From bef17ef534fc0309b69d4d0f083273e6222a2e7c Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Tue, 2 Mar 2021 15:44:40 +0100 Subject: [PATCH] Release/3.6.0 (#527) * feat: (wip) authorize note access * fix: remove multiEditorEnabled * refactor: update SNJS + eslint * refactor: remove privileges in favor of SNJS protections * fix: do not close editor when editing an archived note * chore: remove progress indicator for webpack dev server * fix: add rel="noreferrer" to bugsnag links * chore(deps): upgrade snjs * chore(deps): upgrade snjs * feat: batch manager protection + react challenge modal + eslint fix * fix: lint errors * fix: launch state error * fix: challenge modal: cancel instead of dismiss when pressing escape * feat: improve focus styles * fix: cancel session revoking when pressing escape on confirm dialog * fix: lint warning * chore(deps): upgrade minor versions * feat: make SNWebCrypto a constant * feat: add random identifier to bugsnag reports * fix: check onKeyUp instead of onKeyDown * feat: implement SNJS backup file password retrieval * chore(deps): upgrade snjs * feat: display warning banner when using the app with no account * fix: properly color svg button * fix: wording * fix: hide account warning after login + improve key storage wording * chore(deps): upgrade stylekit * feat: use stylekit fonts for the editor * chore(deps): bump nokogiri from 1.10.8 to 1.11.1 (#511) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.8 to 1.11.1. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.8...v1.11.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> * chore(deps): bump ini from 1.3.5 to 1.3.8 (#504) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> * fix: rename master branch to main * fix: add missing placeholders for submodules (#516) Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> * chore(deps): upgrade snjs, babel, typescript, reach, mobx, preact * feat: clear protection session * fix: use correct close icon size * fix: hide protections paragraph when no account or passcode exist * chore(deps): remove unused dependencies * fix: button casing * feat: implement SNApplication.hasProtectionSources * chore(version): 3.6.0 * feat: enable sessions management for every build * feat: make "Protected" flag more subtle * fix: only match protected note title * fix: remove inconsistencies between protected note label and date * feat: show warning when protecting a note with no protection source * feat: make unprotecting a note a protected action * chore(deps): upgrade snjs * chore(version): 3.6.0-beta01 * fix: run docker with root to fix crashing on Linux (undoes 62da387d3a) (#525) * feat: make encrypted backups protected (#524) Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: proletarius101 <54175165+proletarius101@users.noreply.github.com> Co-authored-by: Darius JJ Chuck <79410894+standarius@users.noreply.github.com> Co-authored-by: Antonella Sgarlatta --- .eslintrc | 9 +- .github/workflows/dev.yml | 5 +- .github/workflows/pr.yml | 9 + .github/workflows/prod.yml | 5 +- Dockerfile | 15 +- Gemfile.lock | 12 +- app/assets/fonts/ionicons.svg | 38 - app/assets/icons/ic_close.svg | 3 + app/assets/javascripts/@types/modules.ts | 3 + app/assets/javascripts/app.ts | 13 +- .../components/NoAccountWarning.tsx | 39 + .../SessionsModal.tsx} | 82 +- app/assets/javascripts/components/utils.ts | 56 + app/assets/javascripts/crypto.ts | 3 + app/assets/javascripts/database.ts | 1 + .../directives/functional/click-outside.ts | 2 +- .../directives/functional/delay-hide.ts | 8 +- .../directives/functional/elemReady.ts | 2 +- .../directives/functional/infiniteScroll.ts | 2 +- .../directives/views/accountMenu.ts | 474 ++- .../directives/views/actionsMenu.ts | 8 +- .../directives/views/componentView.ts | 3 +- .../directives/views/editorMenu.ts | 6 +- .../directives/views/historyMenu.ts | 2 +- .../javascripts/directives/views/index.ts | 2 - .../directives/views/panelResizer.ts | 6 +- .../directives/views/passwordWizard.ts | 2 +- .../directives/views/privilegesAuthModal.ts | 128 - .../views/privilegesManagementModal.ts | 118 - app/assets/javascripts/index.ts | 1 - .../javascripts/services/archiveManager.ts | 63 +- .../javascripts/services/browserBridge.ts | 11 +- .../javascripts/services/desktopManager.ts | 14 +- .../javascripts/services/errorReporting.ts | 27 +- .../javascripts/services/keyboardManager.ts | 10 +- .../javascripts/services/localStorage.ts | 10 +- .../javascripts/services/nativeExtManager.ts | 10 +- .../javascripts/services/themeManager.ts | 4 +- app/assets/javascripts/strings.ts | 130 +- app/assets/javascripts/tsconfig.json | 3 +- app/assets/javascripts/typings/pug.d.ts | 2 +- app/assets/javascripts/ui_models/app_state.ts | 189 +- .../javascripts/ui_models/application.ts | 110 +- .../javascripts/ui_models/component_group.ts | 10 +- .../javascripts/ui_models/editor_group.ts | 2 +- app/assets/javascripts/utils.ts | 52 +- .../views/abstract/pure_view_ctrl.ts | 8 +- .../account_switcher/account_switcher.ts | 8 +- .../views/application/application-view.pug | 8 + .../views/application/application_view.ts | 95 +- .../views/challenge_modal/challenge-modal.pug | 59 - .../views/challenge_modal/challenge_modal.ts | 208 -- .../views/challenge_modal/challenge_modal.tsx | 409 +++ .../javascripts/views/editor/editor-view.pug | 5 +- .../javascripts/views/editor/editor_view.ts | 170 +- .../views/editor_group/editor_group_view.ts | 7 +- .../javascripts/views/footer/footer_view.ts | 52 +- app/assets/javascripts/views/index.ts | 2 +- .../javascripts/views/notes/note_utils.ts | 44 +- .../javascripts/views/notes/notes-view.pug | 14 +- .../javascripts/views/notes/notes_view.ts | 14 +- .../javascripts/views/tags/tags-view.pug | 12 +- .../javascripts/views/tags/tags_view.ts | 14 +- app/assets/stylesheets/_editor.scss | 9 +- app/assets/stylesheets/_ionicons.scss | 3 +- app/assets/stylesheets/_main.scss | 2 + app/assets/stylesheets/_modals.scss | 49 - app/assets/stylesheets/_notes.scss | 18 +- app/assets/stylesheets/_reach-sub.scss | 2 + app/assets/stylesheets/_sessions-modal.scss | 3 + app/assets/stylesheets/_sn.scss | 16 + app/assets/stylesheets/_stylekit-sub.scss | 13 +- app/assets/stylesheets/_tags.scss | 1 + app/assets/stylesheets/_ui.scss | 190 +- app/assets/stylesheets/index.css.scss | 1 + .../templates/directives/account-menu.pug | 56 +- .../directives/permissions-modal.pug | 8 +- .../directives/privileges-auth-modal.pug | 37 - .../privileges-management-modal.pug | 51 - app/extensions/extensions-manager | 1 + package.json | 62 +- vendor/extensions/extensions-manager | 1 + webpack.config.js | 6 +- yarn.lock | 2574 +++++++++++------ 84 files changed, 3410 insertions(+), 2526 deletions(-) delete mode 100644 app/assets/fonts/ionicons.svg create mode 100644 app/assets/icons/ic_close.svg create mode 100644 app/assets/javascripts/@types/modules.ts create mode 100644 app/assets/javascripts/components/NoAccountWarning.tsx rename app/assets/javascripts/{directives/views/sessionsModal.tsx => components/SessionsModal.tsx} (84%) create mode 100644 app/assets/javascripts/components/utils.ts create mode 100644 app/assets/javascripts/crypto.ts delete mode 100644 app/assets/javascripts/directives/views/privilegesAuthModal.ts delete mode 100644 app/assets/javascripts/directives/views/privilegesManagementModal.ts delete mode 100644 app/assets/javascripts/views/challenge_modal/challenge-modal.pug delete mode 100644 app/assets/javascripts/views/challenge_modal/challenge_modal.ts create mode 100644 app/assets/javascripts/views/challenge_modal/challenge_modal.tsx create mode 100644 app/assets/stylesheets/_sn.scss delete mode 100644 app/assets/templates/directives/privileges-auth-modal.pug delete mode 100644 app/assets/templates/directives/privileges-management-modal.pug create mode 160000 app/extensions/extensions-manager create mode 160000 vendor/extensions/extensions-manager diff --git a/.eslintrc b/.eslintrc index c88737d79..28f7be1df 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,13 @@ { - "extends": ["eslint:recommended", "prettier"], + "root": true, "parser": "@typescript-eslint/parser", + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "plugin:react-hooks/recommended" + ], + "plugins": ["@typescript-eslint", "react"], "parserOptions": { "project": "./app/assets/javascripts/tsconfig.json" }, diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index a84a4cff6..e5f7cac43 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -8,7 +8,7 @@ jobs: tsc: - name: Check types + name: Check types & lint runs-on: ubuntu-latest @@ -22,6 +22,9 @@ jobs: - name: Typescript run: yarn tsc + - name: ESLint + run: yarn lint --quiet + deploy: runs-on: ubuntu-latest diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9db89f10d..7ad942059 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -7,12 +7,21 @@ on: - main jobs: + tsc: + runs-on: ubuntu-latest + steps: + - name: Checkout code uses: actions/checkout@v2 + - name: Install dependencies run: yarn install --pure-lockfile + - name: Typescript run: yarn tsc + + - name: ESLint + run: yarn lint --quiet diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index 265403a8b..6447634af 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -8,7 +8,7 @@ jobs: tsc: - name: Check types + name: Check types & lint runs-on: ubuntu-latest @@ -23,6 +23,9 @@ jobs: - name: Typescript run: yarn tsc + - name: ESLint + run: yarn lint --quiet + deploy: runs-on: ubuntu-latest diff --git a/Dockerfile b/Dockerfile index d30d111ec..ef383b668 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,5 @@ FROM ruby:2.7.1-alpine3.12 -ARG UID=1000 -ARG GID=1000 - -RUN addgroup -S webapp -g $GID && adduser -D -S webapp -G webapp -u $UID - RUN apk add --update --no-cache \ alpine-sdk \ nodejs-current \ @@ -16,19 +11,15 @@ RUN apk add --update --no-cache \ WORKDIR /app/ -RUN chown -R $UID:$GID . +COPY package.json yarn.lock Gemfile Gemfile.lock /app/ -USER webapp - -COPY --chown=$UID:$GID package.json yarn.lock Gemfile Gemfile.lock /app/ - -COPY --chown=$UID:$GID vendor /app/vendor +COPY vendor /app/vendor RUN yarn install --pure-lockfile RUN gem install bundler && bundle install -COPY --chown=$UID:$GID . /app/ +COPY . /app/ RUN yarn bundle diff --git a/Gemfile.lock b/Gemfile.lock index e2d07dfa4..e317fb7ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM mini_mime (>= 0.1.1) method_source (0.9.2) mini_mime (1.0.2) - mini_portile2 (2.4.0) + mini_portile2 (2.5.0) minitest (5.14.0) msgpack (1.3.3) msgpack (1.3.3-x64-mingw32) @@ -106,14 +106,16 @@ GEM net-ssh (>= 2.6.5, < 6.0.0) net-ssh (5.2.0) nio4r (2.5.2) - nokogiri (1.10.8) - mini_portile2 (~> 2.4.0) - nokogiri (1.10.8-x64-mingw32) - mini_portile2 (~> 2.4.0) + nokogiri (1.11.1) + mini_portile2 (~> 2.5.0) + racc (~> 1.4) + nokogiri (1.11.1-x64-mingw32) + racc (~> 1.4) non-stupid-digest-assets (1.0.9) sprockets (>= 2.0) puma (4.3.5) nio4r (~> 2.0) + racc (1.5.2) rack (2.2.3) rack-cors (1.1.1) rack (>= 2.0.0) diff --git a/app/assets/fonts/ionicons.svg b/app/assets/fonts/ionicons.svg deleted file mode 100644 index 67f37aadf..000000000 --- a/app/assets/fonts/ionicons.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Created by FontForge 20190318 at Thu Apr 11 10:47:26 2019 - By Mo Bitar -Copyright (c) 2019, Mo Bitar - - - - - - - - - - - diff --git a/app/assets/icons/ic_close.svg b/app/assets/icons/ic_close.svg new file mode 100644 index 000000000..8d3b13d49 --- /dev/null +++ b/app/assets/icons/ic_close.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/javascripts/@types/modules.ts b/app/assets/javascripts/@types/modules.ts new file mode 100644 index 000000000..b5518926f --- /dev/null +++ b/app/assets/javascripts/@types/modules.ts @@ -0,0 +1,3 @@ +declare module '*.svg' { + export default function SvgComponent(props: React.SVGProps): JSX.Element; +} diff --git a/app/assets/javascripts/app.ts b/app/assets/javascripts/app.ts index 4051a7883..8f1aab4d7 100644 --- a/app/assets/javascripts/app.ts +++ b/app/assets/javascripts/app.ts @@ -44,8 +44,6 @@ import { PanelResizer, PasswordWizard, PermissionsModal, - PrivilegesAuthModal, - PrivilegesManagementModal, RevisionPreviewModal, HistoryMenu, SyncResolutionMenu, @@ -57,7 +55,8 @@ import { BrowserBridge } from './services/browserBridge'; import { startErrorReporting } from './services/errorReporting'; import { StartApplication } from './startApplication'; import { Bridge } from './services/bridge'; -import { SessionsModalDirective } from './directives/views/sessionsModal'; +import { SessionsModalDirective } from './components/SessionsModal'; +import { NoAccountWarningDirective } from './components/NoAccountWarning'; function reloadHiddenFirefoxTab(): boolean { @@ -140,15 +139,11 @@ const startApplication: StartApplication = async function startApplication( .directive('panelResizer', () => new PanelResizer()) .directive('passwordWizard', () => new PasswordWizard()) .directive('permissionsModal', () => new PermissionsModal()) - .directive('privilegesAuthModal', () => new PrivilegesAuthModal()) - .directive( - 'privilegesManagementModal', - () => new PrivilegesManagementModal() - ) .directive('revisionPreviewModal', () => new RevisionPreviewModal()) .directive('historyMenu', () => new HistoryMenu()) .directive('syncResolutionMenu', () => new SyncResolutionMenu()) - .directive('sessionsModal', SessionsModalDirective); + .directive('sessionsModal', SessionsModalDirective) + .directive('noAccountWarning', NoAccountWarningDirective); // Filters angular.module('app').filter('trusted', ['$sce', trusted]); diff --git a/app/assets/javascripts/components/NoAccountWarning.tsx b/app/assets/javascripts/components/NoAccountWarning.tsx new file mode 100644 index 000000000..83b7dc9c4 --- /dev/null +++ b/app/assets/javascripts/components/NoAccountWarning.tsx @@ -0,0 +1,39 @@ +import { toDirective, useAutorunValue } from './utils'; +import Close from '../../icons/ic_close.svg'; +import { AppState } from '@/ui_models/app_state'; + +function NoAccountWarning({ appState }: { appState: AppState }) { + const canShow = useAutorunValue(() => appState.noAccountWarning.show); + if (!canShow) { + return null; + } + return ( +
+

Data not backed up

+

+ Sign in or register to back up your notes. +

+ + +
+ ); +} + +export const NoAccountWarningDirective = toDirective(NoAccountWarning); diff --git a/app/assets/javascripts/directives/views/sessionsModal.tsx b/app/assets/javascripts/components/SessionsModal.tsx similarity index 84% rename from app/assets/javascripts/directives/views/sessionsModal.tsx rename to app/assets/javascripts/components/SessionsModal.tsx index 08f3906e3..52cbf4533 100644 --- a/app/assets/javascripts/directives/views/sessionsModal.tsx +++ b/app/assets/javascripts/components/SessionsModal.tsx @@ -1,14 +1,13 @@ import { AppState } from '@/ui_models/app_state'; -import { PureViewCtrl } from '@/views'; import { SNApplication, - RemoteSession, SessionStrings, UuidString, + isNullOrUndefined, + RemoteSession, } from '@standardnotes/snjs'; -import { autorun, IAutorunOptions, IReactionPublic } from 'mobx'; -import { render, FunctionComponent } from 'preact'; -import { useState, useEffect, useRef } from 'preact/hooks'; +import { FunctionComponent } from 'preact'; +import { useState, useEffect, useRef, useMemo } from 'preact/hooks'; import { Dialog } from '@reach/dialog'; import { Alert } from '@reach/alert'; import { @@ -16,10 +15,8 @@ import { AlertDialogDescription, AlertDialogLabel, } from '@reach/alert-dialog'; - -function useAutorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions) { - useEffect(() => autorun(view, opts), []); -} +import { toDirective, useAutorun } from './utils'; +import { WebApplication } from '@/ui_models/application'; type Session = RemoteSession & { revoking?: true; @@ -56,16 +53,16 @@ function useSessions( } setRefreshing(false); })(); - }, [lastRefreshDate]); + }, [application, lastRefreshDate]); function refresh() { setLastRefreshDate(Date.now()); } async function revokeSession(uuid: UuidString) { - const responsePromise = application.revokeSession(uuid); + const sessionsBeforeRevoke = sessions; - let sessionsBeforeRevoke = sessions; + const responsePromise = application.revokeSession(uuid); const sessionsDuringRevoke = sessions.slice(); const toRemoveIndex = sessions.findIndex( @@ -78,7 +75,9 @@ function useSessions( setSessions(sessionsDuringRevoke); const response = await responsePromise; - if ('error' in response) { + if (isNullOrUndefined(response)) { + setSessions(sessionsBeforeRevoke); + } else if ('error' in response) { if (response.error?.message) { setErrorMessage(response.error?.message); } else { @@ -111,19 +110,23 @@ const SessionsModal: FunctionComponent<{ const closeRevokeSessionAlert = () => setRevokingSessionUuid(''); const cancelRevokeRef = useRef(); - const formatter = new Intl.DateTimeFormat(undefined, { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - hour: 'numeric', - minute: 'numeric', - }); + const formatter = useMemo( + () => + new Intl.DateTimeFormat(undefined, { + year: 'numeric', + month: 'long', + day: 'numeric', + weekday: 'long', + hour: 'numeric', + minute: 'numeric', + }), + [] + ); return ( <> - -
+ +
@@ -190,7 +193,12 @@ const SessionsModal: FunctionComponent<{
{confirmRevokingSessionUuid && ( - + { + setRevokingSessionUuid(''); + }} + leastDestructiveRef={cancelRevokeRef} + >
@@ -235,7 +243,7 @@ const SessionsModal: FunctionComponent<{ const Sessions: FunctionComponent<{ appState: AppState; - application: SNApplication; + application: WebApplication; }> = ({ appState, application }) => { const [showModal, setShowModal] = useState(false); useAutorun(() => setShowModal(appState.isSessionsModalVisible)); @@ -247,26 +255,4 @@ const Sessions: FunctionComponent<{ } }; -class SessionsModalCtrl extends PureViewCtrl<{}, {}> { - /* @ngInject */ - constructor(private $element: JQLite, $timeout: ng.ITimeoutService) { - super($timeout); - this.$element = $element; - } - $onChanges() { - render( - , - this.$element[0] - ); - } -} - -export function SessionsModalDirective() { - return { - controller: SessionsModalCtrl, - bindToController: true, - scope: { - application: '=', - }, - }; -} +export const SessionsModalDirective = toDirective(Sessions); diff --git a/app/assets/javascripts/components/utils.ts b/app/assets/javascripts/components/utils.ts new file mode 100644 index 000000000..96fa8a4f8 --- /dev/null +++ b/app/assets/javascripts/components/utils.ts @@ -0,0 +1,56 @@ +import { WebApplication } from '@/ui_models/application'; +import { AppState } from '@/ui_models/app_state'; +import { autorun, IAutorunOptions, IReactionPublic } from 'mobx'; +import { FunctionComponent, h, render } from 'preact'; +import { useEffect } from 'preact/hooks'; +import { useState } from 'react'; + +export function useAutorunValue(query: () => T): T { + const [value, setValue] = useState(query); + useAutorun(() => { + setValue(query()); + }); + return value; +} + +export function useAutorun( + view: (r: IReactionPublic) => unknown, + opts?: IAutorunOptions +): void { + useEffect(() => autorun(view, opts), [view, opts]); +} + +export function toDirective( + component: FunctionComponent<{ + application: WebApplication; + appState: AppState; + }> +) { + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + return function () { + return { + controller: [ + '$element', + '$scope', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ($element: JQLite, $scope: any) => { + return { + $onChanges() { + render( + h(component, { + application: $scope.application, + appState: $scope.appState, + }), + $element[0] + ); + }, + }; + }, + ], + scope: { + application: '=', + appState: '=', + }, + }; + }; +} diff --git a/app/assets/javascripts/crypto.ts b/app/assets/javascripts/crypto.ts new file mode 100644 index 000000000..d93163eac --- /dev/null +++ b/app/assets/javascripts/crypto.ts @@ -0,0 +1,3 @@ +import { SNWebCrypto } from "@standardnotes/sncrypto-web"; + +export const WebCrypto = new SNWebCrypto(); diff --git a/app/assets/javascripts/database.ts b/app/assets/javascripts/database.ts index deac64b9e..5134c0fd6 100644 --- a/app/assets/javascripts/database.ts +++ b/app/assets/javascripts/database.ts @@ -135,6 +135,7 @@ export class Database { const db = (await this.openDatabase())!; const transaction = db.transaction(STORE_NAME, READ_WRITE); return new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-empty-function transaction.oncomplete = () => { }; transaction.onerror = (event) => { const target = event!.target! as any; diff --git a/app/assets/javascripts/directives/functional/click-outside.ts b/app/assets/javascripts/directives/functional/click-outside.ts index 0b6246bdd..5f0a6d034 100644 --- a/app/assets/javascripts/directives/functional/click-outside.ts +++ b/app/assets/javascripts/directives/functional/click-outside.ts @@ -22,7 +22,7 @@ export function clickOutside($document: ng.IDocumentService) { $scope.$apply(attrs.clickOutside); didApplyClickOutside = true; } - }; + } $scope.$on('$destroy', () => { attrs.clickOutside = undefined; diff --git a/app/assets/javascripts/directives/functional/delay-hide.ts b/app/assets/javascripts/directives/functional/delay-hide.ts index 8625c4c21..f28588edb 100644 --- a/app/assets/javascripts/directives/functional/delay-hide.ts +++ b/app/assets/javascripts/directives/functional/delay-hide.ts @@ -16,23 +16,23 @@ export function delayHide($timeout: ng.ITimeoutService) { scopeAny.hidePromise = null; } showElement(true); - } + }; const hideSpinner = () => { scopeAny.hidePromise = $timeout( showElement.bind(this as any, false), getDelay() ); - } + }; const showElement = (show: boolean) => { show ? elem.css({ display: '' }) : elem.css({ display: 'none' }); - } + }; const getDelay = () => { const delay = parseInt(scopeAny.delay); return angular.isNumber(delay) ? delay : 200; - } + }; showElement(false); // Whenever the scope variable updates we simply diff --git a/app/assets/javascripts/directives/functional/elemReady.ts b/app/assets/javascripts/directives/functional/elemReady.ts index 2387f0083..f5d91ec28 100644 --- a/app/assets/javascripts/directives/functional/elemReady.ts +++ b/app/assets/javascripts/directives/functional/elemReady.ts @@ -5,7 +5,7 @@ export function elemReady($parse: ng.IParseService) { link: function($scope: ng.IScope, elem: JQLite, attrs: any) { elem.ready(function() { $scope.$apply(function() { - var func = $parse(attrs.elemReady); + const func = $parse(attrs.elemReady); func($scope); }); }); diff --git a/app/assets/javascripts/directives/functional/infiniteScroll.ts b/app/assets/javascripts/directives/functional/infiniteScroll.ts index 1e8b10241..349a59946 100644 --- a/app/assets/javascripts/directives/functional/infiniteScroll.ts +++ b/app/assets/javascripts/directives/functional/infiniteScroll.ts @@ -19,7 +19,7 @@ export function infiniteScroll() { }; elem.on('scroll', scopeAny.onScroll); scope.$on('$destroy', () => { - elem.off('scroll', scopeAny.onScroll);; + elem.off('scroll', scopeAny.onScroll); }); } }; diff --git a/app/assets/javascripts/directives/views/accountMenu.ts b/app/assets/javascripts/directives/views/accountMenu.ts index 7d73e82ab..6012d5fbe 100644 --- a/app/assets/javascripts/directives/views/accountMenu.ts +++ b/app/assets/javascripts/directives/views/accountMenu.ts @@ -1,7 +1,6 @@ import { WebDirective } from './../../types'; -import { isDesktopApplication, preventRefreshing } from '@/utils'; +import { isDesktopApplication, isSameDay, preventRefreshing } from '@/utils'; import template from '%/directives/account-menu.pug'; -import { ProtectedAction, ContentType } from '@standardnotes/snjs'; import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; import { STRING_ACCOUNT_MENU_UNCHECK_MERGE, @@ -10,8 +9,6 @@ import { STRING_LOCAL_ENC_ENABLED, STRING_ENC_NOT_ENABLED, STRING_IMPORT_SUCCESS, - STRING_REMOVE_PASSCODE_CONFIRMATION, - STRING_REMOVE_PASSCODE_OFFLINE_ADDENDUM, STRING_NON_MATCHING_PASSCODES, STRING_NON_MATCHING_PASSWORDS, STRING_INVALID_IMPORT_FILE, @@ -20,38 +17,47 @@ import { StringImportError, STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_CHANGE, STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL, - STRING_UNSUPPORTED_BACKUP_FILE_VERSION + STRING_UNSUPPORTED_BACKUP_FILE_VERSION, + Strings, } from '@/strings'; import { PasswordWizardType } from '@/types'; -import { BackupFile } from '@standardnotes/snjs'; +import { + ApplicationEvent, + BackupFile, + ContentType, + Platform, +} from '@standardnotes/snjs'; import { confirmDialog, alertDialog } from '@/services/alertService'; import { autorun, IReactionDisposer } from 'mobx'; import { storage, StorageKey } from '@/services/localStorage'; - -const ELEMENT_ID_IMPORT_PASSWORD_INPUT = 'import-password-request'; +import { + disableErrorReporting, + enableErrorReporting, + errorReportingId, +} from '@/services/errorReporting'; const ELEMENT_NAME_AUTH_EMAIL = 'email'; const ELEMENT_NAME_AUTH_PASSWORD = 'password'; const ELEMENT_NAME_AUTH_PASSWORD_CONF = 'password_conf'; type FormData = { - email: string - user_password: string - password_conf: string - confirmPassword: boolean - showLogin: boolean - showRegister: boolean - showPasscodeForm: boolean - strictSignin?: boolean - ephemeral: boolean - mergeLocal?: boolean - url: string - authenticating: boolean - status: string - passcode: string - confirmPasscode: string - changingPasscode: boolean -} + email: string; + user_password: string; + password_conf: string; + confirmPassword: boolean; + showLogin: boolean; + showRegister: boolean; + showPasscodeForm: boolean; + strictSignin?: boolean; + ephemeral: boolean; + mergeLocal?: boolean; + url: string; + authenticating: boolean; + status: string; + passcode: string; + confirmPasscode: string; + changingPasscode: boolean; +}; type AccountMenuState = { formData: Partial; @@ -60,30 +66,30 @@ type AccountMenuState = { user: any; mutable: any; importData: any; - encryptionStatusString: string; - server: string; - encryptionEnabled: boolean; - selectedAutoLockInterval: any; + encryptionStatusString?: string; + server?: string; + encryptionEnabled?: boolean; + selectedAutoLockInterval?: unknown; showBetaWarning: boolean; errorReportingEnabled: boolean; syncInProgress: boolean; - syncError: string; + syncError?: string; showSessions: boolean; -} + errorReportingId: string | null; + keyStorageInfo: string | null; + protectionsDisabledUntil: string | null; +}; -class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { - - public appVersion: string +class AccountMenuCtrl extends PureViewCtrl { + public appVersion: string; /** @template */ - private closeFunction?: () => void - private removeBetaWarningListener?: IReactionDisposer - private removeSyncObserver?: IReactionDisposer + private closeFunction?: () => void; + private removeBetaWarningListener?: IReactionDisposer; + private removeSyncObserver?: IReactionDisposer; + private removeProtectionLengthObserver?: () => void; /* @ngInject */ - constructor( - $timeout: ng.ITimeoutService, - appVersion: string, - ) { + constructor($timeout: ng.ITimeoutService, appVersion: string) { super($timeout); this.appVersion = appVersion; } @@ -92,17 +98,25 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { getInitialState() { return { appVersion: 'v' + ((window as any).electronAppVersion || this.appVersion), - passcodeAutoLockOptions: this.application!.getAutolockService().getAutoLockIntervalOptions(), - user: this.application!.getUser(), + passcodeAutoLockOptions: this.application + .getAutolockService() + .getAutoLockIntervalOptions(), + user: this.application.getUser(), formData: { mergeLocal: true, ephemeral: false, }, mutable: {}, showBetaWarning: false, - errorReportingEnabled: storage.get(StorageKey.DisableErrorReporting) === false, + errorReportingEnabled: + storage.get(StorageKey.DisableErrorReporting) === false, showSessions: false, - } as AccountMenuState; + errorReportingId: errorReportingId(), + keyStorageInfo: Strings.keyStorageInfo(this.application), + importData: null, + syncInProgress: false, + protectionsDisabledUntil: this.getProtectionsDisabledUntil(), + }; } getState() { @@ -124,17 +138,17 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { refreshedCredentialState() { return { - user: this.application!.getUser(), - canAddPasscode: !this.application!.isEphemeralSession(), - hasPasscode: this.application!.hasPasscode(), - showPasscodeForm: false + user: this.application.getUser(), + canAddPasscode: !this.application.isEphemeralSession(), + hasPasscode: this.application.hasPasscode(), + showPasscodeForm: false, }; } async $onInit() { super.$onInit(); this.setState({ - showSessions: this.appState.enableUnfinishedFeatures && await this.application.userCanManageSessions() + showSessions: await this.application.userCanManageSessions() }); const sync = this.appState.sync; @@ -143,17 +157,27 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { syncInProgress: sync.inProgress, syncError: sync.errorMessage, }); - }) + }); this.removeBetaWarningListener = autorun(() => { this.setState({ - showBetaWarning: this.appState.showBetaWarning + showBetaWarning: this.appState.showBetaWarning, }); }); + + this.removeProtectionLengthObserver = this.application.addEventObserver( + async () => { + this.setState({ + protectionsDisabledUntil: this.getProtectionsDisabledUntil(), + }); + }, + ApplicationEvent.ProtectionSessionExpiryDateChanged + ); } deinit() { this.removeSyncObserver?.(); this.removeBetaWarningListener?.(); + this.removeProtectionLengthObserver?.(); super.deinit(); } @@ -163,17 +187,50 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { }); } + hasProtections() { + return this.application.hasProtectionSources(); + } + + private getProtectionsDisabledUntil(): string | null { + const protectionExpiry = this.application.getProtectionSessionExpiryDate(); + const now = new Date(); + if (protectionExpiry > now) { + let f: Intl.DateTimeFormat; + if (isSameDay(protectionExpiry, now)) { + f = new Intl.DateTimeFormat(undefined, { + hour: 'numeric', + minute: 'numeric', + }); + } else { + f = new Intl.DateTimeFormat(undefined, { + weekday: 'long', + day: 'numeric', + month: 'short', + hour: 'numeric', + minute: 'numeric', + }); + } + + return f.format(protectionExpiry); + } + return null; + } + async loadHost() { - const host = await this.application!.getHost(); + const host = await this.application.getHost(); this.setState({ server: host, formData: { ...this.getState().formData, - url: host - } + url: host, + }, }); } + enableProtections() { + this.application.clearProtectionSession(); + } + onHostInputChange() { const url = this.getState().formData.url!; this.application!.setHost(url); @@ -188,13 +245,13 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { encryptionStatusString: hasUser ? STRING_E2E_ENABLED : hasPasscode - ? STRING_LOCAL_ENC_ENABLED - : STRING_ENC_NOT_ENABLED, + ? STRING_LOCAL_ENC_ENABLED + : STRING_ENC_NOT_ENABLED, encryptionEnabled, mutable: { ...this.getState().mutable, - backupEncrypted: encryptionEnabled - } + backupEncrypted: encryptionEnabled, + }, }); } @@ -206,7 +263,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { const names = [ ELEMENT_NAME_AUTH_EMAIL, ELEMENT_NAME_AUTH_PASSWORD, - ELEMENT_NAME_AUTH_PASSWORD_CONF + ELEMENT_NAME_AUTH_PASSWORD_CONF, ]; for (const name of names) { const element = document.getElementsByName(name)[0]; @@ -217,7 +274,10 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { } submitAuthForm() { - if (!this.getState().formData.email || !this.getState().formData.user_password) { + if ( + !this.getState().formData.email || + !this.getState().formData.user_password + ) { return; } this.blurAuthFields(); @@ -232,15 +292,15 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { return this.setState({ formData: { ...this.getState().formData, - ...formData - } + ...formData, + }, }); } async login() { await this.setFormDataState({ status: STRING_GENERATING_LOGIN_KEYS, - authenticating: true + authenticating: true, }); const formData = this.getState().formData; const response = await this.application!.signIn( @@ -254,7 +314,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { if (!error) { await this.setFormDataState({ authenticating: false, - user_password: undefined + user_password: undefined, }); this.close(); return; @@ -262,28 +322,26 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { await this.setFormDataState({ showLogin: true, status: undefined, - user_password: undefined + user_password: undefined, }); if (error.message) { this.application!.alertService!.alert(error.message); } await this.setFormDataState({ - authenticating: false + authenticating: false, }); } async register() { const confirmation = this.getState().formData.password_conf; if (confirmation !== this.getState().formData.user_password) { - this.application!.alertService!.alert( - STRING_NON_MATCHING_PASSWORDS - ); + this.application!.alertService!.alert(STRING_NON_MATCHING_PASSWORDS); return; } await this.setFormDataState({ confirmPassword: false, status: STRING_GENERATING_REGISTER_KEYS, - authenticating: true + authenticating: true, }); const response = await this.application!.register( this.getState().formData.email!, @@ -294,14 +352,12 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { const error = response.error; if (error) { await this.setFormDataState({ - status: undefined + status: undefined, }); await this.setFormDataState({ - authenticating: false + authenticating: false, }); - this.application!.alertService!.alert( - error.message - ); + this.application!.alertService!.alert(error.message); } else { await this.setFormDataState({ authenticating: false }); this.close(); @@ -313,8 +369,8 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { this.setFormDataState({ mergeLocal: !(await confirmDialog({ text: STRING_ACCOUNT_MENU_UNCHECK_MERGE, - confirmButtonStyle: 'danger' - })) + confirmButtonStyle: 'danger', + })), }); } } @@ -329,45 +385,20 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { this.appState.openSessionsModal(); } - async openPrivilegesModal() { - const run = () => { - this.application!.presentPrivilegesManagementModal(); - this.close(); - }; - const needsPrivilege = await this.application!.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ManagePrivileges - ); - if (needsPrivilege) { - this.application!.presentPrivilegesModal( - ProtectedAction.ManagePrivileges, - () => { - run(); - } - ); - } else { - run(); - } - } - async destroyLocalData() { - if (await confirmDialog({ - text: STRING_SIGN_OUT_CONFIRMATION, - confirmButtonStyle: "danger" - })) { + if ( + await confirmDialog({ + text: STRING_SIGN_OUT_CONFIRMATION, + confirmButtonStyle: 'danger', + }) + ) { this.application.signOut(); } } - async submitImportPassword() { - await this.performImport( - this.getState().importData.data, - this.getState().importData.password - ); - } - showRegister() { this.setFormDataState({ - showRegister: true + showRegister: true, }); } @@ -379,9 +410,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { const data = JSON.parse(e.target!.result as string); resolve(data); } catch (e) { - this.application!.alertService!.alert( - STRING_INVALID_IMPORT_FILE - ); + this.application!.alertService!.alert(STRING_INVALID_IMPORT_FILE); } }; reader.readAsText(file); @@ -392,128 +421,84 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { * @template */ async importFileSelected(files: File[]) { - const run = async () => { - const file = files[0]; - const data = await this.readFile(file); - if (!data) { - return; - } - if (data.version || data.auth_params || data.keyParams) { - const version = data.version || data.keyParams?.version || data.auth_params?.version; - if ( - !this.application!.protocolService!.supportedVersions().includes(version) - ) { - await this.setState({ importData: null }); - alertDialog({ text: STRING_UNSUPPORTED_BACKUP_FILE_VERSION }); - return; - } - if (data.keyParams || data.auth_params) { - await this.setState({ - importData: { - ...this.getState().importData, - requestPassword: true, - data, - } - }); - const element = document.getElementById( - ELEMENT_ID_IMPORT_PASSWORD_INPUT - ); - if (element) { - element.scrollIntoView(false); - } - } else { - await this.performImport(data, undefined); - } + const file = files[0]; + const data = await this.readFile(file); + if (!data) { + return; + } + if (data.version || data.auth_params || data.keyParams) { + const version = + data.version || data.keyParams?.version || data.auth_params?.version; + if ( + this.application.protocolService.supportedVersions().includes(version) + ) { + await this.performImport(data); } else { - await this.performImport(data, undefined); + await this.setState({ importData: null }); + void alertDialog({ text: STRING_UNSUPPORTED_BACKUP_FILE_VERSION }); } - }; - const needsPrivilege = await this.application!.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ManageBackups - ); - if (needsPrivilege) { - this.application!.presentPrivilegesModal( - ProtectedAction.ManageBackups, - run - ); } else { - run(); + await this.performImport(data); } } - async performImport(data: BackupFile, password?: string) { + async performImport(data: BackupFile) { await this.setState({ importData: { ...this.getState().importData, - loading: true - } + loading: true, + }, }); - const result = await this.application!.importData( - data, - password - ); + const result = await this.application.importData(data); this.setState({ - importData: null + importData: null, }); - if ('error' in result) { - this.application!.alertService!.alert( - result.error - ); + if (!result) { + return; + } else if ('error' in result) { + void alertDialog({ + text: result.error, + }); } else if (result.errorCount) { - const message = StringImportError(result.errorCount); - this.application!.alertService!.alert( - message - ); + void alertDialog({ + text: StringImportError(result.errorCount), + }); } else { - this.application!.alertService!.alert( - STRING_IMPORT_SUCCESS - ); + void alertDialog({ + text: STRING_IMPORT_SUCCESS, + }); } } async downloadDataArchive() { - this.application!.getArchiveService().downloadBackup(this.getState().mutable.backupEncrypted); + this.application + .getArchiveService() + .downloadBackup(this.getState().mutable.backupEncrypted); } notesAndTagsCount() { - return this.application!.getItems( - [ - ContentType.Note, - ContentType.Tag - ] - ).length; + return this.application.getItems([ContentType.Note, ContentType.Tag]) + .length; } encryptionStatusForNotes() { const length = this.notesAndTagsCount(); - return length + "/" + length + " notes and tags encrypted"; + return length + '/' + length + ' notes and tags encrypted'; } async reloadAutoLockInterval() { const interval = await this.application!.getAutolockService().getAutoLockInterval(); this.setState({ - selectedAutoLockInterval: interval + selectedAutoLockInterval: interval, }); } async selectAutoLockInterval(interval: number) { - const run = async () => { - await this.application!.getAutolockService().setAutoLockInterval(interval); - this.reloadAutoLockInterval(); - }; - const needsPrivilege = await this.application!.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ManagePasscode - ); - if (needsPrivilege) { - this.application!.presentPrivilegesModal( - ProtectedAction.ManagePasscode, - () => { - run(); - } - ); - } else { - run(); + if (!(await this.application.authorizeAutolockIntervalChange())) { + return; } + await this.application!.getAutolockService().setAutoLockInterval(interval); + this.reloadAutoLockInterval(); } hidePasswordForm() { @@ -521,7 +506,7 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { showLogin: false, showRegister: false, user_password: undefined, - password_conf: undefined + password_conf: undefined, }); } @@ -531,91 +516,62 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { addPasscodeClicked() { this.setFormDataState({ - showPasscodeForm: true + showPasscodeForm: true, }); } async submitPasscodeForm() { const passcode = this.getState().formData.passcode!; if (passcode !== this.getState().formData.confirmPasscode!) { - this.application!.alertService!.alert( - STRING_NON_MATCHING_PASSCODES - ); + this.application!.alertService!.alert(STRING_NON_MATCHING_PASSCODES); return; } - await preventRefreshing(STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_CHANGE, async () => { - if (this.application!.hasPasscode()) { - await this.application!.changePasscode(passcode); - } else { - await this.application!.setPasscode(passcode); + await preventRefreshing( + STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_CHANGE, + async () => { + if (this.application!.hasPasscode()) { + await this.application!.changePasscode(passcode); + } else { + await this.application!.setPasscode(passcode); + } } - }); + ); this.setFormDataState({ passcode: undefined, confirmPasscode: undefined, - showPasscodeForm: false + showPasscodeForm: false, }); this.refreshEncryptionStatus(); } async changePasscodePressed() { - const run = () => { - this.getState().formData.changingPasscode = true; - this.addPasscodeClicked(); - }; - const needsPrivilege = await this.application!.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ManagePasscode - ); - if (needsPrivilege) { - this.application!.presentPrivilegesModal( - ProtectedAction.ManagePasscode, - run - ); - } else { - run(); - } + this.getState().formData.changingPasscode = true; + this.addPasscodeClicked(); } async removePasscodePressed() { - const run = async () => { - const signedIn = this.application!.hasAccount(); - let message = STRING_REMOVE_PASSCODE_CONFIRMATION; - if (!signedIn) { - message += STRING_REMOVE_PASSCODE_OFFLINE_ADDENDUM; - } - if (await confirmDialog({ - text: message, - confirmButtonStyle: 'danger' - })) { - await preventRefreshing(STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL, async () => { - await this.application.getAutolockService().deleteAutolockPreference(); - await this.application!.removePasscode(); + await preventRefreshing( + STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL, + async () => { + if (await this.application!.removePasscode()) { + await this.application + .getAutolockService() + .deleteAutolockPreference(); await this.reloadAutoLockInterval(); - }); - this.refreshEncryptionStatus(); + this.refreshEncryptionStatus(); + } } - }; - const needsPrivilege = await this.application!.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ManagePasscode ); - if (needsPrivilege) { - this.application!.presentPrivilegesModal( - ProtectedAction.ManagePasscode, - run - ); - } else { - run(); - } } openErrorReportingDialog() { alertDialog({ title: 'Data sent during automatic error reporting', text: ` - We use Bugsnag + We use Bugsnag to automatically report errors that occur while the app is running. See - + this article, paragraph 'Browser' under 'Sending diagnostic data', to see what data is included in error reports. @@ -624,15 +580,15 @@ class AccountMenuCtrl extends PureViewCtrl<{}, AccountMenuState> { anonymized. We use error reports to be alerted when something in our code is causing unexpected errors and crashes in your application experience. - ` + `, }); } toggleErrorReportingEnabled() { if (this.state.errorReportingEnabled) { - storage.set(StorageKey.DisableErrorReporting, true); + disableErrorReporting(); } else { - storage.set(StorageKey.DisableErrorReporting, false); + enableErrorReporting(); } if (!this.state.syncInProgress) { window.location.reload(); @@ -654,7 +610,7 @@ export class AccountMenu extends WebDirective { this.bindToController = true; this.scope = { closeFunction: '&', - application: '=' + application: '=', }; } } diff --git a/app/assets/javascripts/directives/views/actionsMenu.ts b/app/assets/javascripts/directives/views/actionsMenu.ts index 99d60426a..e9f2a6689 100644 --- a/app/assets/javascripts/directives/views/actionsMenu.ts +++ b/app/assets/javascripts/directives/views/actionsMenu.ts @@ -40,7 +40,7 @@ type ActionsMenuState = { }[] } -class ActionsMenuCtrl extends PureViewCtrl<{}, ActionsMenuState> implements ActionsMenuScope { +class ActionsMenuCtrl extends PureViewCtrl implements ActionsMenuScope { application!: WebApplication item!: SNItem private removeHiddenExtensionsListener?: IReactionDisposer; @@ -63,7 +63,7 @@ class ActionsMenuCtrl extends PureViewCtrl<{}, ActionsMenuState> implements Acti hiddenExtensions: this.appState.actionsMenu.hiddenExtensions }); }); - }; + } deinit() { this.removeHiddenExtensionsListener?.(); @@ -74,7 +74,7 @@ class ActionsMenuCtrl extends PureViewCtrl<{}, ActionsMenuState> implements Acti const extensions = this.application.actionsManager!.getExtensions().sort((a, b) => { return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; }); - let extensionsState: Record = {}; + const extensionsState: Record = {}; extensions.map((extension) => { extensionsState[extension.uuid] = { loading: false, @@ -114,7 +114,7 @@ class ActionsMenuCtrl extends PureViewCtrl<{}, ActionsMenuState> implements Acti return { ...action, subrows: this.subRowsForAction(action, extension) - } + }; } else { return action; } diff --git a/app/assets/javascripts/directives/views/componentView.ts b/app/assets/javascripts/directives/views/componentView.ts index 4819a002f..a4488e17a 100644 --- a/app/assets/javascripts/directives/views/componentView.ts +++ b/app/assets/javascripts/directives/views/componentView.ts @@ -159,7 +159,7 @@ class ComponentViewCtrl implements ComponentViewScope { this.$timeout(() => { this.reloading = false; }); - }) + }); } private onVisibilityChange() { @@ -228,6 +228,7 @@ class ComponentViewCtrl implements ComponentViewScope { if (!iframe.contentWindow!.origin || iframe.contentWindow!.origin === 'null') { desktopError = true; } + // eslint-disable-next-line no-empty } catch (e) { } } this.$timeout.cancel(this.loadTimeout); diff --git a/app/assets/javascripts/directives/views/editorMenu.ts b/app/assets/javascripts/directives/views/editorMenu.ts index d4e4c4906..3f2d0244e 100644 --- a/app/assets/javascripts/directives/views/editorMenu.ts +++ b/app/assets/javascripts/directives/views/editorMenu.ts @@ -52,14 +52,14 @@ class EditorMenuCtrl extends PureViewCtrl implements EditorMenuScope { editors: editors, defaultEditor: defaultEditor }); - }; + } selectComponent(component: SNComponent) { if (component) { if (component.conflictOf) { this.application.changeAndSaveItem(component.uuid, (mutator) => { mutator.conflictOf = undefined; - }) + }); } } this.$timeout(() => { @@ -87,7 +87,7 @@ class EditorMenuCtrl extends PureViewCtrl implements EditorMenuScope { this.application.changeItem(currentDefault.uuid, (m) => { const mutator = m as ComponentMutator; mutator.defaultEditor = false; - }) + }); } this.application.changeAndSaveItem(component.uuid, (m) => { const mutator = m as ComponentMutator; diff --git a/app/assets/javascripts/directives/views/historyMenu.ts b/app/assets/javascripts/directives/views/historyMenu.ts index c933d91a1..762791070 100644 --- a/app/assets/javascripts/directives/views/historyMenu.ts +++ b/app/assets/javascripts/directives/views/historyMenu.ts @@ -16,7 +16,7 @@ interface HistoryScope { item: SNItem } -class HistoryMenuCtrl extends PureViewCtrl<{}, HistoryState> implements HistoryScope { +class HistoryMenuCtrl extends PureViewCtrl implements HistoryScope { diskEnabled = false autoOptimize = false diff --git a/app/assets/javascripts/directives/views/index.ts b/app/assets/javascripts/directives/views/index.ts index adee8d90c..99931e2bb 100644 --- a/app/assets/javascripts/directives/views/index.ts +++ b/app/assets/javascripts/directives/views/index.ts @@ -8,8 +8,6 @@ export { MenuRow } from './menuRow'; export { PanelResizer } from './panelResizer'; export { PasswordWizard } from './passwordWizard'; export { PermissionsModal } from './permissionsModal'; -export { PrivilegesAuthModal } from './privilegesAuthModal'; -export { PrivilegesManagementModal } from './privilegesManagementModal'; export { RevisionPreviewModal } from './revisionPreviewModal'; export { HistoryMenu } from './historyMenu'; export { SyncResolutionMenu } from './syncResolutionMenu'; diff --git a/app/assets/javascripts/directives/views/panelResizer.ts b/app/assets/javascripts/directives/views/panelResizer.ts index 352aaca9c..67307e618 100644 --- a/app/assets/javascripts/directives/views/panelResizer.ts +++ b/app/assets/javascripts/directives/views/panelResizer.ts @@ -6,12 +6,12 @@ import { debounce } from '@/utils'; enum PanelSide { Right = 'right', Left = 'left' -}; +} enum MouseEventType { Move = 'mousemove', Down = 'mousedown', Up = 'mouseup' -}; +} enum CssClass { Hoverable = 'hoverable', AlwaysVisible = 'always-visible', @@ -19,7 +19,7 @@ enum CssClass { NoSelection = 'no-selection', Collapsed = 'collapsed', AnimateOpacity = 'animate-opacity', -}; +} const WINDOW_EVENT_RESIZE = 'resize'; type ResizeFinishCallback = ( diff --git a/app/assets/javascripts/directives/views/passwordWizard.ts b/app/assets/javascripts/directives/views/passwordWizard.ts index 36ea4fa71..934ebb1fe 100644 --- a/app/assets/javascripts/directives/views/passwordWizard.ts +++ b/app/assets/javascripts/directives/views/passwordWizard.ts @@ -7,7 +7,7 @@ const DEFAULT_CONTINUE_TITLE = "Continue"; enum Steps { PasswordStep = 1, FinishStep = 2 -}; +} type FormData = { currentPassword?: string, diff --git a/app/assets/javascripts/directives/views/privilegesAuthModal.ts b/app/assets/javascripts/directives/views/privilegesAuthModal.ts deleted file mode 100644 index e715ee9c4..000000000 --- a/app/assets/javascripts/directives/views/privilegesAuthModal.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { WebDirective } from './../../types'; -import { WebApplication } from '@/ui_models/application'; -import { ProtectedAction, PrivilegeCredential, PrivilegeSessionLength } from '@standardnotes/snjs'; -import template from '%/directives/privileges-auth-modal.pug'; - -type PrivilegesAuthModalScope = { - application: WebApplication - action: ProtectedAction - onSuccess: () => void - onCancel: () => void -} - -class PrivilegesAuthModalCtrl implements PrivilegesAuthModalScope { - $element: JQLite - $timeout: ng.ITimeoutService - application!: WebApplication - action!: ProtectedAction - onSuccess!: () => void - onCancel!: () => void - authParameters: Partial> = {} - sessionLengthOptions!: { value: PrivilegeSessionLength, label: string }[] - selectedSessionLength!: PrivilegeSessionLength - requiredCredentials!: PrivilegeCredential[] - failedCredentials!: PrivilegeCredential[] - - /* @ngInject */ - constructor( - $element: JQLite, - $timeout: ng.ITimeoutService - ) { - this.$element = $element; - this.$timeout = $timeout; - } - - $onInit() { - this.sessionLengthOptions = this.application!.privilegesService! - .getSessionLengthOptions(); - this.application.privilegesService!.getSelectedSessionLength() - .then((length) => { - this.$timeout(() => { - this.selectedSessionLength = length; - }); - }); - this.application.privilegesService!.netCredentialsForAction(this.action) - .then((credentials) => { - this.$timeout(() => { - this.requiredCredentials = credentials.sort(); - }); - }); - } - - selectSessionLength(length: PrivilegeSessionLength) { - this.selectedSessionLength = length; - } - - promptForCredential(credential: PrivilegeCredential) { - return this.application.privilegesService!.displayInfoForCredential(credential).prompt; - } - - cancel() { - this.dismiss(); - this.onCancel && this.onCancel(); - } - - isCredentialInFailureState(credential: PrivilegeCredential) { - if (!this.failedCredentials) { - return false; - } - return this.failedCredentials.find((candidate) => { - return candidate === credential; - }) != null; - } - - validate() { - const failed = []; - for (const cred of this.requiredCredentials) { - const value = this.authParameters[cred]; - if (!value || value.length === 0) { - failed.push(cred); - } - } - this.failedCredentials = failed; - return failed.length === 0; - } - - async submit() { - if (!this.validate()) { - return; - } - const result = await this.application.privilegesService!.authenticateAction( - this.action, - this.authParameters - ); - this.$timeout(() => { - if (result.success) { - this.application.privilegesService!.setSessionLength(this.selectedSessionLength); - this.onSuccess(); - this.dismiss(); - } else { - this.failedCredentials = result.failedCredentials; - } - }); - } - - dismiss() { - const elem = this.$element; - const scope = elem.scope(); - scope.$destroy(); - elem.remove(); - } -} - -export class PrivilegesAuthModal extends WebDirective { - constructor() { - super(); - this.restrict = 'E'; - this.template = template; - this.controller = PrivilegesAuthModalCtrl; - this.controllerAs = 'ctrl'; - this.bindToController = true; - this.scope = { - action: '=', - onSuccess: '=', - onCancel: '=', - application: '=' - }; - } -} diff --git a/app/assets/javascripts/directives/views/privilegesManagementModal.ts b/app/assets/javascripts/directives/views/privilegesManagementModal.ts deleted file mode 100644 index 81403b69a..000000000 --- a/app/assets/javascripts/directives/views/privilegesManagementModal.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { WebDirective } from './../../types'; -import { WebApplication } from '@/ui_models/application'; -import template from '%/directives/privileges-management-modal.pug'; -import { PrivilegeCredential, ProtectedAction, SNPrivileges, PrivilegeSessionLength } from '@standardnotes/snjs'; -import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; -import { PrivilegeMutator } from '@standardnotes/snjs'; - -type DisplayInfo = { - label: string - prompt: string -} - -class PrivilegesManagementModalCtrl extends PureViewCtrl { - - hasPasscode = false - hasAccount = false - $element: JQLite - application!: WebApplication - privileges!: SNPrivileges - availableActions!: ProtectedAction[] - availableCredentials!: PrivilegeCredential[] - sessionExpirey!: string - sessionExpired = true - credentialDisplayInfo: Partial> = {} - onCancel!: () => void - - /* @ngInject */ - constructor( - $timeout: ng.ITimeoutService, - $element: JQLite - ) { - super($timeout); - this.$element = $element; - } - - async onAppLaunch() { - super.onAppLaunch(); - this.hasPasscode = this.application.hasPasscode(); - this.hasAccount = !this.application.noAccount(); - this.reloadPrivileges(); - } - - displayInfoForCredential(credential: PrivilegeCredential) { - const info: any = this.application.privilegesService!.displayInfoForCredential(credential); - if (credential === PrivilegeCredential.LocalPasscode) { - info.availability = this.hasPasscode; - } else if (credential === PrivilegeCredential.AccountPassword) { - info.availability = this.hasAccount; - } else { - info.availability = true; - } - return info; - } - - displayInfoForAction(action: ProtectedAction) { - return this.application.privilegesService!.displayInfoForAction(action).label; - } - - isCredentialRequiredForAction(action: ProtectedAction, credential: PrivilegeCredential) { - if (!this.privileges) { - return false; - } - return this.privileges.isCredentialRequiredForAction(action, credential); - } - - async clearSession() { - await this.application.privilegesService!.clearSession(); - this.reloadPrivileges(); - } - - async reloadPrivileges() { - this.availableActions = this.application.privilegesService!.getAvailableActions(); - this.availableCredentials = this.application.privilegesService!.getAvailableCredentials(); - const sessionEndDate = await this.application.privilegesService!.getSessionExpirey(); - this.sessionExpirey = sessionEndDate.toLocaleString(); - this.sessionExpired = new Date() >= sessionEndDate; - for (const cred of this.availableCredentials) { - this.credentialDisplayInfo[cred] = this.displayInfoForCredential(cred); - } - const privs = await this.application.privilegesService!.getPrivileges(); - this.$timeout(() => { - this.privileges = privs; - }); - } - - checkboxValueChanged(action: ProtectedAction, credential: PrivilegeCredential) { - this.application.changeAndSaveItem(this.privileges.uuid, (m) => { - const mutator = m as PrivilegeMutator; - mutator.toggleCredentialForAction(action, credential); - }) - } - - cancel() { - this.dismiss(); - this.onCancel && this.onCancel(); - } - - dismiss() { - const elem = this.$element; - const scope = elem.scope(); - scope.$destroy(); - elem.remove(); - } -} - -export class PrivilegesManagementModal extends WebDirective { - constructor() { - super(); - this.restrict = 'E'; - this.template = template; - this.controller = PrivilegesManagementModalCtrl; - this.controllerAs = 'ctrl'; - this.bindToController = true; - this.scope = { - application: '=' - }; - } -} diff --git a/app/assets/javascripts/index.ts b/app/assets/javascripts/index.ts index 2e0778d4a..d623c79f5 100644 --- a/app/assets/javascripts/index.ts +++ b/app/assets/javascripts/index.ts @@ -15,5 +15,4 @@ import '../../../vendor/assets/javascripts/zip/zip'; import '../../../vendor/assets/javascripts/zip/z-worker'; // entry point -// eslint-disable-next-line import/first import './app'; diff --git a/app/assets/javascripts/services/archiveManager.ts b/app/assets/javascripts/services/archiveManager.ts index 8915aaeb3..d80635a1d 100644 --- a/app/assets/javascripts/services/archiveManager.ts +++ b/app/assets/javascripts/services/archiveManager.ts @@ -1,5 +1,11 @@ import { WebApplication } from '@/ui_models/application'; -import { EncryptionIntent, ProtectedAction, ContentType, SNNote, BackupFile, PayloadContent } from '@standardnotes/snjs'; +import { + EncryptionIntent, + ContentType, + SNNote, + BackupFile, + PayloadContent, +} from '@standardnotes/snjs'; function zippableTxtName(name: string, suffix = ""): string { const sanitizedName = name @@ -22,44 +28,29 @@ export class ArchiveManager { } public async downloadBackup(encrypted: boolean) { - const run = async () => { - const intent = encrypted - ? EncryptionIntent.FileEncrypted - : EncryptionIntent.FileDecrypted; + const intent = encrypted + ? EncryptionIntent.FileEncrypted + : EncryptionIntent.FileDecrypted; - const data = await this.application.createBackupFile(intent); - if (!data) { - return; - } - const blobData = new Blob( - [JSON.stringify(data, null, 2)], - { type: 'text/json' } + const data = await this.application.createBackupFile(intent, true); + if (!data) { + return; + } + const blobData = new Blob( + [JSON.stringify(data, null, 2)], + { type: 'text/json' } + ); + if (encrypted) { + this.downloadData( + blobData, + `Standard Notes Encrypted Backup and Import File - ${this.formattedDate()}.txt` ); - if (encrypted) { - this.downloadData( - blobData, - `Standard Notes Encrypted Backup and Import File - ${this.formattedDate()}.txt` - ); - } else { - /** Remove auth/keyParams as they won't be needed to decrypt the file */ - delete data.auth_params; - delete data.keyParams; - /** download as zipped plain text files */ - this.downloadZippedDecryptedItems(data); - } - }; - - if ( - await this.application.privilegesService! - .actionRequiresPrivilege(ProtectedAction.ManageBackups) - ) { - this.application.presentPrivilegesModal( - ProtectedAction.ManageBackups, - () => { - run(); - }); } else { - run(); + /** Remove auth/keyParams as they won't be needed to decrypt the file */ + delete data.auth_params; + delete data.keyParams; + /** download as zipped plain text files */ + this.downloadZippedDecryptedItems(data); } } diff --git a/app/assets/javascripts/services/browserBridge.ts b/app/assets/javascripts/services/browserBridge.ts index ff8eb9ac6..d0408ffa6 100644 --- a/app/assets/javascripts/services/browserBridge.ts +++ b/app/assets/javascripts/services/browserBridge.ts @@ -24,9 +24,10 @@ export class BrowserBridge implements Bridge { /** No-ops */ - syncComponents() {} - onMajorDataChange() {} - onInitialDataLoad() {} - onSearch() {} - downloadBackup() {} + /* eslint-disable @typescript-eslint/no-empty-function */ + syncComponents(): void {} + onMajorDataChange(): void {} + onInitialDataLoad(): void {} + onSearch(): void {} + downloadBackup(): void {} } diff --git a/app/assets/javascripts/services/desktopManager.ts b/app/assets/javascripts/services/desktopManager.ts index 62ca51934..3587b174c 100644 --- a/app/assets/javascripts/services/desktopManager.ts +++ b/app/assets/javascripts/services/desktopManager.ts @@ -1,9 +1,17 @@ -import { SNComponent, PurePayload, ComponentMutator, AppDataField, ContentType } from '@standardnotes/snjs'; +import { + SNComponent, + PurePayload, + ComponentMutator, + AppDataField, + EncryptionIntent, + ApplicationService, + ApplicationEvent, + removeFromArray, +} from '@standardnotes/snjs'; /* eslint-disable camelcase */ import { WebApplication } from '@/ui_models/application'; // An interface used by the Desktop app to interact with SN import { isDesktopApplication } from '@/utils'; -import { EncryptionIntent, ApplicationService, ApplicationEvent, removeFromArray } from '@standardnotes/snjs'; import { Bridge } from './bridge'; type UpdateObserverCallback = (component: SNComponent) => void @@ -67,7 +75,7 @@ export class DesktopManager extends ApplicationService { getExtServerHost() { console.assert( - this.bridge.extensionsServerHost, + !!this.bridge.extensionsServerHost, 'extServerHost is null' ); return this.bridge.extensionsServerHost; diff --git a/app/assets/javascripts/services/errorReporting.ts b/app/assets/javascripts/services/errorReporting.ts index 0a309e3ab..c3cd66a66 100644 --- a/app/assets/javascripts/services/errorReporting.ts +++ b/app/assets/javascripts/services/errorReporting.ts @@ -2,6 +2,7 @@ import { isNullOrUndefined, SNLog } from '@standardnotes/snjs'; import { isDesktopApplication, isDev } from '@/utils'; import { storage, StorageKey } from './localStorage'; import Bugsnag from '@bugsnag/js'; +import { WebCrypto } from '../crypto'; declare const __VERSION__: string; declare global { @@ -21,7 +22,7 @@ function redactFilePath(line: string): string { } } -export function startErrorReporting() { +export function startErrorReporting(): void { const disableErrorReporting = storage.get(StorageKey.DisableErrorReporting); if ( /** @@ -37,6 +38,15 @@ export function startErrorReporting() { return; } try { + const storedUserId = storage.get(StorageKey.AnonymousUserId); + let anonymousUserId: string; + if (storedUserId === null) { + anonymousUserId = WebCrypto.generateUUIDSync(); + storage.set(StorageKey.AnonymousUserId, anonymousUserId); + } else { + anonymousUserId = storedUserId; + } + Bugsnag.start({ apiKey: window._bugsnag_api_key, appType: isDesktopApplication() ? 'desktop' : 'web', @@ -46,6 +56,8 @@ export function startErrorReporting() { releaseStage: isDev ? 'development' : undefined, enabledBreadcrumbTypes: ['error', 'log'], onError(event) { + event.setUser(anonymousUserId); + /** * Redact any data that could be used to identify user, * such as file paths. @@ -95,3 +107,16 @@ export function startErrorReporting() { SNLog.onError = console.error; } } + +export function disableErrorReporting() { + storage.remove(StorageKey.AnonymousUserId); + storage.set(StorageKey.DisableErrorReporting, true); +} + +export function enableErrorReporting() { + storage.set(StorageKey.DisableErrorReporting, false); +} + +export function errorReportingId() { + return storage.get(StorageKey.AnonymousUserId); +} diff --git a/app/assets/javascripts/services/keyboardManager.ts b/app/assets/javascripts/services/keyboardManager.ts index 85918c3f7..b786bcd43 100644 --- a/app/assets/javascripts/services/keyboardManager.ts +++ b/app/assets/javascripts/services/keyboardManager.ts @@ -4,7 +4,7 @@ export enum KeyboardKey { Backspace = "Backspace", Up = "ArrowUp", Down = "ArrowDown", -}; +} export enum KeyboardModifier { Shift = "Shift", @@ -12,12 +12,12 @@ export enum KeyboardModifier { /** ⌘ key on Mac, ⊞ key on Windows */ Meta = "Meta", Alt = "Alt", -}; +} enum KeyboardKeyEvent { Down = "KeyEventDown", Up = "KeyEventUp" -}; +} type KeyboardObserver = { key?: KeyboardKey | string @@ -39,10 +39,10 @@ export class KeyboardManager { constructor() { this.handleKeyDown = (event: KeyboardEvent) => { this.notifyObserver(event, KeyboardKeyEvent.Down); - } + }; this.handleKeyUp = (event: KeyboardEvent) => { this.notifyObserver(event, KeyboardKeyEvent.Up); - } + }; window.addEventListener('keydown', this.handleKeyDown); window.addEventListener('keyup', this.handleKeyUp); } diff --git a/app/assets/javascripts/services/localStorage.ts b/app/assets/javascripts/services/localStorage.ts index ac20a5243..fa03d7c9b 100644 --- a/app/assets/javascripts/services/localStorage.ts +++ b/app/assets/javascripts/services/localStorage.ts @@ -1,9 +1,15 @@ export enum StorageKey { DisableErrorReporting = 'DisableErrorReporting', + AnonymousUserId = 'AnonymousUserId', + ShowBetaWarning = 'ShowBetaWarning', + ShowNoAccountWarning = 'ShowNoAccountWarning', } export type StorageValue = { [StorageKey.DisableErrorReporting]: boolean; + [StorageKey.AnonymousUserId]: string; + [StorageKey.ShowBetaWarning]: boolean; + [StorageKey.ShowNoAccountWarning]: boolean; } export const storage = { @@ -11,10 +17,10 @@ export const storage = { const value = localStorage.getItem(key); return value ? JSON.parse(value) : null; }, - set(key: K, value: StorageValue[K]) { + set(key: K, value: StorageValue[K]): void { localStorage.setItem(key, JSON.stringify(value)); }, - remove(key: StorageKey) { + remove(key: StorageKey): void { localStorage.removeItem(key); }, }; diff --git a/app/assets/javascripts/services/nativeExtManager.ts b/app/assets/javascripts/services/nativeExtManager.ts index 955193a3c..42e52b6d8 100644 --- a/app/assets/javascripts/services/nativeExtManager.ts +++ b/app/assets/javascripts/services/nativeExtManager.ts @@ -9,9 +9,9 @@ import { ComponentMutator, Copy, dictToArray -} from '@standardnotes/snjs'; -import { PayloadContent } from '@standardnotes/snjs'; -import { ComponentPermission } from '@standardnotes/snjs'; +, PayloadContent , ComponentPermission } from '@standardnotes/snjs'; + + /** A class for handling installation of system extensions */ export class NativeExtManager extends ApplicationService { @@ -82,7 +82,7 @@ export class NativeExtManager extends ApplicationService { // Handle addition of SN|ExtensionRepo permission const permissions = Copy(extensionsManager!.permissions) as ComponentPermission[]; const permission = permissions.find((p) => { - return p.name === ComponentAction.StreamItems + return p.name === ComponentAction.StreamItems; }); if (permission && !permission.content_types!.includes(ContentType.ExtensionRepo)) { permission.content_types!.push(ContentType.ExtensionRepo); @@ -160,7 +160,7 @@ export class NativeExtManager extends ApplicationService { // Handle addition of SN|ExtensionRepo permission const permissions = Copy(batchManager!.permissions) as ComponentPermission[]; const permission = permissions.find((p) => { - return p.name === ComponentAction.StreamItems + return p.name === ComponentAction.StreamItems; }); if (permission && !permission.content_types!.includes(ContentType.ExtensionRepo)) { permission.content_types!.push(ContentType.ExtensionRepo); diff --git a/app/assets/javascripts/services/themeManager.ts b/app/assets/javascripts/services/themeManager.ts index ef9b65eb3..cdd81aa8a 100644 --- a/app/assets/javascripts/services/themeManager.ts +++ b/app/assets/javascripts/services/themeManager.ts @@ -22,8 +22,6 @@ export class ThemeManager extends ApplicationService { this.deactivateAllThemes(); } else if (event === ApplicationEvent.StorageReady) { await this.activateCachedThemes(); - if (!this.webApplication.getDesktopService().isDesktop) { - } } } @@ -75,7 +73,7 @@ export class ThemeManager extends ApplicationService { this.deactivateTheme(theme.uuid); } } - }) + }); } private clearAppThemeState() { diff --git a/app/assets/javascripts/strings.ts b/app/assets/javascripts/strings.ts index 6f4dbff99..25232bc9c 100644 --- a/app/assets/javascripts/strings.ts +++ b/app/assets/javascripts/strings.ts @@ -1,27 +1,45 @@ +import { Platform, SNApplication } from '@standardnotes/snjs'; +import { getPlatform, isDesktopApplication } from './utils'; + /** @generic */ -export const STRING_SESSION_EXPIRED = "Your session has expired. New changes will not be pulled in. Please sign in to refresh your session."; -export const STRING_DEFAULT_FILE_ERROR = "Please use FileSafe or the Bold Editor to attach images and files. Learn more at standardnotes.org/filesafe."; -export const STRING_GENERIC_SYNC_ERROR = "There was an error syncing. Please try again. If all else fails, try signing out and signing back in."; +export const STRING_SESSION_EXPIRED = + 'Your session has expired. New changes will not be pulled in. Please sign in to refresh your session.'; +export const STRING_DEFAULT_FILE_ERROR = + 'Please use FileSafe or the Bold Editor to attach images and files. Learn more at standardnotes.org/filesafe.'; +export const STRING_GENERIC_SYNC_ERROR = + 'There was an error syncing. Please try again. If all else fails, try signing out and signing back in.'; export function StringSyncException(data: any) { - return `There was an error while trying to save your items. Please contact support and share this message: ${JSON.stringify(data)}.`; + return `There was an error while trying to save your items. Please contact support and share this message: ${JSON.stringify( + data + )}.`; } /** @footer */ -export const STRING_NEW_UPDATE_READY = "A new update is ready to install. Please use the top-level 'Updates' menu to manage installation."; +export const STRING_NEW_UPDATE_READY = + "A new update is ready to install. Please use the top-level 'Updates' menu to manage installation."; /** @tags */ -export const STRING_DELETE_TAG = "Are you sure you want to delete this tag? Note: deleting a tag will not delete its notes."; +export const STRING_DELETE_TAG = + 'Are you sure you want to delete this tag? Note: deleting a tag will not delete its notes.'; /** @editor */ -export const STRING_SAVING_WHILE_DOCUMENT_HIDDEN = 'Attempting to save an item while the application is hidden. To protect data integrity, please refresh the application window and try again.' -export const STRING_DELETED_NOTE = "The note you are attempting to edit has been deleted, and is awaiting sync. Changes you make will be disregarded."; -export const STRING_INVALID_NOTE = "The note you are attempting to save can not be found or has been deleted. Changes you make will not be synced. Please copy this note's text and start a new note."; -export const STRING_ELLIPSES = "..."; -export const STRING_GENERIC_SAVE_ERROR = "There was an error saving your note. Please try again."; -export const STRING_DELETE_PLACEHOLDER_ATTEMPT = "This note is a placeholder and cannot be deleted. To remove from your list, simply navigate to a different note."; -export const STRING_ARCHIVE_LOCKED_ATTEMPT = "This note is locked. If you'd like to archive it, unlock it, and try again."; -export const STRING_UNARCHIVE_LOCKED_ATTEMPT = "This note is locked. If you'd like to archive it, unlock it, and try again."; -export const STRING_DELETE_LOCKED_ATTEMPT = "This note is locked. If you'd like to delete it, unlock it, and try again."; +export const STRING_SAVING_WHILE_DOCUMENT_HIDDEN = + 'Attempting to save an item while the application is hidden. To protect data integrity, please refresh the application window and try again.'; +export const STRING_DELETED_NOTE = + 'The note you are attempting to edit has been deleted, and is awaiting sync. Changes you make will be disregarded.'; +export const STRING_INVALID_NOTE = + "The note you are attempting to save can not be found or has been deleted. Changes you make will not be synced. Please copy this note's text and start a new note."; +export const STRING_ELLIPSES = '...'; +export const STRING_GENERIC_SAVE_ERROR = + 'There was an error saving your note. Please try again.'; +export const STRING_DELETE_PLACEHOLDER_ATTEMPT = + 'This note is a placeholder and cannot be deleted. To remove from your list, simply navigate to a different note.'; +export const STRING_ARCHIVE_LOCKED_ATTEMPT = + "This note is locked. If you'd like to archive it, unlock it, and try again."; +export const STRING_UNARCHIVE_LOCKED_ATTEMPT = + "This note is locked. If you'd like to archive it, unlock it, and try again."; +export const STRING_DELETE_LOCKED_ATTEMPT = + "This note is locked. If you'd like to delete it, unlock it, and try again."; export function StringDeleteNote(title: string, permanently: boolean) { return permanently ? `Are you sure you want to permanently delete ${title}?` @@ -32,44 +50,80 @@ export function StringEmptyTrash(count: number) { } /** @account */ -export const STRING_ACCOUNT_MENU_UNCHECK_MERGE = "Unchecking this option means any of the notes you have written while you were signed out will be deleted. Are you sure you want to discard these notes?"; -export const STRING_SIGN_OUT_CONFIRMATION = "Are you sure you want to end your session? This will delete all local items and extensions."; -export const STRING_ERROR_DECRYPTING_IMPORT = "There was an error decrypting your items. Make sure the password you entered is correct and try again."; -export const STRING_E2E_ENABLED = "End-to-end encryption is enabled. Your data is encrypted on your device first, then synced to your private cloud."; -export const STRING_LOCAL_ENC_ENABLED = "Encryption is enabled. Your data is encrypted using your passcode before it is saved to your device storage."; -export const STRING_ENC_NOT_ENABLED = "Encryption is not enabled. Sign in, register, or add a passcode lock to enable encryption."; -export const STRING_IMPORT_SUCCESS = "Your data has been successfully imported."; -export const STRING_REMOVE_PASSCODE_CONFIRMATION = "Are you sure you want to remove your application passcode?"; -export const STRING_REMOVE_PASSCODE_OFFLINE_ADDENDUM = " This will remove encryption from your local data."; -export const STRING_NON_MATCHING_PASSCODES = "The two passcodes you entered do not match. Please try again."; -export const STRING_NON_MATCHING_PASSWORDS = "The two passwords you entered do not match. Please try again."; -export const STRING_GENERATING_LOGIN_KEYS = "Generating Login Keys..."; -export const STRING_GENERATING_REGISTER_KEYS = "Generating Account Keys..."; -export const STRING_INVALID_IMPORT_FILE = "Unable to open file. Ensure it is a proper JSON file and try again."; +export const STRING_ACCOUNT_MENU_UNCHECK_MERGE = + 'Unchecking this option means any of the notes you have written while you were signed out will be deleted. Are you sure you want to discard these notes?'; +export const STRING_SIGN_OUT_CONFIRMATION = + 'Are you sure you want to end your session? This will delete all local items and extensions.'; +export const STRING_ERROR_DECRYPTING_IMPORT = + 'There was an error decrypting your items. Make sure the password you entered is correct and try again.'; +export const STRING_E2E_ENABLED = + 'End-to-end encryption is enabled. Your data is encrypted on your device first, then synced to your private cloud.'; +export const STRING_LOCAL_ENC_ENABLED = + 'Encryption is enabled. Your data is encrypted using your passcode before it is saved to your device storage.'; +export const STRING_ENC_NOT_ENABLED = + 'Encryption is not enabled. Sign in, register, or add a passcode lock to enable encryption.'; +export const STRING_IMPORT_SUCCESS = + 'Your data has been successfully imported.'; +export const STRING_REMOVE_PASSCODE_CONFIRMATION = + 'Are you sure you want to remove your application passcode?'; +export const STRING_REMOVE_PASSCODE_OFFLINE_ADDENDUM = + ' This will remove encryption from your local data.'; +export const STRING_NON_MATCHING_PASSCODES = + 'The two passcodes you entered do not match. Please try again.'; +export const STRING_NON_MATCHING_PASSWORDS = + 'The two passwords you entered do not match. Please try again.'; +export const STRING_GENERATING_LOGIN_KEYS = 'Generating Login Keys...'; +export const STRING_GENERATING_REGISTER_KEYS = 'Generating Account Keys...'; +export const STRING_INVALID_IMPORT_FILE = + 'Unable to open file. Ensure it is a proper JSON file and try again.'; export function StringImportError(errorCount: number) { return `Import complete. ${errorCount} items were not imported because there was an error decrypting them. Make sure the password is correct and try again.`; } -export const STRING_UNSUPPORTED_BACKUP_FILE_VERSION = 'This backup file was created using an unsupported version of the application and cannot be imported here. Please update your application and try again.'; +export const STRING_UNSUPPORTED_BACKUP_FILE_VERSION = + 'This backup file was created using an unsupported version of the application and cannot be imported here. Please update your application and try again.'; /** @password_change */ -export const STRING_FAILED_PASSWORD_CHANGE = "There was an error re-encrypting your items. Your password was changed, but not all your items were properly re-encrypted and synced. You should try syncing again. If all else fails, you should restore your notes from backup."; +export const STRING_FAILED_PASSWORD_CHANGE = + 'There was an error re-encrypting your items. Your password was changed, but not all your items were properly re-encrypted and synced. You should try syncing again. If all else fails, you should restore your notes from backup.'; export const STRING_CONFIRM_APP_QUIT_DURING_UPGRADE = - "The encryption upgrade is in progress. You may lose data if you quit the app. " + - "Are you sure you want to quit?" + 'The encryption upgrade is in progress. You may lose data if you quit the app. ' + + 'Are you sure you want to quit?'; export const STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_CHANGE = - "A passcode change is in progress. You may lose data if you quit the app. " + - "Are you sure you want to quit?" + 'A passcode change is in progress. You may lose data if you quit the app. ' + + 'Are you sure you want to quit?'; export const STRING_CONFIRM_APP_QUIT_DURING_PASSCODE_REMOVAL = - "A passcode removal is in progress. You may lose data if you quit the app. " + - "Are you sure you want to quit?" + 'A passcode removal is in progress. You may lose data if you quit the app. ' + + 'Are you sure you want to quit?'; -export const STRING_UPGRADE_ACCOUNT_CONFIRM_TITLE = 'Encryption upgrade available'; +export const STRING_UPGRADE_ACCOUNT_CONFIRM_TITLE = + 'Encryption upgrade available'; export const STRING_UPGRADE_ACCOUNT_CONFIRM_TEXT = 'Encryption version 004 is available. ' + 'This version strengthens the encryption algorithms your account and ' + 'local storage use. To learn more about this upgrade, visit our ' + 'Security Upgrade page.'; export const STRING_UPGRADE_ACCOUNT_CONFIRM_BUTTON = 'Upgrade'; + +export const Strings = { + keyStorageInfo(application: SNApplication): string | null { + if (!isDesktopApplication()) { + return null; + } + if (!application.hasAccount()) { + return null; + } + const platform = getPlatform(); + const keychainName = + platform === Platform.WindowsDesktop + ? 'credential manager' + : platform === Platform.MacDesktop + ? 'keychain' + : 'password manager'; + return `Your keys are currently stored in your operating system's ${keychainName}. Adding a passcode prevents even your operating system from reading them.`; + }, + protectingNoteWithoutProtectionSources: 'Access to this note will not be restricted until you set up a passcode or account.', + openAccountMenu: 'Open Account Menu' +}; diff --git a/app/assets/javascripts/tsconfig.json b/app/assets/javascripts/tsconfig.json index 1381b681e..afff29158 100644 --- a/app/assets/javascripts/tsconfig.json +++ b/app/assets/javascripts/tsconfig.json @@ -6,7 +6,7 @@ "allowJs": true, "noEmit": true, "strict": true, - "isolatedModules": true, + "isolatedModules": false, "esModuleInterop": true, "declaration": true, "newLine": "lf", @@ -14,6 +14,7 @@ "baseUrl": ".", "jsx": "react-jsx", "jsxImportSource": "preact", + "typeRoots": ["./@types"], "paths": { "%/*": ["../templates/*"], "@/*": ["./*"], diff --git a/app/assets/javascripts/typings/pug.d.ts b/app/assets/javascripts/typings/pug.d.ts index 8005eaa90..73500cba1 100644 --- a/app/assets/javascripts/typings/pug.d.ts +++ b/app/assets/javascripts/typings/pug.d.ts @@ -1,5 +1,5 @@ declare module "*.pug" { - import { compileTemplate } from 'pug' + import { compileTemplate } from 'pug'; const content: compileTemplate; export default content; } \ No newline at end of file diff --git a/app/assets/javascripts/ui_models/app_state.ts b/app/assets/javascripts/ui_models/app_state.ts index f64d2f8c8..8748bb593 100644 --- a/app/assets/javascripts/ui_models/app_state.ts +++ b/app/assets/javascripts/ui_models/app_state.ts @@ -1,22 +1,22 @@ import { isDesktopApplication, isDev } from '@/utils'; import pull from 'lodash/pull'; import { - ProtectedAction, ApplicationEvent, SNTag, SNNote, - SNUserPrefs, ContentType, - SNSmartTag, PayloadSource, DeinitSource, UuidString, SyncOpStatus, + PrefKey, + SNApplication, } from '@standardnotes/snjs'; import { WebApplication } from '@/ui_models/application'; import { Editor } from '@/ui_models/editor'; -import { action, makeObservable, observable } from 'mobx'; +import { action, makeObservable, observable, runInAction } from 'mobx'; import { Bridge } from '@/services/bridge'; +import { storage, StorageKey } from '@/services/localStorage'; export enum AppStateEvent { TagChanged, @@ -29,6 +29,11 @@ export enum AppStateEvent { WindowDidBlur, } +export type PanelResizedData = { + panel: string; + collapsed: boolean; +}; + export enum EventSource { UserInteraction, Script, @@ -36,8 +41,6 @@ export enum EventSource { type ObserverCallback = (event: AppStateEvent, data?: any) => Promise; -const SHOW_BETA_WARNING_KEY = 'show_beta_warning'; - class ActionsMenuState { hiddenExtensions: Record = {}; @@ -45,7 +48,7 @@ class ActionsMenuState { makeObservable(this, { hiddenExtensions: observable, toggleExtensionVisibility: action, - deinit: action, + reset: action, }); } @@ -53,7 +56,7 @@ class ActionsMenuState { this.hiddenExtensions[uuid] = !this.hiddenExtensions[uuid]; } - deinit() { + reset() { this.hiddenExtensions = {}; } } @@ -72,7 +75,7 @@ export class SyncState { }); } - update(status: SyncOpStatus) { + update(status: SyncOpStatus): void { this.errorMessage = status.error?.message; this.inProgress = status.syncInProgress; const stats = status.getStats(); @@ -92,6 +95,59 @@ export class SyncState { } } +class AccountMenuState { + show = false; + constructor() { + makeObservable(this, { + show: observable, + setShow: action, + toggleShow: action, + }); + } + setShow(show: boolean) { + this.show = show; + } + toggleShow() { + this.show = !this.show; + } +} + +class NoAccountWarningState { + show: boolean; + constructor(application: SNApplication, appObservers: (() => void)[]) { + this.show = application.hasAccount() + ? false + : storage.get(StorageKey.ShowNoAccountWarning) ?? true; + + appObservers.push( + application.addEventObserver(async () => { + runInAction(() => { + this.show = false; + }); + }, ApplicationEvent.SignedIn), + application.addEventObserver(async () => { + if (application.hasAccount()) { + runInAction(() => { + this.show = false; + }); + } + }, ApplicationEvent.Started) + ); + + makeObservable(this, { + show: observable, + hide: action, + }); + } + hide() { + this.show = false; + storage.set(StorageKey.ShowNoAccountWarning, false); + } + reset() { + storage.remove(StorageKey.ShowNoAccountWarning); + } +} + export class AppState { readonly enableUnfinishedFeatures = isDev || location.host.includes('app-dev.standardnotes.org'); @@ -106,12 +162,15 @@ export class AppState { rootScopeCleanup2: any; onVisibilityChange: any; selectedTag?: SNTag; - multiEditorEnabled = false; - showBetaWarning = false; + showBetaWarning: boolean; + readonly accountMenu = new AccountMenuState(); readonly actionsMenu = new ActionsMenuState(); + readonly noAccountWarning: NoAccountWarningState; readonly sync = new SyncState(); isSessionsModalVisible = false; + private appEventObserverRemovers: (() => void)[] = []; + /* @ngInject */ constructor( $rootScope: ng.IRootScopeService, @@ -122,15 +181,10 @@ export class AppState { this.$timeout = $timeout; this.$rootScope = $rootScope; this.application = application; - makeObservable(this, { - showBetaWarning: observable, - isSessionsModalVisible: observable, - - enableBetaWarning: action, - disableBetaWarning: action, - openSessionsModal: action, - closeSessionsModal: action, - }); + this.noAccountWarning = new NoAccountWarningState( + application, + this.appEventObserverRemovers + ); this.addAppEventObserver(); this.streamNotesAndTags(); this.onVisibilityChange = () => { @@ -141,17 +195,35 @@ export class AppState { this.notifyEvent(event); }; this.registerVisibilityObservers(); - this.determineBetaWarningValue(); + + if (this.bridge.appVersion.includes('-beta')) { + this.showBetaWarning = storage.get(StorageKey.ShowBetaWarning) ?? true; + } else { + this.showBetaWarning = false; + } + + makeObservable(this, { + showBetaWarning: observable, + isSessionsModalVisible: observable, + + enableBetaWarning: action, + disableBetaWarning: action, + openSessionsModal: action, + closeSessionsModal: action, + }); } - deinit(source: DeinitSource) { + deinit(source: DeinitSource): void { if (source === DeinitSource.SignOut) { - localStorage.removeItem(SHOW_BETA_WARNING_KEY); + storage.remove(StorageKey.ShowBetaWarning); + this.noAccountWarning.reset(); } - this.actionsMenu.deinit(); + this.actionsMenu.reset(); this.unsubApp(); this.unsubApp = undefined; this.observers.length = 0; + this.appEventObserverRemovers.forEach((remover) => remover()); + this.appEventObserverRemovers.length = 0; if (this.rootScopeCleanup1) { this.rootScopeCleanup1(); this.rootScopeCleanup2(); @@ -172,30 +244,12 @@ export class AppState { disableBetaWarning() { this.showBetaWarning = false; - localStorage.setItem(SHOW_BETA_WARNING_KEY, 'false'); + storage.set(StorageKey.ShowBetaWarning, false); } enableBetaWarning() { this.showBetaWarning = true; - localStorage.setItem(SHOW_BETA_WARNING_KEY, 'true'); - } - - clearBetaWarning() { - localStorage.setItem(SHOW_BETA_WARNING_KEY, 'true'); - } - - private determineBetaWarningValue() { - if (this.bridge.appVersion.includes('-beta')) { - switch (localStorage.getItem(SHOW_BETA_WARNING_KEY)) { - case 'true': - default: - this.enableBetaWarning(); - break; - case 'false': - this.disableBetaWarning(); - break; - } - } + storage.set(StorageKey.ShowBetaWarning, true); } /** @@ -210,7 +264,7 @@ export class AppState { : this.selectedTag.uuid : undefined; - if (!activeEditor || this.multiEditorEnabled) { + if (!activeEditor) { this.application.editorGroup.createEditor( undefined, title, @@ -221,35 +275,25 @@ export class AppState { } } - async openEditor(noteUuid: string) { + async openEditor(noteUuid: string): Promise { + if (this.getActiveEditor()?.note?.uuid === noteUuid) { + return; + } + const note = this.application.findItem(noteUuid) as SNNote; - if (this.getActiveEditor()?.note?.uuid === noteUuid) return; - const run = async () => { + if (!note) { + console.warn('Tried accessing a non-existant note of UUID ' + noteUuid); + return; + } + + if (await this.application.authorizeNoteAccess(note)) { const activeEditor = this.getActiveEditor(); - if (!activeEditor || this.multiEditorEnabled) { + if (!activeEditor) { this.application.editorGroup.createEditor(noteUuid); } else { activeEditor.setNote(note); } await this.notifyEvent(AppStateEvent.ActiveEditorChanged); - }; - if ( - note && - note.safeContent.protected && - (await this.application.privilegesService!.actionRequiresPrivilege( - ProtectedAction.ViewProtectedNotes - )) - ) { - return new Promise((resolve) => { - this.application.presentPrivilegesModal( - ProtectedAction.ViewProtectedNotes, - () => { - run().then(resolve); - } - ); - }); - } else { - return run(); } } @@ -299,7 +343,11 @@ export class AppState { this.closeEditor(editor); } else if (note.trashed && !this.selectedTag?.isTrashTag) { this.closeEditor(editor); - } else if (note.archived && !this.selectedTag?.isArchiveTag) { + } else if ( + note.archived && + !this.selectedTag?.isArchiveTag && + !this.application.getPreference(PrefKey.NotesShowArchived, false) + ) { this.closeEditor(editor); } } @@ -400,10 +448,11 @@ export class AppState { } panelDidResize(name: string, collapsed: boolean) { - this.notifyEvent(AppStateEvent.PanelResized, { + const data: PanelResizedData = { panel: name, collapsed: collapsed, - }); + }; + this.notifyEvent(AppStateEvent.PanelResized, data); } editorDidFocus(eventSource: EventSource) { diff --git a/app/assets/javascripts/ui_models/application.ts b/app/assets/javascripts/ui_models/application.ts index 79f628799..2bc8b2c66 100644 --- a/app/assets/javascripts/ui_models/application.ts +++ b/app/assets/javascripts/ui_models/application.ts @@ -1,4 +1,3 @@ -import { PermissionDialog } from '@standardnotes/snjs'; import { ComponentModalScope } from './../directives/views/componentModal'; import { AccountSwitcherScope, PermissionsModalScope } from './../types'; import { ComponentGroup } from './component_group'; @@ -8,11 +7,12 @@ import { PasswordWizardType, PasswordWizardScope } from '@/types'; import { SNApplication, platformFromString, - Challenge, - ProtectedAction, SNComponent + SNComponent, + PermissionDialog, + DeinitSource, } from '@standardnotes/snjs'; import angular from 'angular'; -import { getPlatformString } from '@/utils'; +import { getPlatform, getPlatformString } from '@/utils'; import { AlertService } from '@/services/alertService'; import { WebDeviceInterface } from '@/web_device_interface'; import { @@ -25,26 +25,25 @@ import { KeyboardManager } from '@/services'; import { AppState } from '@/ui_models/app_state'; -import { SNWebCrypto } from '@standardnotes/sncrypto-web'; import { Bridge } from '@/services/bridge'; -import { DeinitSource } from '@standardnotes/snjs'; +import { WebCrypto } from '@/crypto'; type WebServices = { - appState: AppState - desktopService: DesktopManager - autolockService: AutolockService - archiveService: ArchiveManager - nativeExtService: NativeExtManager - statusManager: StatusManager - themeService: ThemeManager - keyboardService: KeyboardManager + appState: AppState; + desktopService: DesktopManager; + autolockService: AutolockService; + archiveService: ArchiveManager; + nativeExtService: NativeExtManager; + statusManager: StatusManager; + themeService: ThemeManager; + keyboardService: KeyboardManager; } export class WebApplication extends SNApplication { - private scope?: ng.IScope + private scope?: angular.IScope private webServices!: WebServices - private currentAuthenticationElement?: JQLite + private currentAuthenticationElement?: angular.IRootElementService public editorGroup: EditorGroup public componentGroup: ComponentGroup @@ -52,16 +51,16 @@ export class WebApplication extends SNApplication { constructor( deviceInterface: WebDeviceInterface, identifier: string, - private $compile: ng.ICompileService, - scope: ng.IScope, + private $compile: angular.ICompileService, + scope: angular.IScope, defaultSyncServerHost: string, private bridge: Bridge, ) { super( bridge.environment, - platformFromString(getPlatformString()), + getPlatform(), deviceInterface, - new SNWebCrypto(), + WebCrypto, new AlertService(), identifier, undefined, @@ -78,7 +77,7 @@ export class WebApplication extends SNApplication { } /** @override */ - deinit(source: DeinitSource) { + deinit(source: DeinitSource): void { for (const service of Object.values(this.webServices)) { if ('deinit' in service) { service.deinit?.(source); @@ -98,24 +97,24 @@ export class WebApplication extends SNApplication { * to complete before destroying the global application instance and all its services */ setTimeout(() => { super.deinit(source); - }, 0) + }, 0); } - onStart() { + onStart(): void { super.onStart(); this.componentManager!.openModalComponent = this.openModalComponent; this.componentManager!.presentPermissionsDialog = this.presentPermissionsDialog; } - setWebServices(services: WebServices) { + setWebServices(services: WebServices): void { this.webServices = services; } - public getAppState() { + public getAppState(): AppState { return this.webServices.appState; } - public getDesktopService() { + public getDesktopService(): DesktopManager { return this.webServices.desktopService; } @@ -158,58 +157,6 @@ export class WebApplication extends SNApplication { this.applicationElement.append(el); } - promptForChallenge(challenge: Challenge) { - const scope: any = this.scope!.$new(true); - scope.challenge = challenge; - scope.application = this; - const el = this.$compile!( - "" + - "" - )(scope); - this.applicationElement.append(el); - } - - async presentPrivilegesModal( - action: ProtectedAction, - onSuccess?: any, - onCancel?: any - ) { - if (this.authenticationInProgress()) { - onCancel && onCancel(); - return; - } - - const customSuccess = async () => { - onSuccess && await onSuccess(); - this.currentAuthenticationElement = undefined; - }; - const customCancel = async () => { - onCancel && await onCancel(); - this.currentAuthenticationElement = undefined; - }; - - const scope: any = this.scope!.$new(true); - scope.action = action; - scope.onSuccess = customSuccess; - scope.onCancel = customCancel; - scope.application = this; - const el = this.$compile!(` - - `)(scope); - this.applicationElement.append(el); - - this.currentAuthenticationElement = el; - } - - presentPrivilegesManagementModal() { - const scope: any = this.scope!.$new(true); - scope.application = this; - const el = this.$compile!("")(scope); - this.applicationElement.append(el); - } - authenticationInProgress() { return this.currentAuthenticationElement != null; } @@ -254,7 +201,12 @@ export class WebApplication extends SNApplication { this.applicationElement.append(el); } - openModalComponent(component: SNComponent) { + async openModalComponent(component: SNComponent): Promise { + if (component.package_info?.identifier === "org.standardnotes.batch-manager") { + if (!await this.authorizeBatchManagerAccess()) { + return; + } + } const scope = this.scope!.$new(true) as Partial; scope.componentUuid = component.uuid; scope.application = this; diff --git a/app/assets/javascripts/ui_models/component_group.ts b/app/assets/javascripts/ui_models/component_group.ts index 77e69ee5d..16bdffe58 100644 --- a/app/assets/javascripts/ui_models/component_group.ts +++ b/app/assets/javascripts/ui_models/component_group.ts @@ -1,13 +1,13 @@ -import { SNComponent, ComponentArea, removeFromArray, addIfUnique } from '@standardnotes/snjs'; +import { SNComponent, ComponentArea, removeFromArray, addIfUnique , UuidString } from '@standardnotes/snjs'; import { WebApplication } from './application'; -import { UuidString } from '@standardnotes/snjs'; + /** Areas that only allow a single component to be active */ const SingleComponentAreas = [ ComponentArea.Editor, ComponentArea.NoteTags, ComponentArea.TagsList -] +]; export class ComponentGroup { @@ -20,7 +20,7 @@ export class ComponentGroup { } get componentManager() { - return this.application?.componentManager!; + return this.application.componentManager!; } public deinit() { @@ -91,7 +91,7 @@ export class ComponentGroup { callback(); return () => { removeFromArray(this.changeObservers, callback); - } + }; } private notifyObservers() { diff --git a/app/assets/javascripts/ui_models/editor_group.ts b/app/assets/javascripts/ui_models/editor_group.ts index 46e46a136..0ed73352c 100644 --- a/app/assets/javascripts/ui_models/editor_group.ts +++ b/app/assets/javascripts/ui_models/editor_group.ts @@ -68,7 +68,7 @@ export class EditorGroup { } return () => { removeFromArray(this.changeObservers, callback); - } + }; } private notifyObservers() { diff --git a/app/assets/javascripts/utils.ts b/app/assets/javascripts/utils.ts index 586d943c9..c5f9b6be6 100644 --- a/app/assets/javascripts/utils.ts +++ b/app/assets/javascripts/utils.ts @@ -1,3 +1,11 @@ +import { Platform, platformFromString } from '@standardnotes/snjs'; + +declare const process: { + env: { + NODE_ENV: string | null | undefined; + }; +}; + export const isDev = process.env.NODE_ENV === 'development'; export function getPlatformString() { @@ -20,15 +28,18 @@ export function getPlatformString() { } } +export function getPlatform(): Platform { + return platformFromString(getPlatformString()); +} + let sharedDateFormatter: Intl.DateTimeFormat; export function dateToLocalizedString(date: Date) { if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) { if (!sharedDateFormatter) { - const locale = ( - (navigator.languages && navigator.languages.length) + const locale = + navigator.languages && navigator.languages.length ? navigator.languages[0] - : navigator.language - ); + : navigator.language; sharedDateFormatter = new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'numeric', @@ -46,11 +57,26 @@ export function dateToLocalizedString(date: Date) { } } +export function isSameDay(dateA: Date, dateB: Date): boolean { + return ( + dateA.getFullYear() === dateB.getFullYear() && + dateA.getMonth() === dateB.getMonth() && + dateA.getDate() === dateB.getDate() + ); +} + /** Via https://davidwalsh.name/javascript-debounce-function */ -export function debounce(this: any, func: any, wait: number, immediate = false) { +export function debounce( + this: any, + func: any, + wait: number, + immediate = false +) { let timeout: any; return () => { + // eslint-disable-next-line @typescript-eslint/no-this-alias const context = this; + // eslint-disable-next-line prefer-rest-params const args = arguments; const later = function () { timeout = null; @@ -61,7 +87,7 @@ export function debounce(this: any, func: any, wait: number, immediate = false) timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; -}; +} // https://tc39.github.io/ecma262/#sec-array.prototype.includes if (!Array.prototype.includes) { @@ -73,10 +99,10 @@ if (!Array.prototype.includes) { } // 1. Let O be ? ToObject(this value). - var o = Object(this); + const o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). - var len = o.length >>> 0; + const len = o.length >>> 0; // 3. If len is 0, return false. if (len === 0) { @@ -85,14 +111,14 @@ if (!Array.prototype.includes) { // 4. Let n be ? ToInteger(fromIndex). // (If fromIndex is undefined, this step produces the value 0.) - var n = fromIndex | 0; + const n = fromIndex | 0; // 5. If n ≥ 0, then // a. Let k be n. // 6. Else n < 0, // a. Let k be len + n. // b. If k < 0, let k be 0. - var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); function sameValueZero(x: number, y: number) { return ( @@ -117,7 +143,7 @@ if (!Array.prototype.includes) { // 8. Return false return false; - } + }, }); } @@ -139,7 +165,9 @@ declare const __WEB__: boolean; declare const __DESKTOP__: boolean; if (!__WEB__ && !__DESKTOP__) { - throw Error('Neither __WEB__ nor __DESKTOP__ is true. Check your configuration files.'); + throw Error( + 'Neither __WEB__ nor __DESKTOP__ is true. Check your configuration files.' + ); } export function isDesktopApplication() { diff --git a/app/assets/javascripts/views/abstract/pure_view_ctrl.ts b/app/assets/javascripts/views/abstract/pure_view_ctrl.ts index fb8af1751..0c104d7dd 100644 --- a/app/assets/javascripts/views/abstract/pure_view_ctrl.ts +++ b/app/assets/javascripts/views/abstract/pure_view_ctrl.ts @@ -30,7 +30,7 @@ export class PureViewCtrl

{ this.state = { ...this.getInitialState(), ...this.state, - } + }; this.addAppEventObserver(); this.addAppStateObserver(); this.templateReady = true; @@ -77,10 +77,16 @@ export class PureViewCtrl

{ */ this.state = Object.freeze(Object.assign({}, this.state, state)); resolve(); + this.afterStateChange(); }); }); } + /** @override */ + // eslint-disable-next-line @typescript-eslint/no-empty-function + afterStateChange(): void { + } + /** @returns a promise that resolves after the UI has been updated. */ flushUI() { return this.$timeout(); diff --git a/app/assets/javascripts/views/account_switcher/account_switcher.ts b/app/assets/javascripts/views/account_switcher/account_switcher.ts index 3cbb1d4ed..9ca75b1eb 100644 --- a/app/assets/javascripts/views/account_switcher/account_switcher.ts +++ b/app/assets/javascripts/views/account_switcher/account_switcher.ts @@ -7,7 +7,7 @@ import { import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; import { WebDirective } from '@/types'; -class AccountSwitcherCtrl extends PureViewCtrl<{}, { +class AccountSwitcherCtrl extends PureViewCtrl { @@ -38,7 +38,7 @@ class AccountSwitcherCtrl extends PureViewCtrl<{}, { reloadApplications() { this.setState({ descriptors: this.mainApplicationGroup.getDescriptors() - }) + }); } /** @template */ @@ -63,7 +63,7 @@ class AccountSwitcherCtrl extends PureViewCtrl<{}, { this.setState({ editingDescriptor: descriptor }).then(() => { const input = this.inputForDescriptor(descriptor); input?.focus(); - }) + }); } /** @template */ @@ -71,7 +71,7 @@ class AccountSwitcherCtrl extends PureViewCtrl<{}, { this.mainApplicationGroup.renameDescriptor( this.state.editingDescriptor!, this.state.editingDescriptor!.label - ) + ); this.setState({ editingDescriptor: undefined }); } diff --git a/app/assets/javascripts/views/application/application-view.pug b/app/assets/javascripts/views/application/application-view.pug index bb7149b0a..b428a9fab 100644 --- a/app/assets/javascripts/views/application/application-view.pug +++ b/app/assets/javascripts/views/application/application-view.pug @@ -26,4 +26,12 @@ path(d="M480 256l-75.53-33.53L256.1 290.6l-148.77-68.17L32 256l224 102 224-102z") sessions-modal( application='self.application' + app-state='self.appState' + ) + challenge-modal( + ng-repeat="challenge in self.challenges track by challenge.id" + class="sk-modal" + application="self.application" + challenge="challenge" + on-dismiss="self.removeChallenge(challenge)" ) diff --git a/app/assets/javascripts/views/application/application_view.ts b/app/assets/javascripts/views/application/application_view.ts index fe477fdd4..3dbf4ab91 100644 --- a/app/assets/javascripts/views/application/application_view.ts +++ b/app/assets/javascripts/views/application/application_view.ts @@ -2,8 +2,8 @@ import { RootScopeMessages } from './../../messages'; import { WebDirective } from '@/types'; import { getPlatformString } from '@/utils'; import template from './application-view.pug'; -import { AppStateEvent } from '@/ui_models/app_state'; -import { ApplicationEvent } from '@standardnotes/snjs'; +import { AppStateEvent, PanelResizedData } from '@/ui_models/app_state'; +import { ApplicationEvent, Challenge, removeFromArray } from '@standardnotes/snjs'; import { PANEL_NAME_NOTES, PANEL_NAME_TAGS @@ -14,37 +14,44 @@ import { import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; import { alertDialog } from '@/services/alertService'; -class ApplicationViewCtrl extends PureViewCtrl { - private $location?: ng.ILocationService - private $rootScope?: ng.IRootScopeService +class ApplicationViewCtrl extends PureViewCtrl { public platformString: string private notesCollapsed = false private tagsCollapsed = false + /** + * To prevent stale state reads (setState is async), + * challenges is a mutable array + */ + private challenges: Challenge[] = []; /* @ngInject */ constructor( - $location: ng.ILocationService, - $rootScope: ng.IRootScopeService, + private $location: ng.ILocationService, + private $rootScope: ng.IRootScopeService, $timeout: ng.ITimeoutService ) { super($timeout); this.$location = $location; this.$rootScope = $rootScope; this.platformString = getPlatformString(); - this.state = { appClass: '' }; + this.state = this.getInitialState(); this.onDragDrop = this.onDragDrop.bind(this); this.onDragOver = this.onDragOver.bind(this); this.addDragDropHandlers(); } deinit() { - this.$location = undefined; - this.$rootScope = undefined; - (this.application as any) = undefined; + (this.$location as unknown) = undefined; + (this.$rootScope as unknown) = undefined; + (this.application as unknown) = undefined; window.removeEventListener('dragover', this.onDragOver, true); window.removeEventListener('drop', this.onDragDrop, true); - (this.onDragDrop as any) = undefined; - (this.onDragOver as any) = undefined; + (this.onDragDrop as unknown) = undefined; + (this.onDragOver as unknown) = undefined; super.deinit(); } @@ -53,23 +60,38 @@ class ApplicationViewCtrl extends PureViewCtrl { this.loadApplication(); } + getInitialState() { + return { + appClass: '', + challenges: [], + }; + } + async loadApplication() { - this.application!.componentManager!.setDesktopManager( - this.application!.getDesktopService() + this.application.componentManager.setDesktopManager( + this.application.getDesktopService() ); - await this.application!.prepareForLaunch({ + await this.application.prepareForLaunch({ receiveChallenge: async (challenge) => { - this.application!.promptForChallenge(challenge); + this.$timeout(() => { + this.challenges.push(challenge); + }); } }); - await this.application!.launch(); + await this.application.launch(); + } + + public async removeChallenge(challenge: Challenge) { + this.$timeout(() => { + removeFromArray(this.challenges, challenge); + }); } async onAppStart() { super.onAppStart(); this.setState({ ready: true, - needsUnlock: this.application!.hasPasscode() + needsUnlock: this.application.hasPasscode() }); } @@ -80,8 +102,8 @@ class ApplicationViewCtrl extends PureViewCtrl { } onUpdateAvailable() { - this.$rootScope!.$broadcast(RootScopeMessages.NewUpdateAvailable); - }; + this.$rootScope.$broadcast(RootScopeMessages.NewUpdateAvailable); + } /** @override */ async onAppEvent(eventName: ApplicationEvent) { @@ -98,21 +120,22 @@ class ApplicationViewCtrl extends PureViewCtrl { } /** @override */ - async onAppStateEvent(eventName: AppStateEvent, data?: any) { + async onAppStateEvent(eventName: AppStateEvent, data?: unknown) { if (eventName === AppStateEvent.PanelResized) { - if (data.panel === PANEL_NAME_NOTES) { - this.notesCollapsed = data.collapsed; + const { panel, collapsed } = data as PanelResizedData; + if (panel === PANEL_NAME_NOTES) { + this.notesCollapsed = collapsed; } - if (data.panel === PANEL_NAME_TAGS) { - this.tagsCollapsed = data.collapsed; + if (panel === PANEL_NAME_TAGS) { + this.tagsCollapsed = collapsed; } let appClass = ""; if (this.notesCollapsed) { appClass += "collapsed-notes"; } if (this.tagsCollapsed) { appClass += " collapsed-tags"; } this.setState({ appClass }); } else if (eventName === AppStateEvent.WindowDidFocus) { - if (!(await this.application!.isLocked())) { - this.application!.sync(); + if (!(await this.application.isLocked())) { + this.application.sync(); } } } @@ -128,29 +151,29 @@ class ApplicationViewCtrl extends PureViewCtrl { } onDragOver(event: DragEvent) { - if (event.dataTransfer!.files.length > 0) { + if (event.dataTransfer?.files.length) { event.preventDefault(); } } onDragDrop(event: DragEvent) { - if (event.dataTransfer!.files.length > 0) { + if (event.dataTransfer?.files.length) { event.preventDefault(); - this.application!.alertService!.alert( - STRING_DEFAULT_FILE_ERROR - ); + void alertDialog({ + text: STRING_DEFAULT_FILE_ERROR + }); } } async handleDemoSignInFromParams() { if ( - this.$location!.search().demo === 'true' && + this.$location.search().demo === 'true' && !this.application.hasAccount() ) { - await this.application!.setHost( + await this.application.setHost( 'https://syncing-server-demo.standardnotes.org' ); - this.application!.signIn( + this.application.signIn( 'demo@standardnotes.org', 'password', ); diff --git a/app/assets/javascripts/views/challenge_modal/challenge-modal.pug b/app/assets/javascripts/views/challenge_modal/challenge-modal.pug deleted file mode 100644 index bb44ffbf9..000000000 --- a/app/assets/javascripts/views/challenge_modal/challenge-modal.pug +++ /dev/null @@ -1,59 +0,0 @@ -.sk-modal-background(ng-click="ctrl.cancel()") -.challenge-modal.sk-modal-content(ng-if='ctrl.templateReady') - .sn-component - .sk-panel - .sk-panel-header - .sk-panel-header-title {{ctrl.challenge.modalTitle}} - .sk-panel-content - .sk-panel-section - .sk-p.sk-panel-row.centered.prompt - strong {{ctrl.challenge.heading}} - .sk-p.sk-panel-row.centered.subprompt(ng-if='ctrl.challenge.subheading') - | {{ctrl.challenge.subheading}} - .sk-panel-section - div(ng-repeat="prompt in ctrl.state.prompts track by prompt.id") - .sk-panel-row - input.sk-input.contrast( - ng-model="ctrl.state.values[prompt.id].value" - should-focus="$index == 0" - sn-autofocus="true" - sn-enter="ctrl.submit()" , - ng-change="ctrl.onTextValueChange(prompt)" - ng-attr-type="{{prompt.secureTextEntry ? 'password' : 'text'}}", - ng-attr-placeholder="{{prompt.title}}" - ) - .sk-panel-row.centered - label.sk-label.danger( - ng-if="ctrl.state.values[prompt.id].invalid" - ) Invalid authentication. Please try again. - .sk-panel-footer.extra-padding - .sk-button.info.big.block.bold( - ng-click="ctrl.submit()", - ng-class="{'info' : !ctrl.state.processing, 'neutral': ctrl.state.processing}" - ng-disabled="ctrl.state.processing" - ) - .sk-label {{ctrl.state.processing ? 'Generating Keys...' : 'Submit'}} - .sk-panel-row(ng-if="ctrl.challenge.cancelable") - a.sk-panel-row.sk-a.info.centered( - ng-if="ctrl.challenge.cancelable" - ng-click="ctrl.cancel()" - ) Cancel - - .sk-panel-footer(ng-if="ctrl.state.showForgotPasscodeLink") - a.sk-panel-row.sk-a.info.centered( - ng-if="!ctrl.state.forgotPasscode" - ng-click="ctrl.onForgotPasscodeClick()" - ) Forgot your passcode? - p.sk-panel-row.sk-p(ng-if="ctrl.state.forgotPasscode"). - {{ - ctrl.state.hasAccount - ? "If you forgot your application passcode, your only option is to clear - your local data from this device and sign back in to your account." - : "If you forgot your application passcode, your only option is - to delete your data." - }} - a.sk-panel-row.sk-a.danger.centered( - ng-if="ctrl.state.forgotPasscode" - ng-click="ctrl.destroyLocalData()" - ) Delete Local Data - .sk-panel-row diff --git a/app/assets/javascripts/views/challenge_modal/challenge_modal.ts b/app/assets/javascripts/views/challenge_modal/challenge_modal.ts deleted file mode 100644 index 0291a41a9..000000000 --- a/app/assets/javascripts/views/challenge_modal/challenge_modal.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { WebApplication } from '@/ui_models/application'; -import template from './challenge-modal.pug'; -import { - ChallengeValue, - removeFromArray, - Challenge, - ChallengeReason, - ChallengePrompt -} from '@standardnotes/snjs'; -import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; -import { WebDirective } from '@/types'; -import { confirmDialog } from '@/services/alertService'; -import { - STRING_SIGN_OUT_CONFIRMATION, -} from '@/strings'; - -type InputValue = { - prompt: ChallengePrompt; - value: string; - invalid: boolean; -} - -type Values = Record - -type ChallengeModalState = { - prompts: ChallengePrompt[] - values: Partial - processing: boolean, - forgotPasscode: boolean, - showForgotPasscodeLink: boolean, - processingPrompts: ChallengePrompt[], - hasAccount: boolean, -} - -class ChallengeModalCtrl extends PureViewCtrl<{}, ChallengeModalState> { - private $element: JQLite - application!: WebApplication - challenge!: Challenge - - /* @ngInject */ - constructor( - $element: JQLite, - $timeout: ng.ITimeoutService - ) { - super($timeout); - this.$element = $element; - } - - getState() { - return this.state as ChallengeModalState; - } - - $onInit() { - super.$onInit(); - const values = {} as Values; - const prompts = this.challenge.prompts; - for (const prompt of prompts) { - values[prompt.id] = { - prompt, - value: '', - invalid: false - }; - } - const showForgotPasscodeLink = [ - ChallengeReason.ApplicationUnlock, - ChallengeReason.Migration - ].includes(this.challenge.reason); - this.setState({ - prompts, - values, - processing: false, - forgotPasscode: false, - showForgotPasscodeLink, - hasAccount: this.application.hasAccount(), - processingPrompts: [] - }); - this.application.addChallengeObserver( - this.challenge, - { - onValidValue: (value) => { - this.getState().values[value.prompt.id]!.invalid = false; - removeFromArray(this.state.processingPrompts, value.prompt); - this.reloadProcessingStatus(); - }, - onInvalidValue: (value) => { - this.getState().values[value.prompt.id]!.invalid = true; - /** If custom validation, treat all values together and not individually */ - if (!value.prompt.validates) { - this.setState({ processingPrompts: [], processing: false }); - } else { - removeFromArray(this.state.processingPrompts, value.prompt); - this.reloadProcessingStatus(); - } - }, - onComplete: () => { - this.dismiss(); - }, - onCancel: () => { - this.dismiss(); - }, - } - ); - } - - deinit() { - (this.application as any) = undefined; - (this.challenge as any) = undefined; - super.deinit(); - } - - reloadProcessingStatus() { - return this.setState({ - processing: this.state.processingPrompts.length > 0 - }); - } - - async destroyLocalData() { - if (await confirmDialog({ - text: STRING_SIGN_OUT_CONFIRMATION, - confirmButtonStyle: "danger" - })) { - await this.application.signOut(); - this.dismiss(); - }; - } - - /** @template */ - cancel() { - if (this.challenge.cancelable) { - this.application!.cancelChallenge(this.challenge); - } - } - - onForgotPasscodeClick() { - this.setState({ - forgotPasscode: true - }); - } - - onTextValueChange(prompt: ChallengePrompt) { - const values = this.getState().values; - values[prompt.id]!.invalid = false; - this.setState({ values }); - } - - validate() { - const failed = []; - for (const prompt of this.getState().prompts) { - const value = this.getState().values[prompt.id]; - if (!value || value.value.length === 0) { - this.getState().values[prompt.id]!.invalid = true; - } - } - return failed.length === 0; - } - - async submit() { - if (!this.validate()) { - return; - } - await this.setState({ processing: true }); - const values: ChallengeValue[] = []; - for (const inputValue of Object.values(this.getState().values)) { - const rawValue = inputValue!!.value; - const value = new ChallengeValue(inputValue!.prompt, rawValue); - values.push(value); - } - const processingPrompts = values.map((v) => v.prompt); - await this.setState({ - processingPrompts: processingPrompts, - processing: processingPrompts.length > 0 - }) - /** - * Unfortunately neccessary to wait 50ms so that the above setState call completely - * updates the UI to change processing state, before we enter into UI blocking operation - * (crypto key generation) - */ - this.$timeout(() => { - if (values.length > 0) { - this.application.submitValuesForChallenge(this.challenge, values); - } else { - this.setState({ processing: false }); - } - }, 50) - } - - dismiss() { - const elem = this.$element; - const scope = elem.scope(); - scope.$destroy(); - elem.remove(); - } -} - -export class ChallengeModal extends WebDirective { - constructor() { - super(); - this.restrict = 'E'; - this.template = template; - this.controller = ChallengeModalCtrl; - this.controllerAs = 'ctrl'; - this.bindToController = true; - this.scope = { - challenge: '=', - application: '=' - }; - } -} diff --git a/app/assets/javascripts/views/challenge_modal/challenge_modal.tsx b/app/assets/javascripts/views/challenge_modal/challenge_modal.tsx new file mode 100644 index 000000000..a1f486b7c --- /dev/null +++ b/app/assets/javascripts/views/challenge_modal/challenge_modal.tsx @@ -0,0 +1,409 @@ +import { WebApplication } from '@/ui_models/application'; +import { Dialog } from '@reach/dialog'; +import { + ChallengeValue, + removeFromArray, + Challenge, + ChallengeReason, + ChallengePrompt, + ChallengeValidation, + ProtectionSessionDurations, +} from '@standardnotes/snjs'; +import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; +import { WebDirective } from '@/types'; +import { confirmDialog } from '@/services/alertService'; +import { STRING_SIGN_OUT_CONFIRMATION } from '@/strings'; +import { Ref, render } from 'preact'; +import { useRef } from 'preact/hooks'; +import ng from 'angular'; + +type InputValue = { + prompt: ChallengePrompt; + value: string | number | boolean; + invalid: boolean; +}; + +type Values = Record; + +type ChallengeModalState = { + prompts: ChallengePrompt[]; + values: Partial; + processing: boolean; + forgotPasscode: boolean; + showForgotPasscodeLink: boolean; + processingPrompts: ChallengePrompt[]; + hasAccount: boolean; + protectedNoteAccessDuration: number; +}; + +class ChallengeModalCtrl extends PureViewCtrl { + application!: WebApplication; + challenge!: Challenge; + onDismiss!: () => void; + submitting = false; + + /** @template */ + protectionsSessionDurations = ProtectionSessionDurations; + protectionsSessionValidation = ChallengeValidation.ProtectionSessionDuration; + + /* @ngInject */ + constructor( + private $element: ng.IRootElementService, + $timeout: ng.ITimeoutService + ) { + super($timeout); + } + + getState() { + return this.state as ChallengeModalState; + } + + $onInit() { + super.$onInit(); + const values = {} as Values; + const prompts = this.challenge.prompts; + for (const prompt of prompts) { + values[prompt.id] = { + prompt, + value: prompt.initialValue ?? '', + invalid: false, + }; + } + const showForgotPasscodeLink = [ + ChallengeReason.ApplicationUnlock, + ChallengeReason.Migration, + ].includes(this.challenge.reason); + this.setState({ + prompts, + values, + processing: false, + forgotPasscode: false, + showForgotPasscodeLink, + hasAccount: this.application.hasAccount(), + processingPrompts: [], + protectedNoteAccessDuration: ProtectionSessionDurations[0].valueInSeconds, + }); + this.application.addChallengeObserver(this.challenge, { + onValidValue: (value) => { + this.state.values[value.prompt.id]!.invalid = false; + removeFromArray(this.state.processingPrompts, value.prompt); + this.reloadProcessingStatus(); + /** Trigger UI update */ + this.afterStateChange(); + }, + onInvalidValue: (value) => { + this.state.values[value.prompt.id]!.invalid = true; + /** If custom validation, treat all values together and not individually */ + if (!value.prompt.validates) { + this.setState({ processingPrompts: [], processing: false }); + } else { + removeFromArray(this.state.processingPrompts, value.prompt); + this.reloadProcessingStatus(); + } + /** Trigger UI update */ + this.afterStateChange(); + }, + onComplete: () => { + this.dismiss(); + }, + onCancel: () => { + this.dismiss(); + }, + }); + } + + deinit() { + (this.application as any) = undefined; + (this.challenge as any) = undefined; + super.deinit(); + } + + reloadProcessingStatus() { + return this.setState({ + processing: this.state.processingPrompts.length > 0, + }); + } + + async destroyLocalData() { + if ( + await confirmDialog({ + text: STRING_SIGN_OUT_CONFIRMATION, + confirmButtonStyle: 'danger', + }) + ) { + await this.application.signOut(); + this.dismiss(); + } + } + + /** @template */ + cancel() { + if (this.challenge.cancelable) { + this.application!.cancelChallenge(this.challenge); + } + } + + onForgotPasscodeClick() { + this.setState({ + forgotPasscode: true, + }); + } + + onTextValueChange(prompt: ChallengePrompt) { + const values = this.getState().values; + values[prompt.id]!.invalid = false; + this.setState({ values }); + } + + onNumberValueChange(prompt: ChallengePrompt, value: number) { + const values = this.state.values; + values[prompt.id]!.invalid = false; + values[prompt.id]!.value = value; + this.setState({ values }); + } + + validate() { + let failed = 0; + for (const prompt of this.state.prompts) { + const value = this.state.values[prompt.id]!; + if (typeof value.value === 'string' && value.value.length === 0) { + this.state.values[prompt.id]!.invalid = true; + failed++; + } + } + return failed === 0; + } + + async submit() { + if (!this.validate()) { + return; + } + if (this.submitting) { + return; + } + this.submitting = true; + await this.setState({ processing: true }); + const values: ChallengeValue[] = []; + for (const inputValue of Object.values(this.getState().values)) { + const rawValue = inputValue!.value; + const value = new ChallengeValue(inputValue!.prompt, rawValue); + values.push(value); + } + const processingPrompts = values.map((v) => v.prompt); + await this.setState({ + processingPrompts: processingPrompts, + processing: processingPrompts.length > 0, + }); + /** + * Unfortunately neccessary to wait 50ms so that the above setState call completely + * updates the UI to change processing state, before we enter into UI blocking operation + * (crypto key generation) + */ + this.$timeout(() => { + if (values.length > 0) { + this.application.submitValuesForChallenge(this.challenge, values); + } else { + this.setState({ processing: false }); + } + this.submitting = false; + }, 50); + } + + afterStateChange() { + this.render(); + } + + dismiss() { + this.onDismiss(); + } + + $onDestroy() { + render(<>, this.$element[0]); + } + + private render() { + if (!this.state.prompts) return; + render(, this.$element[0]); + } +} + +export class ChallengeModal extends WebDirective { + constructor() { + super(); + this.restrict = 'E'; + // this.template = template; + this.controller = ChallengeModalCtrl; + this.controllerAs = 'ctrl'; + this.bindToController = true; + this.scope = { + challenge: '=', + application: '=', + onDismiss: '&', + }; + } +} + +function ChallengeModalView({ ctrl }: { ctrl: ChallengeModalCtrl }) { + const initialFocusRef = useRef(); + return ( +

{ + if (ctrl.challenge.cancelable) { + ctrl.cancel(); + } + }} + > +
+
+
+
+
+ {ctrl.challenge.modalTitle} +
+
+
+
+
+ {ctrl.challenge.heading} +
+ {ctrl.challenge.subheading && ( +
+ {ctrl.challenge.subheading} +
+ )} +
+ +
+ {ChallengePrompts({ ctrl, initialFocusRef })} +
+
+
+
ctrl.submit()} + > +
+ {ctrl.state.processing ? 'Generating Keys…' : 'Submit'} +
+
+ {ctrl.challenge.cancelable && ( + <> +
+ ctrl.cancel()} + > + Cancel + + + )} +
+ {ctrl.state.showForgotPasscodeLink && ( +
+ {ctrl.state.forgotPasscode ? ( + <> +

+ {ctrl.state.hasAccount + ? 'If you forgot your application passcode, your ' + + 'only option is to clear your local data from this ' + + 'device and sign back in to your account.' + : 'If you forgot your application passcode, your ' + + 'only option is to delete your data.'} +

+ { + ctrl.destroyLocalData(); + }} + > + Delete Local Data + + + ) : ( + ctrl.onForgotPasscodeClick()} + > + Forgot your passcode? + + )} +
+
+ )} +
+
+
+
+ ); +} + +function ChallengePrompts({ + ctrl, + initialFocusRef, +}: { + ctrl: ChallengeModalCtrl; + initialFocusRef: Ref; +}) { + return ctrl.state.prompts.map((prompt, index) => ( + <> + {/** ProtectionSessionDuration can't just be an input field */} + {prompt.validation === ChallengeValidation.ProtectionSessionDuration ? ( + + ) : ( +
+ { + const value = (event.target as HTMLInputElement).value; + ctrl.state.values[prompt.id]!.value = value; + ctrl.onTextValueChange(prompt); + }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + event.preventDefault(); + ctrl.submit(); + } + }} + ref={index === 0 ? initialFocusRef : undefined} + placeholder={prompt.title} + type={prompt.secureTextEntry ? 'password' : 'text'} + /> +
+ )} + + {ctrl.state.values[prompt.id]!.invalid && ( +
+ +
+ )} + + )); +} diff --git a/app/assets/javascripts/views/editor/editor-view.pug b/app/assets/javascripts/views/editor/editor-view.pug index 2c5f0d5a7..4784a9151 100644 --- a/app/assets/javascripts/views/editor/editor-view.pug +++ b/app/assets/javascripts/views/editor/editor-view.pug @@ -80,8 +80,7 @@ ) menu-row( action='self.selectedMenuItem(true); self.toggleProtectNote()' - desc=`'Protecting a note will require credentials to view - it (Manage Privileges via Account menu)'`, + desc=`'Protecting a note will require credentials to view it'`, label="self.note.protected ? 'Unprotect' : 'Protect'" ) menu-row( @@ -210,7 +209,7 @@ on-load='self.onEditorLoad', application='self.application' ) - textarea#note-text-editor.editable( + textarea#note-text-editor.editable.font-editor( dir='auto', ng-attr-spellcheck='{{self.state.spellcheck}}', ng-change='self.contentChanged()', diff --git a/app/assets/javascripts/views/editor/editor_view.ts b/app/assets/javascripts/views/editor/editor_view.ts index 8366d1e30..f5ed13f1a 100644 --- a/app/assets/javascripts/views/editor/editor_view.ts +++ b/app/assets/javascripts/views/editor/editor_view.ts @@ -1,4 +1,4 @@ -import { STRING_ARCHIVE_LOCKED_ATTEMPT, STRING_SAVING_WHILE_DOCUMENT_HIDDEN, STRING_UNARCHIVE_LOCKED_ATTEMPT } from './../../strings'; +import { Strings, STRING_ARCHIVE_LOCKED_ATTEMPT, STRING_SAVING_WHILE_DOCUMENT_HIDDEN, STRING_UNARCHIVE_LOCKED_ATTEMPT } from './../../strings'; import { Editor } from '@/ui_models/editor'; import { WebApplication } from '@/ui_models/application'; import { PanelPuppet, WebDirective } from '@/types'; @@ -8,7 +8,6 @@ import { isPayloadSourceRetrieved, isPayloadSourceInternalChange, ContentType, - ProtectedAction, SNComponent, SNNote, SNTag, @@ -24,7 +23,7 @@ import { isDesktopApplication } from '@/utils'; import { KeyboardModifier, KeyboardKey } from '@/services/keyboardManager'; import template from './editor-view.pug'; import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; -import { AppStateEvent, EventSource } from '@/ui_models/app_state'; +import { EventSource } from '@/ui_models/app_state'; import { STRING_DELETED_NOTE, STRING_INVALID_NOTE, @@ -48,11 +47,6 @@ const ElementIds = { EditorContent: 'editor-content', NoteTagsComponentContainer: 'note-tags-component-container' }; -const Fonts = { - DesktopMonospaceFamily: `Menlo,Consolas,'DejaVu Sans Mono',monospace`, - WebMonospaceFamily: `monospace`, - SansSerifFamily: `inherit` -}; type NoteStatus = { message?: string @@ -85,7 +79,7 @@ type EditorState = { * then re-initialized. Used when reloading spellcheck status. */ textareaUnloading: boolean /** Fields that can be directly mutated by the template */ - mutable: {} + mutable: any } type EditorValues = { @@ -98,7 +92,7 @@ function sortAlphabetically(array: SNComponent[]): SNComponent[] { return array.sort((a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1); } -class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { +class EditorViewCtrl extends PureViewCtrl { /** Passed through template */ readonly application!: WebApplication readonly editor!: Editor @@ -143,7 +137,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { this.onPanelResizeFinish = this.onPanelResizeFinish.bind(this); this.onEditorLoad = () => { this.application!.getDesktopService().redoSearch(); - } + }; } deinit() { @@ -200,7 +194,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { if (note.lastSyncBegan) { if (note.lastSyncEnd) { if (note.lastSyncBegan!.getTime() > note.lastSyncEnd!.getTime()) { - this.showSavingStatus() + this.showSavingStatus(); } else if (note.lastSyncEnd!.getTime() > note.lastSyncBegan!.getTime()) { this.showAllChangesSavedStatus(); } @@ -248,7 +242,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { case ApplicationEvent.HighLatencySync: this.setState({ syncTakingTooLong: true }); break; - case ApplicationEvent.CompletedFullSync: + case ApplicationEvent.CompletedFullSync: { this.setState({ syncTakingTooLong: false }); const isInErrorState = this.state.saveError; /** if we're still dirty, don't change status, a sync is likely upcoming. */ @@ -256,6 +250,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { this.showAllChangesSavedStatus(); } break; + } case ApplicationEvent.FailedSync: /** * Only show error status in editor if the note is dirty. @@ -412,7 +407,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { await this.application.changeItem(this.note.uuid, (mutator) => { const noteMutator = mutator as NoteMutator; noteMutator.prefersPlainEditor = false; - }) + }); } await this.associateComponentWithCurrentNote(component); } @@ -471,7 +466,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { (mutator) => { mutator.addItemAsRelationship(note); } - ) + ); } if (!this.application.findItem(note.uuid)) { this.application.alertService!.alert( @@ -494,7 +489,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { noteMutator.preview_plain = previewPlain; noteMutator.preview_html = undefined; } - }, isUserModified) + }, isUserModified); if (this.saveTimeout) { this.$timeout.cancel(this.saveTimeout); } @@ -549,7 +544,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { this.statusTimeout = this.$timeout(() => { this.setState({ noteStatus: status - }) + }); }, MINIMUM_STATUS_DURATION); } else { this.setState({ @@ -601,10 +596,12 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { this.setMenuState('showOptionsMenu', false); } + // eslint-disable-next-line @typescript-eslint/no-empty-function onTitleFocus() { } + // eslint-disable-next-line @typescript-eslint/no-empty-function onTitleBlur() { } @@ -627,50 +624,35 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { ); return; } - const run = async () => { - if (this.note.locked) { - this.application.alertService!.alert( - STRING_DELETE_LOCKED_ATTEMPT - ); - return; - } - const title = this.note.safeTitle().length - ? `'${this.note.title}'` - : "this note"; - const text = StringDeleteNote( - title, - permanently + if (this.note.locked) { + this.application.alertService!.alert( + STRING_DELETE_LOCKED_ATTEMPT ); - if (await confirmDialog({ - text, - confirmButtonStyle: 'danger' - })) { - if (permanently) { - this.performNoteDeletion(this.note); - } else { - this.saveNote( - true, - false, - true, - (mutator) => { - mutator.trashed = true; - } - ); - } - }; - }; - const requiresPrivilege = await this.application.privilegesService!.actionRequiresPrivilege( - ProtectedAction.DeleteNote + return; + } + const title = this.note.safeTitle().length + ? `'${this.note.title}'` + : "this note"; + const text = StringDeleteNote( + title, + permanently ); - if (requiresPrivilege) { - this.application.presentPrivilegesModal( - ProtectedAction.DeleteNote, - () => { - run(); - } - ); - } else { - run(); + if (await confirmDialog({ + text, + confirmButtonStyle: 'danger' + })) { + if (permanently) { + this.performNoteDeletion(this.note); + } else { + this.saveNote( + true, + false, + true, + (mutator) => { + mutator.trashed = true; + } + ); + } } } @@ -715,7 +697,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { false, true, (mutator) => { - mutator.pinned = !this.note.pinned + mutator.pinned = !this.note.pinned; } ); } @@ -726,28 +708,26 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { false, true, (mutator) => { - mutator.locked = !this.note.locked + mutator.locked = !this.note.locked; } ); } - toggleProtectNote() { - this.saveNote( - true, - false, - true, - (mutator) => { - mutator.protected = !this.note.protected + async toggleProtectNote() { + if (this.note.protected) { + void this.application.unprotectNote(this.note); + } else { + const note = await this.application.protectNote(this.note); + if (note?.protected && !this.application.hasProtectionSources()) { + if (await confirmDialog({ + text: Strings.protectingNoteWithoutProtectionSources, + confirmButtonText: Strings.openAccountMenu, + confirmButtonStyle: 'info', + })) { + this.appState.accountMenu.setShow(true); + } } - ); - /** Show privileges manager if protection is not yet set up */ - this.application.privilegesService!.actionHasPrivilegesConfigured( - ProtectedAction.ViewProtectedNotes - ).then((configured) => { - if (!configured) { - this.application.presentPrivilegesManagementModal(); - } - }); + } } toggleNotePreview() { @@ -756,7 +736,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { false, true, (mutator) => { - mutator.hidePreview = !this.note.hidePreview + mutator.hidePreview = !this.note.hidePreview; } ); } @@ -775,7 +755,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { false, true, (mutator) => { - mutator.archived = !this.note.archived + mutator.archived = !this.note.archived; }, /** If we are unarchiving, and we are in the archived tag, close the editor */ this.note.archived && this.appState.selectedTag?.isArchiveTag @@ -884,7 +864,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { (mutator) => { mutator.addItemAsRelationship(note); } - ) + ); } this.application.sync(); this.reloadTags(); @@ -966,20 +946,18 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { } reloadFont() { - const editor = document.getElementById( - ElementIds.NoteTextEditor - ); - if (!editor) { - return; - } + const root = document.querySelector(':root') as HTMLElement; + const propertyName = '--sn-stylekit-editor-font-family'; if (this.state.monospaceFont) { - if (this.state.isDesktop) { - editor.style.fontFamily = Fonts.DesktopMonospaceFamily; - } else { - editor.style.fontFamily = Fonts.WebMonospaceFamily; - } + root.style.setProperty( + propertyName, + 'var(--sn-stylekit-monospace-font)' + ); } else { - editor.style.fontFamily = Fonts.SansSerifFamily; + root.style.setProperty( + propertyName, + 'var(--sn-stylekit-sans-serif-font)' + ); } } @@ -991,7 +969,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { ); await this.setState({ [key]: !currentValue - }) + }); this.reloadFont(); if (key === PrefKey.EditorSpellcheck) { @@ -1082,7 +1060,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { (mutator) => { mutator.addItemAsRelationship(this.note); } - ) + ); } } } @@ -1141,7 +1119,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { const mutator = m as ComponentMutator; mutator.removeAssociatedItemId(note.uuid); mutator.disassociateWithItem(note.uuid); - }) + }); } async associateComponentWithCurrentNote(component: SNComponent) { @@ -1150,7 +1128,7 @@ class EditorViewCtrl extends PureViewCtrl<{}, EditorState> { const mutator = m as ComponentMutator; mutator.removeDisassociatedItemId(note.uuid); mutator.associateWithItem(note.uuid); - }) + }); } registerKeyboardShortcuts() { diff --git a/app/assets/javascripts/views/editor_group/editor_group_view.ts b/app/assets/javascripts/views/editor_group/editor_group_view.ts index 3848f133a..d365fd6b6 100644 --- a/app/assets/javascripts/views/editor_group/editor_group_view.ts +++ b/app/assets/javascripts/views/editor_group/editor_group_view.ts @@ -8,15 +8,10 @@ class EditorGroupViewCtrl { private application!: WebApplication public editors: Editor[] = [] - /* @ngInject */ - constructor() { - - } - $onInit() { this.application.editorGroup.addChangeObserver(() => { this.editors = this.application.editorGroup.editors; - }) + }); } } diff --git a/app/assets/javascripts/views/footer/footer_view.ts b/app/assets/javascripts/views/footer/footer_view.ts index b6491d070..5b36ebef0 100644 --- a/app/assets/javascripts/views/footer/footer_view.ts +++ b/app/assets/javascripts/views/footer/footer_view.ts @@ -5,7 +5,6 @@ import { dateToLocalizedString, preventRefreshing } from '@/utils'; import { ApplicationEvent, SyncQueueStrategy, - ProtectedAction, ContentType, SNComponent, SNTheme, @@ -44,7 +43,7 @@ type DockShortcut = { } } -class FooterViewCtrl extends PureViewCtrl<{}, { +class FooterViewCtrl extends PureViewCtrl void> = []; private completedInitialSync = false; private showingDownloadStatus = false; - private removeBetaWarningListener?: IReactionDisposer; + private autorunDisposer?: IReactionDisposer; /* @ngInject */ constructor( @@ -104,7 +103,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { this.rootScopeListener2 = undefined; (this.closeAccountMenu as any) = undefined; (this.toggleSyncResolutionMenu as any) = undefined; - this.removeBetaWarningListener?.(); + this.autorunDisposer?.(); super.deinit(); } @@ -116,8 +115,9 @@ class FooterViewCtrl extends PureViewCtrl<{}, { }); }); this.loadAccountSwitcherState(); - this.removeBetaWarningListener = autorun(() => { + this.autorunDisposer = autorun(() => { const showBetaWarning = this.appState.showBetaWarning; + this.showAccountMenu = this.appState.accountMenu.show; this.setState({ showBetaWarning: showBetaWarning, showDataUpgrade: !showBetaWarning @@ -207,9 +207,9 @@ class FooterViewCtrl extends PureViewCtrl<{}, { case AppStateEvent.BeganBackupDownload: statusService.setMessage("Saving local backup…"); break; - case AppStateEvent.EndedBackupDownload: + case AppStateEvent.EndedBackupDownload: { const successMessage = "Successfully saved backup."; - const errorMessage = "Unable to save local backup." + const errorMessage = "Unable to save local backup."; statusService.setMessage(data.success ? successMessage : errorMessage); const twoSeconds = 2000; @@ -222,6 +222,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { } }, twoSeconds); break; + } } } @@ -255,7 +256,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { if (!this.didCheckForOffline) { this.didCheckForOffline = true; if (this.offline && this.application.getNoteCount() === 0) { - this.showAccountMenu = true; + this.appState.accountMenu.setShow(true); } } this.syncUpdated(); @@ -297,7 +298,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { theme.package_info.dock_icon ); } - ) + ); this.observerRemovers.push(this.application.streamItems( ContentType.Component, @@ -437,7 +438,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { } accountMenuPressed() { - this.showAccountMenu = !this.showAccountMenu; + this.appState.accountMenu.toggleShow(); this.closeAllRooms(); } @@ -446,7 +447,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { } closeAccountMenu() { - this.showAccountMenu = false; + this.appState.accountMenu.setShow(false); } lockApp() { @@ -544,28 +545,9 @@ class FooterViewCtrl extends PureViewCtrl<{}, { } async selectRoom(room: SNComponent) { - const run = () => { - this.$timeout(() => { - this.roomShowState[room.uuid] = !this.roomShowState[room.uuid]; - }); - }; - - if (!this.roomShowState[room.uuid]) { - const requiresPrivilege = await this.application.privilegesService! - .actionRequiresPrivilege( - ProtectedAction.ManageExtensions - ); - if (requiresPrivilege) { - this.application.presentPrivilegesModal( - ProtectedAction.ManageExtensions, - run - ); - } else { - run(); - } - } else { - run(); - } + this.$timeout(() => { + this.roomShowState[room.uuid] = !this.roomShowState[room.uuid]; + }); } displayBetaDialog() { @@ -582,7 +564,7 @@ class FooterViewCtrl extends PureViewCtrl<{}, { if (this.application && this.application.authenticationInProgress()) { return; } - this.showAccountMenu = false; + this.appState.accountMenu.setShow(false); } } diff --git a/app/assets/javascripts/views/index.ts b/app/assets/javascripts/views/index.ts index 55b48fe36..31cbe1ad1 100644 --- a/app/assets/javascripts/views/index.ts +++ b/app/assets/javascripts/views/index.ts @@ -6,4 +6,4 @@ export { EditorView } from './editor/editor_view'; export { FooterView } from './footer/footer_view'; export { NotesView } from './notes/notes_view'; export { TagsView } from './tags/tags_view'; -export { ChallengeModal } from './challenge_modal/challenge_modal' \ No newline at end of file +export { ChallengeModal } from './challenge_modal/challenge_modal'; \ No newline at end of file diff --git a/app/assets/javascripts/views/notes/note_utils.ts b/app/assets/javascripts/views/notes/note_utils.ts index 4ca9604c3..6f8265982 100644 --- a/app/assets/javascripts/views/notes/note_utils.ts +++ b/app/assets/javascripts/views/notes/note_utils.ts @@ -5,44 +5,54 @@ export function notePassesFilter( showArchived: boolean, hidePinned: boolean, filterText: string -) { - - let canShowArchived = showArchived; +): boolean { + const canShowArchived = showArchived; const canShowPinned = !hidePinned; - if ( - (note.archived && !canShowArchived) || - (note.pinned && !canShowPinned) - ) { + if ((note.archived && !canShowArchived) || (note.pinned && !canShowPinned)) { return false; } - return noteMatchesQuery(note, filterText); + if (note.protected) { + const match = noteMatchesQuery(note, filterText); + /** Only match title to prevent leaking protected note text */ + return match === Match.Title || match === Match.TitleAndText; + } else { + return noteMatchesQuery(note, filterText) !== Match.None; + } } -function noteMatchesQuery( - note: SNNote, - query: string -) { +enum Match { + None = 0, + Title = 1, + Text = 2, + TitleAndText = Title + Text, + Uuid = 5, +} + +function noteMatchesQuery(note: SNNote, query: string): Match { if (query.length === 0) { - return true; + return Match.TitleAndText; } const title = note.safeTitle().toLowerCase(); const text = note.safeText().toLowerCase(); const lowercaseText = query.toLowerCase(); + const words = lowercaseText.split(' '); const quotedText = stringBetweenQuotes(lowercaseText); if (quotedText) { - return title.includes(quotedText) || text.includes(quotedText); + return ( + (title.includes(quotedText) ? Match.Title : Match.None) + + (text.includes(quotedText) ? Match.Text : Match.None) + ); } if (stringIsUuid(lowercaseText)) { - return note.uuid === lowercaseText; + return note.uuid === lowercaseText ? Match.Uuid : Match.None; } - const words = lowercaseText.split(" "); const matchesTitle = words.every((word) => { return title.indexOf(word) >= 0; }); const matchesBody = words.every((word) => { return text.indexOf(word) >= 0; }); - return matchesTitle || matchesBody; + return (matchesTitle ? Match.Title : 0) + (matchesBody ? Match.Text : 0); } function stringBetweenQuotes(text: string) { diff --git a/app/assets/javascripts/views/notes/notes-view.pug b/app/assets/javascripts/views/notes/notes-view.pug index db6883f8a..a42e16bc1 100644 --- a/app/assets/javascripts/views/notes/notes-view.pug +++ b/app/assets/javascripts/views/notes/notes-view.pug @@ -3,7 +3,7 @@ #notes-title-bar.section-title-bar .padded .section-title-bar-header - .title {{self.state.panelTitle}} + .sk-h2.font-semibold.title {{self.state.panelTitle}} .sk-button.contrast.wide( ng-click='self.createNewNote()', title='Create a new note in the selected tag' @@ -24,6 +24,10 @@ ng-click='self.clearFilterText();', ng-show='self.state.noteFilter.text' ) ✕ + no-account-warning( + application='self.application' + app-state='self.appState' + ) #notes-menu-bar.sn-component .sk-app-bar.no-edges .left @@ -139,10 +143,12 @@ .default-preview( ng-show='!note.preview_html && !note.preview_plain' ) {{note.text}} - .date.faded(ng-show='!self.state.hideDate') - span(ng-show="self.state.sortBy == 'userModifiedDate'") + .bottom-info.faded(ng-show='!self.state.hideDate || note.protected') + span(ng-if="note.protected") + | Protected{{self.state.hideDate ? '' : ' • '}} + span(ng-show="!self.state.hideDate && self.state.sortBy == 'userModifiedDate'") | Modified {{note.updatedAtString || 'Now'}} - span(ng-show="self.state.sortBy != 'userModifiedDate'") + span(ng-show="!self.state.hideDate && self.state.sortBy != 'userModifiedDate'") | {{note.createdAtString || 'Now'}} .tags-string(ng-if='!self.state.hideTags && self.state.renderedNotesTags[$index]') .faded {{self.state.renderedNotesTags[$index]}} diff --git a/app/assets/javascripts/views/notes/notes_view.ts b/app/assets/javascripts/views/notes/notes_view.ts index df3d0792a..3bd631cf6 100644 --- a/app/assets/javascripts/views/notes/notes_view.ts +++ b/app/assets/javascripts/views/notes/notes_view.ts @@ -59,7 +59,7 @@ const DEFAULT_LIST_NUM_NOTES = 20; const ELEMENT_ID_SEARCH_BAR = 'search-bar'; const ELEMENT_ID_SCROLL_CONTAINER = 'notes-scrollable'; -class NotesViewCtrl extends PureViewCtrl<{}, NotesState> { +class NotesViewCtrl extends PureViewCtrl { private panelPuppet?: PanelPuppet private reloadNotesPromise?: any @@ -410,7 +410,7 @@ class NotesViewCtrl extends PureViewCtrl<{}, NotesState> { if (activeNote && activeNote.conflictOf) { this.application!.changeAndSaveItem(activeNote.uuid, (mutator) => { mutator.conflictOf = undefined; - }) + }); } if (this.isFiltering()) { this.application!.getDesktopService().searchText(this.getState().noteFilter.text); @@ -576,12 +576,6 @@ class NotesViewCtrl extends PureViewCtrl<{}, NotesState> { class: 'warning' }); } - if (note.protected) { - flags.push({ - text: "Protected", - class: 'success' - }); - } if (note.locked) { flags.push({ text: "Locked", @@ -641,7 +635,7 @@ class NotesViewCtrl extends PureViewCtrl<{}, NotesState> { selectNextNote() { const displayableNotes = this.displayableNotes(); const currentIndex = displayableNotes.findIndex((candidate) => { - return candidate.uuid === this.activeEditorNote!.uuid + return candidate.uuid === this.activeEditorNote!.uuid; }); if (currentIndex + 1 < displayableNotes.length) { this.selectNote(displayableNotes[currentIndex + 1]); @@ -798,7 +792,7 @@ class NotesViewCtrl extends PureViewCtrl<{}, NotesState> { ], onKeyDown: () => { const searchBar = this.getSearchBar(); - if (searchBar) { searchBar.focus(); }; + if (searchBar) { searchBar.focus(); } } }); } diff --git a/app/assets/javascripts/views/tags/tags-view.pug b/app/assets/javascripts/views/tags/tags-view.pug index cc28d70c7..600ab2760 100644 --- a/app/assets/javascripts/views/tags/tags-view.pug +++ b/app/assets/javascripts/views/tags/tags-view.pug @@ -25,9 +25,9 @@ .tag-info .title(ng-if="!tag.errorDecrypting") {{tag.title}} .count(ng-show='tag.isAllTag') {{self.state.noteCounts[tag.uuid]}} - .danger.small-text.bold(ng-show='tag.conflictOf') Conflicted Copy - .danger.small-text.bold(ng-show='tag.errorDecrypting && !tag.waitingForKey') Missing Keys - .info.small-text.bold(ng-show='tag.errorDecrypting && tag.waitingForKey') Waiting For Keys + .danger.small-text.font-bold(ng-show='tag.conflictOf') Conflicted Copy + .danger.small-text.font-bold(ng-show='tag.errorDecrypting && !tag.waitingForKey') Missing Keys + .info.small-text.font-bold(ng-show='tag.errorDecrypting && tag.waitingForKey') Waiting For Keys .tags-title-section.section-title-bar .section-title-bar-header .sk-h3.title @@ -52,9 +52,9 @@ spellcheck='false' ) .count {{self.state.noteCounts[tag.uuid]}} - .danger.small-text.bold(ng-show='tag.conflictOf') Conflicted Copy - .danger.small-text.bold(ng-show='tag.errorDecrypting && !tag.waitingForKey') Missing Keys - .info.small-text.bold(ng-show='tag.errorDecrypting && tag.waitingForKey') Waiting For Keys + .danger.small-text.font-bold(ng-show='tag.conflictOf') Conflicted Copy + .danger.small-text.font-bold(ng-show='tag.errorDecrypting && !tag.waitingForKey') Missing Keys + .info.small-text.font-bold(ng-show='tag.errorDecrypting && tag.waitingForKey') Waiting For Keys .menu(ng-show='self.state.selectedTag == tag') a.item(ng-click='self.selectedRenameTag(tag)' ng-show='!self.state.editingTag') Rename a.item(ng-click='self.saveTag($event, tag)' ng-show='self.state.editingTag') Save diff --git a/app/assets/javascripts/views/tags/tags_view.ts b/app/assets/javascripts/views/tags/tags_view.ts index 01f9bcb8a..b4a609f59 100644 --- a/app/assets/javascripts/views/tags/tags_view.ts +++ b/app/assets/javascripts/views/tags/tags_view.ts @@ -36,7 +36,7 @@ type TagState = { templateTag?: SNTag } -class TagsViewCtrl extends PureViewCtrl<{}, TagState> { +class TagsViewCtrl extends PureViewCtrl { /** Passed through template */ readonly application!: WebApplication @@ -136,7 +136,7 @@ class TagsViewCtrl extends PureViewCtrl<{}, TagState> { } else { this.setState({ selectedTag: matchingTag - }) + }); } } } @@ -186,14 +186,14 @@ class TagsViewCtrl extends PureViewCtrl<{}, TagState> { const notes = this.application.notesMatchingSmartTag(tag as SNSmartTag) .filter((note) => { return !note.archived && !note.trashed; - }) + }); noteCounts[tag.uuid] = notes.length; } } else { const notes = this.application.referencesForItem(tag, ContentType.Note) .filter((note) => { return !note.archived && !note.trashed; - }) + }); noteCounts[tag.uuid] = notes.length; } } @@ -264,7 +264,7 @@ class TagsViewCtrl extends PureViewCtrl<{}, TagState> { if (tag.conflictOf) { this.application.changeAndSaveItem(tag.uuid, (mutator) => { mutator.conflictOf = undefined; - }) + }); } this.application.getAppState().setSelectedTag(tag); } @@ -326,7 +326,7 @@ class TagsViewCtrl extends PureViewCtrl<{}, TagState> { "A tag with this name already exists." ); return; - }; + } await this.application.changeAndSaveItem(tag.uuid, (mutator) => { mutator.title = newTitle; }); @@ -350,7 +350,7 @@ class TagsViewCtrl extends PureViewCtrl<{}, TagState> { "A tag with this name already exists." ); return; - }; + } const insertedTag = await this.application.insertItem(newTag); const changedTag = await this.application.changeItem(insertedTag.uuid, (m) => { m.title = newTitle; diff --git a/app/assets/stylesheets/_editor.scss b/app/assets/stylesheets/_editor.scss index 5ae221361..610c5324b 100644 --- a/app/assets/stylesheets/_editor.scss +++ b/app/assets/stylesheets/_editor.scss @@ -64,6 +64,9 @@ $heading-height: 75px; &:disabled { color: var(--sn-stylekit-editor-foreground-color); } + &:focus { + box-shadow: none; + } } } @@ -117,6 +120,7 @@ $heading-height: 75px; &:focus { outline: 0; + box-shadow: none; } } } @@ -140,7 +144,6 @@ $heading-height: 75px; } .editable { - font-family: monospace; overflow-y: scroll; width: 100%; background-color: var(--sn-stylekit-editor-background-color); @@ -182,3 +185,7 @@ $heading-height: 75px; } } } + +#note-text-editor:focus { + box-shadow: none; +} diff --git a/app/assets/stylesheets/_ionicons.scss b/app/assets/stylesheets/_ionicons.scss index e2d032034..3a8a3ddcd 100644 --- a/app/assets/stylesheets/_ionicons.scss +++ b/app/assets/stylesheets/_ionicons.scss @@ -16,8 +16,7 @@ src: url('../fonts/ionicons.eot?v=2.0.0'); src: url('../fonts/ionicons.eot?v=2.0.1#iefix') format('embedded-opentype'), url('../fonts/ionicons.ttf?v=2.0.1') format('truetype'), - url('../fonts/ionicons.woff?v=2.0.1') format('woff'), - url('../fonts/ionicons.svg?v=2.0.1#Ionicons') format('svg'); + url('../fonts/ionicons.woff?v=2.0.1') format('woff'); font-weight: normal; font-style: normal; } diff --git a/app/assets/stylesheets/_main.scss b/app/assets/stylesheets/_main.scss index c0db8f3b5..914c0bd12 100644 --- a/app/assets/stylesheets/_main.scss +++ b/app/assets/stylesheets/_main.scss @@ -94,6 +94,8 @@ a { p { overflow: auto; + color: var(--sn-stylekit-paragraph-text-color); + margin: 0; } .main-ui-view { diff --git a/app/assets/stylesheets/_modals.scss b/app/assets/stylesheets/_modals.scss index 77494478d..966e9ef24 100644 --- a/app/assets/stylesheets/_modals.scss +++ b/app/assets/stylesheets/_modals.scss @@ -42,55 +42,6 @@ } } -#privileges-modal { - min-width: 400px; - max-width: 700px; - - .sk-panel-header { - position: relative; - } - - .close-button { - cursor: pointer; - position: absolute; - padding: 1.1rem 2rem; - right: 0; - } - - table { - margin-bottom: 12px; - width: 100%; - overflow: auto; - border-collapse: collapse; - border-spacing: 0px; - border-color: var(--sn-stylekit-contrast-border-color); - background-color: var(--sn-stylekit-background-color); - color: var(--sn-stylekit-contrast-foreground-color); - - th, - td { - padding: 6px 13px; - border: 1px solid var(--sn-stylekit-contrast-border-color); - } - - tr:nth-child(2n) { - background-color: var(--sn-stylekit-contrast-background-color); - } - } - - th { - text-align: center; - font-weight: normal; - } - - .priv-header { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } -} - #item-preview-modal { > .sk-modal-content { width: 800px; diff --git a/app/assets/stylesheets/_notes.scss b/app/assets/stylesheets/_notes.scss index 38a22d8a7..fa7d78c10 100644 --- a/app/assets/stylesheets/_notes.scss +++ b/app/assets/stylesheets/_notes.scss @@ -30,13 +30,14 @@ #notes-title-bar { padding-top: 16px; font-weight: normal; - font-size: var(--sn-stylekit-font-size-h1); .section-title-bar-header .title { - font-size: var(--sn-stylekit-font-size-h3); - font-weight: 600; width: calc(90% - 45px); } + + p { + font-size: var(--sn-stylekit-font-size-p); + } } #notes-menu-bar { @@ -67,12 +68,6 @@ border-color: transparent; width: 100%; position: relative; - - &:focus { - outline: 0; - border-color: var(--sn-stylekit-info-color); - border-width: 1px; - } } #search-clear-button { @@ -86,7 +81,8 @@ line-height: 17px; text-align: center; position: absolute; - top: 8px; + top: 50%; + transform: translateY(-50%); right: 8px; transition: background-color 0.15s linear; @@ -130,7 +126,7 @@ text-overflow: ellipsis; } - > .date { + > .bottom-info { font-size: 12px; margin-top: 4px; } diff --git a/app/assets/stylesheets/_reach-sub.scss b/app/assets/stylesheets/_reach-sub.scss index af80a7ccf..346817713 100644 --- a/app/assets/stylesheets/_reach-sub.scss +++ b/app/assets/stylesheets/_reach-sub.scss @@ -20,11 +20,13 @@ } [data-reach-dialog-content] { + width: auto; padding: 0; margin: 0; position: relative; overflow: unset; flex-basis: 0; + min-width: 400px; max-width: 600px; } diff --git a/app/assets/stylesheets/_sessions-modal.scss b/app/assets/stylesheets/_sessions-modal.scss index 09b9f919f..6ec272de5 100644 --- a/app/assets/stylesheets/_sessions-modal.scss +++ b/app/assets/stylesheets/_sessions-modal.scss @@ -1,4 +1,7 @@ .sessions-modal { + min-width: 40vw; + width: auto; + h2, ul, p { margin: 0; padding: 0; diff --git a/app/assets/stylesheets/_sn.scss b/app/assets/stylesheets/_sn.scss new file mode 100644 index 000000000..420dd8b24 --- /dev/null +++ b/app/assets/stylesheets/_sn.scss @@ -0,0 +1,16 @@ +/* Generic UI controls that have yet to be extracted into Stylekit */ + +.sn-btn { + @extend .border-0; + @extend .bg-main; + @extend .cursor-pointer; + @extend .capitalize; + @extend .font-bold; + @extend .py-2; + @extend .px-3; + @extend .rounded; + @extend .text-info-contrast; + @extend .text-sm; + + @extend .hover\:brightness-130; +} diff --git a/app/assets/stylesheets/_stylekit-sub.scss b/app/assets/stylesheets/_stylekit-sub.scss index 70dc79d8f..2a500e677 100644 --- a/app/assets/stylesheets/_stylekit-sub.scss +++ b/app/assets/stylesheets/_stylekit-sub.scss @@ -49,6 +49,7 @@ .sk-panel { .sk-panel-header { .close-button { + border-radius: var(--sn-stylekit-general-border-radius); &:hover { text-decoration: none; } @@ -88,5 +89,15 @@ button.sk-a { } *:focus { - outline: solid var(--sn-stylekit-info-color) 2px; + outline: none; + box-shadow: 0 0 0 2px var(--sn-stylekit-info-color); +} + +input:focus { + box-shadow: 0 0 0 1px var(--sn-stylekit-info-color); +} + +.sk-button:focus, button:focus { + box-shadow: 0 0 0 2px var(--sn-stylekit-background-color), + 0 0 0 4px var(--sn-stylekit-info-color); } diff --git a/app/assets/stylesheets/_tags.scss b/app/assets/stylesheets/_tags.scss index d0669405f..95060e799 100644 --- a/app/assets/stylesheets/_tags.scss +++ b/app/assets/stylesheets/_tags.scss @@ -91,6 +91,7 @@ &:focus { outline: 0; + box-shadow: 0; } pointer-events: none; diff --git a/app/assets/stylesheets/_ui.scss b/app/assets/stylesheets/_ui.scss index 29ab8cb69..8ee59b19d 100644 --- a/app/assets/stylesheets/_ui.scss +++ b/app/assets/stylesheets/_ui.scss @@ -57,35 +57,6 @@ $screen-md-max: ($screen-lg-min - 1) !default; } } -.selectable { - user-select: text !important; - cursor: text; -} - -.mt-5 { - margin-top: 5px !important; -} - -.mt-10 { - margin-top: 10px !important; -} - -.mr-5 { - margin-right: 5px !important; -} - -.mr-8 { - margin-right: 8px !important; -} - -.faded { - opacity: 0.5; -} - -.center-align { - text-align: center !important; -} - .block { display: block !important; } @@ -94,19 +65,6 @@ $screen-md-max: ($screen-lg-min - 1) !default; display: inline-block; } -.wrap { - word-wrap: break-word; - word-break: break-all; -} - -.medium-padding { - padding: 10px !important; -} - -.bold { - font-weight: bold !important; -} - .normal { font-weight: normal !important; } @@ -118,3 +76,151 @@ $screen-md-max: ($screen-lg-min - 1) !default; .medium-text { font-size: 14px !important; } + +.faded { + opacity: 0.5; +} + +.flex { + display: flex; +} + +.flex-column { + flex-direction: column; +} + +.self-start { + align-self: flex-start; +} + +.justify-self-start { + justify-self: flex-start; +} + +.m-0 { + margin: 0; +} + +.mt-1 { + margin-top: .25rem; +} +.mt-3 { + margin-top: .75rem; +} +.mt-5 { + margin-top: 1.25rem; +} + +.p-0 { + padding: 0rem; +} +.p-5 { + padding: 1.25rem; +} + +.px-3 { + padding-left: .75rem; + padding-right: .75rem; +} + +.py-2 { + padding-top: .5rem; + padding-bottom: .5rem; +} + +.border-0 { + border-width: 0px; +} + +.rounded { + border-radius: var(--sn-stylekit-general-border-radius); +} +.rounded-md { + border-radius: 0.375rem; +} + +.bg-main { + background-color: var(--sn-stylekit-info-color); +} +.bg-transparent { + background-color: transparent; +} + +.capitalize { + text-transform: capitalize; +} + +.col-start-1 { + grid-column-start: 1; +} +.col-start-2 { + grid-column-start: 2; +} +.col-end-3 { + grid-column-end: 3; +} + +.color-neutral { + color: var(--sn-stylekit-neutral-color) +} +.hover\:color-info:hover { + color: var(--sn-stylekit-info-color) +} + +.hover\:brightness-130:hover { + filter: brightness(130%); +} + +.cursor-pointer { + cursor: pointer; +} + +.fill-current { + fill: currentColor; +} + +.font-editor { + font-family: var(--sn-stylekit-editor-font-family); +} +.font-semibold { + font-weight: 600 !important; +} +.font-bold { + font-weight: 700 !important; +} + +.grid { + display: grid; +} +.grid-template-cols-1fr { + grid-template-columns: 1fr; +} + +.relative { + position: relative; +} + +.row-start-1 { + grid-row-start: 1; +} + +.selectable { + user-select: text !important; + cursor: text; +} + +.shadow-sm { + box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.04), 0px 1px 4px 0px rgba(0, 0, 0, 0.12); +} + +.text-sm { + font-size: var(--sn-stylekit-font-size-h5);; +} +.text-info-contrast { + color: var(--sn-stylekit-info-contrast-color); +} + +.wrap { + word-wrap: break-word; + word-break: break-all; +} diff --git a/app/assets/stylesheets/index.css.scss b/app/assets/stylesheets/index.css.scss index 52ca8b997..2dc340e5e 100644 --- a/app/assets/stylesheets/index.css.scss +++ b/app/assets/stylesheets/index.css.scss @@ -11,3 +11,4 @@ @import "ionicons"; @import "reach-sub"; @import "sessions-modal"; +@import "sn"; diff --git a/app/assets/templates/directives/account-menu.pug b/app/assets/templates/directives/account-menu.pug index d891f114a..e56af6939 100644 --- a/app/assets/templates/directives/account-menu.pug +++ b/app/assets/templates/directives/account-menu.pug @@ -71,7 +71,7 @@ .sk-notification-title.sk-panel-row.padded-row Advanced Options .bordered-row.padded-row label.sk-label Sync Server Domain - input.sk-input.mt-5.sk-base( + input.sk-input.sk-base( name='server', ng-model='self.state.formData.url', ng-change='self.onHostInputChange()' @@ -156,18 +156,26 @@ ) Change Password a.sk-a.info.sk-panel-row.condensed( ng-click="self.openSessionsModal()" - ng-if="self.state.showSessions" ) Manage Sessions - a.sk-a.info.sk-panel-row.condensed( - ng-click="self.openPrivilegesModal('')", - ng-show='self.state.user' - ) Manage Privileges .sk-panel-section .sk-panel-section-title Encryption .sk-panel-section-subtitle.info(ng-if='self.state.encryptionEnabled') | {{self.encryptionStatusForNotes()}} p.sk-p | {{self.state.encryptionStatusString}} + .sk-panel-section(ng-if="self.hasProtections()") + .sk-panel-section-title Protections + .sk-panel-section-subtitle.info(ng-if="self.state.protectionsDisabledUntil") + | Protections are disabled until {{self.state.protectionsDisabledUntil}} + .sk-panel-section-subtitle.info(ng-if="!self.state.protectionsDisabledUntil") + | Protections are enabled + p.sk-p + | Actions like viewing protected notes, exporting decrypted backups, + | or revoking an active session, require additional authentication + | like entering your account password or application passcode. + .sk-panel-row(ng-if="self.state.protectionsDisabledUntil") + button.sk-button.info(ng-click="self.enableProtections()") + span.sk-label.capitalize Enable protections .sk-panel-section .sk-panel-section-title Passcode Lock div(ng-if='!self.state.hasPasscode') @@ -180,6 +188,8 @@ p.sk-p | Add a passcode to lock the application and | encrypt on-device key storage. + p(ng-if='self.state.keyStorageInfo') + | {{self.state.keyStorageInfo}} div(ng-if='!self.state.canAddPasscode') p.sk-p | Adding a passcode is not supported in temporary sessions. Please sign @@ -208,8 +218,7 @@ ng-click='self.state.formData.showPasscodeForm = false' ) Cancel div(ng-if='self.state.hasPasscode && !self.state.formData.showPasscodeForm') - .sk-p - | Passcode lock is enabled. + .sk-panel-section-subtitle.info Passcode lock is enabled .sk-notification.contrast .sk-notification-title Options .sk-notification-text @@ -226,10 +235,6 @@ | {{option.label}} .sk-p The autolock timer begins when the window or tab loses focus. .sk-panel-row - a.sk-a.info.sk-panel-row.condensed( - ng-click="self.openPrivilegesModal('')", - ng-show='!self.state.user' - ) Manage Privileges a.sk-a.info.sk-panel-row.condensed( ng-click='self.changePasscodePressed()' ) Change Passcode @@ -274,33 +279,22 @@ span(ng-if='self.isDesktopApplication()') | Backups are automatically created on desktop and can be managed | via the "Backups" top-level menu. - #import-password-request(ng-if='self.state.importData.requestPassword') - form.sk-panel-form.stretch(ng-submit='self.submitImportPassword()') - p Enter the account password associated with the import file. - input.sk-input.contrast.mt-5( - autofocus='true', - ng-model='self.state.importData.password', - placeholder='Enter File Account Password', - type='password' - ) - .sk-button-group.stretch.sk-panel-row.form-submit - button.sk-button.info(type='submit') - .sk-label Decrypt & Import - p - | Importing from backup will not overwrite existing data, - | but instead create a duplicate of any differing data. - p - | If you'd like to import only a selection of items instead of - | the whole file, please use the Batch Manager extension. .sk-panel-row .sk-spinner.small.info(ng-if='self.state.importData.loading') .sk-panel-section .sk-panel-section-title Error Reporting .sk-panel-section-subtitle.info - | Automatic error reporting is {{ self.state.errorReportingEnabled ? 'enabled.' : 'disabled.' }} + | Automatic error reporting is {{ self.state.errorReportingEnabled ? 'enabled' : 'disabled' }} p.sk-p | Help us improve Standard Notes by automatically submitting | anonymized error reports. + p.sk-p.selectable(ng-if="self.state.errorReportingId") + | Your random identifier is + strong {{ self.state.errorReportingId }} + p.sk-p(ng-if="self.state.errorReportingId") + | Disabling error reporting will remove that identifier from your + | local storage, and a new identifier will be created should you + | decide to enable error reporting again in the future. .sk-panel-row button(ng-click="self.toggleErrorReportingEnabled()").sk-button.info span.sk-label {{ self.state.errorReportingEnabled ? 'Disable' : 'Enable'}} Error Reporting diff --git a/app/assets/templates/directives/permissions-modal.pug b/app/assets/templates/directives/permissions-modal.pug index cbed6941f..d401c97b1 100644 --- a/app/assets/templates/directives/permissions-modal.pug +++ b/app/assets/templates/directives/permissions-modal.pug @@ -14,12 +14,12 @@ | {{ctrl.permissionsString}} .sk-panel-row p.sk-p - | Extensions use an offline messaging system to communicate. Learn more at + | Extensions use an offline messaging system to communicate. Learn more at a.sk-a.info( - href='https://standardnotes.org/permissions', - rel='noopener', + href='https://standardnotes.org/permissions', + rel='noopener', target='_blank' ) https://standardnotes.org/permissions. .sk-panel-footer - .sk-button.info.big.block.bold(ng-click='ctrl.accept()') + .sk-button.info.big.block.font-bold(ng-click='ctrl.accept()') .sk-label Continue diff --git a/app/assets/templates/directives/privileges-auth-modal.pug b/app/assets/templates/directives/privileges-auth-modal.pug deleted file mode 100644 index 3c578b256..000000000 --- a/app/assets/templates/directives/privileges-auth-modal.pug +++ /dev/null @@ -1,37 +0,0 @@ -.sk-modal-background(ng-click="ctrl.cancel()") -#privileges-modal.sk-modal-content - .sn-component - .sk-panel - .sk-panel-header - .sk-panel-header-title Authentication Required - a.close-button.info(ng-click="ctrl.cancel()") Cancel - .sk-panel-content - .sk-panel-section - div(ng-repeat="credential in ctrl.requiredCredentials") - .sk-p.sk-bold.sk-panel-row - strong {{ctrl.promptForCredential(credential)}} - .sk-panel-row - input.sk-input.contrast( - ng-model="ctrl.authParameters[credential]" - should-focus="$index == 0" - sn-autofocus="true" - sn-enter="ctrl.submit()" - type="password" - ) - .sk-panel-row - label.sk-label.danger( - ng-if="ctrl.isCredentialInFailureState(credential)" - ) Invalid authentication. Please try again. - .sk-panel-row - .sk-panel-row - .sk-horizontal-group - .sk-p.sk-bold Remember For - a.sk-a.info( - ng-repeat="option in ctrl.sessionLengthOptions" - ng-class="{'boxed' : option.value == ctrl.selectedSessionLength}" - ng-click="ctrl.selectSessionLength(option.value)" - ) - | {{option.label}} - .sk-panel-footer.extra-padding - .sk-button.info.big.block.bold(ng-click="ctrl.submit()") - .sk-label Submit diff --git a/app/assets/templates/directives/privileges-management-modal.pug b/app/assets/templates/directives/privileges-management-modal.pug deleted file mode 100644 index cc697e901..000000000 --- a/app/assets/templates/directives/privileges-management-modal.pug +++ /dev/null @@ -1,51 +0,0 @@ -.sk-modal-background(ng-click='ctrl.cancel()') -#privileges-modal.sk-modal-content - .sn-component - .sk-panel - .sk-panel-header - .sk-panel-header-title Manage Privileges - a.sk-a.close-button.info(ng-click='ctrl.cancel()') Done - .sk-panel-content - .sk-panel-section - table.sk-table - thead - tr - th - th(ng-repeat='cred in ctrl.availableCredentials') - .priv-header - strong {{ctrl.credentialDisplayInfo[cred].label}} - .sk-p.font-small( - ng-show='!ctrl.credentialDisplayInfo[cred].availability', - style='margin-top: 2px' - ) Not Configured - tbody - tr(ng-repeat='action in ctrl.availableActions') - td - .sk-p {{ctrl.displayInfoForAction(action)}} - th(ng-repeat='credential in ctrl.availableCredentials') - input( - ng-checked='ctrl.isCredentialRequiredForAction(action, credential)', - ng-click='ctrl.checkboxValueChanged(action, credential)', - ng-disabled='!ctrl.credentialDisplayInfo[credential].availability', - type='checkbox' - ) - .sk-panel-section(ng-if='ctrl.sessionExpirey && !ctrl.sessionExpired') - .sk-p.sk-panel-row - | You will not be asked to authenticate until {{ctrl.sessionExpirey}}. - a.sk-a.sk-panel-row.info(ng-click='ctrl.clearSession()') Clear Session - .sk-panel-footer - .sk-h2.sk-bold About Privileges - .sk-panel-section.no-bottom-pad - .sk-panel-row - .text-content - .sk-p - | Privileges represent interface level authentication for accessing - | certain items and features. Note that when your application is unlocked, - | your data exists in temporary memory in an unencrypted state. - | Privileges are meant to protect against unwanted access in the event of - | an unlocked application, but do not affect data encryption state. - p.sk-p - | Privileges sync across your other devices; however, note that if you - | require an "Application Passcode" privilege, and another device does not have - | an application passcode set up, the application passcode requirement will be ignored - | on that device. diff --git a/app/extensions/extensions-manager b/app/extensions/extensions-manager new file mode 160000 index 000000000..206c1da0a --- /dev/null +++ b/app/extensions/extensions-manager @@ -0,0 +1 @@ +Subproject commit 206c1da0a4bcd2389a052863de03251b103b7335 diff --git a/package.json b/package.json index 6f7e13c56..6f6057cb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "standard-notes-web", - "version": "3.5.19", + "version": "3.6.0-beta01", "license": "AGPL-3.0-or-later", "repository": { "type": "git", @@ -8,7 +8,7 @@ }, "scripts": { "setup": "yarn submodules && yarn install", - "start": "webpack-dev-server --progress --config webpack.dev.js", + "start": "webpack-dev-server --config webpack.dev.js", "watch": "webpack -w --config webpack.dev.js", "watch:desktop": "webpack -w --config webpack.dev.js --env.platform='desktop'", "bundle": "webpack --config webpack.prod.js && yarn tsc", @@ -16,64 +16,60 @@ "bundle:desktop:beta": "webpack --config webpack.prod.js --env.platform='desktop' --env.public_beta='true'", "build": "bundle install && yarn install --pure-lockfile && bundle exec rails assets:precompile && yarn bundle", "submodules": "git submodule update --init --force", - "lint": "eslint --fix app/assets/javascripts/**/*.js", + "lint": "eslint --fix app/assets/javascripts", "tsc": "tsc --project app/assets/javascripts/tsconfig.json" }, "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-transform-react-jsx": "^7.12.10", - "@babel/preset-env": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", + "@babel/core": "^7.12.16", + "@babel/plugin-transform-react-jsx": "^7.12.16", + "@babel/preset-env": "^7.12.16", + "@babel/preset-typescript": "^7.12.16", + "@svgr/webpack": "^5.5.0", "@types/angular": "^1.8.0", - "@types/chai": "^4.2.11", - "@types/lodash": "^4.14.149", - "@types/mocha": "^7.0.2", + "@types/lodash": "^4.14.168", "@types/pug": "^2.0.4", "@types/react": "^17.0.0", - "@typescript-eslint/eslint-plugin": "^2.23.0", - "@typescript-eslint/parser": "^2.23.0", + "@typescript-eslint/eslint-plugin": "^4.14.0", + "@typescript-eslint/parser": "^4.14.0", "angular": "^1.8.2", "apply-loader": "^2.0.0", "babel-eslint": "^10.1.0", + "babel-loader": "^8.2.2", "babel-plugin-angularjs-annotate": "^0.10.0", - "chai": "^4.2.0", "connect": "^3.7.0", "css-loader": "^3.4.2", "dotenv": "^8.2.0", - "eslint": "^6.8.0", - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-import": "^2.20.1", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1", + "eslint": "^7.18.0", + "eslint-config-prettier": "^7.2.0", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", "file-loader": "^5.1.0", "html-webpack-plugin": "^4.3.0", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "mini-css-extract-plugin": "^0.9.0", - "mocha": "^7.1.0", "ng-cache-loader": "0.0.26", "node-sass": "^4.14.1", "pug": "^2.0.4", "pug-loader": "^2.4.0", "sass-loader": "^8.0.2", "serve-static": "^1.14.1", - "sn-stylekit": "2.1.0", - "ts-loader": "^8.0.12", - "typescript": "^4.1.3", + "sn-stylekit": "^2.2.0", + "ts-loader": "^8.0.17", + "typescript": "^4.1.5", "typescript-eslint": "0.0.1-alpha.0", "webpack": "^4.44.1", "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0", + "webpack-dev-server": "^3.11.2", "webpack-merge": "^4.2.2" }, "dependencies": { - "@bugsnag/js": "^7.5.1", - "@reach/alert": "^0.12.1", - "@reach/alert-dialog": "^0.12.1", - "@reach/dialog": "^0.12.1", - "@standardnotes/sncrypto-web": "^1.2.9", - "@standardnotes/snjs": "^2.0.38", - "babel-loader": "^8.2.2", - "mobx": "^6.0.4", - "preact": "^10.5.7" + "@bugsnag/js": "^7.6.0", + "@reach/alert": "^0.13.0", + "@reach/alert-dialog": "^0.13.0", + "@reach/dialog": "^0.13.0", + "@standardnotes/sncrypto-web": "^1.2.10", + "@standardnotes/snjs": "^2.0.61", + "mobx": "^6.1.6", + "preact": "^10.5.12" } } diff --git a/vendor/extensions/extensions-manager b/vendor/extensions/extensions-manager new file mode 160000 index 000000000..206c1da0a --- /dev/null +++ b/vendor/extensions/extensions-manager @@ -0,0 +1 @@ +Subproject commit 206c1da0a4bcd2389a052863de03251b103b7335 diff --git a/webpack.config.js b/webpack.config.js index 4fb2589cd..a4a6ba212 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -71,7 +71,11 @@ module.exports = ( ], }, { - test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, + test: /\.svg$/, + use: ['@svgr/webpack'], + }, + { + test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/, use: [ { loader: 'file-loader', diff --git a/yarn.lock b/yarn.lock index 2bf6585af..bfe148027 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,12 +9,45 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== + "@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== -"@babel/core@^7.12.10": +"@babel/core@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.16.tgz#8c6ba456b23b680a6493ddcfcd9d3c3ad51cab7c" + integrity sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.15" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helpers" "^7.12.13" + "@babel/parser" "^7.12.16" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.3": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== @@ -44,6 +77,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.12.13", "@babel/generator@^7.12.15": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== + dependencies: + "@babel/types" "^7.12.13" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" @@ -67,6 +109,13 @@ dependencies: "@babel/types" "^7.12.10" +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" @@ -75,22 +124,23 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.10.tgz#a58cb96a793dc0fcd5c9ed3bb36d62fdc60534c2" - integrity sha512-3Kcr2LGpL7CTRDTTYm1bzeor9qZbxbvU2AxsLA6mUG9gYarSfIKMK0UlU+azLWI+s0+BH768bwyaziWB2NOJlQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.10" - "@babel/helper-module-imports" "^7.12.5" - "@babel/types" "^7.12.10" + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-builder-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" - integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== +"@babel/helper-compilation-targets@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz#6905238b4a5e02ba2d032c1a49dd1820fe8ce61b" + integrity sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.16" + browserslist "^4.14.5" + semver "^5.5.0" "@babel/helper-compilation-targets@^7.12.5": version "7.12.5" @@ -113,6 +163,17 @@ "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz#955d5099fd093e5afb05542190f8022105082c61" + integrity sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.16" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-create-regexp-features-plugin@^7.12.1": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" @@ -121,6 +182,14 @@ "@babel/helper-annotate-as-pure" "^7.10.4" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz#3b31d13f39f930fad975e151163b7df7d4ffe9d3" + integrity sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + "@babel/helper-define-map@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" @@ -137,6 +206,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" @@ -146,6 +222,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -153,6 +238,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" @@ -160,6 +252,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-member-expression-to-functions@^7.12.1": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" @@ -167,6 +266,13 @@ dependencies: "@babel/types" "^7.12.7" +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz#41e0916b99f8d5f43da4f05d85f4930fa3d62b22" + integrity sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" @@ -174,6 +280,13 @@ dependencies: "@babel/types" "^7.12.5" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -189,6 +302,21 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" + integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + lodash "^4.17.19" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c" @@ -196,11 +324,23 @@ dependencies: "@babel/types" "^7.12.7" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + "@babel/helper-remap-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" @@ -210,6 +350,15 @@ "@babel/helper-wrap-function" "^7.10.4" "@babel/types" "^7.12.1" +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-replace-supers@^7.12.1": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" @@ -220,6 +369,16 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-simple-access@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" @@ -227,6 +386,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -241,16 +407,38 @@ dependencies: "@babel/types" "^7.11.0" +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-validator-option@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" + integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== + +"@babel/helper-validator-option@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz#f73cbd3bbba51915216c5dea908e9b206bb10051" + integrity sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ== + "@babel/helper-wrap-function@^7.10.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" @@ -261,6 +449,25 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helpers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" + integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helpers@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" @@ -279,11 +486,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== +"@babel/parser@^7.12.13", "@babel/parser@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + "@babel/parser@^7.12.7", "@babel/parser@^7.7.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" @@ -298,6 +519,15 @@ "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" +"@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-proposal-class-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" @@ -306,6 +536,14 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" @@ -314,6 +552,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" +"@babel/plugin-proposal-dynamic-import@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz#b9f33b252e3406d492a15a799c9d45a9a9613473" + integrity sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-export-namespace-from@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" @@ -322,6 +568,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" @@ -330,6 +584,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" +"@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-proposal-logical-assignment-operators@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" @@ -338,6 +600,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" @@ -346,6 +616,22 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" @@ -363,6 +649,15 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" +"@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" @@ -371,6 +666,23 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" +"@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz#600c7531f754186b0f2096e495a92da7d88aa139" + integrity sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-optional-chaining@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" @@ -388,6 +700,14 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" @@ -396,6 +716,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-unicode-property-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-async-generators@^7.8.0": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -410,6 +738,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -438,6 +773,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -487,12 +829,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" - integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-arrow-functions@^7.12.1": version "7.12.1" @@ -501,6 +850,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" @@ -510,6 +866,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.12.1" +"@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" @@ -517,13 +882,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" - integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.12.11": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" + integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-classes@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" @@ -538,6 +917,19 @@ "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" @@ -545,6 +937,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-destructuring@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" @@ -552,6 +951,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" @@ -560,6 +966,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-dotall-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-duplicate-keys@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" @@ -567,6 +981,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" @@ -575,6 +996,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-for-of@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" @@ -582,6 +1011,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-function-name@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" @@ -590,6 +1026,14 @@ "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" @@ -597,6 +1041,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-member-expression-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" @@ -604,6 +1055,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-modules-amd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" @@ -613,6 +1071,15 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" @@ -623,6 +1090,16 @@ "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" @@ -634,6 +1111,17 @@ "@babel/helper-validator-identifier" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== + dependencies: + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-umd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" @@ -642,6 +1130,14 @@ "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" @@ -649,6 +1145,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.1" +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/plugin-transform-new-target@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" @@ -656,6 +1159,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-object-super@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" @@ -664,6 +1174,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.12.1" +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/plugin-transform-parameters@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" @@ -671,6 +1189,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-property-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" @@ -678,15 +1203,63 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.10.tgz#a7af3097c73479123594c8c8fe39545abebd44e3" - integrity sha512-MM7/BC8QdHXM7Qc1wdnuk73R4gbuOpfrSUgfV/nODGc86sPY1tgmY2M9E9uAnf2e4DOIp8aKGWqgZfQxnTNGuw== +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.10" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz#4471f0851feec3231cc9aaa0dccde39947c1ac1e" + integrity sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-display-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-jsx-development@^7.12.7": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz#bccca33108fe99d95d7f9e82046bfe762e71f4e7" + integrity sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.12" + +"@babel/plugin-transform-react-jsx@^7.12.10", "@babel/plugin-transform-react-jsx@^7.12.12": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz#b0da51ffe5f34b9a900e9f1f5fb814f9e512d25e" + integrity sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.10" + "@babel/helper-module-imports" "^7.12.5" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/types" "^7.12.12" + +"@babel/plugin-transform-react-jsx@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.16.tgz#07c341e02a3e4066b00413534f30c42519923230" + integrity sha512-dNu0vAbIk8OkqJfGtYF6ADk6jagoyAl+Ks5aoltbAlfoKv8d6yooi3j+kObeSQaCj9PgN6KMZPB90wWyek5TmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-regenerator@^7.12.1": version "7.12.1" @@ -695,6 +1268,13 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== + dependencies: + regenerator-transform "^0.14.2" + "@babel/plugin-transform-reserved-words@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" @@ -702,6 +1282,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-shorthand-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" @@ -709,6 +1296,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-spread@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" @@ -717,6 +1311,21 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" +"@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-sticky-regex@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" @@ -731,6 +1340,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-typeof-symbol@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" @@ -738,14 +1354,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" - integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.12.1" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typescript@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.16.tgz#3f30b829bdd15683f71c32fa31330c2af8c1b732" + integrity sha512-88hep+B6dtDOiEqtRzwHp2TYO+CN8nbAV3eh5OpBGPsedug9J6y1JwLKzXRIGGQZDC8NlpxpQMIIxcfIW96Wgw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.16" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-typescript" "^7.12.13" "@babel/plugin-transform-unicode-escapes@^7.12.1": version "7.12.1" @@ -754,6 +1377,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-unicode-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" @@ -762,16 +1392,24 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.10.tgz#ca981b95f641f2610531bd71948656306905e6ab" - integrity sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA== +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" + integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== dependencies: "@babel/compat-data" "^7.12.7" "@babel/helper-compilation-targets" "^7.12.5" "@babel/helper-module-imports" "^7.12.5" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" + "@babel/helper-validator-option" "^7.12.11" "@babel/plugin-proposal-async-generator-functions" "^7.12.1" "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-dynamic-import" "^7.12.1" @@ -800,7 +1438,7 @@ "@babel/plugin-transform-arrow-functions" "^7.12.1" "@babel/plugin-transform-async-to-generator" "^7.12.1" "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.11" "@babel/plugin-transform-classes" "^7.12.1" "@babel/plugin-transform-computed-properties" "^7.12.1" "@babel/plugin-transform-destructuring" "^7.12.1" @@ -830,7 +1468,79 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.1" "@babel/plugin-transform-unicode-regex" "^7.12.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.11" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-env@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.16.tgz#16710e3490e37764b2f41886de0a33bc4ae91082" + integrity sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.16" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.16" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-dynamic-import" "^7.12.16" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.16" + "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.13" core-js-compat "^3.8.0" semver "^5.5.0" @@ -845,14 +1555,25 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz#fc7df8199d6aae747896f1e6c61fc872056632a3" - integrity sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw== +"@babel/preset-react@^7.12.5": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" + integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" - "@babel/plugin-transform-typescript" "^7.12.1" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.10" + "@babel/plugin-transform-react-jsx-development" "^7.12.7" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-typescript@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.16.tgz#b2080ce20b7095c049db2a0410f1e39bc892f7ca" + integrity sha512-IrYNrpDSuQfNHeqh7gsJsO35xTGyAyGkI1VxOpBEADFtxCqZ77a1RHbJqM3YJhroj7qMkNMkNtcw0lqeZUrzow== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.16" + "@babel/plugin-transform-typescript" "^7.12.16" "@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": version "7.12.5" @@ -870,6 +1591,15 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" @@ -900,6 +1630,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" @@ -918,17 +1663,35 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@bugsnag/browser@^7.5.3": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.5.3.tgz#a91e9fe74422f5866d4058a05cf6d6881e15c26d" - integrity sha512-iGmKFtHz91hNovWW8rb/qLD9X5TMVEc7OUEfwE5s1M8ElReEmUAVbgTfQjkahG8aHvjGQ+M+zyM0gHfk+tTczg== +"@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.6": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== dependencies: - "@bugsnag/core" "^7.5.3" + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" -"@bugsnag/core@^7.5.3": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@bugsnag/core/-/core-7.5.3.tgz#2851284a9f7d9e0628b5f73da3e91ae1d83fc8fb" - integrity sha512-HaAPWN+z3ZlEjwF2JeuAx83eKoVd6osgx2Hyn8dlmGsRfUvpi+7rG9DI483PGexEM0O6i/ORvD6Qx92/E9zW7w== +"@babel/types@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@bugsnag/browser@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.6.0.tgz#3a34a1e8e151d09b3bf8cdd9d1358abc102db792" + integrity sha512-8sth20TM8BVfebkqxqJQOCM2P2L4foOgFH2QA3ruG0iknDKZDhE7XcoWgmUP9zVSNJqkCyiIzcBOuiwZW8JaSQ== + dependencies: + "@bugsnag/core" "^7.6.0" + +"@bugsnag/core@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@bugsnag/core/-/core-7.6.0.tgz#f18deb534ea5f95c1e02bdb3656e1e6605b16334" + integrity sha512-hBYAZJw4ScqoyM1jA1x/m2e4iS2EqYEs0I2hdzBCZFv2ls17ILmU58eRSyVdUfyzbv0J7Hi6DwwBGC4Yb6ROZA== dependencies: "@bugsnag/cuid" "^3.0.0" "@bugsnag/safe-json-stringify" "^6.0.0" @@ -941,20 +1704,20 @@ resolved "https://registry.yarnpkg.com/@bugsnag/cuid/-/cuid-3.0.0.tgz#2ee7642a30aee6dc86f5e7f824653741e42e5c35" integrity sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg== -"@bugsnag/js@^7.5.1": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-7.5.3.tgz#83362da1c4aac5cac0cc05898d11fccea291b652" - integrity sha512-xdwfq+bQPWZFwc02IIFk7rVsxoEsAMOLiZLJpjnRK/HtzwWPUciMTRIIlUzb/uZaAmd05UieVQ/TxuwQYdMgEA== +"@bugsnag/js@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-7.6.0.tgz#fec736b592220713bbeffac7805024088b3220d9" + integrity sha512-EcI3sTpyOs94/OOjwI7fOg1iZ800o3kkOAipAnULRoP62j1vmErH2l/2xubny7g0JTOL59iZEkt+5O5MhbQJ2A== dependencies: - "@bugsnag/browser" "^7.5.3" - "@bugsnag/node" "^7.5.3" + "@bugsnag/browser" "^7.6.0" + "@bugsnag/node" "^7.6.0" -"@bugsnag/node@^7.5.3": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-7.5.3.tgz#1da15d414d49712196d15f6c347e6b8714c69f77" - integrity sha512-irNGOTcxi7u8lUziLfv7rKzWGg2Yd+ZXZnwD0r6ZDhdlOwA3UnGq6Fud3SOTJNKPcUk/16Sv0mcuKkcLdHTodg== +"@bugsnag/node@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-7.6.0.tgz#45fbfafb26bde0dec79f81b442765863eef5e910" + integrity sha512-n3BVb04bq4z16nOM4gbWoXsi6k8R9bryWS/NAYi/jQg6tgyBkNYzmK0ojf3fYJ7uAgCjUJNMX6S9UHSJy/MMcQ== dependencies: - "@bugsnag/core" "^7.5.3" + "@bugsnag/core" "^7.6.0" byline "^5.0.0" error-stack-parser "^2.0.2" iserror "^0.0.2" @@ -966,69 +1729,106 @@ resolved "https://registry.yarnpkg.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz#22abdcd83e008c369902976730c34c150148a758" integrity sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA== -"@reach/alert-dialog@^0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/alert-dialog/-/alert-dialog-0.12.1.tgz#61f9bd20722761555aded777c80ec29b30c25040" - integrity sha512-LbgWXKOAnqjOvIrgcHYtQtbU93KY5Nom8OuHrMaR2wVQWtFyem/+OgPR0/cc6bvnLd6XiLDn4HFGIWDBf1Ca6w== +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== dependencies: - "@reach/auto-id" "0.12.1" - "@reach/dialog" "0.12.1" - "@reach/utils" "0.12.1" + 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.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@reach/alert-dialog@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/alert-dialog/-/alert-dialog-0.13.0.tgz#657b6e0278ac7e5c5b02298600f5862c945f0b80" + integrity sha512-cCeIa2EI9BxBqwFwC9rNNJNku/dLk9r065Q00TFVJSoQZ+uSf7V0YzOVm3OtRI80KJaVss1mMJgqoOuJ1erbIg== + dependencies: + "@reach/auto-id" "0.13.0" + "@reach/dialog" "0.13.0" + "@reach/utils" "0.13.0" invariant "^2.2.4" prop-types "^15.7.2" tslib "^2.0.0" -"@reach/alert@^0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/alert/-/alert-0.12.1.tgz#16b9493aaae3b41dbf945517d881bbbda0f79930" - integrity sha512-kIVsKgc4Vv3jFfzBEFdDmwWekMQaDfOhmJLAZczMMI/t4wqQjLANU6JVmRZsOF13/Wj2cMFNje/CIZU/VCVdsA== +"@reach/alert@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/alert/-/alert-0.13.0.tgz#1f67b389f49af61286ef03a84f5a57bd3503dadf" + integrity sha512-5lpgRnlQ0JHBsRTPfKjD9aFPDZuLcaxTgD5PXdSLb+1CU8WgNbcy+7qSjqnu1uzWS2pQenIEBViV5wGpt63ADw== dependencies: - "@reach/utils" "0.12.1" - "@reach/visually-hidden" "0.12.0" + "@reach/utils" "0.13.0" + "@reach/visually-hidden" "0.13.0" prop-types "^15.7.2" tslib "^2.0.0" -"@reach/auto-id@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.12.1.tgz#2e4a7250d2067ec16a9b4ea732695bc75572405c" - integrity sha512-s8cdY6dF0hEBB/28BbidB2EX6JfEBVIWLP6S2Jg0Xqq2H3xijL+zrsjL40jACwXRkignjuP+CvYsuFuO0+/GRA== +"@reach/auto-id@0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.13.0.tgz#0dfa4c1af46d1ad68d8282c786c03362ae35e335" + integrity sha512-yU0Mp+xvbq8hmNz8UfvbJEmy6cHnPJ8SwlXg6WuPsJA9sOJdlCyMfkbwqyz1KFVs2ISCR+wVVLT3j/TuuvS60w== dependencies: - "@reach/utils" "0.12.1" + "@reach/utils" "0.13.0" tslib "^2.0.0" -"@reach/dialog@0.12.1", "@reach/dialog@^0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/dialog/-/dialog-0.12.1.tgz#1fe67d7d09eccac57292a06a9388b5ef7d529d06" - integrity sha512-PBAzBXrChxeufhROhRuYkZmJhZeZVXGU6fa9/EVZs+Prsv40MgPdrSR6CBDAxLaYJfeZIbOwy7xoAawtlWlmpw== +"@reach/dialog@0.13.0", "@reach/dialog@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/dialog/-/dialog-0.13.0.tgz#2110725c3b8a3c64685834cdc9f3ce5c15617809" + integrity sha512-/vWv9g+jv32OGvBbN2UJJOyUfFnx/cvfTSxZiEpi6TJd9EEcfCeqtV+wbSnH9RkkLubtwHXnYZbgmE0NSMX6Ag== dependencies: - "@reach/portal" "0.12.1" - "@reach/utils" "0.12.1" + "@reach/portal" "0.13.0" + "@reach/utils" "0.13.0" prop-types "^15.7.2" - react-focus-lock "^2.3.1" - react-remove-scroll "^2.3.0" + react-focus-lock "^2.5.0" + react-remove-scroll "^2.4.1" tslib "^2.0.0" -"@reach/portal@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.12.1.tgz#995858a6e758d9446870937b60b8707a2efa11cb" - integrity sha512-Lhmtd2Qw1DzNZ2m0GHNzCu+2TYUf6kBREPSQJf44AP6kThRs02p1clntbJcmW/rrpYFYgFNbgf5Lso7NyW9ZXg== +"@reach/portal@0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.13.0.tgz#bed220d41097deb1454a7928b22529ba10d3ea2b" + integrity sha512-mGbZtox66KR6FJWfvLEJIK2dfBiqkTpGJqQa4jHR+yHu/uSDWHi7DQ173z/BuZPc+9J9sryU53+wqfmhHvU5NA== dependencies: - "@reach/utils" "0.12.1" + "@reach/utils" "0.13.0" tslib "^2.0.0" -"@reach/utils@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.12.1.tgz#02b9c15ba5cddf23e16f2d2ca77aef98a9702607" - integrity sha512-5uH4OgO+GupAzZuf3b6Wv/9uC6NdMBlxS6FSKD6YqSxP4QJ0vjD34RVon6N/RMRORacCLyD/aaZIA7283YgeOg== +"@reach/utils@0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.13.0.tgz#2da775a910d8894bb34e1e94fe95842674f71844" + integrity sha512-dypxuyA1Qy3LHxzzyS7jFGPgCCR04b8UEn+Tv/aj6y9V578dULQqkcCyobrdEa+OI8lxH7dFFHa+jH8M/noBrQ== dependencies: "@types/warning" "^3.0.0" tslib "^2.0.0" warning "^4.0.3" -"@reach/visually-hidden@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.12.0.tgz#c6c39f0bf292ae97a480ba3ed32e8a6149e852d4" - integrity sha512-VXtyR36WOS0FHmFQ/BzfswwPyBXICl/YjmTPtx/I0Vy5C6djjhD9kDsE+h/FpHzP3ugTdqdqiPBVElIZTSwOSA== +"@reach/visually-hidden@0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.13.0.tgz#cace36d9bb80ffb797374fcaea989391b881038f" + integrity sha512-LF11WL9/495Q3d86xNy0VO6ylPI6SqF2xZGg9jpZSXLbFKpQ5Bf0qC7DOJfSf+/yb9WgPgB4m+a48Fz8AO6oZA== dependencies: tslib "^2.0.0" @@ -1037,21 +1837,124 @@ resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.2.9.tgz#5212a959e4ec563584e42480bfd39ef129c3cbdf" integrity sha512-xJ5IUGOZztjSgNP/6XL+Ut5+q9UgSTv6xMtKkcQC5aJxCOkJy9u6RamPLdF00WQgwibxx2tu0e43bKUjTgzMig== -"@standardnotes/sncrypto-web@^1.2.9": - version "1.2.9" - resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.2.9.tgz#17c1a75727a65a4a8dc0cc28ddc1d21e25adabfc" - integrity sha512-OJVsoLiKoFHkEnrRImZQ6fH5H0ptk67IrVrb97Y4WEDLVABqEkX/HgdjaQwnreXWc489fqtg3BVvfgIPS7GXnQ== +"@standardnotes/sncrypto-web@^1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.2.10.tgz#ddda0c8ec92754c1334d9a83be7b320433c55b79" + integrity sha512-mmHlXFFovBqOdctpMkyXTpK0zI/k4NuXoV5LRGLKIXUktT9/cZg1pgNNfGPFUP+g4C5M2qxeFmZKFh581ipolQ== dependencies: "@standardnotes/sncrypto-common" "^1.2.7" libsodium-wrappers "^0.7.8" -"@standardnotes/snjs@^2.0.38": - version "2.0.38" - resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.0.38.tgz#3edbdc6c04926f2f4940aea8ebb6c7007f6d4235" - integrity sha512-cr+jdtDOyrwKlad/SRCy/D/cIsEQdShEsuazSIajpvXhwo9ixkj/wv/o0r3GrHug6CgXLOQRgzuZ9eZvi0PM9g== +"@standardnotes/snjs@^2.0.61": + version "2.0.61" + resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.0.61.tgz#82608ef48830a80afbc9468ed2d308e59e4e9a08" + integrity sha512-MVnzT7cX7oIak9g/xlOJKfWCfBygw8kXtuVHSofdxPhYIPIr1MwK4xkkqho/ZShVfPQEESyj3RaEsOIzKuuL4w== dependencies: "@standardnotes/sncrypto-common" "^1.2.9" +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + "@types/angular@^1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.8.0.tgz#6bce6f21d69f9dfa45e3e3dd76f723496b12c32c" @@ -1074,16 +1977,6 @@ dependencies: "@types/babel-types" "*" -"@types/chai@^4.2.11": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" - integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -1102,31 +1995,26 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/lodash@^4.14.149": - version "4.14.165" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.165.tgz#74d55d947452e2de0742bad65270433b63a8c30f" - integrity sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg== +"@types/lodash@^4.14.168": + version "4.14.168" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/mocha@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" - integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== - "@types/node@*": version "14.14.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -1137,6 +2025,11 @@ resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2" integrity sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI= +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + "@types/react@^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" @@ -1188,49 +2081,77 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@typescript-eslint/eslint-plugin@^2.23.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.0.tgz#92db8e7c357ed7d69632d6843ca70b71be3a721d" + integrity sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "4.14.0" + "@typescript-eslint/scope-manager" "4.14.0" + debug "^4.1.1" functional-red-black-tree "^1.0.1" + lodash "^4.17.15" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.0.tgz#5aa7b006736634f588a69ee343ca959cd09988df" + integrity sha512-6i6eAoiPlXMKRbXzvoQD5Yn9L7k9ezzGRvzC/x1V3650rUk3c3AOjQyGYyF9BDxQQDK2ElmKOZRD0CbtdkMzQQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/scope-manager" "4.14.0" + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/typescript-estree" "4.14.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.23.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== - dependencies: - "@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" - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== +"@typescript-eslint/parser@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.14.0.tgz#62d4cd2079d5c06683e9bfb200c758f292c4dee7" + integrity sha512-sUDeuCjBU+ZF3Lzw0hphTyScmDDJ5QVkyE21pRoBo8iDl7WBtVFS+WDN3blY1CH3SBt7EmYCw6wfmJjF0l/uYg== dependencies: + "@typescript-eslint/scope-manager" "4.14.0" + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/typescript-estree" "4.14.0" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + +"@typescript-eslint/scope-manager@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.14.0.tgz#55a4743095d684e1f7b7180c4bac2a0a3727f517" + integrity sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q== + dependencies: + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/visitor-keys" "4.14.0" + +"@typescript-eslint/types@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.14.0.tgz#d8a8202d9b58831d6fd9cee2ba12f8a5a5dd44b6" + integrity sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A== + +"@typescript-eslint/typescript-estree@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.0.tgz#4bcd67486e9acafc3d0c982b23a9ab8ac8911ed7" + integrity sha512-wRjZ5qLao+bvS2F7pX4qi2oLcOONIB+ru8RGBieDptq/SudYwshveORwCVU4/yMAd4GK7Fsf8Uq1tjV838erag== + dependencies: + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/visitor-keys" "4.14.0" + debug "^4.1.1" + globby "^11.0.1" is-glob "^4.0.1" lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.0.tgz#b1090d9d2955b044b2ea2904a22496849acbdf54" + integrity sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA== + dependencies: + "@typescript-eslint/types" "4.14.0" + eslint-visitor-keys "^2.0.0" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1406,7 +2327,7 @@ acorn-globals@^3.0.0: dependencies: acorn "^4.0.4" -acorn-jsx@^5.2.0: +acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== @@ -1426,7 +2347,7 @@ acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -1451,6 +2372,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -1470,22 +2401,15 @@ angular@^1.8.2: resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.2.tgz#5983bbb5a9fa63e213cb7749199e0d352de3a2f1" integrity sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw== -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-html@0.0.7: version "0.0.7" @@ -1524,7 +2448,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -1604,7 +2528,7 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.1: +array-includes@^3.1.1, array-includes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== @@ -1622,6 +2546,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1632,14 +2561,15 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: +array.prototype.flatmap@^1.2.3: version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== dependencies: call-bind "^1.0.0" define-properties "^1.1.3" es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" asap@~2.0.3: version "2.0.6" @@ -1676,20 +2606,15 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: version "1.0.3" @@ -1901,7 +2826,7 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -1942,11 +2867,6 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -2107,6 +3027,14 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.0" +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2151,6 +3079,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + caniuse-lite@^1.0.30001164: version "1.0.30001165" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" @@ -2169,18 +3102,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2192,7 +3113,7 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2201,7 +3122,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -2216,31 +3137,6 @@ character-parser@^2.1.1: dependencies: is-regex "^1.0.3" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2312,18 +3208,6 @@ clean-css@4.2.x, clean-css@^4.1.11, clean-css@^4.2.3: dependencies: source-map "~0.6.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -2351,6 +3235,15 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2505,11 +3398,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -2574,6 +3462,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@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" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -2624,6 +3523,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -2660,6 +3568,11 @@ css-loader@^3.4.2: schema-utils "^2.7.0" semver "^6.3.0" +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -2670,16 +3583,54 @@ css-select@^1.1.0: domutils "1.5.1" nth-check "~1.0.1" +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + csstype@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" @@ -2704,21 +3655,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^3.1.1, debug@^3.2.5: +debug@^3.1.1, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -2742,13 +3686,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -2761,11 +3698,16 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -2859,11 +3801,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2873,6 +3810,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2893,13 +3837,12 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -2958,7 +3901,7 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1: +domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -3056,6 +3999,13 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -3073,7 +4023,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -3087,7 +4037,7 @@ error-stack-parser@^2.0.2, error-stack-parser@^2.0.3: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.0-next.1: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -3141,62 +4091,37 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-config-prettier@^6.10.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" + integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-import@^2.20.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== +eslint-plugin-react@^7.22.0: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== dependencies: array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" has "^1.0.3" - minimatch "^3.0.4" + jsx-ast-utils "^2.4.1 || ^3.0.0" + object.entries "^1.1.2" + object.fromentries "^2.0.2" object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-promise@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== - -eslint-plugin-standard@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== + prop-types "^15.7.2" + resolve "^1.18.1" + string.prototype.matchall "^4.0.2" eslint-scope@^4.0.3: version "4.0.3" @@ -3206,7 +4131,7 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: +eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3214,83 +4139,81 @@ eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.18.0: + version "7.18.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" + integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.3.0" 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.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash "^4.17.20" 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" - table "^5.2.3" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== @@ -3438,15 +4361,6 @@ extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3476,12 +4390,24 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3491,14 +4417,14 @@ fastparse@^1.0.0: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= +fastq@^1.6.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== dependencies: - websocket-driver ">=0.5.1" + reusify "^1.0.4" -faye-websocket@~0.11.1: +faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== @@ -3510,19 +4436,12 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-loader@^5.1.0: version "5.1.0" @@ -3585,13 +4504,6 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -3600,12 +4512,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: - locate-path "^2.0.0" + locate-path "^3.0.0" find-up@^4.0.0: version "4.1.0" @@ -3625,26 +4537,18 @@ findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== flush-write-stream@^1.0.0: version "1.1.1" @@ -3733,7 +4637,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.1, fsevents@~2.1.2: +fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== @@ -3789,11 +4693,6 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" @@ -3803,6 +4702,15 @@ get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -3813,11 +4721,6 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -3845,26 +4748,14 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3924,6 +4815,18 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3949,11 +4852,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -3989,7 +4887,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -4054,7 +4952,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.0, he@1.2.x, he@^1.2.0: +he@1.2.x, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -4223,7 +5121,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4252,6 +5150,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + import-fresh@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" @@ -4260,6 +5163,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -4319,28 +5230,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - 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" + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-ip@^4.3.0: version "4.3.0" @@ -4350,6 +5242,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -4427,11 +5328,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" @@ -4686,14 +5582,6 @@ js-stringify@^1.0.1: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -4722,11 +5610,21 @@ json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -4742,7 +5640,7 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@^3.3.2: +json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== @@ -4779,6 +5677,14 @@ jstransformer@1.0.0: is-promise "^2.0.0" promise "^7.0.1" +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -4813,13 +5719,13 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" libsodium-wrappers@^0.7.8: version "0.7.8" @@ -4833,6 +5739,11 @@ libsodium@0.7.8: resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.8.tgz#fbd12247b7b1353f88d8de1cbc66bc1a07b2e008" integrity sha512-/Qc+APf0jbeWSaeEruH0L1/tbbT+sbf884ZL0/zV/0JXaDPBzYkKbyb/wmxMHgAHzm3t6gqe7bOOXAVwfqVikQ== +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4844,22 +5755,12 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -4868,13 +5769,14 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4 emojis-list "^3.0.0" json5 "^1.0.1" -locate-path@^2.0.0: +loader-utils@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" locate-path@^3.0.0: version "3.0.0" @@ -4896,13 +5798,6 @@ lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.1 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - loglevel@^1.6.8: version "1.7.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" @@ -5003,6 +5898,16 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -5045,6 +5950,11 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5069,7 +5979,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.0: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -5112,11 +6022,6 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mini-css-extract-plugin@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -5137,7 +6042,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -5173,47 +6078,17 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.5, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mobx@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.0.4.tgz#8fc3e3629a3346f8afddf5bd954411974744dad1" - integrity sha512-wT2QJT9tW19VSHo9x7RPKU3z/I2Ps6wUS8Kb1OO+kzmg7UY3n4AkcaYG6jq95Lp1R9ohjC/NGYuT2PtuvBjhFg== - -mocha@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" +mobx@^6.1.6: + version "6.1.6" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.1.6.tgz#ae75e57ec07d190ed187273864002163fa357224" + integrity sha512-3by0Avodad/3cdPAuJuj8jWXhe1YByHKaEkonD9yOdcMoMuot2jrjlSXmQPhR1bJpNHfSsOx122tM9Pv3IzFWA== move-concurrently@^1.0.1: version "1.0.1" @@ -5255,11 +6130,6 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1, nan@^2.13.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" @@ -5327,14 +6197,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -5471,7 +6333,7 @@ npm-run-path@^2.0.0: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.1: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== @@ -5502,7 +6364,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: +object-inspect@^1.8.0, object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== @@ -5515,7 +6377,7 @@ object-is@^1.0.1: call-bind "^1.0.0" define-properties "^1.1.3" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -5527,17 +6389,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -5547,7 +6399,27 @@ object.assign@^4.1.0, object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3: +object.entries@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" + integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== @@ -5563,7 +6435,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.1: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== @@ -5597,13 +6469,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -5611,17 +6476,17 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.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@^1.0.0: version "1.0.2" @@ -5640,7 +6505,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -5658,13 +6523,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5672,13 +6530,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -5705,11 +6556,6 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -5769,6 +6615,16 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -5834,6 +6690,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -5853,17 +6714,10 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: version "3.1.1" @@ -5908,13 +6762,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -6000,15 +6847,15 @@ postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: source-map "^0.6.1" supports-color "^6.1.0" -preact@^10.5.7: - version "10.5.7" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.7.tgz#f1d84725539e18f7ccbea937cf3db5895661dbd3" - integrity sha512-4oEpz75t/0UNcwmcsjk+BIcDdk68oao+7kxcpc1hQPNs2Oo3ZL9xFz8UBf350mxk/VEdD41L5b4l2dE3Ug3RYg== +preact@^10.5.12: + version "10.5.12" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.12.tgz#6a8ee8bf40a695c505df9abebacd924e4dd37704" + integrity sha512-r6siDkuD36oszwlCkcqDJCAKBQxGoeEGytw2DGMD5A/GGdu5Tymw+N2OBXwvOLxg6d1FeY8MgMV3cc5aVQo4Cg== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prepend-http@^1.0.0: version "1.0.4" @@ -6248,6 +7095,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -6318,7 +7170,7 @@ react-clientside-effect@^1.2.2: dependencies: "@babel/runtime" "^7.0.0" -react-focus-lock@^2.3.1: +react-focus-lock@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.5.0.tgz#12e3a3940e897c26e2c2a0408cd25ea3c99b3709" integrity sha512-XLxj6uTXgz0US8TmqNU2jMfnXwZG0mH2r/afQqvPEaX6nyEll5LHVcEXk2XDUQ34RVeLPkO/xK5x6c/qiuSq/A== @@ -6343,7 +7195,7 @@ react-remove-scroll-bar@^2.1.0: react-style-singleton "^2.1.0" tslib "^1.0.0" -react-remove-scroll@^2.3.0: +react-remove-scroll@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.4.1.tgz#e0af6126621083a5064591d367291a81b2d107f5" integrity sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA== @@ -6371,14 +7223,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -6388,15 +7232,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -6428,13 +7263,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -6495,12 +7323,15 @@ regexp.prototype.flags@^1.2.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexp.prototype.flags@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" -regexpp@^3.0.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -6598,6 +7429,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -6638,7 +7474,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.18.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -6646,14 +7482,6 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13. is-core-module "^2.1.0" path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -6664,6 +7492,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -6678,10 +7511,10 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -6693,10 +7526,10 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -6705,13 +7538,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -6755,6 +7581,11 @@ sass-loader@^8.0.2: schema-utils "^2.6.1" semver "^6.3.0" +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -6786,14 +7617,14 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.7: +selfsigned@^1.10.8: version "1.10.8" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== dependencies: node-forge "^0.10.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -6803,12 +7634,12 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -6921,12 +7752,33 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0, signal-exit@^3.0.2: +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.2, side-channel@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -6936,19 +7788,24 @@ simple-is@~0.2.0: resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -sn-stylekit@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sn-stylekit/-/sn-stylekit-2.1.0.tgz#ca6c925e714a1ff490e0e499341c6335059e00e0" - integrity sha512-H7Ml3rMSTGSveM7YRd574gPAIw/HINdnkQjk/TxQ9Vt457im+z6lZq9AerXn+9NiYWfY88B5LrOTihKOwTGYgw== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sn-stylekit@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sn-stylekit/-/sn-stylekit-2.2.0.tgz#0c143cb25addf4a1edf02d41ea1d6821017f8652" + integrity sha512-xUx+EujROZBaoMrvM0y7CjHPD6WJfwu1tY3oeFG/sV3M9YvCcGkX76Jz9iPt0daeYM4h0oAWphniH7pLi3aFwA== snapdragon-node@^2.0.1: version "2.1.1" @@ -6980,26 +7837,26 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== +sockjs-client@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== dependencies: - debug "^3.2.5" + debug "^3.2.6" eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.4.7" -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== dependencies: - faye-websocket "^0.10.0" + faye-websocket "^0.11.3" uuid "^3.4.0" - websocket-driver "0.6.5" + websocket-driver "^0.7.4" sort-keys@^1.0.0: version "1.1.2" @@ -7142,6 +7999,11 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-generator@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36" @@ -7237,7 +8099,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: +string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -7246,6 +8108,19 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz#24243399bc31b0a49d19e2b74171a15653ec996a" + integrity sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + string.prototype.trimend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" @@ -7311,11 +8186,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -7328,23 +8198,11 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.0.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -7371,15 +8229,39 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -7432,11 +8314,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -7449,13 +8326,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -7533,26 +8403,16 @@ trim-newlines@^1.0.0: dependencies: glob "^7.1.2" -ts-loader@^8.0.12: - version "8.0.12" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.12.tgz#1de9f1de65176318c1e6d187bfc496182f8dc2a0" - integrity sha512-UIivVfGVJDdwwjgSrbtcL9Nf10c1BWnL1mxAQUVcnhNIn/P9W3nP5v60Z0aBMtc7ZrE11lMmU6+5jSgAXmGaYw== +ts-loader@^8.0.17: + version "8.0.17" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.17.tgz#98f2ccff9130074f4079fd89b946b4c637b1f2fc" + integrity sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w== dependencies: - chalk "^2.3.0" + chalk "^4.1.0" enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" + loader-utils "^2.0.0" micromatch "^4.0.0" - semver "^6.0.0" - -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" + semver "^7.3.4" tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" @@ -7588,22 +8448,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + prelude-ls "^1.2.1" type-fest@^0.8.1: version "0.8.1" @@ -7628,10 +8478,10 @@ typescript-eslint@0.0.1-alpha.0: resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-0.0.1-alpha.0.tgz#285d68a4e96588295cd436278801bcb6a6b916c1" integrity sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg== -typescript@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== uglify-js@3.4.x: version "3.4.10" @@ -7713,6 +8563,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -7743,7 +8598,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse@^1.4.3: +url-parse@^1.4.3, url-parse@^1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== @@ -7790,6 +8645,16 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -7916,10 +8781,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== +webpack-dev-server@^3.11.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -7941,11 +8806,11 @@ webpack-dev-server@^3.11.0: p-retry "^3.0.1" portfinder "^1.0.26" schema-utils "^1.0.0" - selfsigned "^1.10.7" + selfsigned "^1.10.8" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" + sockjs "^0.3.21" + sockjs-client "^1.5.0" spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" @@ -8007,14 +8872,7 @@ webpack@^4.44.1: watchpack "^1.7.4" webpack-sources "^1.4.1" -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" - -websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -8033,14 +8891,21 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@1.1.3, wide-align@^1.1.0: +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -8060,7 +8925,7 @@ with@^5.0.0: acorn "^3.1.0" acorn-globals "^3.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -8091,13 +8956,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -8130,7 +8988,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.2: +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -8138,16 +9001,7 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0, yargs@^13.3.2: +yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==