From aaf873d9fa9d17ecf5cd0bc45fb77011932f1d76 Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Thu, 17 Sep 2020 22:38:39 +0800 Subject: [PATCH] dependencies: bump (major) --- .eslintignore | 1 + .eslintrc.js | 8 +- client/.eslintrc.js | 3 +- client/config/webpack.config.dev.js | 7 +- client/config/webpack.config.prod.js | 7 +- client/src/javascript/app.tsx | 32 +- .../javascript/components/auth/AuthForm.tsx | 2 +- .../general/ClientConnectionInterruption.tsx | 3 +- .../javascript/components/general/Size.tsx | 4 +- .../general/form-elements/TextboxRepeater.tsx | 3 +- .../components/icons/SpinnerIcon.tsx | 4 +- .../modals/feeds-modal/DownloadRulesTab.tsx | 10 +- .../modals/feeds-modal/FeedsModal.tsx | 4 +- .../modals/feeds-modal/FeedsTab.tsx | 29 +- .../modals/settings-modal/AuthTab.tsx | 4 +- .../components/sidebar/DiskUsage.tsx | 8 +- .../components/sidebar/LogoutButton.tsx | 4 +- .../sidebar/NotificationsButton.tsx | 2 +- .../components/sidebar/SpeedLimitDropdown.tsx | 11 +- .../components/sidebar/StatusFilters.tsx | 51 +- .../components/sidebar/TagFilters.tsx | 10 +- .../components/sidebar/TrackerFilters.tsx | 10 +- .../sidebar/TransferRateDetails.tsx | 2 +- .../components/sidebar/TransferRateGraph.tsx | 22 +- .../components/torrent-list/ActionBar.tsx | 24 +- client/src/javascript/i18n/languages.tsx | 16 +- client/src/javascript/stores/AlertStore.tsx | 13 +- client/src/javascript/stores/AuthStore.tsx | 19 +- client/src/javascript/stores/ConfigStore.tsx | 12 +- client/src/javascript/stores/FeedsStore.tsx | 28 +- .../javascript/stores/NotificationStore.tsx | 4 +- .../src/javascript/stores/SettingsStore.tsx | 24 +- client/src/javascript/stores/TorrentStore.tsx | 14 +- client/src/javascript/stores/UIStore.tsx | 6 +- .../src/javascript/ui/components/Button.tsx | 2 +- .../javascript/ui/components/FormGroup.tsx | 3 +- .../src/javascript/ui/components/Select.tsx | 6 +- .../src/javascript/ui/components/Textbox.tsx | 5 +- .../javascript/ui/components/ToggleInput.tsx | 9 +- .../javascript/ui/components/util/forms.tsx | 13 +- client/src/javascript/util/connectStores.tsx | 7 +- client/src/javascript/util/detectLocale.tsx | 21 +- client/src/javascript/util/searchTorrents.tsx | 10 +- client/src/javascript/util/selectTorrents.tsx | 8 +- client/src/javascript/util/sortTorrents.tsx | 4 +- package-lock.json | 1518 +++++++++++------ package.json | 23 +- server/.eslintrc.js | 2 + server/bin/enforce-prerequisites.ts | 2 +- server/bin/start.ts | 2 +- server/bin/web-server.ts | 5 +- server/models/TemporaryStorage.ts | 6 +- server/util/ajaxUtil.ts | 2 +- shared/types/ClientSettings.tsx | 2 +- 54 files changed, 1243 insertions(+), 808 deletions(-) diff --git a/.eslintignore b/.eslintignore index ba166c0d..054c112c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ +.eslintrc.js /node_modules /dist **/*.d.ts diff --git a/.eslintrc.js b/.eslintrc.js index 51d7ceea..95e5b153 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -59,12 +59,18 @@ module.exports = { overrides: [ { files: ['*.ts', '*.tsx', '**/*.ts', '**/*.tsx'], - extends: ['plugin:@typescript-eslint/recommended', 'prettier', 'prettier/@typescript-eslint'], + extends: ['airbnb-typescript', 'plugin:@typescript-eslint/recommended', 'prettier', 'prettier/@typescript-eslint'], + parserOptions: { + project: './tsconfig.json' + }, rules: { + 'no-underscore-dangle': [2, {allow: ['_id']}], 'no-unused-vars': 0, + '@typescript-eslint/lines-between-class-members': ['error', 'always', {exceptAfterSingleLine: true}], '@typescript-eslint/no-unused-vars': ['error', {argsIgnorePattern: '^_'}], // TODO: Explicit return type '@typescript-eslint/explicit-function-return-type': 0, + "@typescript-eslint/explicit-module-boundary-types": 0, // TODO: Re-enable after everything is module '@typescript-eslint/no-var-requires': 0, }, diff --git a/client/.eslintrc.js b/client/.eslintrc.js index 948951f8..b6d731fb 100644 --- a/client/.eslintrc.js +++ b/client/.eslintrc.js @@ -11,8 +11,8 @@ module.exports = { process: 'writable', window: 'writable', }, - plugins: ['import'], rules: { + 'import/no-extraneous-dependencies': 0, 'no-restricted-imports': [ 'error', { @@ -25,7 +25,6 @@ module.exports = { patterns: ['**/server/**/*'], }, ], - '@typescript-eslint/camelcase': ['error'], camelcase: 0, // TODO: Enable a11y features 'jsx-a11y/click-events-have-key-events': 0, diff --git a/client/config/webpack.config.dev.js b/client/config/webpack.config.dev.js index f15cddee..7817a0fa 100644 --- a/client/config/webpack.config.dev.js +++ b/client/config/webpack.config.dev.js @@ -66,10 +66,9 @@ module.exports = { loader: 'postcss-loader', options: { sourceMap: true, - // Necessary for external CSS imports to work - // https://github.com/facebookincubator/create-react-app/issues/2677 - ident: 'postcss', - plugins: () => [autoprefixer()], + postcssOptions: { + plugins: () => [autoprefixer()], + }, }, }, { diff --git a/client/config/webpack.config.prod.js b/client/config/webpack.config.prod.js index dd5ac78b..b85d2022 100644 --- a/client/config/webpack.config.prod.js +++ b/client/config/webpack.config.prod.js @@ -56,10 +56,9 @@ module.exports = { loader: 'postcss-loader', options: { sourceMap: true, - // Necessary for external CSS imports to work - // https://github.com/facebookincubator/create-react-app/issues/2677 - ident: 'postcss', - plugins: () => [autoprefixer()], + postcssOptions: { + plugins: () => [autoprefixer()], + }, }, }, { diff --git a/client/src/javascript/app.tsx b/client/src/javascript/app.tsx index 04eff574..e1496e15 100644 --- a/client/src/javascript/app.tsx +++ b/client/src/javascript/app.tsx @@ -4,7 +4,7 @@ import {Route} from 'react-router'; import React from 'react'; import ReactDOM from 'react-dom'; -import {AsyncIntlProvider} from './i18n/languages'; +import AsyncIntlProvider from './i18n/languages'; import connectStores from './util/connectStores'; import AppWrapper from './components/AppWrapper'; import AuthActions from './actions/AuthActions'; @@ -25,15 +25,19 @@ interface FloodAppProps { } const initialize = (): void => { - UIStore.registerDependency({ - id: 'notifications', - message: , - }); + UIStore.registerDependency([ + { + id: 'notifications', + message: , + }, + ]); - UIStore.registerDependency({ - id: 'torrent-taxonomy', - message: , - }); + UIStore.registerDependency([ + { + id: 'torrent-taxonomy', + message: , + }, + ]); UIStore.registerDependency([ { @@ -46,10 +50,12 @@ const initialize = (): void => { }, ]); - UIStore.registerDependency({ - id: 'torrent-list', - message: , - }); + UIStore.registerDependency([ + { + id: 'torrent-list', + message: , + }, + ]); AuthActions.verify().then( ({initialUser}: {initialUser?: boolean}): void => { diff --git a/client/src/javascript/components/auth/AuthForm.tsx b/client/src/javascript/components/auth/AuthForm.tsx index 4effaa52..219986cd 100644 --- a/client/src/javascript/components/auth/AuthForm.tsx +++ b/client/src/javascript/components/auth/AuthForm.tsx @@ -15,7 +15,7 @@ interface AuthFormProps extends WrappedComponentProps { error?: Error; } -interface AuthFormStates { +interface AuthFormStates extends Record { isSubmitting: boolean; } diff --git a/client/src/javascript/components/general/ClientConnectionInterruption.tsx b/client/src/javascript/components/general/ClientConnectionInterruption.tsx index 3168291a..8c2303cb 100644 --- a/client/src/javascript/components/general/ClientConnectionInterruption.tsx +++ b/client/src/javascript/components/general/ClientConnectionInterruption.tsx @@ -102,7 +102,7 @@ class ClientConnectionInterruption extends React.Component< ); } - renderFormError() { + renderFormError(): React.ReactNode { const {hasTestedConnection, isConnectionVerified, isTestingConnection} = this.state; if (hasTestedConnection && !isConnectionVerified) { return ( @@ -113,6 +113,7 @@ class ClientConnectionInterruption extends React.Component< ); } + return undefined; } render() { diff --git a/client/src/javascript/components/general/Size.tsx b/client/src/javascript/components/general/Size.tsx index 0f80930e..1b2f477a 100644 --- a/client/src/javascript/components/general/Size.tsx +++ b/client/src/javascript/components/general/Size.tsx @@ -16,7 +16,7 @@ class Size extends React.Component { precision: 2, }; - renderNumber(computedNumber: ReturnType) { + static renderNumber(computedNumber: ReturnType) { if (Number.isNaN(computedNumber.value)) { return '—'; } @@ -43,7 +43,7 @@ class Size extends React.Component { return ( - {this.renderNumber(computed)} + {Size.renderNumber(computed)} {translatedUnit} ); diff --git a/client/src/javascript/components/general/form-elements/TextboxRepeater.tsx b/client/src/javascript/components/general/form-elements/TextboxRepeater.tsx index a92eb28d..a767a63c 100644 --- a/client/src/javascript/components/general/form-elements/TextboxRepeater.tsx +++ b/client/src/javascript/components/general/form-elements/TextboxRepeater.tsx @@ -28,7 +28,8 @@ export default class TextboxRepeater extends React.PureComponent diff --git a/client/src/javascript/components/icons/SpinnerIcon.tsx b/client/src/javascript/components/icons/SpinnerIcon.tsx index 54e2a15e..1d66948d 100644 --- a/client/src/javascript/components/icons/SpinnerIcon.tsx +++ b/client/src/javascript/components/icons/SpinnerIcon.tsx @@ -6,7 +6,7 @@ import BaseIcon from './BaseIcon'; export default class SpinnerIcon extends BaseIcon { id = _.uniqueId(); - getViewBox() { + static getViewBox() { return '0 0 128 128'; } @@ -14,7 +14,7 @@ export default class SpinnerIcon extends BaseIcon { const maskID = `icon--spinner__mask-id--${this.id}`; return ( - + { errors?: { [field in ValidatedFields]?: string; }; @@ -421,9 +421,9 @@ class DownloadRulesTab extends React.Component { componentDidMount() { - FeedsStore.fetchFeedMonitors(); + FeedsStoreClass.fetchFeedMonitors(); } render() { diff --git a/client/src/javascript/components/modals/feeds-modal/FeedsTab.tsx b/client/src/javascript/components/modals/feeds-modal/FeedsTab.tsx index ecd653d7..ec7c5dbb 100644 --- a/client/src/javascript/components/modals/feeds-modal/FeedsTab.tsx +++ b/client/src/javascript/components/modals/feeds-modal/FeedsTab.tsx @@ -17,7 +17,7 @@ import { } from '../../../ui'; import Edit from '../../icons/Edit'; import Close from '../../icons/Close'; -import FeedsStore from '../../../stores/FeedsStore'; +import FeedsStore, {FeedsStoreClass} from '../../../stores/FeedsStore'; import ModalFormSectionHeader from '../ModalFormSectionHeader'; import * as validators from '../../../util/validators'; import UIActions from '../../../actions/UIActions'; @@ -41,7 +41,7 @@ interface FeedsTabProps extends WrappedComponentProps { items: Items; } -interface FeedsTabStates { +interface FeedsTabStates extends Record { errors?: { [field in ValidatedFields]?: string; }; @@ -310,7 +310,7 @@ class FeedsTab extends React.Component { ); } - getFeedAddForm(errors: Array | null) { + getFeedAddForm(errors: React.ReactNode) { return (
{ if (formData != null) { if (currentFeed === defaultFeed) { - FeedsStore.addFeed(formData); + FeedsStoreClass.addFeed(formData); } else if (currentFeed != null && currentFeed._id != null) { - FeedsStore.modifyFeed(currentFeed._id, formData); + FeedsStoreClass.modifyFeed(currentFeed._id, formData); } } if (this.formRef != null) { @@ -451,7 +451,7 @@ class FeedsTab extends React.Component { handleRemoveFeedClick = (feed: Feed) => { if (feed._id != null) { - FeedsStore.removeFeed(feed._id); + FeedsStoreClass.removeFeed(feed._id); } if (feed === this.state.currentlyEditingFeed) { @@ -474,7 +474,7 @@ class FeedsTab extends React.Component { const feedBrowseForm = input.formData as {feedID: string; search: string}; if ((input.event.target as HTMLInputElement).type !== 'checkbox') { this.setState({selectedFeedID: feedBrowseForm.feedID}); - FeedsStore.fetchItems({params: {id: feedBrowseForm.feedID, search: feedBrowseForm.search}}); + FeedsStoreClass.fetchItems({params: {id: feedBrowseForm.feedID, search: feedBrowseForm.search}}); } }; @@ -483,7 +483,7 @@ class FeedsTab extends React.Component { return; } - const formData = this.manualAddingFormRef.getFormData() as Record; + const formData = this.manualAddingFormRef.getFormData(); const downloadedTorrents = this.props.items .filter((item, index) => formData[index]) @@ -497,16 +497,17 @@ class FeedsTab extends React.Component { return {isValid: false}; } - const formData = this.formRef.getFormData() as Record; + const formData = this.formRef.getFormData(); const errors = Object.keys(this.validatedFields).reduce((memo: FeedsTabStates['errors'], field) => { const fieldName = field as ValidatedFields; const fieldValue = `${formData[fieldName]}`; - if (!this.validatedFields[fieldName].isValid(fieldValue) && memo != null) { - memo[fieldName] = this.validatedFields[fieldName].error; - } - - return memo; + return { + ...memo, + ...(!this.validatedFields[fieldName].isValid(fieldValue) && memo != null + ? {fieldName: this.validatedFields[fieldName].error} + : {}), + }; }, {}); if (errors == null) { diff --git a/client/src/javascript/components/modals/settings-modal/AuthTab.tsx b/client/src/javascript/components/modals/settings-modal/AuthTab.tsx index 1bb89fc1..b24c6807 100644 --- a/client/src/javascript/components/modals/settings-modal/AuthTab.tsx +++ b/client/src/javascript/components/modals/settings-modal/AuthTab.tsx @@ -47,7 +47,7 @@ class AuthTab extends SettingsTab { removeIcon = (
+ onClick={AuthTab.handleDeleteUserClick.bind(this, user.username)}> ); @@ -75,7 +75,7 @@ class AuthTab extends SettingsTab { }); } - handleDeleteUserClick(username: UserConfig['username']) { + static handleDeleteUserClick(username: UserConfig['username']) { AuthActions.deleteUser(username).then(AuthActions.fetchUsers); } diff --git a/client/src/javascript/components/sidebar/DiskUsage.tsx b/client/src/javascript/components/sidebar/DiskUsage.tsx index bfb71be2..309e68ed 100644 --- a/client/src/javascript/components/sidebar/DiskUsage.tsx +++ b/client/src/javascript/components/sidebar/DiskUsage.tsx @@ -15,7 +15,7 @@ interface DiskUsageProps { mountPoints?: Array; } -const DiskUsageTooltipItem = ({label, value}: {label: object; value: number}) => { +const DiskUsageTooltipItem = ({label, value}: {label: React.ReactNode; value: number}) => { return (
  • @@ -33,8 +33,10 @@ class DiskUsage extends React.Component { } const diskMap = disks.reduce((disksByTarget: Record, disk: Disk) => { - disksByTarget[disk.target] = disk; - return disksByTarget; + return { + ...disksByTarget, + [disk.target]: disk, + }; }, {}); return mountPoints diff --git a/client/src/javascript/components/sidebar/LogoutButton.tsx b/client/src/javascript/components/sidebar/LogoutButton.tsx index 0a7397a4..8b1781b8 100644 --- a/client/src/javascript/components/sidebar/LogoutButton.tsx +++ b/client/src/javascript/components/sidebar/LogoutButton.tsx @@ -13,7 +13,7 @@ const MESSAGES = defineMessages({ }); class LogoutButton extends React.Component { - handleLogoutClick() { + static handleLogoutClick() { AuthActions.logout().then(() => { window.location.reload(); }); @@ -26,7 +26,7 @@ class LogoutButton extends React.Component { return ( { - handleClick(filter: string) { + static handleClick(filter: string) { UIActions.setTorrentStatusFilter(filter); } @@ -94,7 +94,7 @@ class StatusFilters extends React.Component { const filterElements = filters.map((filter) => ( { } } -const ConnectedStatusFilters = connectStores>(injectIntl(StatusFilters), () => { - return [ - { - store: TorrentFilterStore, - event: 'CLIENT_FETCH_TORRENT_TAXONOMY_SUCCESS', - getValue: ({store}) => { - const storeTorrentFilter = store as typeof TorrentFilterStore; - return { - statusCount: storeTorrentFilter.getTorrentStatusCount(), - }; +const ConnectedStatusFilters = connectStores, Record>( + injectIntl(StatusFilters), + () => { + return [ + { + store: TorrentFilterStore, + event: 'CLIENT_FETCH_TORRENT_TAXONOMY_SUCCESS', + getValue: ({store}) => { + const storeTorrentFilter = store as typeof TorrentFilterStore; + return { + statusCount: storeTorrentFilter.getTorrentStatusCount(), + }; + }, }, - }, - { - store: TorrentFilterStore, - event: 'UI_TORRENTS_FILTER_STATUS_CHANGE', - getValue: ({store}) => { - const storeTorrentFilter = store as typeof TorrentFilterStore; - return { - statusFilter: storeTorrentFilter.getStatusFilter(), - }; + { + store: TorrentFilterStore, + event: 'UI_TORRENTS_FILTER_STATUS_CHANGE', + getValue: ({store}) => { + const storeTorrentFilter = store as typeof TorrentFilterStore; + return { + statusFilter: storeTorrentFilter.getStatusFilter(), + }; + }, }, - }, - ]; -}); + ]; + }, +); export default ConnectedStatusFilters; diff --git a/client/src/javascript/components/sidebar/TagFilters.tsx b/client/src/javascript/components/sidebar/TagFilters.tsx index 71e1e6e0..06977d84 100644 --- a/client/src/javascript/components/sidebar/TagFilters.tsx +++ b/client/src/javascript/components/sidebar/TagFilters.tsx @@ -12,6 +12,10 @@ interface TagFiltersProps { } class TagFilters extends React.Component { + static handleClick(filter: string) { + UIActions.setTorrentTagFilter(filter); + } + getFilters() { if (this.props.tagCount == null) { return null; @@ -30,7 +34,7 @@ class TagFilters extends React.Component { const filterElements = filterItems.map((filter) => ( { return filterElements; } - handleClick(filter: string) { - UIActions.setTorrentTagFilter(filter); - } - hasTags(): boolean { if (this.props.tagCount == null) { return false; diff --git a/client/src/javascript/components/sidebar/TrackerFilters.tsx b/client/src/javascript/components/sidebar/TrackerFilters.tsx index a4ceae0c..0e7e6bd4 100644 --- a/client/src/javascript/components/sidebar/TrackerFilters.tsx +++ b/client/src/javascript/components/sidebar/TrackerFilters.tsx @@ -12,6 +12,10 @@ interface TrackerFiltersProps { } class TrackerFilters extends React.Component { + static handleClick(filter: string): void { + UIActions.setTorrentTrackerFilter(filter); + } + getFilters(): React.ReactNode { if (this.props.trackerCount == null) { return null; @@ -30,7 +34,7 @@ class TrackerFilters extends React.Component { const filterElements = filterItems.map((filter) => ( { return filterElements; } - handleClick(filter: string): void { - UIActions.setTorrentTrackerFilter(filter); - } - hasTrackers(): boolean { if (this.props.trackerCount == null) { return false; diff --git a/client/src/javascript/components/sidebar/TransferRateDetails.tsx b/client/src/javascript/components/sidebar/TransferRateDetails.tsx index 247832be..5f346dca 100644 --- a/client/src/javascript/components/sidebar/TransferRateDetails.tsx +++ b/client/src/javascript/components/sidebar/TransferRateDetails.tsx @@ -118,7 +118,7 @@ class TransferRateDetails extends React.Component { } } -const ConnectedTransferRateDetails = connectStores>( +const ConnectedTransferRateDetails = connectStores, Record>( injectIntl(TransferRateDetails), () => { return [ diff --git a/client/src/javascript/components/sidebar/TransferRateGraph.tsx b/client/src/javascript/components/sidebar/TransferRateGraph.tsx index 06a5d484..e40f4c9d 100644 --- a/client/src/javascript/components/sidebar/TransferRateGraph.tsx +++ b/client/src/javascript/components/sidebar/TransferRateGraph.tsx @@ -27,6 +27,15 @@ const METHODS_TO_BIND = [ ] as const; class TransferRateGraph extends React.Component { + private static getGradient(slug: TransferDirection): React.ReactNode { + return ( + + + + + ); + } + lastMouseX?: number; xScale?: d3.ScaleLinear; yScale?: d3.ScaleLinear; @@ -132,15 +141,6 @@ class TransferRateGraph extends React.Component { this.graphRefs.areDefined = true; } - private getGradient(slug: TransferDirection): React.ReactNode { - return ( - - - - - ); - } - private setInspectorCoordinates(slug: TransferDirection, hoverPoint: number): number { const { graphRefs: { @@ -263,8 +263,8 @@ class TransferRateGraph extends React.Component { this.graphRefs.graph = ref; }}> - {this.getGradient('upload')} - {this.getGradient('download')} + {TransferRateGraph.getGradient('upload')} + {TransferRateGraph.getGradient('download')} ); diff --git a/client/src/javascript/components/torrent-list/ActionBar.tsx b/client/src/javascript/components/torrent-list/ActionBar.tsx index ae4a08c8..d10f6a1c 100644 --- a/client/src/javascript/components/torrent-list/ActionBar.tsx +++ b/client/src/javascript/components/torrent-list/ActionBar.tsx @@ -23,30 +23,30 @@ interface ActionBarProps extends WrappedComponentProps { } class ActionBar extends React.Component { - handleAddTorrents() { + static handleAddTorrents() { UIActions.displayModal({id: 'add-torrents'}); } - handleRemoveTorrents() { + static handleRemoveTorrents() { UIActions.displayModal({ id: 'remove-torrents', }); } - handleSortChange(sortBy: FloodSettings['sortTorrents']) { + static handleSortChange(sortBy: FloodSettings['sortTorrents']) { SettingsStore.setFloodSetting('sortTorrents', sortBy); UIActions.setTorrentsSort(sortBy); } - handleStart() { + static handleStart() { TorrentActions.startTorrents(TorrentStore.getSelectedTorrents()); } - handleStop() { + static handleStop() { TorrentActions.stopTorrents(TorrentStore.getSelectedTorrents()); } - handleSidebarChange() { + static handleSidebarChange() { const view = document.getElementsByClassName('application__view')[0]; if (view != null) { view.classList.toggle('application__view--sidebar-alternative-state'); @@ -65,14 +65,14 @@ class ActionBar extends React.Component { label="actionbar.button.sidebar.expand.collapse" slug="sidebar-expand-collapse" icon={} - clickHandler={this.handleSidebarChange} + clickHandler={ActionBar.handleSidebarChange} noTip />
    @@ -84,7 +84,7 @@ class ActionBar extends React.Component { })} slug="start-torrent" icon={} - clickHandler={this.handleStart} + clickHandler={ActionBar.handleStart} /> { })} slug="stop-torrent" icon={} - clickHandler={this.handleStop} + clickHandler={ActionBar.handleStop} />
    @@ -102,7 +102,7 @@ class ActionBar extends React.Component { })} slug="add-torrent" icon={} - clickHandler={this.handleAddTorrents} + clickHandler={ActionBar.handleAddTorrents} /> { })} slug="remove-torrent" icon={} - clickHandler={this.handleRemoveTorrents} + clickHandler={ActionBar.handleRemoveTorrents} />
    diff --git a/client/src/javascript/i18n/languages.tsx b/client/src/javascript/i18n/languages.tsx index 68df768c..14fc0faa 100644 --- a/client/src/javascript/i18n/languages.tsx +++ b/client/src/javascript/i18n/languages.tsx @@ -22,18 +22,24 @@ function getMessages(locale: Exclude) { if (messagesCache[locale]) { return messagesCache[locale]; } + // eslint-disable-next-line @typescript-eslint/no-throw-literal throw loadMessages(locale as Exclude); } -export const AsyncIntlProvider = ({locale, children}: {locale?: keyof typeof Languages; children: React.ReactNode}) => { - if (locale == null || locale === 'auto') { - locale = detectLocale(); +const AsyncIntlProvider = ({locale, children}: {locale?: keyof typeof Languages; children: React.ReactNode}) => { + let validatedLocale: Exclude; + if (locale == null || locale === 'auto' || !Object.prototype.hasOwnProperty.call(Languages, locale)) { + validatedLocale = detectLocale(); + } else { + validatedLocale = locale; } - const messages = getMessages(locale as Exclude); + const messages = getMessages(validatedLocale); return ( - + {children} ); }; + +export default AsyncIntlProvider; diff --git a/client/src/javascript/stores/AlertStore.tsx b/client/src/javascript/stores/AlertStore.tsx index 39a661e8..745964e4 100644 --- a/client/src/javascript/stores/AlertStore.tsx +++ b/client/src/javascript/stores/AlertStore.tsx @@ -35,14 +35,17 @@ class AlertStoreClass extends BaseStore { } add(alert: Alert) { - alert.duration = alert.duration || DEFAULT_DURATION; - alert.id = alert.id || `${Date.now()}`; + const newAlert: Alert = { + ...alert, + id: alert.id || `${Date.now()}`, + duration: alert.duration || DEFAULT_DURATION, + }; - this.accumulate(alert); + this.accumulate(newAlert); - this.scheduleCleanse(alert); + this.scheduleCleanse(newAlert); - this.alerts[alert.id] = alert; + this.alerts[newAlert.id] = newAlert; this.emit('ALERTS_CHANGE'); } diff --git a/client/src/javascript/stores/AuthStore.tsx b/client/src/javascript/stores/AuthStore.tsx index 934aa4df..9840299b 100644 --- a/client/src/javascript/stores/AuthStore.tsx +++ b/client/src/javascript/stores/AuthStore.tsx @@ -1,5 +1,4 @@ import AppDispatcher from '../dispatcher/AppDispatcher'; -import AuthActions from '../actions/AuthActions'; import BaseStore from './BaseStore'; import ConfigStore from './ConfigStore'; import FloodActions from '../actions/FloodActions'; @@ -40,10 +39,6 @@ class AuthStoreClass extends BaseStore { username: null, }; - createUser(config: UserConfig) { - AuthActions.createUser(config); - } - addOptimisticUser(credentials: Credentials) { this.optimisticUsers.push({username: credentials.username}); this.emit('AUTH_LIST_USERS_SUCCESS'); @@ -129,16 +124,20 @@ class AuthStoreClass extends BaseStore { } handleAuthVerificationSuccess(credentials: Credentials) { + this.currentUser = { + username: credentials.username, + isAdmin: credentials.isAdmin, + isInitialUser: credentials.initialUser, + }; + if (credentials.token != null) { // Auth is disabled if a token is sent on verification ConfigStore.setDisableAuth(true); - credentials.initialUser = false; + this.currentUser.isInitialUser = false; } - this.currentUser.username = credentials.username; - this.currentUser.isAdmin = credentials.isAdmin; - this.currentUser.isInitialUser = credentials.initialUser; + this.isAuthenticating = true; - this.isAuthenticated = !credentials.initialUser; + this.isAuthenticated = !this.currentUser.isInitialUser; this.emit('AUTH_VERIFY_SUCCESS', credentials); } diff --git a/client/src/javascript/stores/ConfigStore.tsx b/client/src/javascript/stores/ConfigStore.tsx index d145d545..fab10d86 100644 --- a/client/src/javascript/stores/ConfigStore.tsx +++ b/client/src/javascript/stores/ConfigStore.tsx @@ -2,23 +2,23 @@ import BaseStore from './BaseStore'; let disableUsersAndAuth = false; -class ConfigStoreClass extends BaseStore { - getBaseURI(): string { +class ConfigStore extends BaseStore { + static getBaseURI(): string { const {pathname} = window.location; return pathname.substr(0, pathname.lastIndexOf('/') + 1); } - getPollInterval(): number { + static getPollInterval(): number { return Number(process.env.POLL_INTERVAL) || 5000; } - getDisableAuth(): boolean { + static getDisableAuth(): boolean { return disableUsersAndAuth; } - setDisableAuth(val: boolean): void { + static setDisableAuth(val: boolean): void { disableUsersAndAuth = val; } } -export default new ConfigStoreClass(); +export default ConfigStore; diff --git a/client/src/javascript/stores/FeedsStore.tsx b/client/src/javascript/stores/FeedsStore.tsx index c9ac4fe4..f6636d2c 100644 --- a/client/src/javascript/stores/FeedsStore.tsx +++ b/client/src/javascript/stores/FeedsStore.tsx @@ -35,44 +35,44 @@ export type Feeds = Array; export type Rules = Array; export type Items = Array; -class FeedsStoreClass extends BaseStore { +export class FeedsStoreClass extends BaseStore { feeds: Feeds = []; rules: Rules = []; items: Items = []; - addFeed(feed: Feed) { + static addFeed(feed: Feed) { SettingsActions.addFeed(feed); } - modifyFeed(id: Feed['_id'], feed: Feed) { + static modifyFeed(id: Feed['_id'], feed: Feed) { SettingsActions.modifyFeed(id, feed); } - addRule(rule: Rule) { + static addRule(rule: Rule) { SettingsActions.addRule(rule); } - fetchFeedMonitors(query?: string) { + static fetchFeedMonitors(query?: string) { SettingsActions.fetchFeedMonitors(query); } - fetchFeeds(query: string) { + static fetchFeeds(query: string) { SettingsActions.fetchFeeds(query); } - fetchItems(query: {params: {id: string; search: string}}) { + static fetchItems(query: {params: {id: string; search: string}}) { SettingsActions.fetchItems(query); } - fetchRules(query: string) { + static fetchRules(query: string) { SettingsActions.fetchRules(query); } - removeFeed(id: Feed['_id']) { + static removeFeed(id: Feed['_id']) { SettingsActions.removeFeedMonitor(id); } - removeRule(id: Rule['_id']) { + static removeRule(id: Rule['_id']) { SettingsActions.removeFeedMonitor(id); } @@ -93,7 +93,7 @@ class FeedsStoreClass extends BaseStore { } handleFeedAddSuccess() { - this.fetchFeedMonitors(); + FeedsStoreClass.fetchFeedMonitors(); this.emit('SETTINGS_FEED_MONITOR_FEED_ADD_SUCCESS'); } @@ -102,7 +102,7 @@ class FeedsStoreClass extends BaseStore { } handleFeedModifySuccess() { - this.fetchFeedMonitors(); + FeedsStoreClass.fetchFeedMonitors(); this.emit('SETTINGS_FEED_MONITOR_FEED_MODIFY_SUCCESS'); } @@ -111,7 +111,7 @@ class FeedsStoreClass extends BaseStore { } handleRuleAddSuccess() { - this.fetchFeedMonitors(); + FeedsStoreClass.fetchFeedMonitors(); this.emit('SETTINGS_FEED_MONITOR_RULE_ADD_SUCCESS'); } @@ -130,7 +130,7 @@ class FeedsStoreClass extends BaseStore { } handleFeedMonitorRemoveSuccess(id: string) { - this.fetchFeedMonitors(); + FeedsStoreClass.fetchFeedMonitors(); this.emit('SETTINGS_FEED_MONITOR_REMOVE_SUCCESS', id); } diff --git a/client/src/javascript/stores/NotificationStore.tsx b/client/src/javascript/stores/NotificationStore.tsx index d462eb4b..9598f668 100644 --- a/client/src/javascript/stores/NotificationStore.tsx +++ b/client/src/javascript/stores/NotificationStore.tsx @@ -59,7 +59,7 @@ class NotificationStoreClass extends BaseStore { this.emit('NOTIFICATIONS_COUNT_CHANGE', notificationCount); } - handleNotificationsClearSuccess(options: NotificationClearOptions) { + static handleNotificationsClearSuccess(options: NotificationClearOptions) { FloodActions.fetchNotifications({ ...options, start: 0, @@ -83,7 +83,7 @@ NotificationStore.dispatcherID = AppDispatcher.register((payload) => { switch (action.type) { case 'FLOOD_CLEAR_NOTIFICATIONS_SUCCESS': - NotificationStore.handleNotificationsClearSuccess(action.data as NotificationClearOptions); + NotificationStoreClass.handleNotificationsClearSuccess(action.data as NotificationClearOptions); break; case 'FLOOD_FETCH_NOTIFICATIONS_ERROR': NotificationStore.handleNotificationsFetchError(); diff --git a/client/src/javascript/stores/SettingsStore.tsx b/client/src/javascript/stores/SettingsStore.tsx index 74c64f32..026cc643 100644 --- a/client/src/javascript/stores/SettingsStore.tsx +++ b/client/src/javascript/stores/SettingsStore.tsx @@ -199,7 +199,7 @@ class SettingsStoreClass extends BaseStore { } } - saveFloodSettings(settings: SettingUpdatesFlood, options: object = {}) { + saveFloodSettings(settings: SettingUpdatesFlood, options: Record = {}) { SettingsActions.saveSettings(settings, options); settings.forEach(

    ({id, data}: {id: P; data: V}) => { this.floodSettings[id] = data; @@ -207,21 +207,17 @@ class SettingsStoreClass extends BaseStore { this.emit('SETTINGS_CHANGE'); } - saveClientSettings(settings: SettingUpdatesClient, options: object = {}) { - // Special case: - // DHT mode uses different set and get methods. (rTorrent's problem) - // TODO: This is cleaner than previous solution but it is still dirty. - // It is totally nonsense that dht.mode.set sets DHT mode but dht.mode doesn't work. - const dhtSetting = settings.find(({id}) => id === 'dht'); - if (dhtSetting != null) { - settings = settings.concat({ - id: 'dhtStats', - data: {dht: dhtSetting.data}, - }); - } - + saveClientSettings(settings: SettingUpdatesClient, options: Record = {}) { ClientActions.saveSettings(settings, options); settings.forEach(

    ({id, data}: {id: P; data: V}) => { + if (id === 'dht') { + // Special case: + // DHT mode uses different set and get methods. (rTorrent's problem) + // TODO: This is cleaner than previous solution but it is still dirty. + // It is totally nonsense that dht.mode.set sets DHT mode but dht.mode doesn't work. + this.clientSettings.dhtStats = {dht: data}; + return; + } this.clientSettings[id] = data; }); this.emit('SETTINGS_CHANGE'); diff --git a/client/src/javascript/stores/TorrentStore.tsx b/client/src/javascript/stores/TorrentStore.tsx index 188a3561..630b08d3 100644 --- a/client/src/javascript/stores/TorrentStore.tsx +++ b/client/src/javascript/stores/TorrentStore.tsx @@ -5,10 +5,10 @@ import AppDispatcher from '../dispatcher/AppDispatcher'; import BaseStore from './BaseStore'; import ConfigStore from './ConfigStore'; import {filterTorrents} from '../util/filterTorrents'; -import {searchTorrents} from '../util/searchTorrents'; -import {selectTorrents} from '../util/selectTorrents'; +import searchTorrents from '../util/searchTorrents'; +import selectTorrents from '../util/selectTorrents'; import SettingsStore from './SettingsStore'; -import {sortTorrents} from '../util/sortTorrents'; +import sortTorrents from '../util/sortTorrents'; import TorrentActions from '../actions/TorrentActions'; import TorrentFilterStore from './TorrentFilterStore'; import UIStore from './UIStore'; @@ -281,7 +281,7 @@ class TorrentStoreClass extends BaseStore { }); } - handleRemoveTorrentsSuccess(response: {count: number; deleteData: boolean}) { + static handleRemoveTorrentsSuccess(response: {count: number; deleteData: boolean}) { SettingsStore.setFloodSetting('deleteTorrentData', response.deleteData); AlertStore.add({ @@ -293,7 +293,7 @@ class TorrentStoreClass extends BaseStore { }); } - handleRemoveTorrentsError(error: Error & {count: number}) { + static handleRemoveTorrentsError(error: Error & {count: number}) { AlertStore.add({ accumulation: { id: 'alert.torrent.remove.failed', @@ -422,10 +422,10 @@ TorrentStore.dispatcherID = AppDispatcher.register((payload) => { TorrentStore.handleMoveTorrentsError(action.error as Error & {count: number}); break; case 'CLIENT_REMOVE_TORRENT_SUCCESS': - TorrentStore.handleRemoveTorrentsSuccess(action.data as {count: number; deleteData: boolean}); + TorrentStoreClass.handleRemoveTorrentsSuccess(action.data as {count: number; deleteData: boolean}); break; case 'CLIENT_REMOVE_TORRENT_ERROR': - TorrentStore.handleRemoveTorrentsError(action.error as Error & {count: number}); + TorrentStoreClass.handleRemoveTorrentsError(action.error as Error & {count: number}); break; case 'CLIENT_SET_FILE_PRIORITY_SUCCESS': TorrentStore.handleSetFilePrioritySuccess(); diff --git a/client/src/javascript/stores/UIStore.tsx b/client/src/javascript/stores/UIStore.tsx index 0860db24..df266920 100644 --- a/client/src/javascript/stores/UIStore.tsx +++ b/client/src/javascript/stores/UIStore.tsx @@ -132,11 +132,7 @@ class UIStoreClass extends BaseStore { this.applyStyles(); } - registerDependency(dependencies: Array> | Omit) { - if (!Array.isArray(dependencies)) { - dependencies = [dependencies]; - } - + registerDependency(dependencies: Array>) { dependencies.forEach((dependency) => { const {id} = dependency; diff --git a/client/src/javascript/ui/components/Button.tsx b/client/src/javascript/ui/components/Button.tsx index 7793895f..80185409 100644 --- a/client/src/javascript/ui/components/Button.tsx +++ b/client/src/javascript/ui/components/Button.tsx @@ -17,7 +17,7 @@ export type ButtonProps = Pick, 'd wrap?: boolean; wrapper?: string | React.FunctionComponent; - wrapperProps?: object; + wrapperProps?: Record; grow?: boolean; shrink?: boolean; }; diff --git a/client/src/javascript/ui/components/FormGroup.tsx b/client/src/javascript/ui/components/FormGroup.tsx index 369754a4..db8b5656 100644 --- a/client/src/javascript/ui/components/FormGroup.tsx +++ b/client/src/javascript/ui/components/FormGroup.tsx @@ -5,10 +5,11 @@ import FormRowItem from './FormRowItem'; import type {FormRowItemProps} from './FormRowItem'; export default class FormRowItemGroup extends Component<{label?: string; width?: FormRowItemProps['width']}> { - getLabel() { + getLabel(): React.ReactNode { if (this.props.label) { return ; } + return undefined; } render() { diff --git a/client/src/javascript/ui/components/Select.tsx b/client/src/javascript/ui/components/Select.tsx index 941c93f5..92d1bade 100644 --- a/client/src/javascript/ui/components/Select.tsx +++ b/client/src/javascript/ui/components/Select.tsx @@ -125,7 +125,7 @@ export default class Select extends Component { }, []); } - getLabel() { + getLabel(): React.ReactNode { if (this.props.label) { return ( ); } + + return undefined; } getSelectedItem(children: React.ReactNodeArray): React.ReactElement | undefined { @@ -148,6 +150,8 @@ export default class Select extends Component { if (selectedItem) { return React.cloneElement(selectedItem as React.ReactElement, {isTrigger: true}); } + + return undefined; } getTrigger(selectItems: React.ReactNodeArray) { diff --git a/client/src/javascript/ui/components/Textbox.tsx b/client/src/javascript/ui/components/Textbox.tsx index f8b3b526..5784a729 100644 --- a/client/src/javascript/ui/components/Textbox.tsx +++ b/client/src/javascript/ui/components/Textbox.tsx @@ -25,7 +25,7 @@ export default class Textbox extends Component { type: 'text', }; - getLabel() { + getLabel(): React.ReactNode { if (this.props.label) { return ( ); } + return undefined; } render() { @@ -40,7 +41,7 @@ export default class Textbox extends Component { const children = React.Children.map(this.props.children, (child) => { const childAsElement = child as React.ReactElement; if (childAsElement && childAsElement.type === FormElementAddon) { - addonCount++; + addonCount += 1; return React.cloneElement(childAsElement, { addonIndex: addonCount, addonPlacement: this.props.addonPlacement, diff --git a/client/src/javascript/ui/components/ToggleInput.tsx b/client/src/javascript/ui/components/ToggleInput.tsx index 032d9c00..27de32ec 100644 --- a/client/src/javascript/ui/components/ToggleInput.tsx +++ b/client/src/javascript/ui/components/ToggleInput.tsx @@ -45,24 +45,27 @@ class ToggleInput extends Component { }; } - getCheckedProp() { + getCheckedProp(): React.InputHTMLAttributes['checked'] { // When element is controlled, we provide the checked prop. if (this.props.useProps) { return this.props.checked != null && this.props.checked; } + return undefined; } - getDefaultCheckedProp() { + getDefaultCheckedProp(): React.InputHTMLAttributes['defaultChecked'] { // When element is uncontrolled, we provide the defaultChecked prop. if (!this.props.useProps) { return this.props.checked; } + return undefined; } - getValueProp() { + getValueProp(): React.InputHTMLAttributes['value'] { if (this.props.type === 'radio') { return this.props.value; } + return undefined; } handleInputChange = (event: React.ChangeEvent) => { diff --git a/client/src/javascript/ui/components/util/forms.tsx b/client/src/javascript/ui/components/util/forms.tsx index f319b00c..ce79dc13 100644 --- a/client/src/javascript/ui/components/util/forms.tsx +++ b/client/src/javascript/ui/components/util/forms.tsx @@ -23,22 +23,23 @@ export const getDataFromForm = (form: HTMLFormElement) => { return Array.from(form.elements).reduce((formData: Record, element) => { const inputElement = element as HTMLInputElement; const {name, type, value} = inputElement; + const retForm = formData; if (!name || type === 'button' || type === 'submit' || type === 'reset') { - return formData; + return retForm; } if (type === 'checkbox') { - formData[name] = inputElement.checked; + retForm[name] = inputElement.checked; } else if (type !== 'radio') { - formData[name] = value; + retForm[name] = value; } else if (type === 'radio' && !inputElement.checked && formData[name] === undefined) { - formData[name] = null; + retForm[name] = null; } else if (type === 'radio' && inputElement.checked) { - formData[name] = value; + retForm[name] = value; } - return formData; + return retForm; }, {}); }; diff --git a/client/src/javascript/util/connectStores.tsx b/client/src/javascript/util/connectStores.tsx index 5fc8eafd..db45ba4d 100644 --- a/client/src/javascript/util/connectStores.tsx +++ b/client/src/javascript/util/connectStores.tsx @@ -38,7 +38,10 @@ export interface EventListenerDescriptor Partial; } -const connectStores = ( +const connectStores = < + ConnectedComponentProps extends Record, + ConnectedComponentStates extends Record +>( InputComponent: React.JSXElementConstructor, getEventListenerDescriptors: ( props: ConnectedComponentProps, @@ -60,7 +63,7 @@ const connectStores = = 'en'; let localeDetected = false; -export default function (): keyof typeof Languages { +function detectLocale(): Exclude { if (localeDetected) { return detectedLocale; } @@ -12,29 +12,32 @@ export default function (): keyof typeof Languages { getUserLocales() .reverse() .forEach((userLocale): void => { - switch (userLocale) { + let locale = userLocale; + switch (locale) { // Special handlings for languages with variants case 'zh': case 'zh-CN': case 'zh-SG': case 'zh-MY': - userLocale = 'zh-Hans'; + locale = 'zh-Hans'; break; case 'zh-TW': case 'zh-HK': case 'zh-MO': - userLocale = 'zh-Hant'; + locale = 'zh-Hant'; break; default: break; } - if (Object.prototype.hasOwnProperty.call(Languages, userLocale)) { - detectedLocale = userLocale as keyof typeof Languages; - } else if (Object.prototype.hasOwnProperty.call(Languages, userLocale.substr(0, 2))) { + if (Object.prototype.hasOwnProperty.call(Languages, locale)) { + detectedLocale = locale as Exclude; + } else if (Object.prototype.hasOwnProperty.call(Languages, locale.substr(0, 2))) { // In rare cases, user provides a locale (eg. en-US) without fallback (eg. en) - detectedLocale = userLocale.substr(0, 2) as keyof typeof Languages; + detectedLocale = locale.substr(0, 2) as Exclude; } }); localeDetected = true; return detectedLocale; } + +export default detectLocale; \ No newline at end of file diff --git a/client/src/javascript/util/searchTorrents.tsx b/client/src/javascript/util/searchTorrents.tsx index d1919216..545d1511 100644 --- a/client/src/javascript/util/searchTorrents.tsx +++ b/client/src/javascript/util/searchTorrents.tsx @@ -1,16 +1,16 @@ import type {TorrentProperties} from '../stores/TorrentStore'; -export function searchTorrents(torrents: Array, searchString: string): Array { +function searchTorrents(torrents: Array, searchString: string): Array { if (searchString !== '') { const queries: Array = []; const searchTerms = searchString.replace(/,/g, ' ').split(' '); - for (let i = 0, len = searchTerms.length; i < len; i++) { + for (let i = 0, len = searchTerms.length; i < len; i += 1) { queries.push(new RegExp(searchTerms[i], 'gi')); } - torrents = torrents.filter((torrent) => { - for (let i = 0, len = queries.length; i < len; i++) { + return torrents.filter((torrent) => { + for (let i = 0, len = queries.length; i < len; i += 1) { if (!torrent.name.match(queries[i])) { return false; } @@ -21,3 +21,5 @@ export function searchTorrents(torrents: Array, searchString: return torrents; } + +export default searchTorrents; diff --git a/client/src/javascript/util/selectTorrents.tsx b/client/src/javascript/util/selectTorrents.tsx index a315217f..91a89743 100644 --- a/client/src/javascript/util/selectTorrents.tsx +++ b/client/src/javascript/util/selectTorrents.tsx @@ -9,7 +9,7 @@ interface SelectTorrentOptions { torrentList: Array; } -export function selectTorrents(options: SelectTorrentOptions): string[] { +function selectTorrents(options: SelectTorrentOptions): string[] { if (options.event.shiftKey) { if (options.selectedTorrents.length) { const lastHash = options.selectedTorrents[options.selectedTorrents.length - 1]; @@ -65,7 +65,7 @@ export function selectTorrents(options: SelectTorrentOptions): string[] { currentHashIndex += increment; } } else { - options.selectedTorrents = [options.hash]; + return [options.hash]; } } else if (options.event.metaKey || options.event.ctrlKey) { const hashPosition = options.selectedTorrents.indexOf(options.hash); @@ -78,7 +78,9 @@ export function selectTorrents(options: SelectTorrentOptions): string[] { } } else { // clicked torrent is only item in list. - options.selectedTorrents = [options.hash]; + return [options.hash]; } return options.selectedTorrents; } + +export default selectTorrents; diff --git a/client/src/javascript/util/sortTorrents.tsx b/client/src/javascript/util/sortTorrents.tsx index d80a3cc4..1fd93a6f 100644 --- a/client/src/javascript/util/sortTorrents.tsx +++ b/client/src/javascript/util/sortTorrents.tsx @@ -4,7 +4,7 @@ import type {Duration, Torrents, TorrentProperties} from '../stores/TorrentStore const stringProps = ['basePath', 'comment', 'hash', 'message', 'name']; -export function sortTorrents(torrentsHash: Torrents, sortBy: FloodSettings['sortTorrents']) { +function sortTorrents(torrentsHash: Torrents, sortBy: FloodSettings['sortTorrents']) { const torrents = Object.keys(torrentsHash).map((hash) => ({...torrentsHash[hash]})); if (torrents.length) { @@ -78,3 +78,5 @@ export function sortTorrents(torrentsHash: Torrents, sortBy: FloodSettings['sort } return torrents; } + +export default sortTorrents; diff --git a/package-lock.json b/package-lock.json index 569373f5..916fe0ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1359,6 +1359,65 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, "@formatjs/cli": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-2.11.2.tgz", @@ -1999,12 +2058,6 @@ "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", "dev": true }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, "@types/express": { "version": "4.17.8", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", @@ -2159,6 +2212,12 @@ "integrity": "sha512-DY2QwdrBqNlsxdMehwzUtSsWHgYYPLVCAuXvOcu3wkzYmchbRunQ7OEZFOrmFoBLfA1ysz2Ypr6vtNP9WQkUaQ==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/passport": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.4.tgz", @@ -2346,80 +2405,184 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.1.1.tgz", + "integrity": "sha512-Hoxyt99EA9LMmqo/5PuWWPeWeB3mKyvibfJ1Hy5SfiUpjE8Nqp+5QNd9fOkzL66+fqvIWSIE+Ett16LGMzCGnQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "4.1.1", + "@typescript-eslint/scope-manager": "4.1.1", + "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.1.1.tgz", + "integrity": "sha512-jzYsNciHoa4Z3c1URtmeT/bamYm8Dwfw6vuN3WHIE/BXb1iC4KveAnXDErTAZtPVxTYBaYn3n2gbt6F6D2rm1A==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", + "@typescript-eslint/scope-manager": "4.1.1", + "@typescript-eslint/types": "4.1.1", + "@typescript-eslint/typescript-estree": "4.1.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" }, "dependencies": { "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } } } }, "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.1.1.tgz", + "integrity": "sha512-NLIhmicpKGfJbdXyQBz9j48PA6hq6e+SDOoXy7Ak6bq1ebGqbgG+fR1UIDAuay6OjQdot69c/URu2uLlsP8GQQ==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "@typescript-eslint/scope-manager": "4.1.1", + "@typescript-eslint/types": "4.1.1", + "@typescript-eslint/typescript-estree": "4.1.1", + "debug": "^4.1.1" } }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "@typescript-eslint/scope-manager": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.1.1.tgz", + "integrity": "sha512-0W8TTobCvIIQ2FsrYTffyZGAAFUyIbEHq5EYJb1m7Rpd005jrnOvKOo8ywCLhs/Bm17C+KsrUboBvBAARQVvyA==", "dev": true, "requires": { + "@typescript-eslint/types": "4.1.1", + "@typescript-eslint/visitor-keys": "4.1.1" + } + }, + "@typescript-eslint/types": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.1.1.tgz", + "integrity": "sha512-zrBiqOKYerMTllKcn+BP+i1b7LW/EbMMYytroXMxUTvFPn1smkCu0D7lSAx29fTUO4jnwV0ljSvYQtn2vNrNxA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.1.1.tgz", + "integrity": "sha512-2AUg5v0liVBsqbGxBphbJ0QbGqSRVaF5qPoTPWcxop+66vMdU1h4CCvHxTC47+Qb+Pr4l2RhXDd41JNpwcQEKw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.1.1", + "@typescript-eslint/visitor-keys": "4.1.1", "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", + "globby": "^11.0.1", "is-glob": "^4.0.1", "lodash": "^4.17.15", "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, "semver": { @@ -2427,6 +2590,30 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.1.1.tgz", + "integrity": "sha512-/EOOXbA2ferGLG6RmCHEQ0lTTLkOlXYDgblCmQk3tIU7mTPLm4gKhFMeeUSe+bcchTUsKeCk8xcpbop5Zr/8Rw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.1.1", + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true } } }, @@ -2644,9 +2831,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "add-px-to-style": { @@ -2758,23 +2945,6 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -3552,69 +3722,48 @@ "dev": true }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.0.0.tgz", + "integrity": "sha512-rFlVYthz6Iw0LhEYryiGGyjTGofebWie3ydvtqTCJiwWe+z6y8H35b4cadYbOUcYlP495TNeVktW+ZZqxbPW4Q==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", + "browserslist": "^4.14.2", + "caniuse-lite": "^1.0.30001131", "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" }, "dependencies": { - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - } + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "caniuse-lite": { + "version": "1.0.30001131", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", + "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "electron-to-chromium": { + "version": "1.3.570", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", + "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==", + "dev": true + }, + "node-releases": { + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "dev": true } } }, @@ -4564,32 +4713,6 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4617,7 +4740,8 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "camelcase-keys": { "version": "2.1.0", @@ -4979,15 +5103,6 @@ "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", "dev": true }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -5009,6 +5124,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5018,22 +5134,26 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5044,6 +5164,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -5731,41 +5852,34 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } @@ -5886,6 +6000,28 @@ "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", "dev": true }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -5909,6 +6045,17 @@ "json5": "^2.1.2" } }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -5925,6 +6072,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -6437,7 +6599,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", @@ -7176,6 +7339,23 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, "entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -7295,8 +7475,7 @@ "escalade": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", - "dev": true + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" }, "escape-goat": { "version": "2.1.1", @@ -7316,22 +7495,24 @@ "dev": true }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", + "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "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", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -7340,62 +7521,39 @@ "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", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "doctrine": { @@ -7408,30 +7566,38 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -7447,34 +7613,40 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "strip-json-comments": { @@ -7482,6 +7654,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -7635,6 +7816,17 @@ } } }, + "eslint-config-airbnb-typescript": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-10.0.0.tgz", + "integrity": "sha512-me2QQj+MUc9+vsr44ZMgGdI2f7Brd7dWTl/+ly9r5RFsoSPkwzV/N4tTg5ZOrtA4Ay18urKPKmwLGe9TTIDxnw==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^4.0.1", + "eslint-config-airbnb": "^18.2.0", + "eslint-config-airbnb-base": "^14.2.0" + } + }, "eslint-config-prettier": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", @@ -7645,12 +7837,20 @@ } }, "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", + "version": "6.0.0-next.98", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0-next.98.tgz", + "integrity": "sha512-mU2brgZVhgb4M/Efv4lChqclNRkwQ6bOHukcUAey2AtRC1ll0jA1qhK5kVkTQJ0yUxpUSv2ZOP5hu5Yz4dUJOw==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.9" + "confusing-browser-globals": "2.0.0-next.281+025f2739" + }, + "dependencies": { + "confusing-browser-globals": { + "version": "2.0.0-next.281", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-2.0.0-next.281.tgz", + "integrity": "sha512-Lah3+jpqoLqS0B4fkvknPVGavxUe+CtAmMwY3S+VHyRhktmM/USnHpvOHL2QDqsGBCUbdApvPlxBgiLLzEFvbQ==", + "dev": true + } } }, "eslint-import-resolver-node": { @@ -7937,12 +8137,13 @@ } }, "eslint-plugin-flowtype": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.7.0.tgz", - "integrity": "sha512-M+hxhSCk5QBEValO5/UqrS4UunT+MgplIJK5wA1sCtXjzBcZkpTGRwxmLHhGpbHcrmQecgt6ZL/KDdXWqGB7VA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz", + "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { @@ -8089,6 +8290,15 @@ } } }, + "eslint-plugin-jest": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.0.1.tgz", + "integrity": "sha512-8tYFDqOHGr7vVfdVYspmlV4sRBTylrM4gSLgkGKlO6F+djDOEJ+tEU7I50smUs7AIvFnNZutXUQAMgI9s9N6xQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, "eslint-plugin-jsx-a11y": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", @@ -8233,9 +8443,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz", - "integrity": "sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz", + "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==", "dev": true }, "eslint-scope": { @@ -8272,14 +8482,14 @@ "dev": true }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "dev": true, "requires": { - "acorn": "^7.1.1", + "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.3.0" }, "dependencies": { "eslint-visitor-keys": { @@ -8306,9 +8516,9 @@ }, "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } @@ -8771,15 +8981,6 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -10304,6 +10505,56 @@ "dev": true, "requires": { "postcss": "^7.0.14" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "ieee754": { @@ -10348,15 +10599,6 @@ "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -10367,23 +10609,6 @@ "resolve-from": "^4.0.0" } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -10442,88 +10667,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -10813,12 +10956,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.0.tgz", @@ -11268,6 +11405,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -11472,13 +11615,13 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lie": { @@ -11489,6 +11632,33 @@ "immediate": "~3.0.5" } }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "dev": true, + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -11968,12 +12138,6 @@ "mime-db": "1.40.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -12279,12 +12443,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "mv": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", @@ -12331,6 +12489,12 @@ "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true }, + "nanoid": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -13297,15 +13461,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "open": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz", @@ -13342,17 +13497,17 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "original": { @@ -13405,6 +13560,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -13436,7 +13592,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "package-json": { "version": "6.5.0", @@ -13768,14 +13925,105 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.0.5.tgz", + "integrity": "sha512-3rDm6KR0jHstte3aL3ugrCyFA1UXY90SWNwRZ2WTmRf/QpOqM35mm0FrRR+HHZQ5fY9+nXFat1nl2ekYJf0P4w==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.12", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.2.tgz", + "integrity": "sha512-u7Qoa6GSPIeg9/hHbNnXspzuD5jjCIWKgk1fJ/gGJPS0uaj6Whk2zjXhDAiHZyYSrDmIzUQk7GgwRF22eRIQGQ==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.3", + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" }, "dependencies": { "chalk": { @@ -13800,6 +14048,17 @@ } } }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13817,50 +14076,6 @@ } } }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, "postcss-modules-local-by-default": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", @@ -13871,6 +14086,56 @@ "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-modules-scope": { @@ -13881,6 +14146,56 @@ "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-modules-values": { @@ -13891,6 +14206,56 @@ "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-selector-parser": { @@ -13917,9 +14282,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -15445,7 +15810,8 @@ "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "requires-port": { "version": "1.0.0", @@ -15527,16 +15893,6 @@ "integrity": "sha512-MTPto7t44AawqmSbEmvMKoSMWPnxjaTuHf94s7RjWxuSGFN0o8/b+6yOwkaC50+Vihjsu6ODUEQR397gTMn57w==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -16741,6 +17097,12 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "dev": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -17077,9 +17439,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -17689,12 +18051,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { @@ -19543,7 +19905,8 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "which-typed-array": { "version": "1.1.2", @@ -19691,6 +20054,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19700,12 +20064,14 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -19715,6 +20081,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -19722,22 +20089,26 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -19748,6 +20119,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -19831,7 +20203,8 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true }, "yallist": { "version": "2.1.2", @@ -19839,22 +20212,24 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.0", + "escalade": "^3.0.2", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.1", + "yargs-parser": "^20.0.0" }, "dependencies": { "ansi-regex": { @@ -19862,46 +20237,48 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", + "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -19919,17 +20296,28 @@ "requires": { "ansi-regex": "^5.0.0" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz", + "integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==" } } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==" }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 96be03c0..1927b54f 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "feedsub": "^0.7.1", "fs-extra": "^9.0.1", "geoip-country": "^4.0.36", + "glob": "^7.1.6", "http-errors": "^1.8.0", "joi": "^17.2.1", "jsonwebtoken": "^8.4.0", @@ -63,7 +64,7 @@ "spdy": "^4.0.2", "tar-stream": "^2.1.4", "xmlrpc": "^1.3.2", - "yargs": "^15.4.1" + "yargs": "^16.0.3" }, "devDependencies": { "@babel/core": "^7.11.6", @@ -90,9 +91,9 @@ "@types/react-router-dom": "^5.1.5", "@types/react-transition-group": "^4.4.0", "@types/spdy": "^3.4.4", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", - "autoprefixer": "^9.8.6", + "@typescript-eslint/eslint-plugin": "^4.1.1", + "@typescript-eslint/parser": "^4.1.1", + "autoprefixer": "^10.0.0", "axios": "^0.20.0", "babel-eslint": "^10.1.0", "babel-loader": "^8.0.6", @@ -102,21 +103,22 @@ "copy-webpack-plugin": "^6.1.0", "css-loader": "^4.3.0", "d3": "^6.1.1", - "eslint": "^6.8.0", + "eslint": "^7.9.0", "eslint-config-airbnb": "^18.2.0", + "eslint-config-airbnb-typescript": "^10.0.0", "eslint-config-prettier": "^6.11.0", - "eslint-config-react-app": "^5.2.1", + "eslint-config-react-app": "^6.0.0-next.98", "eslint-import-resolver-webpack": "^0.12.2", "eslint-loader": "^4.0.2", - "eslint-plugin-flowtype": "4.7.0", + "eslint-plugin-flowtype": "5.2.0", "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", "eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-react": "^7.20.6", - "eslint-plugin-react-hooks": "^2.5.1", + "eslint-plugin-react-hooks": "^4.1.2", "file-loader": "^6.1.0", "flux": "^3.1.3", "get-user-locale": "^1.4.0", - "glob": "^7.1.6", "html-webpack-plugin": "^4.4.1", "jsdoc": "^3.6.5", "minami": "^1.2.3", @@ -124,7 +126,8 @@ "nodemon": "^2.0.4", "object-assign": "4.1.1", "pascal-case": "^3.1.1", - "postcss-loader": "^3.0.0", + "postcss": "^8.0.5", + "postcss-loader": "^4.0.2", "prettier": "^2.1.2", "promise": "^8.1.0", "react": "^16.13.1", diff --git a/server/.eslintrc.js b/server/.eslintrc.js index 6a5f6a97..979f3342 100644 --- a/server/.eslintrc.js +++ b/server/.eslintrc.js @@ -7,6 +7,8 @@ module.exports = { }, rules: { + 'import/no-extraneous-dependencies': ['error', {devDependencies: false}], + 'no-console': 0, 'no-restricted-imports': [ 'error', { diff --git a/server/bin/enforce-prerequisites.ts b/server/bin/enforce-prerequisites.ts index 4dda8f79..b3dea856 100644 --- a/server/bin/enforce-prerequisites.ts +++ b/server/bin/enforce-prerequisites.ts @@ -57,7 +57,7 @@ const enforcePrerequisites = () => return; } - return resolve(); + resolve(); }); export default enforcePrerequisites; diff --git a/server/bin/start.ts b/server/bin/start.ts index b754a8e5..3e3ac61a 100755 --- a/server/bin/start.ts +++ b/server/bin/start.ts @@ -4,7 +4,7 @@ import chalk from 'chalk'; import enforcePrerequisites from './enforce-prerequisites'; import migrateData from './migrations/run'; -import {startWebServer} from './web-server'; +import startWebServer from './web-server'; enforcePrerequisites() .then(migrateData) diff --git a/server/bin/web-server.ts b/server/bin/web-server.ts index becfac11..7530e75e 100755 --- a/server/bin/web-server.ts +++ b/server/bin/web-server.ts @@ -25,9 +25,10 @@ const normalizePort = (val: string | number): string | number => { console.error('Unexpected port or pipe'); process.exit(1); + return 0; }; -export const startWebServer = () => { +const startWebServer = () => { const port = normalizePort(config.floodServerPort); const host = config.floodServerHost; const useSSL = config.ssl; @@ -106,3 +107,5 @@ export const startWebServer = () => { console.log(chalk.yellow('Starting without builtin authentication\n')); } }; + +export default startWebServer; diff --git a/server/models/TemporaryStorage.ts b/server/models/TemporaryStorage.ts index d33080dd..a9945ecf 100644 --- a/server/models/TemporaryStorage.ts +++ b/server/models/TemporaryStorage.ts @@ -8,11 +8,11 @@ class TemporaryStorage { fs.mkdirSync(tempPath, {recursive: true}); } - deleteFile(filename: string): void { - fs.unlinkSync(this.getTempPath(filename)); + static deleteFile(filename: string): void { + fs.unlinkSync(TemporaryStorage.getTempPath(filename)); } - getTempPath(filename: string): string { + static getTempPath(filename: string): string { return path.join(tempPath, filename); } } diff --git a/server/util/ajaxUtil.ts b/server/util/ajaxUtil.ts index 2482682f..038cdcf1 100644 --- a/server/util/ajaxUtil.ts +++ b/server/util/ajaxUtil.ts @@ -8,7 +8,7 @@ const ajaxUtil = { } if (typeof error === 'string') { - error = Error(error); + res.status(500).json(Error(error)); } res.status(500).json(error); diff --git a/shared/types/ClientSettings.tsx b/shared/types/ClientSettings.tsx index b55a92b9..8f166372 100644 --- a/shared/types/ClientSettings.tsx +++ b/shared/types/ClientSettings.tsx @@ -5,5 +5,5 @@ import {clientSettings} from '../constants/clientSettingsMap'; export type ClientSetting = keyof typeof clientSettings; export type ClientSettings = { // TODO: Need proper types for each property - [property in ClientSetting]?: string | object | null; + [property in ClientSetting]?: string | Record | null; };