From 1fd9332bdc1589da48977451ba7851ffb6fa1e78 Mon Sep 17 00:00:00 2001 From: Yasuaki Uechi Date: Tue, 24 Dec 2019 01:57:07 +0900 Subject: [PATCH] chore: add eslint rules --- .eslintrc.js | 17 ++ CODE_OF_CONDUCT.md | 26 +-- CONTRIBUTING.md | 22 +-- api/.eslintrc.js | 5 + api/package.json | 1 + api/services/appstore.ts | 2 +- api/services/debian.ts | 5 +- api/services/dns.ts | 5 +- api/services/domain.ts | 5 +- api/services/existence.ts | 7 +- api/services/gitlab.ts | 7 +- api/services/launchpad.ts | 5 +- api/services/npm-org.ts | 7 +- api/services/npm.ts | 5 +- api/services/nta.ts | 4 +- api/services/slack.ts | 5 +- api/services/spectrum.ts | 5 +- namae.code-workspace | 15 -- package.json | 7 + web/.eslintrc.js | 9 + web/package.json | 3 +- web/src/components/Footer.tsx | 5 +- web/src/components/Form.tsx | 8 +- web/src/components/Icons.tsx | 6 +- web/src/components/Suggestion.tsx | 94 +++++----- web/src/components/Welcome.tsx | 5 +- web/src/components/cards/core.tsx | 1 + web/src/serviceWorker.ts | 167 +++++++++-------- web/src/util/analytics.ts | 14 +- web/src/util/crip.ts | 6 +- web/src/util/hooks.ts | 2 +- web/src/util/pwa.ts | 4 +- web/src/util/suspense.tsx | 2 +- web/src/util/text.ts | 2 +- yarn.lock | 302 +++++++++++------------------- 35 files changed, 381 insertions(+), 404 deletions(-) create mode 100644 .eslintrc.js create mode 100644 api/.eslintrc.js delete mode 100644 namae.code-workspace create mode 100644 web/.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..c28137a --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + env: { + es6: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:react/recommended', + 'prettier/@typescript-eslint', + ], +}; diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 5726c34..7f689c7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,22 +14,22 @@ appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40ae03f..c62f31e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,23 +20,23 @@ yarn start Create `web/src/components/cards/.js`. Here is the example card that checks if spcified repository on GitHub is available. ```jsx -import React from 'react' -import { useTranslation } from 'react-i18next' -import { FaGithub } from 'react-icons/fa' +import React from 'react'; +import {useTranslation} from 'react-i18next'; +import {FaGithub} from 'react-icons/fa'; -import { Card, Repeater, DedicatedAvailability } from '../Cards' +import {Card, Repeater, DedicatedAvailability} from '../Cards'; -export default function GithubCard({ name }) { - const { t } = useTranslation() - const lowerCase = name.toLowerCase() +export default function GithubCard({name}) { + const {t} = useTranslation(); + const lowerCase = name.toLowerCase(); - const names = [name] + const names = [name]; const moreNames = [ `${lowerCase}hq`, `${lowerCase}-team`, `${lowerCase}-org`, `${lowerCase}-js`, - ] + ]; return ( @@ -52,14 +52,14 @@ export default function GithubCard({ name }) { )} - ) + ); } ``` and add the card to `/web/src/App.js`: ```jsx -import NewCard from './components/cards/NewCard' +import NewCard from './components/cards/NewCard'; ``` ```patch diff --git a/api/.eslintrc.js b/api/.eslintrc.js new file mode 100644 index 0000000..4015d66 --- /dev/null +++ b/api/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + parserOptions: { + project: './tsconfig.json', + }, +}; diff --git a/api/package.json b/api/package.json index 25d7124..aa863ba 100644 --- a/api/package.json +++ b/api/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "scripts": { "build": "tsc", + "lint": "eslint . --ext .ts,.tsx --format visualstudio --fix", "start": "tsc -w", "test": "jest --coverage" }, diff --git a/api/services/appstore.ts b/api/services/appstore.ts index f3d53f7..f7dfa24 100644 --- a/api/services/appstore.ts +++ b/api/services/appstore.ts @@ -16,7 +16,7 @@ interface AppStoreResponse { export default async function handler( req: NowRequest<{query: string; country: string}>, res: NowResponse, -) { +): Promise { const {query, country} = req.query; if (!query) { diff --git a/api/services/debian.ts b/api/services/debian.ts index 0b7bde5..59f2f96 100644 --- a/api/services/debian.ts +++ b/api/services/debian.ts @@ -1,6 +1,9 @@ import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/dns.ts b/api/services/dns.ts index 85c1385..f6d0d75 100644 --- a/api/services/dns.ts +++ b/api/services/dns.ts @@ -10,7 +10,10 @@ function resolvePromise(hostname: string): Promise { }); } -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/domain.ts b/api/services/domain.ts index 4b4a2e2..ba3a32c 100644 --- a/api/services/domain.ts +++ b/api/services/domain.ts @@ -1,7 +1,10 @@ import whois from 'whois-json'; import {send, sendError, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/existence.ts b/api/services/existence.ts index 0273e44..45e0660 100644 --- a/api/services/existence.ts +++ b/api/services/existence.ts @@ -1,6 +1,9 @@ import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { @@ -8,7 +11,7 @@ export default async function handler(req: NowRequest, res: NowResponse) { } if ( - !/^[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/.test( + !/^[(http(s)?)://(www.)?a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/.test( query, ) ) { diff --git a/api/services/gitlab.ts b/api/services/gitlab.ts index d5af2ec..d5ebf23 100644 --- a/api/services/gitlab.ts +++ b/api/services/gitlab.ts @@ -1,7 +1,10 @@ -import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; +import {send, sendError, NowRequest, NowResponse} from '../util/http'; import nodeFetch from 'node-fetch'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/launchpad.ts b/api/services/launchpad.ts index 846dc35..125d272 100644 --- a/api/services/launchpad.ts +++ b/api/services/launchpad.ts @@ -1,6 +1,9 @@ import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/npm-org.ts b/api/services/npm-org.ts index 44e0a8d..3328c96 100644 --- a/api/services/npm-org.ts +++ b/api/services/npm-org.ts @@ -1,7 +1,10 @@ import npmName from 'npm-name'; -import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; +import {send, sendError, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/npm.ts b/api/services/npm.ts index 1b795ff..b077ecd 100644 --- a/api/services/npm.ts +++ b/api/services/npm.ts @@ -1,7 +1,10 @@ import npmName from 'npm-name'; import {send, sendError, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/nta.ts b/api/services/nta.ts index e4b3bed..f987a9f 100644 --- a/api/services/nta.ts +++ b/api/services/nta.ts @@ -5,7 +5,7 @@ const APPLICATION_ID = process.env.NTA_APPLICATION_ID; export default async function handler( req: NowRequest<{query: string; country: string}>, res: NowResponse, -) { +): Promise { const {query} = req.query; if (!query) { @@ -24,6 +24,7 @@ export default async function handler( 'GET', ); const body: string[] = (await response.text()).split('\n').slice(0, -1); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const header = body.shift()!.split(','); const result = body.map((csv) => { const entry = csv.split(',').map((item) => @@ -32,6 +33,7 @@ export default async function handler( .replace(/[A-Za-z0-9]/g, (str) => String.fromCharCode(str.charCodeAt(0) - 0xfee0), ) + // eslint-disable-next-line no-irregular-whitespace .replace(/ /g, ' '), ); diff --git a/api/services/slack.ts b/api/services/slack.ts index e9d5d9b..85f5f6c 100644 --- a/api/services/slack.ts +++ b/api/services/slack.ts @@ -1,6 +1,9 @@ import {send, sendError, fetch, NowRequest, NowResponse} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/api/services/spectrum.ts b/api/services/spectrum.ts index 5b44ed8..133d896 100644 --- a/api/services/spectrum.ts +++ b/api/services/spectrum.ts @@ -1,6 +1,9 @@ import {send, sendError, fetch, NowResponse, NowRequest} from '../util/http'; -export default async function handler(req: NowRequest, res: NowResponse) { +export default async function handler( + req: NowRequest, + res: NowResponse, +): Promise { const {query} = req.query; if (!query) { diff --git a/namae.code-workspace b/namae.code-workspace deleted file mode 100644 index 64b4f15..0000000 --- a/namae.code-workspace +++ /dev/null @@ -1,15 +0,0 @@ -{ - "folders": [ - { - "name": "API", - "path": "api" - }, - { - "name": "Web", - "path": "web" - } - ], - "settings": { - "jest.disabledWorkspaceFolders": ["Root"] - } -} diff --git a/package.json b/package.json index 84571ca..28fb0e3 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "description": "namae saves your time searching around registries and checking if the desired name is ready for use.", "scripts": { "dev": " yarn start", + "lint": "yarn workspaces run lint", "start": "now dev", "test": "CI=true yarn workspaces run test" }, @@ -10,7 +11,13 @@ "now": "^16.7.0" }, "devDependencies": { + "@sentry/cli": "^1.49.0", + "@typescript-eslint/eslint-plugin": "^2.12.0", + "@typescript-eslint/parser": "^2.12.0", "codacy-coverage": "^3.4.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-react": "^7.17.0", "husky": "^3.1.0", "prettier": "^1.19.1", "pretty-quick": "^2.0.1" diff --git a/web/.eslintrc.js b/web/.eslintrc.js new file mode 100644 index 0000000..86f8c7a --- /dev/null +++ b/web/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + parserOptions: { + project: './tsconfig.json', + }, + rules: { + 'react/prop-types': 0, + '@typescript-eslint/explicit-function-return-type': 0, + }, +}; diff --git a/web/package.json b/web/package.json index 67c1395..e41cc29 100644 --- a/web/package.json +++ b/web/package.json @@ -4,6 +4,7 @@ "scripts": { "build": "NODE_ENV=production react-scripts build", "eject": "react-scripts eject", + "lint": "eslint . --ext .ts,.tsx --format visualstudio", "now-build": "yarn build", "now-dev": "NODE_ENV=development BROWSER=none react-scripts start", "start": "NODE_ENV=development react-scripts start", @@ -30,7 +31,7 @@ "react-spinners": "^0.6.1", "react-tippy": "^1.2.3", "styled-components": "^4.3.2", - "typescript": "3.5.3" + "typescript": "3.7.4" }, "devDependencies": { "@testing-library/jest-dom": "^4.1.0", diff --git a/web/src/components/Footer.tsx b/web/src/components/Footer.tsx index 046ab51..fb26ab8 100644 --- a/web/src/components/Footer.tsx +++ b/web/src/components/Footer.tsx @@ -5,7 +5,7 @@ import {FaTwitter, FaGithubAlt} from 'react-icons/fa'; import {ExternalLink} from './Links'; -export default function Footer() { +const Footer: React.FC = () => { const {t} = useTranslation(); return ( @@ -51,7 +51,8 @@ export default function Footer() { ); -} +}; +export default Footer; const Container = styled.div` display: flex; diff --git a/web/src/components/Form.tsx b/web/src/components/Form.tsx index c198099..0ecd073 100644 --- a/web/src/components/Form.tsx +++ b/web/src/components/Form.tsx @@ -15,19 +15,19 @@ const Form: React.FC<{onQuery: (query: string) => void}> = ({onQuery}) => { const {t} = useTranslation(); // set input value - function onInputChange(e: React.FormEvent) { + function onInputChange(e: React.FormEvent): void { const value = e.currentTarget.value; setInputValue(value); } // clear input form and focus on it - function onLogoClick(e: React.MouseEvent) { + function onLogoClick(): void { setInputValue(''); - inputRef.current!.focus(); + inputRef.current?.focus(); } // invoke when user clicked one of the suggested items - function onSuggestionCompleted(name: string) { + function onSuggestionCompleted(name: string): void { setInputValue(name); setSuggested(true); } diff --git a/web/src/components/Icons.tsx b/web/src/components/Icons.tsx index 9c1d36b..ae04d18 100644 --- a/web/src/components/Icons.tsx +++ b/web/src/components/Icons.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export const SpectrumIcon = () => ( +export const SpectrumIcon: React.FC = () => ( ( ); -export const NowIcon = () => ( +export const NowIcon: React.FC = () => ( ( ); -export const NetlifyIcon = () => ( +export const NetlifyIcon: React.FC = () => ( string; -const maximumCount = 3; -const modifiers: Modifier[] = [ - (word) => `${capitalize(word)}ify`, - (word) => `lib${lower(word)}`, - (word) => `Omni${capitalize(word)}`, - (word) => `${capitalize(word)}Lab`, - (word) => `${capitalize(word)}Kit`, - (word) => `Open${capitalize(word)}`, - (word) => `${capitalize(word)}box`, - (word) => `Insta${lower(word)}`, - (word) => `${capitalize(word)}Hub`, - (word) => `Cloud${capitalize(word)}`, - (word) => `quick${lower(word)}`, - (word) => `fast${lower(word)}`, - (word) => `super-${lower(word)}`, - (word) => `Hyper${capitalize(word)}`, - (word) => `${capitalize(word)}Go`, - (word) => `${lower(word)}-io`, - (word) => `Go${capitalize(word)}`, - (word) => `${capitalize(word)}X`, - (word) => `${capitalize(word)}time`, - (word) => `${capitalize(word)}flow`, - (word) => `${capitalize(word)}ful`, - (word) => `${capitalize(word)}ery`, - (word) => `${lower(word)}ly`, - (word) => `${lower(word)}joy`, - (word) => `${capitalize(word)}Hunt`, - (word) => `${capitalize(word)}gram`, - (word) => `${capitalize(word)}base`, - (word) => `${capitalize(word)}API`, - (word) => `${capitalize(word)}note`, - (word) => `In${capitalize(word)}`, - (word) => `Uni${lower(word)}`, - (word) => `${capitalize(word)}`, -]; - -function lower(word: string) { +function lower(word: string): string { return word.toLowerCase(); } -function shuffleArray(array: any[]) { +const maximumCount = 3; +const modifiers: Modifier[] = [ + (word): string => `${capitalize(word)}ify`, + (word): string => `lib${lower(word)}`, + (word): string => `Omni${capitalize(word)}`, + (word): string => `${capitalize(word)}Lab`, + (word): string => `${capitalize(word)}Kit`, + (word): string => `Open${capitalize(word)}`, + (word): string => `${capitalize(word)}box`, + (word): string => `Insta${lower(word)}`, + (word): string => `${capitalize(word)}Hub`, + (word): string => `Cloud${capitalize(word)}`, + (word): string => `quick${lower(word)}`, + (word): string => `fast${lower(word)}`, + (word): string => `super-${lower(word)}`, + (word): string => `Hyper${capitalize(word)}`, + (word): string => `${capitalize(word)}Go`, + (word): string => `${lower(word)}-io`, + (word): string => `Go${capitalize(word)}`, + (word): string => `${capitalize(word)}X`, + (word): string => `${capitalize(word)}time`, + (word): string => `${capitalize(word)}flow`, + (word): string => `${capitalize(word)}ful`, + (word): string => `${capitalize(word)}ery`, + (word): string => `${lower(word)}ly`, + (word): string => `${lower(word)}joy`, + (word): string => `${capitalize(word)}Hunt`, + (word): string => `${capitalize(word)}gram`, + (word): string => `${capitalize(word)}base`, + (word): string => `${capitalize(word)}API`, + (word): string => `${capitalize(word)}note`, + (word): string => `In${capitalize(word)}`, + (word): string => `Uni${lower(word)}`, + (word): string => `${capitalize(word)}`, +]; + +function shuffleArray(array: T[]): T[] { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); const temp = array[i]; @@ -59,15 +59,15 @@ function shuffleArray(array: any[]) { return array; } -function sampleFromArray(array: any[], maximum: number) { +function sampleFromArray(array: T[], maximum: number): T[] { return shuffleArray(array).slice(0, maximum); } -function modifyWord(word: string) { +function modifyWord(word: string): string { return modifiers[Math.floor(Math.random() * modifiers.length)](word); } -function fillArray(array: any[], filler: string, maximum: number) { +function fillArray(array: T[], filler: string, maximum: number): T[] { const deficit = maximum - array.length; if (deficit > 0) { array = [...array, ...Array(deficit).fill(filler)]; @@ -75,7 +75,7 @@ function fillArray(array: any[], filler: string, maximum: number) { return array; } -async function findSynonyms(word: string) { +async function findSynonyms(word: string): Promise { try { const response = await fetch( `https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&dt=ss&ie=UTF-8&oe=UTF-8&dj=1&q=${encodeURIComponent( @@ -92,7 +92,7 @@ async function findSynonyms(word: string) { [] as string[], ), ), - ).filter((word) => !word.match(/[\s-]/)); + ).filter((word) => !/[\s-]/.exec(word)); return synonyms; } catch (err) { return []; @@ -107,7 +107,7 @@ const Suggestion: React.FC<{ const synonymRef = useRef([]); const [bestWords, setBestWords] = useState([]); - function shuffle() { + function shuffle(): void { const best = fillArray( sampleFromArray(synonymRef.current, maximumCount), query, @@ -116,12 +116,12 @@ const Suggestion: React.FC<{ setBestWords(best); } - function applyQuery(name: string) { + function applyQuery(name: string): void { onSubmit(name); } useEffect(() => { - const fn = async () => { + const fn = async (): Promise => { if (query && query.length > 0) { const synonyms = await findSynonyms(query); synonymRef.current = synonyms; @@ -142,7 +142,7 @@ const Suggestion: React.FC<{ {bestWords && bestWords.map((name) => ( - applyQuery(name)}> + applyQuery(name)}> {name} ))} diff --git a/web/src/components/Welcome.tsx b/web/src/components/Welcome.tsx index 6f7a31e..c280d12 100644 --- a/web/src/components/Welcome.tsx +++ b/web/src/components/Welcome.tsx @@ -23,7 +23,7 @@ import {DiRust, DiHeroku} from 'react-icons/di'; import {SpectrumIcon, NowIcon, NetlifyIcon} from './Icons'; import {mobile} from '../util/css'; -export default function Welcome() { +const Welcome: React.FC = () => { const {t} = useTranslation(); return ( @@ -96,7 +96,8 @@ export default function Welcome() { ); -} +}; +export default Welcome; const Container = styled.div` padding-bottom: 40px; diff --git a/web/src/components/cards/core.tsx b/web/src/components/cards/core.tsx index ea1c277..3eb9efa 100644 --- a/web/src/components/cards/core.tsx +++ b/web/src/components/cards/core.tsx @@ -231,6 +231,7 @@ class ErrorBoundary extends React.Component< return {hasError: true, message: error.message}; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any componentDidCatch(error: Error, errorInfo: any) { if (error instanceof APIError || error instanceof NotFoundError) { return; diff --git a/web/src/serviceWorker.ts b/web/src/serviceWorker.ts index 5c8e91c..5c26c91 100644 --- a/web/src/serviceWorker.ts +++ b/web/src/serviceWorker.ts @@ -15,8 +15,9 @@ const isLocalhost = Boolean( // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/, + + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/.exec( + window.location.hostname, ), ); @@ -25,7 +26,87 @@ type Config = { onUpdate?: (registration: ServiceWorkerRegistration) => void; }; -export function register(config?: Config) { +function registerValidSW(swUrl: string, config?: Config): void { + navigator.serviceWorker + .register(swUrl) + .then((registration) => { + registration.onupdatefound = (): void => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = (): void => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch((error) => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl: string, config?: Config): void { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then((response) => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && !contentType.includes('javascript')) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then((registration) => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.', + ); + }); +} + +export function unregister(): void { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then((registration) => { + registration.unregister(); + }); + } +} + +export function register(config?: Config): void { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL( @@ -61,83 +142,3 @@ export function register(config?: Config) { }); } } - -function registerValidSW(swUrl: string, config?: Config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch((error) => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl: string, config?: Config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.', - ); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then((registration) => { - registration.unregister(); - }); - } -} diff --git a/web/src/util/analytics.ts b/web/src/util/analytics.ts index 00906c6..00ec9c9 100644 --- a/web/src/util/analytics.ts +++ b/web/src/util/analytics.ts @@ -3,14 +3,14 @@ import * as Sentry from '@sentry/browser'; const isProduction = process.env.NODE_ENV !== 'development'; -export function initGA() { +export function initGA(): void { if (isProduction) { ReactGA.initialize('UA-28919359-15'); ReactGA.pageview(window.location.pathname + window.location.search); } } -export function sendQueryStatistics(queryLength: number) { +export function sendQueryStatistics(queryLength: number): void { if (isProduction) { ReactGA.event({ category: 'Search', @@ -20,7 +20,7 @@ export function sendQueryStatistics(queryLength: number) { } } -export function initSentry() { +export function initSentry(): void { if (isProduction) { Sentry.init({ dsn: 'https://7ab2df74aead499b950ebef190cc40b7@sentry.io/1759299', @@ -28,7 +28,13 @@ export function initSentry() { } } -export function sendError(error: Error, errorInfo: any): Promise { +export function sendError( + error: Error, + errorInfo: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [key: string]: any; + }, +): Promise { return new Promise((resolve) => { if (isProduction) { Sentry.withScope((scope) => { diff --git a/web/src/util/crip.ts b/web/src/util/crip.ts index 4e67f5d..ccb66e1 100644 --- a/web/src/util/crip.ts +++ b/web/src/util/crip.ts @@ -1,10 +1,10 @@ interface CrispWindow extends Window { - $crisp: any[]; + $crisp: unknown[]; CRISP_WEBSITE_ID: string; } -declare var window: CrispWindow; +declare let window: CrispWindow; -export function initCrisp() { +export function initCrisp(): void { window.$crisp = []; window.CRISP_WEBSITE_ID = '92b2e096-6892-47dc-bf4a-057bad52d82e'; const s = document.createElement('script'); diff --git a/web/src/util/hooks.ts b/web/src/util/hooks.ts index 2379097..4366922 100644 --- a/web/src/util/hooks.ts +++ b/web/src/util/hooks.ts @@ -12,7 +12,7 @@ export function useDeferredState( setResponse(innerValue); }, duration); - return () => { + return (): void => { clearTimeout(fn); }; }, [duration, innerValue]); diff --git a/web/src/util/pwa.ts b/web/src/util/pwa.ts index e4ac740..826d6ba 100644 --- a/web/src/util/pwa.ts +++ b/web/src/util/pwa.ts @@ -2,7 +2,7 @@ interface CustomNavigator extends Navigator { standalone?: boolean; } -export function isStandalone() { +export function isStandalone(): boolean { const navigator: CustomNavigator = window.navigator; - return 'standalone' in navigator && navigator.standalone; + return 'standalone' in navigator && navigator.standalone === true; } diff --git a/web/src/util/suspense.tsx b/web/src/util/suspense.tsx index 8f94919..f065adf 100644 --- a/web/src/util/suspense.tsx +++ b/web/src/util/suspense.tsx @@ -15,7 +15,7 @@ const Container = styled.div` align-items: center; `; -const Fallback = () => ( +const Fallback: React.FC = () => ( diff --git a/web/src/util/text.ts b/web/src/util/text.ts index 84302a4..b48338e 100644 --- a/web/src/util/text.ts +++ b/web/src/util/text.ts @@ -1,4 +1,4 @@ -export function capitalize(text: string) { +export function capitalize(text: string): string { if (text.length === 0) return ''; return text[0].toUpperCase() + text.slice(1).toLowerCase(); } diff --git a/yarn.lock b/yarn.lock index fad1170..4014511 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1258,6 +1258,18 @@ "@sentry/utils" "5.10.2" tslib "^1.9.3" +"@sentry/cli@^1.49.0": + version "1.49.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.49.0.tgz#174152978acbe6023986a8fb0b247cf58b4653d8" + integrity sha512-Augz7c42Cxz/xWQ/NOVjUGePKVA370quvskWbCICMUwxcTvKnCLI+7KDdzEoCexj4MSuxFfBzLnrrn4w2+c9TQ== + dependencies: + fs-copy-file-sync "^1.1.1" + https-proxy-agent "^3.0.0" + mkdirp "^0.5.1" + node-fetch "^2.1.2" + progress "2.0.0" + proxy-from-env "^1.0.0" + "@sentry/core@5.10.2": version "5.10.2" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.10.2.tgz#1cb64489e6f8363c3249415b49d3f1289814825f" @@ -1671,7 +1683,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.8.0": +"@typescript-eslint/eslint-plugin@^2.12.0", "@typescript-eslint/eslint-plugin@^2.8.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.12.0.tgz#0da7cbca7b24f4c6919e9eb31c704bfb126f90ad" integrity sha512-1t4r9rpLuEwl3hgt90jY18wJHSyb0E3orVL3DaqwmpiSDHmHiSspVsvsFF78BJ/3NNG3qmeso836jpuBWYziAA== @@ -1691,7 +1703,7 @@ "@typescript-eslint/typescript-estree" "2.12.0" eslint-scope "^5.0.0" -"@typescript-eslint/parser@^2.8.0": +"@typescript-eslint/parser@^2.12.0", "@typescript-eslint/parser@^2.8.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.12.0.tgz#393f1604943a4ca570bb1a45bc8834e9b9158884" integrity sha512-lPdkwpdzxEfjI8TyTzZqPatkrswLSVu4bqUgnB03fHSOwpC7KSerPgJRgIAf11UGNf7HKjJV6oaPZI4AghLU6g== @@ -1875,11 +1887,6 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -1937,6 +1944,13 @@ adjust-sourcemap-loader@2.0.0: object-path "0.11.4" regex-parser "2.2.10" +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -2032,19 +2046,11 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3303,11 +3309,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constant-case@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" @@ -3779,7 +3780,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3911,11 +3912,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3934,11 +3930,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4273,6 +4264,18 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + es6-symbol@^3.1.1, es6-symbol@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -4303,6 +4306,13 @@ escodegen@^1.11.0, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" + integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== + dependencies: + get-stdin "^6.0.0" + eslint-config-react-app@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.1.0.tgz#a37b3f2d4f56f856f93277281ef52bd791273e63" @@ -4337,6 +4347,11 @@ eslint-module-utils@^2.4.0: debug "^2.6.9" pkg-dir "^2.0.0" +eslint-plugin-eslint-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5" + integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg== + eslint-plugin-flowtype@3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz#e241ebd39c0ce519345a3f074ec1ebde4cf80f2c" @@ -4396,6 +4411,22 @@ eslint-plugin-react@7.16.0: prop-types "^15.7.2" resolve "^1.12.0" +eslint-plugin-react@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.17.0.tgz#a31b3e134b76046abe3cd278e7482bd35a1d12d7" + integrity sha512-ODB7yg6lxhBVMeiH1c7E95FLD4E/TwmFjltiU+ethv7KPdCwgiFuOZg9zNRHyufStTDLl/dEFqI2Q1VPmCd78A== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + eslint-plugin-eslint-plugin "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.0" + object.fromentries "^2.0.1" + object.values "^1.1.0" + prop-types "^15.7.2" + resolve "^1.13.1" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -4424,7 +4455,7 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^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.6.0: +eslint@^6.6.0, eslint@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== @@ -4994,6 +5025,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== + fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -5021,13 +5057,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" @@ -5073,20 +5102,6 @@ functional-red-black-tree@^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" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -5107,6 +5122,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stdin@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" @@ -5341,11 +5361,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5627,6 +5642,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + husky@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/husky/-/husky-3.1.0.tgz#5faad520ab860582ed94f0c1a77f0f04c90b57c0" @@ -5685,7 +5708,7 @@ i18next@>=17.0.11, i18next@>=17.0.12: dependencies: "@babel/runtime" "^7.3.1" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5716,13 +5739,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -6906,7 +6922,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.2.1: +jsx-ast-utils@^2.2.1, 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== @@ -7470,14 +7486,6 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - minipass@^3.0.0, minipass@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" @@ -7485,13 +7493,6 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -7641,15 +7642,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7692,7 +7684,7 @@ nock@^10.0.6: qs "^6.5.1" semver "^5.5.0" -node-fetch@^2.2.0: +node-fetch@^2.1.2, node-fetch@^2.2.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -7752,22 +7744,6 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.40, node-releases@^1.1.42: version "1.1.43" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" @@ -7775,14 +7751,6 @@ node-releases@^1.1.40, node-releases@^1.1.42: dependencies: semver "^6.3.0" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7835,13 +7803,6 @@ now@^16.7.0: resolved "https://registry.yarnpkg.com/now/-/now-16.7.0.tgz#4a1f1588410e7cbe9ca8d2c3fdcdc61e7116e8cc" integrity sha512-YUMFYphAxcLE441/o2h55QgtXerF3M0GlQgy7ihJhPcz6OsllCqGgxaN5/XgnAJOlgKCW84HxSB8ZzCY55H4lQ== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-name@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-5.5.0.tgz#3a73adbcb0488a41a44ff820ed51dcc32c72bd09" @@ -7855,19 +7816,6 @@ npm-name@^5.5.0: registry-url "^5.1.0" validate-npm-package-name "^3.0.0" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.7" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" - integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -7882,16 +7830,6 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -7985,7 +7923,7 @@ object.entries@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -object.fromentries@^2.0.0: +object.fromentries@^2.0.0, object.fromentries@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== @@ -8129,11 +8067,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -8143,19 +8076,11 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -9307,6 +9232,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.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -9354,6 +9284,11 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.0" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -9496,7 +9431,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7, rc@^1.2.8: +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -9766,7 +9701,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.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: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, 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.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10076,7 +10011,7 @@ resolve@1.12.2: dependencies: path-parse "^1.0.6" -resolve@1.x, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@1.x, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== @@ -10153,7 +10088,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -10311,7 +10246,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -10381,7 +10316,7 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -10813,7 +10748,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -11070,19 +11005,6 @@ tapable@^1.0.0, tapable@^1.1.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - terser-webpack-plugin@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz#5569e6c7d8be79e5e43d6da23acc3b6ba77d22bd" @@ -11376,12 +11298,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" - integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== - -typescript@^3.6.2: +typescript@3.7.4, typescript@^3.6.2: version "3.7.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== @@ -11915,13 +11832,6 @@ whois@^2.6.0: socks "^2.2.2" underscore "^1.9.1" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -12166,7 +12076,7 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==