From fb5fd5c53eb2b8d2c92805a0a1b3828de7c75c6b Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 29 Jul 2021 13:59:25 +0300 Subject: [PATCH 01/84] Up version --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 1e54e98..033ef6f 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "time-tracker", "productName": "TimeTracker", - "version": "1.0.3", + "version": "1.0.4", "description": "Start and stop time, jump between tasks, and add details on how time was spent.", "main": "./main.prod.js", "author": { From 9f606800ea2c65b861ae012178ed58abcfd013af Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 29 Jul 2021 14:13:59 +0300 Subject: [PATCH 02/84] Set env variables --- .github/workflows/publish.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ddb02b1..f66ebdf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -48,6 +48,9 @@ jobs: CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} # This is used for uploading release assets to github GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # App env + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + GA_UACODE: ${{ secrets.GA_UACODE }} run: | yarn postinstall && yarn build && yarn electron-builder --publish always --win # yarn postinstall && yarn build && yarn electron-builder --publish always --win --mac --linux From f14343115e150bd3ed0664ec3ae5b031341ddd54 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 29 Jul 2021 15:59:00 +0300 Subject: [PATCH 03/84] Log vars --- src/components/SettingsModal/SettingsModal.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 108abdd..5a806ed 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -130,6 +130,9 @@ const SettingsModal: React.VFC = observer( Test Sentry )} + {`APPDATA: ${process.env.APPDATA}`} + {`SENTRY_DSN: ${process.env.SENTRY_DSN}`} + {`GA_UACODE: ${process.env.GA_UACODE}`} ); } From 38fab40ceaec6ee4d35289951c9b057fb4d4c3a8 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 29 Jul 2021 16:51:26 +0300 Subject: [PATCH 04/84] Log vars --- src/components/SettingsModal/SettingsModal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 5a806ed..250883e 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -130,9 +130,9 @@ const SettingsModal: React.VFC = observer( Test Sentry )} - {`APPDATA: ${process.env.APPDATA}`} - {`SENTRY_DSN: ${process.env.SENTRY_DSN}`} - {`GA_UACODE: ${process.env.GA_UACODE}`} +

{`APPDATA: ${process.env.APPDATA}`}

+

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

+

{`GA_UACODE: ${process.env.GA_UACODE}`}

); } From ef75d3a959dfeae042fe301feb6f2eb5f42765c4 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 29 Jul 2021 17:22:58 +0300 Subject: [PATCH 05/84] Cross platform saving data --- src/base/repositories/AbstractFileRepository.ts | 7 +++++-- src/components/SettingsModal/SettingsModal.tsx | 3 ++- src/main.dev.ts | 7 ++++--- src/main/EChannels.ts | 3 +++ src/main/IpcMain.ts | 8 ++++++++ 5 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/main/EChannels.ts create mode 100644 src/main/IpcMain.ts diff --git a/src/base/repositories/AbstractFileRepository.ts b/src/base/repositories/AbstractFileRepository.ts index c170b3f..2bb454c 100644 --- a/src/base/repositories/AbstractFileRepository.ts +++ b/src/base/repositories/AbstractFileRepository.ts @@ -1,5 +1,8 @@ +import { EChannels } from '../../main/EChannels'; + const fs = require('fs'); const path = require('path'); +import { ipcRenderer } from 'electron'; import FsHelper from '../../helpers/FsHelper'; import PromiseQueue from '../../helpers/PromiseQueueHellper'; @@ -21,8 +24,8 @@ export default abstract class AbstractFileRepository { return `FileRepository [${filePath}/${this.fileName}]:`; } - private static get appDataFolder() { - return process.env.APPDATA || ''; + static get appDataFolder() { + return ipcRenderer.sendSync(EChannels.GetPathUserData); } private get destFolder() { diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 250883e..4c024c5 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -21,6 +21,7 @@ import IModalProps from '../../types/IModalProps'; import NewProfilePopover from './NewProfilePopover'; import { timeToMs } from '../../helpers/DateTime'; import { DEFAULT_SETTINGS } from '../../modules/settings/models/SettingsModel'; +import AbstractFileRepository from '../../base/repositories/AbstractFileRepository'; const { settingsStore } = rootStore; @@ -130,7 +131,7 @@ const SettingsModal: React.VFC = observer( Test Sentry )} -

{`APPDATA: ${process.env.APPDATA}`}

+

{`APPDATA: ${AbstractFileRepository.appDataFolder}`}

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

{`GA_UACODE: ${process.env.GA_UACODE}`}

diff --git a/src/main.dev.ts b/src/main.dev.ts index 2bf7043..b8060eb 100644 --- a/src/main.dev.ts +++ b/src/main.dev.ts @@ -12,15 +12,16 @@ import log from 'electron-log'; Object.assign(console, log.functions); import 'core-js/stable'; import 'regenerator-runtime/runtime'; +import { initSentry } from './shared/initSentry'; +initSentry(); + import path from 'path'; import { app, BrowserWindow, shell } from 'electron'; import { autoUpdater } from 'electron-updater'; import Badge from 'electron-windows-badge'; +import './main/IpcMain'; import MenuBuilder from './menu'; -import { initSentry } from './shared/initSentry'; - -initSentry(); console.log('Working path:', app.getAppPath()); diff --git a/src/main/EChannels.ts b/src/main/EChannels.ts new file mode 100644 index 0000000..4009b4f --- /dev/null +++ b/src/main/EChannels.ts @@ -0,0 +1,3 @@ +export enum EChannels { + GetPathUserData = 'get-path-userdata', +} diff --git a/src/main/IpcMain.ts b/src/main/IpcMain.ts new file mode 100644 index 0000000..fbf64df --- /dev/null +++ b/src/main/IpcMain.ts @@ -0,0 +1,8 @@ +// main process +import { ipcMain, app } from 'electron'; + +import { EChannels } from './EChannels'; + +ipcMain.on(EChannels.GetPathUserData, (event) => { + event.returnValue = app.getPath('appData'); +}); From 648d5cd392f833c772f42de09fc3b3aa31d51256 Mon Sep 17 00:00:00 2001 From: Yadro Date: Thu, 29 Jul 2021 17:34:21 +0300 Subject: [PATCH 06/84] Build for win mac and linux --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f66ebdf..30a1e49 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -52,5 +52,4 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} GA_UACODE: ${{ secrets.GA_UACODE }} run: | - yarn postinstall && yarn build && yarn electron-builder --publish always --win - # yarn postinstall && yarn build && yarn electron-builder --publish always --win --mac --linux + yarn postinstall && yarn build && yarn electron-builder --publish always --win --mac --linux From 716af5c3c0361ba80aa08ee5b5af445bb54bbf6d Mon Sep 17 00:00:00 2001 From: Yadro Date: Thu, 29 Jul 2021 17:41:00 +0300 Subject: [PATCH 07/84] Disable mac --- .github/workflows/publish.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 30a1e49..bdc0400 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -52,4 +52,5 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} GA_UACODE: ${{ secrets.GA_UACODE }} run: | - yarn postinstall && yarn build && yarn electron-builder --publish always --win --mac --linux + yarn postinstall && yarn build && yarn electron-builder --publish always --win --linux + # --mac From 75ea152eb749568d06431ad12ca1935c24396751 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 15 Aug 2021 11:58:24 +0300 Subject: [PATCH 08/84] Hide vars, optimize --- src/base/repositories/AbstractFileRepository.ts | 8 +++++++- src/components/SettingsModal/SettingsModal.tsx | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/base/repositories/AbstractFileRepository.ts b/src/base/repositories/AbstractFileRepository.ts index 2bb454c..b2eefc1 100644 --- a/src/base/repositories/AbstractFileRepository.ts +++ b/src/base/repositories/AbstractFileRepository.ts @@ -12,6 +12,8 @@ const APP_DIR = ? 'YadroTimeTracker_test' : 'YadroTimeTracker'; +let _appDataPath: string = ''; + export default abstract class AbstractFileRepository { dirWithProfileData: string = 'profile1'; fileName: string = 'defaultFileName.json'; @@ -25,7 +27,11 @@ export default abstract class AbstractFileRepository { } static get appDataFolder() { - return ipcRenderer.sendSync(EChannels.GetPathUserData); + if (_appDataPath) { + return _appDataPath; + } + _appDataPath = ipcRenderer.sendSync(EChannels.GetPathUserData); + return _appDataPath; } private get destFolder() { diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 4c024c5..471ec7d 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -131,9 +131,14 @@ const SettingsModal: React.VFC = observer( Test Sentry )} -

{`APPDATA: ${AbstractFileRepository.appDataFolder}`}

-

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

-

{`GA_UACODE: ${process.env.GA_UACODE}`}

+ {process.env.NODE_ENV === 'development' || + (process.env.DEBUG_PROD === 'true' && ( + <> +

{`APPDATA: ${AbstractFileRepository.appDataFolder}`}

+

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

+

{`GA_UACODE: ${process.env.GA_UACODE}`}

+ + ))} ); } From 3c82473ad2a2b2ddd099f60e6f4c992d4df52510 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 15 Aug 2021 12:15:34 +0300 Subject: [PATCH 09/84] Fix parentheses --- src/components/SettingsModal/SettingsModal.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 471ec7d..5426db2 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -131,14 +131,14 @@ const SettingsModal: React.VFC = observer( Test Sentry )} - {process.env.NODE_ENV === 'development' || - (process.env.DEBUG_PROD === 'true' && ( - <> -

{`APPDATA: ${AbstractFileRepository.appDataFolder}`}

-

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

-

{`GA_UACODE: ${process.env.GA_UACODE}`}

- - ))} + {(process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true') && ( + <> +

{`APPDATA: ${AbstractFileRepository.appDataFolder}`}

+

{`SENTRY_DSN: ${process.env.SENTRY_DSN}`}

+

{`GA_UACODE: ${process.env.GA_UACODE}`}

+ + )} ); } From 26389cc5dedc4f42d2f9de8dd4600303f1ca51f9 Mon Sep 17 00:00:00 2001 From: yadro Date: Tue, 28 Sep 2021 19:21:15 +0300 Subject: [PATCH 10/84] Bump From 776afd6a4ea26ae76a429eaa5664d043c01becf7 Mon Sep 17 00:00:00 2001 From: yadro Date: Tue, 28 Sep 2021 21:17:15 +0300 Subject: [PATCH 11/84] v1.0.5 --- src/package.json | 2 +- yarn.lock | 313 +++++++++++++++++++++++------------------------ 2 files changed, 153 insertions(+), 162 deletions(-) diff --git a/src/package.json b/src/package.json index 033ef6f..6c280b8 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "time-tracker", "productName": "TimeTracker", - "version": "1.0.4", + "version": "1.0.5", "description": "Start and stop time, jump between tasks, and add details on how time was spent.", "main": "./main.prod.js", "author": { diff --git a/yarn.lock b/yarn.lock index 9df93c5..3a051f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1159,10 +1159,10 @@ global-agent "^2.0.2" global-tunnel-ng "^2.7.1" -"@electron/universal@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.4.tgz#231ac246c39d45b80e159bd21c3f9027dcaa10f5" - integrity sha512-ajZoumi4XwqwmZe8YVhu4XGkZBCPyWZsVCQONPTIe9TUlleSN+dic3YpXlaWcilx/HOzTdldTKtabNTeI0gDoA== +"@electron/universal@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37" + integrity sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag== dependencies: "@malept/cross-spawn-promise" "^1.1.0" asar "^3.0.3" @@ -1415,10 +1415,10 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== -"@types/fs-extra@^9.0.7": - version "9.0.11" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.11.tgz#8cc99e103499eab9f347dbc6ca4e99fb8d2c2b87" - integrity sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA== +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: "@types/node" "*" @@ -1554,10 +1554,10 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^16.0.0": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.1.tgz#5fc5d41f69762e00fbecbc8d4bf9dea47d8726f4" - integrity sha512-x4HABGLyzr5hKUzBC9dvjciOTm11WVH1NWonNjGgxapnTHu5SWUqyqn0zQ6Re0yQU0lsQ6ztLCoMAKDGZflyxA== +"@types/yargs@^16.0.2": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: "@types/yargs-parser" "*" @@ -2060,34 +2060,34 @@ app-builder-bin@3.5.13: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.13.tgz#6dd7f4de34a4e408806f99b8c7d6ef1601305b7e" integrity sha512-ighVe9G+bT1ENGdp9ecO1P+94vv/f+FUwaI+XkNzeg9bYF8Oi3BQ+mJuxS00UgyHs8luuOzjzC+qnAtdb43Mpg== -app-builder-lib@22.11.1: - version "22.11.1" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.11.1.tgz#a19c90f9bbe22309db53768434e744095ddf6c85" - integrity sha512-oHpXomred4MeDzdLBMNuBtyEMiskX4wwQE+23CKFMqVfLEzpRwErZW+xegFi8aa/rhAOdED0THSHTcIr5rylIQ== +app-builder-lib@22.11.7: + version "22.11.7" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.11.7.tgz#c0ad1119ebfbf4189a8280ad693625f5e684dca6" + integrity sha512-pS9/cR4/TnNZVAHZECiSvvwTBzbwblj7KBBZkMKDG57nibq0I1XY8zAaYeHFdlYTyrRcz9JUXbAqJKezya7UFQ== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/universal" "1.0.4" + "@electron/universal" "1.0.5" "@malept/flatpak-bundler" "^0.4.0" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "22.11.1" - builder-util-runtime "8.7.4" + builder-util "22.11.7" + builder-util-runtime "8.7.7" chromium-pickle-js "^0.2.0" debug "^4.3.2" ejs "^3.1.6" - electron-publish "22.11.1" - fs-extra "^9.1.0" - hosted-git-info "^4.0.0" + electron-publish "22.11.7" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" is-ci "^3.0.0" - istextorbinary "^5.12.0" - js-yaml "^4.0.0" - lazy-val "^1.0.4" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" minimatch "^3.0.4" - read-config-file "6.1.0" + read-config-file "6.2.0" sanitize-filename "^1.6.3" - semver "^7.3.4" - temp-file "^3.3.7" + semver "^7.3.5" + temp-file "^3.4.0" aproba@^1.0.3: version "1.2.0" @@ -2440,11 +2440,6 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -binaryextensions@^4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-4.15.0.tgz#c63a502e0078ff1b0e9b00a9f74d3c2b0f8bd32e" - integrity sha512-MkUl3szxXolQ2scI1PM14WOT951KnaTNJ0eMKg7WzOI4kvSxyNo/Cygx4LOBNhwyINhAuSQpJW1rYD9aBSxGaw== - bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -2689,33 +2684,41 @@ builder-util-runtime@8.7.2: debug "^4.1.1" sax "^1.2.4" -builder-util-runtime@8.7.4: - version "8.7.4" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.4.tgz#83f9f00bdf496cb3636d551cb5f5db56cdf25c96" - integrity sha512-2vDOwH0cyyCLQwW0Tsrg3RKKQpEcrV70KFun39E8RPzNFBOv9ds9juK8WUnO6ml+xJWKkKTjWLFdF3y+8GbPOw== +builder-util-runtime@8.7.6: + version "8.7.6" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz#4b43c96db2bd494ced7694bcd7674934655e8324" + integrity sha512-rj9AIY7CzLSuTOXpToiaQkruYh6UEQ+kYnd5UET22ch8MGClEtIZKXHG14qEiXEr2x4EOKDMxkcTa+9TYaE+ug== dependencies: debug "^4.3.2" sax "^1.2.4" -builder-util@22.11.1: - version "22.11.1" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.11.1.tgz#d0683d192294a8ebf3db413e995f9abdfba59e35" - integrity sha512-3U/ALRUA/neNxGIP/G06sqAiMmCjAgIrRN2wWdAop6s/WKpzYRh+8alFUCLyfSanmxXjnzfJt9dy4TL+HHh6Rw== +builder-util-runtime@8.7.7: + version "8.7.7" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz#6c83cc3abe7a7a5c8b4ec8878f68adc828c07f0d" + integrity sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@22.11.7: + version "22.11.7" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.11.7.tgz#ae9707afa6a31feafa13c274ac83b4fe28ef1467" + integrity sha512-ihqUe5ey82LM9qqQe0/oIcaSm9w+B9UjcsWJZxJliTBsbU+sErOpDFpHW+sim0veiTF/EIcGUh9HoduWw+l9FA== dependencies: "7zip-bin" "~5.1.1" "@types/debug" "^4.1.5" - "@types/fs-extra" "^9.0.7" + "@types/fs-extra" "^9.0.11" app-builder-bin "3.5.13" bluebird-lst "^1.0.9" - builder-util-runtime "8.7.4" - chalk "^4.1.0" + builder-util-runtime "8.7.7" + chalk "^4.1.1" debug "^4.3.2" - fs-extra "^9.1.0" + fs-extra "^10.0.0" is-ci "^3.0.0" - js-yaml "^4.0.0" + js-yaml "^4.1.0" source-map-support "^0.5.19" stat-mode "^1.0.0" - temp-file "^3.3.7" + temp-file "^3.4.0" builtin-status-codes@^3.0.0: version "3.0.0" @@ -2864,10 +2867,10 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.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== +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -3813,31 +3816,31 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@22.11.1: - version "22.11.1" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.11.1.tgz#87a8d7c4fd56166aab805425401b96481f656b83" - integrity sha512-FZIIYpEs/ZfKJbRKjTjpQAHJKjRBlgd6QDUEAuC6OuyHUwwrflQay1rNTwp7spqbu9HDHipiQevX/e8dFmkQmw== +dmg-builder@22.11.7: + version "22.11.7" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.11.7.tgz#5956008c18d40ee72c0ea01ffea9590dbf51df89" + integrity sha512-+I+XfP2DODHB6PwFANgpH/WMzzCA5r5XoMvbFCIYjQjJpXlO0XnqQaamzFl2vh/Wz/Qt0d0lJMgRy8gKR3MGdQ== dependencies: - app-builder-lib "22.11.1" - builder-util "22.11.1" - builder-util-runtime "8.7.4" - fs-extra "^9.1.0" + app-builder-lib "22.11.7" + builder-util "22.11.7" + builder-util-runtime "8.7.6" + fs-extra "^10.0.0" iconv-lite "^0.6.2" - js-yaml "^4.0.0" + js-yaml "^4.1.0" optionalDependencies: - dmg-license "^1.0.8" + dmg-license "^1.0.9" -dmg-license@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.8.tgz#d52e234815f1a07a59706e5f2a2fea71991cf784" - integrity sha512-47GOb6b4yVzpovXC34heXElpH++ICg9GuWBeOTaokUNLAoAdWpE4VehudYEEtu96j2jXsgQWYf78nW7r+0Y3eg== +dmg-license@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.9.tgz#a2fb8d692af0e30b0730b5afc91ed9edc2d9cb4f" + integrity sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q== dependencies: "@types/plist" "^3.0.1" "@types/verror" "^1.10.3" ajv "^6.10.0" cli-truncate "^1.1.0" crc "^3.8.0" - iconv-corefoundation "^1.1.5" + iconv-corefoundation "^1.1.6" plist "^3.0.1" smart-buffer "^4.0.2" verror "^1.10.0" @@ -3950,16 +3953,16 @@ dotenv-webpack@^7.0.3: dependencies: dotenv-defaults "^2.0.2" -dotenv@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - dotenv@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -3978,14 +3981,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -editions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/editions/-/editions-6.1.0.tgz#ba6c6cf9f4bb571d9e53ea34e771a602e5a66549" - integrity sha512-h6nWEyIocfgho9J3sTSuhU/WoFOu1hTX75rPBebNrbF38Y9QFDjCDizYXdikHTySW7Y3mSxli8bpDz9RAtc7rA== - dependencies: - errlop "^4.0.0" - version-range "^1.0.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3998,23 +3993,23 @@ ejs@^3.1.5, ejs@^3.1.6: dependencies: jake "^10.6.1" -electron-builder@^22.11.1: - version "22.11.1" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.11.1.tgz#8d443f6599e718ef96837573a6d07754dde64310" - integrity sha512-IbAhv31idKzTR8KNQ+AIRf9J5vfU+9PzpG2STKHjYYWwGhfhZ5H4YfR0xH8xiwI4gaL1uTrfiq7fnpQxafhF2A== - dependencies: - "@types/yargs" "^16.0.0" - app-builder-lib "22.11.1" - builder-util "22.11.1" - builder-util-runtime "8.7.4" - chalk "^4.1.0" - dmg-builder "22.11.1" - fs-extra "^9.1.0" +electron-builder@^22.11.7: + version "22.11.7" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.11.7.tgz#cd97a0d9f6e6d388112e66b4376de431cca4d596" + integrity sha512-yQExSLt7Hbz/P8lLkZDdE/OnJJ7NCX+uiQcV+XIH0TeEZcD87ZnSqBBzGUN5akySU4BXXlrVZKeUsXACWrm5Kw== + dependencies: + "@types/yargs" "^16.0.2" + app-builder-lib "22.11.7" + builder-util "22.11.7" + builder-util-runtime "8.7.7" + chalk "^4.1.1" + dmg-builder "22.11.7" + fs-extra "^10.0.0" is-ci "^3.0.0" - lazy-val "^1.0.4" - read-config-file "6.1.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" update-notifier "^5.1.0" - yargs "^16.2.0" + yargs "^17.0.1" electron-debug@^3.1.0: version "3.1.0" @@ -4066,18 +4061,18 @@ electron-notarize@^1.0.0: debug "^4.1.1" fs-extra "^9.0.1" -electron-publish@22.11.1: - version "22.11.1" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.11.1.tgz#23f3e96772b2de82c32b75e6070053ed246dfa6a" - integrity sha512-M8aXlIuP0QcGCdSzMvv67m8sZYdRpXFfiGpFbZOXJlO3Io/3jkNvbnUMVfhbamlmYrQKNSRJzB7te/pn+qYneA== +electron-publish@22.11.7: + version "22.11.7" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.11.7.tgz#4126cbb08ccf082a2aa7fef89ee629b3a4b8ae9a" + integrity sha512-A4EhRRNBVz4SPzUlBrPO6BmuyDeI0pyprggPAV9rQ+SDVSnSB/WKPot9JwWMyArkGj3AUUTMNVT6hwZhMvhfqw== dependencies: - "@types/fs-extra" "^9.0.7" - builder-util "22.11.1" - builder-util-runtime "8.7.4" - chalk "^4.1.0" - fs-extra "^9.1.0" - lazy-val "^1.0.4" - mime "^2.5.0" + "@types/fs-extra" "^9.0.11" + builder-util "22.11.7" + builder-util-runtime "8.7.7" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" electron-rebuild@^2.3.2: version "2.3.2" @@ -4218,11 +4213,6 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== -errlop@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-4.1.0.tgz#8e7b8f4f1bf0a6feafce4d14f0c0cf4bf5ef036b" - integrity sha512-vul6gGBuVt0M2TPi1/WrcL86+Hb3Q2Tpu3TME3sbVhZrYf7J1ZMHCodI25RQKCVurh56qTfvgM0p3w5cT4reSQ== - errno@^0.1.1, errno@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -5002,6 +4992,15 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -5011,7 +5010,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5454,7 +5453,7 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -hosted-git-info@^4.0.0: +hosted-git-info@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== @@ -5608,10 +5607,10 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-corefoundation@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.5.tgz#90596d444a579aeb109f5ca113f6bb665a41be2b" - integrity sha512-hI4m7udfV04OcjleOmDaR4gwXnH4xumxN+ZmywHDiKf2CmAzsT9SVYe7Y4pdnQbyZfXwAQyrElykbE5PrPRfmQ== +iconv-corefoundation@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz#27c135470237f6f8d13462fa1f5eaf250523c29a" + integrity sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw== dependencies: cli-truncate "^1.1.0" node-addon-api "^1.6.3" @@ -6124,6 +6123,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6146,15 +6150,6 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istextorbinary@^5.12.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-5.12.0.tgz#2f84777838668fdf524c305a2363d6057aaeec84" - integrity sha512-wLDRWD7qpNTYubk04+q3en1+XZGS4vYWK0+SxNSXJLaITMMEK+J3o/TlOMyULeH1qozVZ9uUkKcyMA8odyxz8w== - dependencies: - binaryextensions "^4.15.0" - editions "^6.1.0" - textextensions "^5.11.0" - jake@^10.6.1: version "10.8.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" @@ -6192,7 +6187,7 @@ js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -6536,10 +6531,10 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" -lazy-val@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" - integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== less-loader@8.0.0: version "8.0.0" @@ -6966,7 +6961,7 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4, mime@^2.5.0: +mime@^2.4.4, mime@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== @@ -8823,14 +8818,14 @@ react@^17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" -read-config-file@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.1.0.tgz#204256f18eedf4dc82dd5f7886dfd7b931d03b08" - integrity sha512-Z3ua8JTbQgrDNDWD0zMtwE2Np+RGeL+Jew5T7bSRfJGcq+t883wExEXNWLQqMaStfRp9Xz6RPsx01/jruhn+tg== +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== dependencies: - dotenv "^8.2.0" + dotenv "^9.0.2" dotenv-expand "^5.1.0" - js-yaml "^4.0.0" + js-yaml "^4.1.0" json5 "^2.2.0" lazy-val "^1.0.4" @@ -9385,7 +9380,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -10121,13 +10116,13 @@ tar@^6.0.2, tar@^6.0.5: mkdirp "^1.0.3" yallist "^4.0.0" -temp-file@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" - integrity sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== dependencies: async-exit-hook "^2.0.1" - fs-extra "^8.1.0" + fs-extra "^10.0.0" terser-webpack-plugin@^5.0.3: version "5.0.3" @@ -10155,11 +10150,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -textextensions@^5.11.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-5.12.0.tgz#b908120b5c1bd4bb9eba41423d75b176011ab68a" - integrity sha512-IYogUDaP65IXboCiPPC0jTLLBzYlhhw2Y4b0a2trPgbHNGGGEfuHE6tds+yDcCf4mpNDaGISFzwSSezcXt+d6w== - theming@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/theming/-/theming-3.3.0.tgz#dacabf04aa689edde35f1e1c117ec6de73fbf870" @@ -10642,18 +10632,6 @@ verror@1.10.0, verror@^1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -version-compare@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/version-compare/-/version-compare-1.1.0.tgz#7b3e67e7e6cec5c72d9c9e586f8854e419ade17c" - integrity sha512-zVKtPOJTC9x23lzS4+4D7J+drq80BXVYAmObnr5zqxxFVH7OffJ1lJlAS7LYsQNV56jx/wtbw0UV7XHLrvd6kQ== - -version-range@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/version-range/-/version-range-1.1.0.tgz#1c233064202ee742afc9d56e21da3b2e15260acf" - integrity sha512-R1Ggfg2EXamrnrV3TkZ6yBNgITDbclB3viwSjbZ3+eK0VVNK4ajkYJTnDz5N0bIMYDtK9MUBvXJUnKO5RWWJ6w== - dependencies: - version-compare "^1.0.0" - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -11059,7 +11037,7 @@ yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^16.0.0, yargs@^16.2.0: +yargs@^16.0.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -11072,6 +11050,19 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.1: + version "17.2.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" + integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yarn-deduplicate@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-3.1.0.tgz#3018d93e95f855f236a215b591fe8bc4bcabba3e" From 0d65ab7ae19d21c8d38422c6f44cd4303fac11a0 Mon Sep 17 00:00:00 2001 From: yadro Date: Wed, 29 Sep 2021 19:36:17 +0300 Subject: [PATCH 12/84] [Mac] Enable copy/past shortcut v1.0.6 --- src/menu.ts | 14 +++++++------- src/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/menu.ts b/src/menu.ts index 8dd0c97..66f3381 100644 --- a/src/menu.ts +++ b/src/menu.ts @@ -26,13 +26,13 @@ export default class MenuBuilder { this.setupDevelopmentEnvironment(); } - // const template = - // process.platform === 'darwin' - // ? this.buildDarwinTemplate() - // : this.buildDefaultTemplate(); - // - // const menu = Menu.buildFromTemplate(template); - const menu = Menu.buildFromTemplate([]); + const template = + process.platform === 'darwin' + ? this.buildDarwinTemplate() + : []; + // : this.buildDefaultTemplate(); // Disable menu for Win and Linux + + const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); return menu; diff --git a/src/package.json b/src/package.json index 6c280b8..ca3f132 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "time-tracker", "productName": "TimeTracker", - "version": "1.0.5", + "version": "1.0.6", "description": "Start and stop time, jump between tasks, and add details on how time was spent.", "main": "./main.prod.js", "author": { From d2b6ae786ff9636b71352348e52ff1b9ed4379b4 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Thu, 22 Jul 2021 18:39:53 +0300 Subject: [PATCH 13/84] MyDay project --- src/modules/projects/ProjectFactory.ts | 23 ++++++++++++- src/modules/projects/ProjectRepository.ts | 5 ++- src/modules/projects/ProjectService.ts | 3 +- src/modules/projects/models/ProjectModel.ts | 36 +++++++++++++++++---- 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/modules/projects/ProjectFactory.ts b/src/modules/projects/ProjectFactory.ts index 8322b75..c2a3c33 100644 --- a/src/modules/projects/ProjectFactory.ts +++ b/src/modules/projects/ProjectFactory.ts @@ -1,3 +1,24 @@ import AbstractFactory from '../../base/AbstractFactory'; +import ProjectModel, { + DEFAULT_PROJECT_ID, + DEFAULT_PROJECTS, + IJsonProjectItem, +} from './models/ProjectModel'; -export default class ProjectFactory extends AbstractFactory {} +export default class ProjectFactory extends AbstractFactory { + createProjects(projectItems: IJsonProjectItem[]): ProjectModel[] { + const hasMyDay = projectItems.find( + (p) => p.key === DEFAULT_PROJECT_ID.MyDay + ); + if (!hasMyDay) { + const myDayProj = DEFAULT_PROJECTS.find( + (p) => p.key === DEFAULT_PROJECT_ID.MyDay + ); + if (myDayProj) { + projectItems.unshift(myDayProj); + } + } + + return this.createList(ProjectModel, projectItems); + } +} diff --git a/src/modules/projects/ProjectRepository.ts b/src/modules/projects/ProjectRepository.ts index 9ced8ec..9642637 100644 --- a/src/modules/projects/ProjectRepository.ts +++ b/src/modules/projects/ProjectRepository.ts @@ -1,5 +1,8 @@ import AbstractFileRepository from '../../base/repositories/AbstractFileRepository'; +import { IJsonProjectItem } from './models/ProjectModel'; -export default class ProjectRepository extends AbstractFileRepository { +export default class ProjectRepository extends AbstractFileRepository< + IJsonProjectItem[] +> { fileName = 'projects.json'; } diff --git a/src/modules/projects/ProjectService.ts b/src/modules/projects/ProjectService.ts index 0a980c3..328722d 100644 --- a/src/modules/projects/ProjectService.ts +++ b/src/modules/projects/ProjectService.ts @@ -11,7 +11,8 @@ export default class ProjectService extends AbstractServiceWithProfile< getAll(): ProjectModel[] { const data = this.repository.restore(DEFAULT_PROJECTS); - return this.factory.createList(ProjectModel, data); + + return this.factory.createProjects(data); } save(data: ProjectModel[]): void { diff --git a/src/modules/projects/models/ProjectModel.ts b/src/modules/projects/models/ProjectModel.ts index fd47c7d..fa1f235 100644 --- a/src/modules/projects/models/ProjectModel.ts +++ b/src/modules/projects/models/ProjectModel.ts @@ -3,20 +3,38 @@ import * as colors from '@ant-design/colors'; import AbstractModel from '../../../base/AbstractModel'; import { ITreeItem } from '../../../types/ITreeItem'; -export const DEFAULT_PROJECTS: any[] = [ +export enum DEFAULT_PROJECT_ID { + MyDay = '0', + Inbox = '1', +} + +export const DEFAULT_PROJECTS: IJsonProjectItem[] = [ + { + key: DEFAULT_PROJECT_ID.MyDay, + title: 'My Day', + color: colors.yellow.primary || '', + deletable: false, + expanded: false, + }, { - key: '1', + key: DEFAULT_PROJECT_ID.Inbox, title: 'Inbox', - color: colors.blue, + color: colors.blue.primary || '', + deletable: false, + expanded: false, }, ]; -interface IJsonProjectItem extends ITreeItem { +export interface IJsonProjectItem extends ITreeItem { color: string; + expanded: boolean; + deletable: boolean; } interface IProjectModel extends ITreeItem { color: string; + expanded: boolean; + deletable: boolean; } export default class ProjectModel extends AbstractModel @@ -25,11 +43,17 @@ export default class ProjectModel extends AbstractModel title: string = ''; color: string = ''; expanded: boolean = false; + deletable: boolean = true; children?: ProjectModel[] = []; constructor(props: IJsonProjectItem) { super(); - this.load(props); // TODO вынести итератор - this.children = props.children?.map((json) => new ProjectModel(json)) || []; + + const newProps = { + ...props, + children: props.children?.map((json) => new ProjectModel(json)) + }; + + this.load(newProps); } } From 460f8f1c2f88e9ff926e16fc0f750249df741f19 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Fri, 23 Jul 2021 20:12:14 +0300 Subject: [PATCH 14/84] Added parent, refactoring --- src/base/TreeModelHelper.ts | 13 +++++ src/modules/tasks/TaskService.ts | 29 +++++++++++- src/modules/tasks/models/TaskModel.ts | 68 +++++++++++++++------------ 3 files changed, 79 insertions(+), 31 deletions(-) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 46994e7..58a1685 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -1,6 +1,19 @@ import { ITreeItem } from '../types/ITreeItem'; const TreeModelHelper = { + walkRecursive>( + fn: (t: T, p?: T) => void, + treeItems: T[], + parent?: T + ) { + treeItems.forEach((item) => { + fn(item, parent); + if (item.children?.length) { + TreeModelHelper.walkRecursive(fn, item.children, item); + } + }); + }, + modifyItemsWithIdsRecursive>( treeItems: T[], ids: string[], diff --git a/src/modules/tasks/TaskService.ts b/src/modules/tasks/TaskService.ts index 70dd95c..8ca36a5 100644 --- a/src/modules/tasks/TaskService.ts +++ b/src/modules/tasks/TaskService.ts @@ -1,7 +1,19 @@ +import { toJS } from 'mobx'; + import TaskRepository from './TaskRepository'; import TaskFactory from './TaskFactory'; import TasksByProject from './models/TasksByProject'; import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; +import TreeModelHelper from '../../base/TreeModelHelper'; +import TaskModel from './models/TaskModel'; + +const setParent = (item: TaskModel, parent?: TaskModel) => { + item.parent = parent || null; +}; + +const clearParent = (item: TaskModel) => { + item.parent = null; +}; export default class TaskService extends AbstractServiceWithProfile< TasksByProject @@ -11,10 +23,25 @@ export default class TaskService extends AbstractServiceWithProfile< getAll(): TasksByProject { const data: TasksByProject = this.repository.restore({}); + TaskService.fillParent(data); return this.factory.createTasks(data); } save(data: TasksByProject) { - this.repository.save(data); + const copyData = toJS(data); + TaskService.clearParent(copyData); + this.repository.save(copyData); + } + + private static fillParent(data: TasksByProject) { + Object.values(data).forEach((projectTasks) => { + TreeModelHelper.walkRecursive(setParent, projectTasks); + }); + } + + private static clearParent(data: TasksByProject) { + Object.values(data).forEach((projectTasks) => { + TreeModelHelper.walkRecursive(clearParent, projectTasks); + }); } } diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index 4334e66..d3f7ce0 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -1,9 +1,8 @@ import { action, computed, makeObservable, observable } from 'mobx'; -import isSameDay from 'date-fns/isSameDay'; +import { isSameDay, startOfDay } from 'date-fns'; import AbstractModel from '../../../base/AbstractModel'; import { ITreeItem } from '../../../types/ITreeItem'; -import { startOfDay } from 'date-fns'; export interface IJsonTimeRangeModel { start: string; @@ -24,47 +23,55 @@ interface IJsonTaskModel extends ITreeItem { expanded: boolean; time: string[][] | IJsonTimeRangeModel[]; datesInProgress: string[]; - children: IJsonTaskModel[]; details: string[]; } +const parseTimeRageItems = ( + timeItems: (string[] | IJsonTimeRangeModel | ITimeRangeModel)[] +) => { + return timeItems.map( + (range: string[] | IJsonTimeRangeModel | ITimeRangeModel) => { + if (Array.isArray(range)) { + return { + start: new Date(range[0]), + end: range[1] ? new Date(range[1]) : undefined, + description: undefined, + }; + } else { + return { + start: new Date(range.start), + end: range.end ? new Date(range.end) : undefined, + description: range.description, + }; + } + } + ); +}; + export default class TaskModel extends AbstractModel { key: string = ''; title: string = ''; children: TaskModel[] = []; + parent: TaskModel | null = null; projectId: string = ''; checked: boolean = false; - expanded: boolean = true; active: boolean = false; + expanded: boolean = true; time: ITimeRangeModel[] = []; datesInProgress: Date[] = []; details: string = ''; - constructor(props: IJsonTaskModel) { + constructor(props: IJsonTaskModel | TaskModel) { super(); - this.load(props); - this.children = props.children?.map((json) => new TaskModel(json)) || []; - this.time = - // @ts-ignore - props.time?.map( - (range: string[] | IJsonTimeRangeModel) => { - if (Array.isArray(range)) { - return { - start: new Date(range[0]), - end: range[1] ? new Date(range[1]) : undefined, - description: undefined, - }; - } else { - return { - start: new Date(range.start), - end: range.end ? new Date(range.end) : undefined, - description: range.description, - }; - } - } - ) || []; - this.datesInProgress = - props.datesInProgress?.map((date) => new Date(date)) || []; + const newProps = { + ...props, + children: props.children?.map((json) => new TaskModel(json)) || [], + time: props.time ? parseTimeRageItems(props.time) : [], + datesInProgress: + props.datesInProgress?.map((date) => new Date(date)) || [], + }; + + this.load(newProps); makeObservable(this, { key: observable, @@ -117,9 +124,10 @@ export default class TaskModel extends AbstractModel { start() { this.active = true; - this.addDateWhenWasInProgress(new Date()); + const dateNow = new Date(); + this.addDateWhenWasInProgress(dateNow); this.time.push({ - start: new Date(), + start: dateNow, end: undefined, description: undefined, }); From 9f3a529ebd124b76092b6d99ac06930d288ff637 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Fri, 23 Jul 2021 20:12:22 +0300 Subject: [PATCH 15/84] Update typescript --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e8e118..e90e781 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "sass-loader": "^10.1.0", "style-loader": "^2.0.0", "terser-webpack-plugin": "^5.0.3", - "typescript": "^4.0.5", + "typescript": "^4.3.5", "url-loader": "^4.1.0", "webpack": "^5.5.1", "webpack-bundle-analyzer": "^4.1.0", From 376f1fd64ac094097d63f048cf04bb451a78ad74 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Fri, 23 Jul 2021 20:12:35 +0300 Subject: [PATCH 16/84] TaskModelProxy --- src/modules/tasks/TaskFactory.ts | 7 ++++++ src/modules/tasks/models/TaskModelProxy.ts | 26 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/modules/tasks/models/TaskModelProxy.ts diff --git a/src/modules/tasks/TaskFactory.ts b/src/modules/tasks/TaskFactory.ts index 7c1402c..cb3ee09 100644 --- a/src/modules/tasks/TaskFactory.ts +++ b/src/modules/tasks/TaskFactory.ts @@ -1,6 +1,7 @@ import AbstractFactory from '../../base/AbstractFactory'; import TasksByProject from './models/TasksByProject'; import TaskModel from './models/TaskModel'; +import { TaskModelProxy, taskModelProxyHandler } from './models/TaskModelProxy'; export default class TaskFactory extends AbstractFactory { createTasks(data: TasksByProject): TasksByProject { @@ -10,4 +11,10 @@ export default class TaskFactory extends AbstractFactory { }); return newData; } + + createTaskProxy(taskModel: TaskModel): TaskModelProxy { + const target = new TaskModelProxy(taskModel); + + return new Proxy(target, taskModelProxyHandler); + } } diff --git a/src/modules/tasks/models/TaskModelProxy.ts b/src/modules/tasks/models/TaskModelProxy.ts new file mode 100644 index 0000000..0cffa50 --- /dev/null +++ b/src/modules/tasks/models/TaskModelProxy.ts @@ -0,0 +1,26 @@ +import TaskModel from './TaskModel'; + +export class TaskModelProxy extends TaskModel { + origin: TaskModel | null = null; +} + +export const taskModelProxyHandler: ProxyHandler = { + get(target: TaskModelProxy, prop: string | symbol): any { + return target?.origin?.[prop as keyof TaskModel]; + }, + set(target: TaskModelProxy, prop: string | symbol, value: any): boolean { + if (prop === 'duration') { + console.error( + `TaskModel: Can't set prop '${prop.toString()}' in`, + target + ); + return false; + } + // @ts-ignore + target[prop] = value; + // @ts-ignore + target.origin[prop] = value; + + return true; + }, +}; From c75c949cba71e27af7b87896672637e9c767976b Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Fri, 23 Jul 2021 20:16:11 +0300 Subject: [PATCH 17/84] Filled props --- src/screens/projects/components/ProjectModals/ProjectModal.tsx | 3 +++ src/screens/projects/components/TaskInput.tsx | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/screens/projects/components/ProjectModals/ProjectModal.tsx b/src/screens/projects/components/ProjectModals/ProjectModal.tsx index b5c08ce..d6bb635 100644 --- a/src/screens/projects/components/ProjectModals/ProjectModal.tsx +++ b/src/screens/projects/components/ProjectModals/ProjectModal.tsx @@ -30,6 +30,9 @@ export default observer(function ProjectModal({ key: String(Date.now()), title: projectName, color: color || '', + children: [], + expanded: true, + deletable: true, }) ); onClose(); diff --git a/src/screens/projects/components/TaskInput.tsx b/src/screens/projects/components/TaskInput.tsx index f1f6405..4bf65b1 100644 --- a/src/screens/projects/components/TaskInput.tsx +++ b/src/screens/projects/components/TaskInput.tsx @@ -23,6 +23,8 @@ export default observer(function TaskInput() { children: [], datesInProgress: [], details: [], + parent: null, // Add into root + expanded: true, }) ); setText(''); From 7bd94802df79a62633baf96122e47b9290dd2cb9 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sat, 24 Jul 2021 10:54:40 +0300 Subject: [PATCH 18/84] draggable prop --- src/screens/projects/ProjectsScreen.tsx | 8 +++++++- src/screens/projects/components/TreeList.tsx | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/screens/projects/ProjectsScreen.tsx b/src/screens/projects/ProjectsScreen.tsx index d7a1fd1..58f8e8b 100644 --- a/src/screens/projects/ProjectsScreen.tsx +++ b/src/screens/projects/ProjectsScreen.tsx @@ -9,7 +9,9 @@ import TaskInput from './components/TaskInput'; import rootStore from '../../modules/RootStore'; import TreeList from './components/TreeList'; import TaskModel from '../../modules/tasks/models/TaskModel'; -import ProjectModel from '../../modules/projects/models/ProjectModel'; +import ProjectModel, { + DEFAULT_PROJECT_ID, +} from '../../modules/projects/models/ProjectModel'; import ProjectModal from './components/ProjectModals/ProjectModal'; import TaskNode from './components/TaskNode/TaskNode'; import DrawerTask from './components/DrawerTask/DrawerTask'; @@ -27,6 +29,9 @@ const TaskList = TreeList( }, { checkable: true, + get draggable() { + return projectStore.activeProject !== DEFAULT_PROJECT_ID.MyDay; + }, onExpand(keys: Key[]) { tasksStore.markExpanded(projectStore.activeProject, keys as string[]); }, @@ -52,6 +57,7 @@ const ProjectList = TreeList( }, { selectable: false, + draggable: true, titleRender(project: ProjectModel) { return ( >( defaultExpandParent={false} checkedKeys={getCheckedKeys?.()} expandedKeys={getExpandedKeys?.()} - draggable blockNode treeData={data} // @ts-ignore From e4daefa7844a8ee8ff8b74daf668b6e2b84b7db8 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sat, 24 Jul 2021 10:55:15 +0300 Subject: [PATCH 19/84] InMyDay prop, TaskModelProxy --- src/modules/tasks/models/TaskModel.ts | 3 +++ src/modules/tasks/models/TasksByProject.ts | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index d3f7ce0..0093d4e 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -21,6 +21,7 @@ interface IJsonTaskModel extends ITreeItem { checked: boolean; active: boolean; expanded: boolean; + inMyDay: string; time: string[][] | IJsonTimeRangeModel[]; datesInProgress: string[]; details: string[]; @@ -57,6 +58,7 @@ export default class TaskModel extends AbstractModel { checked: boolean = false; active: boolean = false; expanded: boolean = true; + inMyDay: Date | null = null; time: ITimeRangeModel[] = []; datesInProgress: Date[] = []; details: string = ''; @@ -69,6 +71,7 @@ export default class TaskModel extends AbstractModel { time: props.time ? parseTimeRageItems(props.time) : [], datesInProgress: props.datesInProgress?.map((date) => new Date(date)) || [], + inMyDay: props?.inMyDay ? new Date(props?.inMyDay) : null, }; this.load(newProps); diff --git a/src/modules/tasks/models/TasksByProject.ts b/src/modules/tasks/models/TasksByProject.ts index f7cae9d..ae5d7a6 100644 --- a/src/modules/tasks/models/TasksByProject.ts +++ b/src/modules/tasks/models/TasksByProject.ts @@ -1,5 +1,7 @@ import TaskModel from './TaskModel'; +import { TaskModelProxy } from './TaskModelProxy'; -type TasksByProject = Record; +type Task = TaskModel | TaskModelProxy; +type TasksByProject = Record; export default TasksByProject; From 1d2341d758e789e2aefd449187351d4c9d0dbb82 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sat, 24 Jul 2021 12:43:17 +0300 Subject: [PATCH 20/84] WIP Add to MyDay --- src/base/TreeModelHelper.ts | 104 +++++++++++++++++- src/modules/tasks/TaskFactory.ts | 4 + src/modules/tasks/TaskStore.ts | 14 +++ src/modules/tasks/models/TaskModel.ts | 16 +-- src/modules/tasks/models/TaskModelProxy.ts | 1 + src/screens/projects/ProjectsScreen.tsx | 2 +- .../projects/components/TaskNode/TaskNode.tsx | 10 +- src/screens/projects/components/TreeList.tsx | 6 +- src/types/ITreeItem.ts | 4 + yarn.lock | 8 +- 10 files changed, 151 insertions(+), 18 deletions(-) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 58a1685..601deb8 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -1,6 +1,108 @@ -import { ITreeItem } from '../types/ITreeItem'; +import { ITreeItem, ITreeItemWithParent } from '../types/ITreeItem'; +import { TaskModelProxy } from '../modules/tasks/models/TaskModelProxy'; +import TaskModel from '../modules/tasks/models/TaskModel'; const TreeModelHelper = { + getPathToNode(node: T) { + const result: string[] = []; + + let ptrNode = node; + while (ptrNode) { + result.unshift(ptrNode.key); + // @ts-ignore + ptrNode = ptrNode.parent; + } + + return result; + }, + copyItemsToTree( + sourceTree: TaskModel[], + destTree: TaskModelProxy[], + keysToTask: string[] + ) { + let keyIdx = 0; + let sourceChild = sourceTree; + let destChild = destTree; + + if (keysToTask.length === 1) { + const source = sourceChild.find((node) => node.key === keysToTask[0]); + destChild.push( + // @ts-ignore + new TaskModelProxy({ + ...source, + children: [], + }) + ); + return true; + } + + do { + const nextSourceNode = sourceChild.find( + (task) => task.key === keysToTask[keyIdx] + ); + if (!nextSourceNode) { + return false; + } + + const nextDestNode = destChild.find( + (task) => task.key === keysToTask[keyIdx] + ); + + if (nextDestNode) { + keyIdx++; + destChild = nextDestNode.children; + } else { + const restKeysToTask = keysToTask.slice(keyIdx); + return TreeModelHelper.copySubItemsToTree( + sourceChild, + destChild, + restKeysToTask + ); + } + } while (keyIdx >= keysToTask.length); + + return true; + }, + + copySubItemsToTree( + sourceTree: TaskModel[], + destTree: TaskModelProxy[], + keysToTask: string[] + ) { + if (!sourceTree) { + return false; + } + + let keyIdx = 0; + let dest = destTree; + let source = sourceTree.find((node) => node.key === keysToTask[keyIdx]); + + if (!source) { + return false; + } + + while (true) { + // @ts-ignore + let copy = new TaskModelProxy({ + ...source, + children: [], + }); + + dest.push(copy); + + keyIdx++; + if (keyIdx === keysToTask.length) { + return true; + } + + dest = copy.children; + source = source.children.find((node) => node.key === keysToTask[keyIdx]); + if (!source) { + return false; + } + } + }, + walkRecursive>( fn: (t: T, p?: T) => void, treeItems: T[], diff --git a/src/modules/tasks/TaskFactory.ts b/src/modules/tasks/TaskFactory.ts index cb3ee09..c7f39f4 100644 --- a/src/modules/tasks/TaskFactory.ts +++ b/src/modules/tasks/TaskFactory.ts @@ -2,6 +2,7 @@ import AbstractFactory from '../../base/AbstractFactory'; import TasksByProject from './models/TasksByProject'; import TaskModel from './models/TaskModel'; import { TaskModelProxy, taskModelProxyHandler } from './models/TaskModelProxy'; +import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; export default class TaskFactory extends AbstractFactory { createTasks(data: TasksByProject): TasksByProject { @@ -9,6 +10,9 @@ export default class TaskFactory extends AbstractFactory { Object.keys(data).forEach((projectId) => { newData[projectId] = this.createList(TaskModel, data[projectId]); }); + + newData[DEFAULT_PROJECT_ID.MyDay] = []; + return newData; } diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 73ce01e..f486ae4 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -12,6 +12,7 @@ import { ETasksEvents, ETimeRangeEvents, } from '../../services/gaService/EEvents'; +import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; export default class TaskStore { tasks: TasksByProject = {}; @@ -92,6 +93,19 @@ export default class TaskStore { GaService.event(EEventCategory.Tasks, ETasksEvents.Create); } + addToMyDay(task: TaskModel) { + task.inMyDay = new Date(); + // @ts-ignore + const pathToNode = TreeModelHelper.getPathToNode(task); + + TreeModelHelper.copyItemsToTree( + this.tasks[task.projectId], + // @ts-ignore + this.tasks[DEFAULT_PROJECT_ID.MyDay], + pathToNode + ); + } + delete(task: TaskModel) { function condition(_task: TaskModel) { return _task.key === task.key; diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index 0093d4e..f4af33b 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -17,14 +17,14 @@ export interface ITimeRangeModel { } interface IJsonTaskModel extends ITreeItem { - projectId: string; - checked: boolean; - active: boolean; - expanded: boolean; - inMyDay: string; - time: string[][] | IJsonTimeRangeModel[]; - datesInProgress: string[]; - details: string[]; + projectId?: string; + checked?: boolean; + active?: boolean; + expanded?: boolean; + inMyDay?: string; + time?: string[][] | IJsonTimeRangeModel[]; + datesInProgress?: string[]; + details?: string[]; } const parseTimeRageItems = ( diff --git a/src/modules/tasks/models/TaskModelProxy.ts b/src/modules/tasks/models/TaskModelProxy.ts index 0cffa50..4ae540d 100644 --- a/src/modules/tasks/models/TaskModelProxy.ts +++ b/src/modules/tasks/models/TaskModelProxy.ts @@ -2,6 +2,7 @@ import TaskModel from './TaskModel'; export class TaskModelProxy extends TaskModel { origin: TaskModel | null = null; + children: TaskModelProxy[] = []; } export const taskModelProxyHandler: ProxyHandler = { diff --git a/src/screens/projects/ProjectsScreen.tsx b/src/screens/projects/ProjectsScreen.tsx index 58f8e8b..1241da8 100644 --- a/src/screens/projects/ProjectsScreen.tsx +++ b/src/screens/projects/ProjectsScreen.tsx @@ -29,7 +29,7 @@ const TaskList = TreeList( }, { checkable: true, - get draggable() { + isDraggable() { return projectStore.activeProject !== DEFAULT_PROJECT_ID.MyDay; }, onExpand(keys: Key[]) { diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index c471e69..0a99f6f 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -1,7 +1,8 @@ -import React, { SyntheticEvent } from 'react'; +import React, { SyntheticEvent, useCallback } from 'react'; import { CaretRightFilled, DeleteOutlined, + EnterOutlined, PauseOutlined, } from '@ant-design/icons'; import { observer } from 'mobx-react'; @@ -22,18 +23,21 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { const duration = TaskHooks.useTaskDuration(task); - function preventDefault(fn: () => void) { + const preventDefault = useCallback((fn: () => void) => { return (e: SyntheticEvent) => { e.stopPropagation(); fn(); }; - } + }, []); return (
{task.title} {duration} + tasksStore.addToMyDay(task))} + /> {!task.active ? ( tasksStore.startTimer(task))} diff --git a/src/screens/projects/components/TreeList.tsx b/src/screens/projects/components/TreeList.tsx index d160f44..5cde8b4 100644 --- a/src/screens/projects/components/TreeList.tsx +++ b/src/screens/projects/components/TreeList.tsx @@ -16,6 +16,7 @@ interface TreePropsExtended getCheckedKeys?: () => Key[]; getExpandedKeys?: () => Key[]; titleRender?: (item: T) => React.ReactNode; + isDraggable?: () => boolean; } export default function TreeList>( @@ -23,7 +24,7 @@ export default function TreeList>( updateData: (items: T[]) => void, options: TreePropsExtended ) { - const { getCheckedKeys, getExpandedKeys, ...rest } = options; + const { getCheckedKeys, getExpandedKeys, isDraggable, ...rest } = options; return observer(({ onSelect }: TreeListProps) => { const data = getData(); @@ -112,12 +113,15 @@ export default function TreeList>( ); } + const draggable = isDraggable ? isDraggable() : rest.draggable; + return ( = ITreeItem> { key: string; children?: T[]; } + +export interface ITreeItemWithParent extends ITreeItem { + parent: ITreeItemWithParent | undefined; +} diff --git a/yarn.lock b/yarn.lock index 3a051f9..26b2a34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10391,10 +10391,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" - integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== typical@^5.0.0, typical@^5.2.0: version "5.2.0" From b9b3e1833c90a26fd7b355bae6bd556a5e34e0cb Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 14:59:42 +0300 Subject: [PATCH 21/84] Fix copyItemsToTree --- src/base/TreeModelHelper.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 601deb8..7ddc880 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -21,12 +21,12 @@ const TreeModelHelper = { keysToTask: string[] ) { let keyIdx = 0; - let sourceChild = sourceTree; - let destChild = destTree; + let sourceChildren = sourceTree; + let destChildren = destTree; if (keysToTask.length === 1) { - const source = sourceChild.find((node) => node.key === keysToTask[0]); - destChild.push( + const source = sourceChildren.find((node) => node.key === keysToTask[0]); + destChildren.push( // @ts-ignore new TaskModelProxy({ ...source, @@ -37,29 +37,30 @@ const TreeModelHelper = { } do { - const nextSourceNode = sourceChild.find( + const nextSourceNode = sourceChildren.find( (task) => task.key === keysToTask[keyIdx] ); if (!nextSourceNode) { return false; } - const nextDestNode = destChild.find( + const nextDestNode = destChildren.find( (task) => task.key === keysToTask[keyIdx] ); if (nextDestNode) { keyIdx++; - destChild = nextDestNode.children; + sourceChildren = nextSourceNode.children; + destChildren = nextDestNode.children; } else { const restKeysToTask = keysToTask.slice(keyIdx); return TreeModelHelper.copySubItemsToTree( - sourceChild, - destChild, + sourceChildren, + destChildren, restKeysToTask ); } - } while (keyIdx >= keysToTask.length); + } while (keyIdx < keysToTask.length); return true; }, From f1779599a8d6f2ea1479c5d4ba35d9581faabb95 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 15:22:27 +0300 Subject: [PATCH 22/84] Using factory, fix filling props --- src/base/TreeModelHelper.ts | 24 ++++++++-------------- src/modules/tasks/TaskFactory.ts | 4 ++-- src/modules/tasks/models/TaskModelProxy.ts | 13 ++++++++++-- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 7ddc880..7e36a66 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -1,12 +1,13 @@ import { ITreeItem, ITreeItemWithParent } from '../types/ITreeItem'; import { TaskModelProxy } from '../modules/tasks/models/TaskModelProxy'; import TaskModel from '../modules/tasks/models/TaskModel'; +import TaskFactory from '../modules/tasks/TaskFactory'; const TreeModelHelper = { - getPathToNode(node: T) { + getPathToNode(node: T) { const result: string[] = []; - let ptrNode = node; + let ptrNode: T | undefined = node; while (ptrNode) { result.unshift(ptrNode.key); // @ts-ignore @@ -26,14 +27,10 @@ const TreeModelHelper = { if (keysToTask.length === 1) { const source = sourceChildren.find((node) => node.key === keysToTask[0]); - destChildren.push( - // @ts-ignore - new TaskModelProxy({ - ...source, - children: [], - }) - ); - return true; + if (source) { + destChildren.push(TaskFactory.createTaskModelProxy(source)); + } + return !!source; } do { @@ -83,12 +80,7 @@ const TreeModelHelper = { } while (true) { - // @ts-ignore - let copy = new TaskModelProxy({ - ...source, - children: [], - }); - + const copy = TaskFactory.createTaskModelProxy(source); dest.push(copy); keyIdx++; diff --git a/src/modules/tasks/TaskFactory.ts b/src/modules/tasks/TaskFactory.ts index c7f39f4..365e7b4 100644 --- a/src/modules/tasks/TaskFactory.ts +++ b/src/modules/tasks/TaskFactory.ts @@ -16,8 +16,8 @@ export default class TaskFactory extends AbstractFactory { return newData; } - createTaskProxy(taskModel: TaskModel): TaskModelProxy { - const target = new TaskModelProxy(taskModel); + static createTaskModelProxy(taskModel: TaskModel): TaskModelProxy { + const target = new TaskModelProxy(taskModel, []); return new Proxy(target, taskModelProxyHandler); } diff --git a/src/modules/tasks/models/TaskModelProxy.ts b/src/modules/tasks/models/TaskModelProxy.ts index 4ae540d..9bfc812 100644 --- a/src/modules/tasks/models/TaskModelProxy.ts +++ b/src/modules/tasks/models/TaskModelProxy.ts @@ -3,6 +3,12 @@ import TaskModel from './TaskModel'; export class TaskModelProxy extends TaskModel { origin: TaskModel | null = null; children: TaskModelProxy[] = []; + + constructor(originTaskModel: TaskModel, children: TaskModelProxy[]) { + super(originTaskModel); + this.origin = originTaskModel; + this.children = children; + } } export const taskModelProxyHandler: ProxyHandler = { @@ -19,8 +25,11 @@ export const taskModelProxyHandler: ProxyHandler = { } // @ts-ignore target[prop] = value; - // @ts-ignore - target.origin[prop] = value; + + if (prop !== 'expanded') { + // @ts-ignore + target.origin[prop] = value; + } return true; }, From 6c8605d820eff7aae840230e662024ff00891fd6 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 15:59:36 +0300 Subject: [PATCH 23/84] Fix getter, rename --- src/base/TreeModelHelper.ts | 18 ++++++++++-------- src/modules/tasks/models/TaskModelProxy.ts | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 7e36a66..664c645 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -72,25 +72,27 @@ const TreeModelHelper = { } let keyIdx = 0; - let dest = destTree; - let source = sourceTree.find((node) => node.key === keysToTask[keyIdx]); + let destChildren = destTree; + let sourceNode = sourceTree.find((node) => node.key === keysToTask[keyIdx]); - if (!source) { + if (!sourceNode) { return false; } while (true) { - const copy = TaskFactory.createTaskModelProxy(source); - dest.push(copy); + const copy = TaskFactory.createTaskModelProxy(sourceNode); + destChildren.push(copy); keyIdx++; if (keyIdx === keysToTask.length) { return true; } - dest = copy.children; - source = source.children.find((node) => node.key === keysToTask[keyIdx]); - if (!source) { + destChildren = copy.children; + sourceNode = sourceNode.children.find( + (node) => node.key === keysToTask[keyIdx] + ); + if (!sourceNode) { return false; } } diff --git a/src/modules/tasks/models/TaskModelProxy.ts b/src/modules/tasks/models/TaskModelProxy.ts index 9bfc812..a9e1ed5 100644 --- a/src/modules/tasks/models/TaskModelProxy.ts +++ b/src/modules/tasks/models/TaskModelProxy.ts @@ -13,7 +13,7 @@ export class TaskModelProxy extends TaskModel { export const taskModelProxyHandler: ProxyHandler = { get(target: TaskModelProxy, prop: string | symbol): any { - return target?.origin?.[prop as keyof TaskModel]; + return target?.[prop as keyof TaskModelProxy]; }, set(target: TaskModelProxy, prop: string | symbol, value: any): boolean { if (prop === 'duration') { @@ -26,7 +26,7 @@ export const taskModelProxyHandler: ProxyHandler = { // @ts-ignore target[prop] = value; - if (prop !== 'expanded') { + if (!['expanded', 'children'].includes(prop as string)) { // @ts-ignore target.origin[prop] = value; } From 09303c4e197a6a9b277f9e1042a08e2c19b7f441 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 16:04:55 +0300 Subject: [PATCH 24/84] Rename to TaskInMyDay.ts --- src/base/TreeModelHelper.ts | 6 +++--- src/modules/tasks/TaskFactory.ts | 8 ++++---- .../models/{TaskModelProxy.ts => TaskInMyDay.ts} | 14 +++++++------- src/modules/tasks/models/TasksByProject.ts | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) rename src/modules/tasks/models/{TaskModelProxy.ts => TaskInMyDay.ts} (56%) diff --git a/src/base/TreeModelHelper.ts b/src/base/TreeModelHelper.ts index 664c645..3acc29a 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/base/TreeModelHelper.ts @@ -1,5 +1,5 @@ import { ITreeItem, ITreeItemWithParent } from '../types/ITreeItem'; -import { TaskModelProxy } from '../modules/tasks/models/TaskModelProxy'; +import { TaskInMyDay } from '../modules/tasks/models/TaskInMyDay'; import TaskModel from '../modules/tasks/models/TaskModel'; import TaskFactory from '../modules/tasks/TaskFactory'; @@ -18,7 +18,7 @@ const TreeModelHelper = { }, copyItemsToTree( sourceTree: TaskModel[], - destTree: TaskModelProxy[], + destTree: TaskInMyDay[], keysToTask: string[] ) { let keyIdx = 0; @@ -64,7 +64,7 @@ const TreeModelHelper = { copySubItemsToTree( sourceTree: TaskModel[], - destTree: TaskModelProxy[], + destTree: TaskInMyDay[], keysToTask: string[] ) { if (!sourceTree) { diff --git a/src/modules/tasks/TaskFactory.ts b/src/modules/tasks/TaskFactory.ts index 365e7b4..d3b3e13 100644 --- a/src/modules/tasks/TaskFactory.ts +++ b/src/modules/tasks/TaskFactory.ts @@ -1,7 +1,7 @@ import AbstractFactory from '../../base/AbstractFactory'; import TasksByProject from './models/TasksByProject'; import TaskModel from './models/TaskModel'; -import { TaskModelProxy, taskModelProxyHandler } from './models/TaskModelProxy'; +import { TaskInMyDay, taskModelProxyHandler } from './models/TaskInMyDay'; import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; export default class TaskFactory extends AbstractFactory { @@ -16,9 +16,9 @@ export default class TaskFactory extends AbstractFactory { return newData; } - static createTaskModelProxy(taskModel: TaskModel): TaskModelProxy { - const target = new TaskModelProxy(taskModel, []); + static createTaskModelProxy(taskModel: TaskModel): TaskInMyDay { + const target = new TaskInMyDay(taskModel, []); - return new Proxy(target, taskModelProxyHandler); + return new Proxy(target, taskModelProxyHandler); } } diff --git a/src/modules/tasks/models/TaskModelProxy.ts b/src/modules/tasks/models/TaskInMyDay.ts similarity index 56% rename from src/modules/tasks/models/TaskModelProxy.ts rename to src/modules/tasks/models/TaskInMyDay.ts index a9e1ed5..b0ebe89 100644 --- a/src/modules/tasks/models/TaskModelProxy.ts +++ b/src/modules/tasks/models/TaskInMyDay.ts @@ -1,21 +1,21 @@ import TaskModel from './TaskModel'; -export class TaskModelProxy extends TaskModel { +export class TaskInMyDay extends TaskModel { origin: TaskModel | null = null; - children: TaskModelProxy[] = []; + children: TaskInMyDay[] = []; - constructor(originTaskModel: TaskModel, children: TaskModelProxy[]) { + constructor(originTaskModel: TaskModel, children: TaskInMyDay[]) { super(originTaskModel); this.origin = originTaskModel; this.children = children; } } -export const taskModelProxyHandler: ProxyHandler = { - get(target: TaskModelProxy, prop: string | symbol): any { - return target?.[prop as keyof TaskModelProxy]; +export const taskModelProxyHandler: ProxyHandler = { + get(target: TaskInMyDay, prop: string | symbol): any { + return target?.[prop as keyof TaskInMyDay]; }, - set(target: TaskModelProxy, prop: string | symbol, value: any): boolean { + set(target: TaskInMyDay, prop: string | symbol, value: any): boolean { if (prop === 'duration') { console.error( `TaskModel: Can't set prop '${prop.toString()}' in`, diff --git a/src/modules/tasks/models/TasksByProject.ts b/src/modules/tasks/models/TasksByProject.ts index ae5d7a6..814e9ca 100644 --- a/src/modules/tasks/models/TasksByProject.ts +++ b/src/modules/tasks/models/TasksByProject.ts @@ -1,7 +1,7 @@ import TaskModel from './TaskModel'; -import { TaskModelProxy } from './TaskModelProxy'; +import { TaskInMyDay } from './TaskInMyDay'; -type Task = TaskModel | TaskModelProxy; +type Task = TaskModel | TaskInMyDay; type TasksByProject = Record; export default TasksByProject; From ff78253ae252f29d92cf5c5cb48aaef8c5d0d5a7 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 16:12:12 +0300 Subject: [PATCH 25/84] Move into helpers --- src/{base => helpers}/TreeModelHelper.ts | 1 + src/modules/projects/ProjectStore.ts | 2 +- src/modules/tasks/TaskService.ts | 2 +- src/modules/tasks/TaskStore.ts | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename src/{base => helpers}/TreeModelHelper.ts (99%) diff --git a/src/base/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts similarity index 99% rename from src/base/TreeModelHelper.ts rename to src/helpers/TreeModelHelper.ts index 3acc29a..fece424 100644 --- a/src/base/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -16,6 +16,7 @@ const TreeModelHelper = { return result; }, + copyItemsToTree( sourceTree: TaskModel[], destTree: TaskInMyDay[], diff --git a/src/modules/projects/ProjectStore.ts b/src/modules/projects/ProjectStore.ts index 0042a06..97d47ee 100644 --- a/src/modules/projects/ProjectStore.ts +++ b/src/modules/projects/ProjectStore.ts @@ -2,7 +2,7 @@ import { autorun, makeAutoObservable } from 'mobx'; import ProjectModel from './models/ProjectModel'; import ProjectService from './ProjectService'; -import TreeModelHelper from '../../base/TreeModelHelper'; +import TreeModelHelper from '../../helpers/TreeModelHelper'; import { Undefined } from '../../types/CommonTypes'; import { RootStore } from '../RootStore'; import GaService from '../../services/gaService/GaService'; diff --git a/src/modules/tasks/TaskService.ts b/src/modules/tasks/TaskService.ts index 8ca36a5..80d4df1 100644 --- a/src/modules/tasks/TaskService.ts +++ b/src/modules/tasks/TaskService.ts @@ -4,7 +4,7 @@ import TaskRepository from './TaskRepository'; import TaskFactory from './TaskFactory'; import TasksByProject from './models/TasksByProject'; import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; -import TreeModelHelper from '../../base/TreeModelHelper'; +import TreeModelHelper from '../../helpers/TreeModelHelper'; import TaskModel from './models/TaskModel'; const setParent = (item: TaskModel, parent?: TaskModel) => { diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index f486ae4..8f1982a 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -3,7 +3,7 @@ import { autorun, makeAutoObservable } from 'mobx'; import TaskService from './TaskService'; import TaskModel, { ITimeRangeModel } from './models/TaskModel'; import TasksByProject from '../../modules/tasks/models/TasksByProject'; -import TreeModelHelper from '../../base/TreeModelHelper'; +import TreeModelHelper from '../../helpers/TreeModelHelper'; import BadgeService from '../BadgeService'; import { RootStore } from '../RootStore'; import GaService from '../../services/gaService/GaService'; From 2242d4cc7635d313ca363437639fa08d33312240 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Sun, 25 Jul 2021 17:35:51 +0300 Subject: [PATCH 26/84] Init test, fix types --- package.json | 29 +++++++++- src/helpers/TreeModelHelper.test.ts | 79 +++++++++++++++++++++++++++ src/modules/tasks/models/TaskModel.ts | 9 +-- src/types/ITreeItem.ts | 6 +- 4 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/helpers/TreeModelHelper.test.ts diff --git a/package.json b/package.json index e90e781..9ee4985 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "postinstall": "node -r @babel/register .erb/scripts/CheckNativeDep.js && electron-builder install-app-deps && yarn cross-env NODE_ENV=development webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.babel.js && opencollective-postinstall && yarn-deduplicate yarn.lock", "start": "node -r @babel/register ./.erb/scripts/CheckPortInUse.js && cross-env yarn start:renderer", "start:main": "cross-env NODE_ENV=development electron -r ./.erb/scripts/BabelRegister ./src/main.dev.ts", - "start:renderer": "cross-env NODE_ENV=development webpack serve --config ./.erb/configs/webpack.config.renderer.dev.babel.js" + "start:renderer": "cross-env NODE_ENV=development webpack serve --config ./.erb/configs/webpack.config.renderer.dev.babel.js", + "test": "jest" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -112,6 +113,27 @@ "hot", "reload" ], + "jest": { + "testURL": "http://localhost/", + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/.erb/mocks/fileMock.js", + "\\.(css|less|sass|scss)$": "identity-obj-proxy" + }, + "moduleFileExtensions": [ + "js", + "jsx", + "ts", + "tsx", + "json" + ], + "moduleDirectories": [ + "node_modules", + "src/node_modules" + ], + "setupFiles": [ + "./.erb/scripts/CheckBuildsExist.js" + ] + }, "devDependencies": { "@babel/core": "^7.12.9", "@babel/plugin-proposal-class-properties": "^7.12.1", @@ -139,6 +161,7 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.4.3", "@teamsupercell/typings-for-css-modules-loader": "^2.4.0", "@types/history": "4.7.6", + "@types/jest": "^26.0.24", "@types/node": "14.14.10", "@types/react": "^16.9.44", "@types/react-dom": "^16.9.9", @@ -147,6 +170,7 @@ "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", "babel-eslint": "^10.1.0", + "babel-jest": "^26.1.0", "babel-loader": "^8.2.2", "babel-plugin-dev-expression": "^0.2.2", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", @@ -172,6 +196,7 @@ "eslint-import-resolver-webpack": "^0.13.0", "eslint-plugin-compat": "^3.8.0", "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.1.3", "eslint-plugin-jsx-a11y": "6.4.1", "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", @@ -179,6 +204,8 @@ "eslint-plugin-react-hooks": "^4.0.8", "file-loader": "^6.0.0", "husky": "^4.2.5", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.0.6", "lint-staged": "^10.2.11", "mini-css-extract-plugin": "^1.3.1", "node-sass": "^5.0.0", diff --git a/src/helpers/TreeModelHelper.test.ts b/src/helpers/TreeModelHelper.test.ts new file mode 100644 index 0000000..2709074 --- /dev/null +++ b/src/helpers/TreeModelHelper.test.ts @@ -0,0 +1,79 @@ +import TreeModelHelper from './TreeModelHelper'; +import TaskFactory from '../modules/tasks/TaskFactory'; +import { IJsonTaskModel } from '../modules/tasks/models/TaskModel'; +import TasksByProject from '../modules/tasks/models/TasksByProject'; +import { ITreeItemWithParent } from '../types/ITreeItem'; + +describe('TreeModelHelper', () => { + let testTasks: TasksByProject | undefined; + beforeEach(() => { + const factory = new TaskFactory(); + const task111: Partial = { + key: '111', + title: 'task1-1-1', + parent: null, + children: [], + }; + const task11: Partial = { + key: '11', + title: 'task1-1', + parent: null, + children: [task111 as IJsonTaskModel], + }; + const task1: Partial = { + key: '1', + title: 'task1', + parent: null, + children: [task11 as IJsonTaskModel], + }; + + task111.parent = task11 as IJsonTaskModel; + task11.parent = task1 as IJsonTaskModel; + + const task21: Partial = { + key: '21', + title: 'task21', + parent: null, + children: [], + }; + const task22: Partial = { + key: '22', + title: 'task22', + parent: null, + children: [], + }; + const task2: Partial = { + key: '2', + title: 'task2', + parent: null, + children: [task21, task22] as IJsonTaskModel[], + }; + task21.parent = task2 as IJsonTaskModel; + task22.parent = task2 as IJsonTaskModel; + + testTasks = factory.createTasks(({ + proj: [task1, task2], + } as unknown) as TasksByProject); + }); + + test('getPathToNode #1', () => { + if (!testTasks) { + throw new Error(); + } + const task111 = testTasks.proj[0].children[0].children[0]; + expect(TreeModelHelper.getPathToNode(task111)).toStrictEqual([ + '1', + '11', + '111', + ]); + }); + test('getPathToNode #2', () => { + if (!testTasks) { + throw new Error(); + } + const task22 = testTasks.proj[1].children[0]; + expect(TreeModelHelper.getPathToNode(task22)).toStrictEqual(['2', '21']); + }); + + test(''); +}); diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index f4af33b..c61f175 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -2,7 +2,7 @@ import { action, computed, makeObservable, observable } from 'mobx'; import { isSameDay, startOfDay } from 'date-fns'; import AbstractModel from '../../../base/AbstractModel'; -import { ITreeItem } from '../../../types/ITreeItem'; +import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem'; export interface IJsonTimeRangeModel { start: string; @@ -16,7 +16,7 @@ export interface ITimeRangeModel { description?: string; } -interface IJsonTaskModel extends ITreeItem { +export interface IJsonTaskModel extends ITreeItemWithParent { projectId?: string; checked?: boolean; active?: boolean; @@ -49,11 +49,12 @@ const parseTimeRageItems = ( ); }; -export default class TaskModel extends AbstractModel { +export default class TaskModel extends AbstractModel + implements ITreeItemWithParent { key: string = ''; title: string = ''; children: TaskModel[] = []; - parent: TaskModel | null = null; + parent: TaskModel | null = null; // update parent on drug&drop projectId: string = ''; checked: boolean = false; active: boolean = false; diff --git a/src/types/ITreeItem.ts b/src/types/ITreeItem.ts index 5fc19a1..31cf95b 100644 --- a/src/types/ITreeItem.ts +++ b/src/types/ITreeItem.ts @@ -4,6 +4,8 @@ export interface ITreeItem = ITreeItem> { children?: T[]; } -export interface ITreeItemWithParent extends ITreeItem { - parent: ITreeItemWithParent | undefined; +export interface ITreeItemWithParent< + T extends ITreeItemWithParent = ITreeItemWithParent +> extends ITreeItem { + parent: T | null; } From a2b24adbabe62267b7a1371809e242c6bb4e9a76 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Wed, 11 Aug 2021 16:34:11 +0300 Subject: [PATCH 27/84] Rename vars --- src/helpers/TreeModelHelper.test.ts | 9 ++++++++ src/helpers/TreeModelHelper.ts | 32 +++++++++++++++-------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/helpers/TreeModelHelper.test.ts b/src/helpers/TreeModelHelper.test.ts index 2709074..1c186f5 100644 --- a/src/helpers/TreeModelHelper.test.ts +++ b/src/helpers/TreeModelHelper.test.ts @@ -8,6 +8,14 @@ describe('TreeModelHelper', () => { let testTasks: TasksByProject | undefined; beforeEach(() => { const factory = new TaskFactory(); + /* Structure: + -task1 + --task1-1 + ---task-1-1-1 + -task2 + --task21 + --task22 + */ const task111: Partial = { key: '111', title: 'task1-1-1', @@ -67,6 +75,7 @@ describe('TreeModelHelper', () => { '111', ]); }); + test('getPathToNode #2', () => { if (!testTasks) { throw new Error(); diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index fece424..c21ea90 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -20,14 +20,14 @@ const TreeModelHelper = { copyItemsToTree( sourceTree: TaskModel[], destTree: TaskInMyDay[], - keysToTask: string[] + keysToNode: string[] ) { let keyIdx = 0; let sourceChildren = sourceTree; let destChildren = destTree; - if (keysToTask.length === 1) { - const source = sourceChildren.find((node) => node.key === keysToTask[0]); + if (keysToNode.length === 1) { + const source = sourceChildren.find((node) => node.key === keysToNode[0]); if (source) { destChildren.push(TaskFactory.createTaskModelProxy(source)); } @@ -36,29 +36,31 @@ const TreeModelHelper = { do { const nextSourceNode = sourceChildren.find( - (task) => task.key === keysToTask[keyIdx] + (task) => task.key === keysToNode[keyIdx] ); if (!nextSourceNode) { return false; } const nextDestNode = destChildren.find( - (task) => task.key === keysToTask[keyIdx] + (task) => task.key === keysToNode[keyIdx] ); if (nextDestNode) { + // We already have a copy of node, go on keyIdx++; sourceChildren = nextSourceNode.children; destChildren = nextDestNode.children; } else { - const restKeysToTask = keysToTask.slice(keyIdx); + // Make a copy from this node + const restKeysToNode = keysToNode.slice(keyIdx); return TreeModelHelper.copySubItemsToTree( sourceChildren, destChildren, - restKeysToTask + restKeysToNode ); } - } while (keyIdx < keysToTask.length); + } while (keyIdx < keysToNode.length); return true; }, @@ -66,7 +68,7 @@ const TreeModelHelper = { copySubItemsToTree( sourceTree: TaskModel[], destTree: TaskInMyDay[], - keysToTask: string[] + keysToNode: string[] ) { if (!sourceTree) { return false; @@ -74,24 +76,24 @@ const TreeModelHelper = { let keyIdx = 0; let destChildren = destTree; - let sourceNode = sourceTree.find((node) => node.key === keysToTask[keyIdx]); + let sourceNode = sourceTree.find((node) => node.key === keysToNode[keyIdx]); if (!sourceNode) { return false; } while (true) { - const copy = TaskFactory.createTaskModelProxy(sourceNode); - destChildren.push(copy); + const copyNode = TaskFactory.createTaskModelProxy(sourceNode); + destChildren.push(copyNode); keyIdx++; - if (keyIdx === keysToTask.length) { + if (keyIdx === keysToNode.length) { return true; } - destChildren = copy.children; + destChildren = copyNode.children; sourceNode = sourceNode.children.find( - (node) => node.key === keysToTask[keyIdx] + (node) => node.key === keysToNode[keyIdx] ); if (!sourceNode) { return false; From b321dca41207857e5534f7ef1595197308d9fdcb Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Wed, 11 Aug 2021 17:27:16 +0300 Subject: [PATCH 28/84] Group by project in MyDay --- src/helpers/TreeModelHelper.ts | 48 +++++++++++++++++++++++++++ src/modules/tasks/TaskStore.ts | 5 +-- src/modules/tasks/models/TaskModel.ts | 1 + 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index c21ea90..f0ba275 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -1,7 +1,13 @@ +import { toJS } from 'mobx'; + import { ITreeItem, ITreeItemWithParent } from '../types/ITreeItem'; import { TaskInMyDay } from '../modules/tasks/models/TaskInMyDay'; import TaskModel from '../modules/tasks/models/TaskModel'; import TaskFactory from '../modules/tasks/TaskFactory'; +import ProjectModel from '../modules/projects/models/ProjectModel'; + +// @ts-ignore TODO remove +window.toJS = toJS; const TreeModelHelper = { getPathToNode(node: T) { @@ -17,6 +23,48 @@ const TreeModelHelper = { return result; }, + copyItemsToTreeUnderProject( + project: ProjectModel | undefined, + sourceTree: TaskModel[], + destTree: TaskInMyDay[], + keysToNode: string[] + ): boolean { + if (!project) { + return false; + } + + let destProject = destTree.find((node) => node.key === project.key); + if (!destProject) { + destProject = TaskFactory.createTaskModelProxy( + new TaskModel({ + key: project.key, + projectId: project.key, + title: project.title, + active: false, + checked: false, + children: [], + datesInProgress: [], + details: [], + expanded: true, + inMyDay: new Date().toString(), + parent: null, + time: [], + withoutActions: true, + }) + ); + destTree.push(destProject); + } + + return TreeModelHelper.copyItemsToTree( + sourceTree, + destProject.children, + keysToNode + ); + }, + + /** + * Make a copy of tasks to 'My Day' + */ copyItemsToTree( sourceTree: TaskModel[], destTree: TaskInMyDay[], diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 8f1982a..5a416cd 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -5,7 +5,7 @@ import TaskModel, { ITimeRangeModel } from './models/TaskModel'; import TasksByProject from '../../modules/tasks/models/TasksByProject'; import TreeModelHelper from '../../helpers/TreeModelHelper'; import BadgeService from '../BadgeService'; -import { RootStore } from '../RootStore'; +import rootStore, { RootStore } from '../RootStore'; import GaService from '../../services/gaService/GaService'; import { EEventCategory, @@ -98,7 +98,8 @@ export default class TaskStore { // @ts-ignore const pathToNode = TreeModelHelper.getPathToNode(task); - TreeModelHelper.copyItemsToTree( + TreeModelHelper.copyItemsToTreeUnderProject( + rootStore.projectStore.get(task.projectId), this.tasks[task.projectId], // @ts-ignore this.tasks[DEFAULT_PROJECT_ID.MyDay], diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index c61f175..42d7b6b 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -63,6 +63,7 @@ export default class TaskModel extends AbstractModel time: ITimeRangeModel[] = []; datesInProgress: Date[] = []; details: string = ''; + withoutActions: boolean = false; // TODO make a new class constructor(props: IJsonTaskModel | TaskModel) { super(); From 41cc75ddcf2fe27fd67c88242fc32810ff202f2f Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Fri, 27 Aug 2021 16:25:25 +0300 Subject: [PATCH 29/84] WIP TaskWithProjectNameModel --- src/base/AbstractModel.ts | 2 +- src/helpers/TreeModelHelper.test.ts | 2 +- src/main.dev.ts | 1 + src/modules/tasks/TaskFactory.ts | 2 +- src/modules/tasks/TaskRepository.ts | 2 +- src/modules/tasks/TaskService.ts | 18 ++++++++++----- src/modules/tasks/TaskStore.ts | 20 ++++++++++------ src/modules/tasks/models/TaskModel.ts | 2 +- .../tasks/models/TaskWithProjectNameModel.ts | 23 +++++++++++++++++++ src/modules/tasks/models/TasksByProject.ts | 7 +++--- 10 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 src/modules/tasks/models/TaskWithProjectNameModel.ts diff --git a/src/base/AbstractModel.ts b/src/base/AbstractModel.ts index 21883a6..3612ef1 100644 --- a/src/base/AbstractModel.ts +++ b/src/base/AbstractModel.ts @@ -3,7 +3,7 @@ export default abstract class AbstractModel { return Object.keys(this); } - protected load(data: T) { + protected load(data: T) { if (data) { this.getAttributes().forEach((attribute) => { if (data.hasOwnProperty(attribute)) { diff --git a/src/helpers/TreeModelHelper.test.ts b/src/helpers/TreeModelHelper.test.ts index 1c186f5..ff3271c 100644 --- a/src/helpers/TreeModelHelper.test.ts +++ b/src/helpers/TreeModelHelper.test.ts @@ -1,7 +1,7 @@ import TreeModelHelper from './TreeModelHelper'; import TaskFactory from '../modules/tasks/TaskFactory'; import { IJsonTaskModel } from '../modules/tasks/models/TaskModel'; -import TasksByProject from '../modules/tasks/models/TasksByProject'; +import { TasksByProject } from '../modules/tasks/models/TasksByProject'; import { ITreeItemWithParent } from '../types/ITreeItem'; describe('TreeModelHelper', () => { diff --git a/src/main.dev.ts b/src/main.dev.ts index b8060eb..1f0cfb1 100644 --- a/src/main.dev.ts +++ b/src/main.dev.ts @@ -18,6 +18,7 @@ initSentry(); import path from 'path'; import { app, BrowserWindow, shell } from 'electron'; import { autoUpdater } from 'electron-updater'; +// @ts-ignore import Badge from 'electron-windows-badge'; import './main/IpcMain'; diff --git a/src/modules/tasks/TaskFactory.ts b/src/modules/tasks/TaskFactory.ts index d3b3e13..4b62249 100644 --- a/src/modules/tasks/TaskFactory.ts +++ b/src/modules/tasks/TaskFactory.ts @@ -1,5 +1,5 @@ import AbstractFactory from '../../base/AbstractFactory'; -import TasksByProject from './models/TasksByProject'; +import { TasksByProject } from './models/TasksByProject'; import TaskModel from './models/TaskModel'; import { TaskInMyDay, taskModelProxyHandler } from './models/TaskInMyDay'; import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; diff --git a/src/modules/tasks/TaskRepository.ts b/src/modules/tasks/TaskRepository.ts index acecda8..85653c6 100644 --- a/src/modules/tasks/TaskRepository.ts +++ b/src/modules/tasks/TaskRepository.ts @@ -1,5 +1,5 @@ import AbstractFileRepository from '../../base/repositories/AbstractFileRepository'; -import TasksByProject from './models/TasksByProject'; +import { TasksByProject } from './models/TasksByProject'; export default class TaskRepository extends AbstractFileRepository< TasksByProject diff --git a/src/modules/tasks/TaskService.ts b/src/modules/tasks/TaskService.ts index 80d4df1..295b53d 100644 --- a/src/modules/tasks/TaskService.ts +++ b/src/modules/tasks/TaskService.ts @@ -2,16 +2,16 @@ import { toJS } from 'mobx'; import TaskRepository from './TaskRepository'; import TaskFactory from './TaskFactory'; -import TasksByProject from './models/TasksByProject'; +import { TasksByProject } from './models/TasksByProject'; import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; import TreeModelHelper from '../../helpers/TreeModelHelper'; -import TaskModel from './models/TaskModel'; +import { ITreeItemWithParent } from '../../types/ITreeItem'; -const setParent = (item: TaskModel, parent?: TaskModel) => { +const setParent = >(item: T, parent?: T) => { item.parent = parent || null; }; -const clearParent = (item: TaskModel) => { +const clearParent = (item: ITreeItemWithParent) => { item.parent = null; }; @@ -35,13 +35,19 @@ export default class TaskService extends AbstractServiceWithProfile< private static fillParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive(setParent, projectTasks); + TreeModelHelper.walkRecursive>( + setParent, + projectTasks + ); }); } private static clearParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive(clearParent, projectTasks); + TreeModelHelper.walkRecursive>( + clearParent, + projectTasks + ); }); } } diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 5a416cd..6ad1dfb 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -2,7 +2,10 @@ import { autorun, makeAutoObservable } from 'mobx'; import TaskService from './TaskService'; import TaskModel, { ITimeRangeModel } from './models/TaskModel'; -import TasksByProject from '../../modules/tasks/models/TasksByProject'; +import { + Task, + TasksByProject, +} from '../../modules/tasks/models/TasksByProject'; import TreeModelHelper from '../../helpers/TreeModelHelper'; import BadgeService from '../BadgeService'; import rootStore, { RootStore } from '../RootStore'; @@ -13,6 +16,7 @@ import { ETimeRangeEvents, } from '../../services/gaService/EEvents'; import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; +import { ITreeItemWithParent } from '../../types/ITreeItem'; export default class TaskStore { tasks: TasksByProject = {}; @@ -51,7 +55,7 @@ export default class TaskStore { GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Delete); } - getTasks(projectId: string): TaskModel[] { + getTasks(projectId: string): Task[] { return this.tasks[projectId] || []; } @@ -95,7 +99,7 @@ export default class TaskStore { addToMyDay(task: TaskModel) { task.inMyDay = new Date(); - // @ts-ignore + const pathToNode = TreeModelHelper.getPathToNode(task); TreeModelHelper.copyItemsToTreeUnderProject( @@ -187,12 +191,14 @@ export default class TaskStore { } markExpanded(projectId: string, taskIds: string[]) { - const markExpanded = (task: TaskModel, taskIds: string[]) => { - task.expanded = taskIds.includes(task.key); + const markExpanded = (task: Task, taskIds: string[]) => { + if (task instanceof TaskModel) { + task.expanded = taskIds.includes(task.key); + } }; if (Array.isArray(this.tasks[projectId])) { - TreeModelHelper.modifyItemsWithIdsRecursive( + TreeModelHelper.modifyItemsWithIdsRecursive( this.tasks[projectId], taskIds, markExpanded @@ -207,7 +213,7 @@ export default class TaskStore { condition: (task: TaskModel) => boolean ) { if (Array.isArray(this.tasks[projectId])) { - return TreeModelHelper.getFlatItemsRecursive( + return TreeModelHelper.getFlatItemsRecursive( this.tasks[projectId], condition ).map((task) => task.key); diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index 42d7b6b..8cbda86 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -2,7 +2,7 @@ import { action, computed, makeObservable, observable } from 'mobx'; import { isSameDay, startOfDay } from 'date-fns'; import AbstractModel from '../../../base/AbstractModel'; -import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem'; +import { ITreeItemWithParent } from '../../../types/ITreeItem'; export interface IJsonTimeRangeModel { start: string; diff --git a/src/modules/tasks/models/TaskWithProjectNameModel.ts b/src/modules/tasks/models/TaskWithProjectNameModel.ts new file mode 100644 index 0000000..11a349b --- /dev/null +++ b/src/modules/tasks/models/TaskWithProjectNameModel.ts @@ -0,0 +1,23 @@ +import AbstractModel from '../../../base/AbstractModel'; +import { ITreeItemWithParent } from '../../../types/ITreeItem'; +import TaskModel from './TaskModel'; + +interface ITaskWithProjectName { + key: string; + title: string; + parent: null; + children: TaskModel[]; +} + +export class TaskWithProjectNameModel extends AbstractModel + implements ITreeItemWithParent { + key: string = ''; + title: string = ''; + parent: TaskModel | null = null; + children: TaskModel[] = []; + + constructor(props: ITaskWithProjectName) { + super(); + this.load(props); + } +} diff --git a/src/modules/tasks/models/TasksByProject.ts b/src/modules/tasks/models/TasksByProject.ts index 814e9ca..fb5d3ad 100644 --- a/src/modules/tasks/models/TasksByProject.ts +++ b/src/modules/tasks/models/TasksByProject.ts @@ -1,7 +1,6 @@ import TaskModel from './TaskModel'; import { TaskInMyDay } from './TaskInMyDay'; +import { TaskWithProjectNameModel } from './TaskWithProjectNameModel'; -type Task = TaskModel | TaskInMyDay; -type TasksByProject = Record; - -export default TasksByProject; +export type Task = TaskModel | TaskInMyDay | TaskWithProjectNameModel; +export type TasksByProject = Record; From dfb67d65e814487082a94483f64405a67798151f Mon Sep 17 00:00:00 2001 From: Yadro Date: Tue, 12 Oct 2021 22:07:46 +0300 Subject: [PATCH 30/84] Disable MyDay --- src/config.ts | 3 +++ src/modules/projects/ProjectFactory.ts | 17 ++++++++++------- src/modules/projects/models/ProjectModel.ts | 16 ++++++++-------- .../projects/components/TaskNode/TaskNode.tsx | 9 ++++++--- 4 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 src/config.ts diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..f7de88e --- /dev/null +++ b/src/config.ts @@ -0,0 +1,3 @@ +export const Features = { + myDay: false, +}; diff --git a/src/modules/projects/ProjectFactory.ts b/src/modules/projects/ProjectFactory.ts index c2a3c33..672c40e 100644 --- a/src/modules/projects/ProjectFactory.ts +++ b/src/modules/projects/ProjectFactory.ts @@ -4,18 +4,21 @@ import ProjectModel, { DEFAULT_PROJECTS, IJsonProjectItem, } from './models/ProjectModel'; +import { Features } from '../../config'; export default class ProjectFactory extends AbstractFactory { createProjects(projectItems: IJsonProjectItem[]): ProjectModel[] { - const hasMyDay = projectItems.find( - (p) => p.key === DEFAULT_PROJECT_ID.MyDay - ); - if (!hasMyDay) { - const myDayProj = DEFAULT_PROJECTS.find( + if (Features.myDay) { + const hasMyDay = projectItems.find( (p) => p.key === DEFAULT_PROJECT_ID.MyDay ); - if (myDayProj) { - projectItems.unshift(myDayProj); + if (!hasMyDay) { + const myDayProj = DEFAULT_PROJECTS.find( + (p) => p.key === DEFAULT_PROJECT_ID.MyDay + ); + if (myDayProj) { + projectItems.unshift(myDayProj); + } } } diff --git a/src/modules/projects/models/ProjectModel.ts b/src/modules/projects/models/ProjectModel.ts index fa1f235..f26c3db 100644 --- a/src/modules/projects/models/ProjectModel.ts +++ b/src/modules/projects/models/ProjectModel.ts @@ -9,13 +9,13 @@ export enum DEFAULT_PROJECT_ID { } export const DEFAULT_PROJECTS: IJsonProjectItem[] = [ - { - key: DEFAULT_PROJECT_ID.MyDay, - title: 'My Day', - color: colors.yellow.primary || '', - deletable: false, - expanded: false, - }, + // { + // key: DEFAULT_PROJECT_ID.MyDay, + // title: 'My Day', + // color: colors.yellow.primary || '', + // deletable: false, + // expanded: false, + // }, { key: DEFAULT_PROJECT_ID.Inbox, title: 'Inbox', @@ -51,7 +51,7 @@ export default class ProjectModel extends AbstractModel const newProps = { ...props, - children: props.children?.map((json) => new ProjectModel(json)) + children: props.children?.map((json) => new ProjectModel(json)), }; this.load(newProps); diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index 0a99f6f..253b0eb 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -11,6 +11,7 @@ import { createUseStyles } from 'react-jss'; import TaskModel from '../../../../modules/tasks/models/TaskModel'; import rootStore from '../../../../modules/RootStore'; import * as TaskHooks from '../../../../hooks/TaskHooks'; +import { Features } from '../../../../config'; const { tasksStore } = rootStore; @@ -35,9 +36,11 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { {task.title} {duration} - tasksStore.addToMyDay(task))} - /> + {Features.myDay && ( + tasksStore.addToMyDay(task))} + /> + )} {!task.active ? ( tasksStore.startTimer(task))} From 7f49cbcfdb5ada39d467f980a722efa71cc67397 Mon Sep 17 00:00:00 2001 From: yadro Date: Tue, 23 Nov 2021 23:24:48 +0300 Subject: [PATCH 31/84] Last active day --- .vscode/settings.json | 5 +++++ src/helpers/ArrayHelper.ts | 4 ++++ src/helpers/DateTime.ts | 14 +++++++++++++- src/helpers/TreeModelHelper.ts | 5 ----- src/modules/tasks/models/TaskModel.ts | 2 +- .../projects/components/TaskNode/TaskNode.tsx | 16 +++++++++++++++- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9993f5e..ece1ffc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,11 @@ "javascript.format.enable": false, "typescript.format.enable": false, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "search.exclude": { ".git": true, ".eslintcache": true, diff --git a/src/helpers/ArrayHelper.ts b/src/helpers/ArrayHelper.ts index 6b660fc..cac4b2a 100644 --- a/src/helpers/ArrayHelper.ts +++ b/src/helpers/ArrayHelper.ts @@ -44,3 +44,7 @@ export function mapCurrentNext( } return result; } + +export function last(arr: T[]): T | undefined { + return arr[arr.length - 1]; +} \ No newline at end of file diff --git a/src/helpers/DateTime.ts b/src/helpers/DateTime.ts index cda855d..971181f 100644 --- a/src/helpers/DateTime.ts +++ b/src/helpers/DateTime.ts @@ -1,5 +1,6 @@ import { ITimeRangeModel } from '../modules/tasks/models/TaskModel'; -import { format } from 'date-fns'; +import { format, isSameMonth, isSameYear } from 'date-fns'; + import { iterPrevCurrent } from './ArrayHelper'; function timePad(time: number): string { @@ -45,6 +46,17 @@ export function msToTime(s: number, showSeconds: boolean = true) { return timeItemsToString(sign, hrs, mins, secs, showSeconds); } +export function taskLastActiveDateFormat(date: Date) { + const now = new Date(); + if (isSameMonth(date, now)) { + return format(date, 'E dd'); + } + if (isSameYear(date, now)) { + return format(date, 'dd/MM'); + } + return format(date, 'dd/MM/yy'); +} + export function timeToMs(date: Date) { const hours = date.getHours(); const minutes = date.getMinutes(); diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index f0ba275..be1f8c0 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -1,14 +1,9 @@ -import { toJS } from 'mobx'; - import { ITreeItem, ITreeItemWithParent } from '../types/ITreeItem'; import { TaskInMyDay } from '../modules/tasks/models/TaskInMyDay'; import TaskModel from '../modules/tasks/models/TaskModel'; import TaskFactory from '../modules/tasks/TaskFactory'; import ProjectModel from '../modules/projects/models/ProjectModel'; -// @ts-ignore TODO remove -window.toJS = toJS; - const TreeModelHelper = { getPathToNode(node: T) { const result: string[] = []; diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index 8cbda86..caeff97 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -154,7 +154,7 @@ export default class TaskModel extends AbstractModel const normalDate = startOfDay(date); const found = this.datesInProgress.find((d) => isSameDay(d, normalDate)); if (!found) { - this.datesInProgress.push(normalDate); + this.datesInProgress = [...this.datesInProgress, normalDate]; } } } diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index 253b0eb..c2aceb7 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -1,4 +1,4 @@ -import React, { SyntheticEvent, useCallback } from 'react'; +import React, { SyntheticEvent, useCallback, useMemo } from 'react'; import { CaretRightFilled, DeleteOutlined, @@ -12,6 +12,8 @@ import TaskModel from '../../../../modules/tasks/models/TaskModel'; import rootStore from '../../../../modules/RootStore'; import * as TaskHooks from '../../../../hooks/TaskHooks'; import { Features } from '../../../../config'; +import { last } from '../../../../helpers/ArrayHelper'; +import { taskLastActiveDateFormat } from '../../../../helpers/DateTime'; const { tasksStore } = rootStore; @@ -24,6 +26,14 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { const duration = TaskHooks.useTaskDuration(task); + const lastDateInProgress = useMemo(() => { + const lastDate = last(task.datesInProgress); + if (lastDate) { + return taskLastActiveDateFormat(lastDate) + } + return undefined; + }, [task.datesInProgress]); + const preventDefault = useCallback((fn: () => void) => { return (e: SyntheticEvent) => { e.stopPropagation(); @@ -34,6 +44,7 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { return (
{task.title} + {lastDateInProgress} {duration} {Features.myDay && ( @@ -72,4 +83,7 @@ const useStyle = createUseStyles({ taskTitle: { flex: 1, }, + date: { + marginRight: 5, + } }); From c550b02e06d12a98c56a76d828c5d04026482d20 Mon Sep 17 00:00:00 2001 From: yadro Date: Tue, 23 Nov 2021 23:42:43 +0300 Subject: [PATCH 32/84] Slash --- .vscode/settings.json | 7 +++++-- src/screens/projects/components/TaskNode/TaskNode.tsx | 8 +++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ece1ffc..a566aed 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,9 +10,12 @@ "javascript.format.enable": false, "typescript.format.enable": false, + "editor.formatOnSave": true, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "search.exclude": { diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index c2aceb7..de1118b 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -29,7 +29,7 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { const lastDateInProgress = useMemo(() => { const lastDate = last(task.datesInProgress); if (lastDate) { - return taskLastActiveDateFormat(lastDate) + return taskLastActiveDateFormat(lastDate); } return undefined; }, [task.datesInProgress]); @@ -44,7 +44,9 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { return (
{task.title} - {lastDateInProgress} + {lastDateInProgress && ( + {`${lastDateInProgress} /`} + )} {duration} {Features.myDay && ( @@ -85,5 +87,5 @@ const useStyle = createUseStyles({ }, date: { marginRight: 5, - } + }, }); From 34f4a9c73dbb8569231b5f8ff36c376354a7aded Mon Sep 17 00:00:00 2001 From: yadro Date: Thu, 25 Nov 2021 20:55:09 +0300 Subject: [PATCH 33/84] Path to task --- src/helpers/DateTime.ts | 2 +- src/helpers/TaskHelper.ts | 26 ++++++++++++++-- src/helpers/TreeModelHelper.ts | 12 +++++++- src/main.dev.ts | 1 - src/package.json | 2 +- .../hours/components/HoursCard/HoursCard.tsx | 30 +++++++++---------- .../components/TotalHours/TotalHours.tsx | 6 ++-- src/screens/projects/components/TreeList.tsx | 19 +++++++----- src/types/ITreeItem.ts | 2 +- 9 files changed, 65 insertions(+), 35 deletions(-) diff --git a/src/helpers/DateTime.ts b/src/helpers/DateTime.ts index 971181f..2f4706d 100644 --- a/src/helpers/DateTime.ts +++ b/src/helpers/DateTime.ts @@ -95,7 +95,7 @@ export function calcDurationGaps(taskTime: ITimeRangeModel[]): number { const TIME_FORMAT = 'HH:mm'; const NO_TIME = '--:--'; -export function getTime(date: Date | undefined) { +export function toTimeFormat(date: Date | undefined) { if (!date) { return NO_TIME; } diff --git a/src/helpers/TaskHelper.ts b/src/helpers/TaskHelper.ts index bcaf5a6..ed13d86 100644 --- a/src/helpers/TaskHelper.ts +++ b/src/helpers/TaskHelper.ts @@ -3,6 +3,7 @@ import { isSameDay, compareAsc } from 'date-fns'; import TaskModel from '../modules/tasks/models/TaskModel'; import TaskTimeItemModel from '../modules/tasks/models/TaskTimeItemModel'; import TaskWithDurationModel from '../modules/tasks/models/TaskWithDurationModel'; +import TreeModelHelper from './TreeModelHelper'; /** * Returns TaskTimeItemModel contains time range @@ -18,7 +19,7 @@ import TaskWithDurationModel from '../modules/tasks/models/TaskWithDurationModel */ export function getTimeItems( tasks: TaskModel[], - date: Date, + date: Date ): TaskTimeItemModel[] { let taskTime: TaskTimeItemModel[] = []; tasks.forEach((task) => { @@ -45,9 +46,28 @@ export function getTimeItems( */ export function getTasksWithTotalTimeForDay( tasks: TaskModel[], - date: Date, + date: Date ): TaskWithDurationModel[] { return tasks.map( - (task) => new TaskWithDurationModel(task, task.getDurationByDate(date)), + (task) => new TaskWithDurationModel(task, task.getDurationByDate(date)) ); } + +/** + * @example task1 → task2 → task + * @param task + */ +export function getTaskTitlesPath(task: TaskModel) { + const titlePath: string[] = []; + + function processParent(nParent: TaskModel) { + titlePath.push(nParent.title); + } + + TreeModelHelper.walkToParent(processParent, task); + let titlePathStr = titlePath.reverse().join(' → '); + if (titlePath.length > 0) { + titlePathStr += ' →'; + } + return titlePathStr; +} diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index be1f8c0..3d86532 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -145,7 +145,7 @@ const TreeModelHelper = { }, walkRecursive>( - fn: (t: T, p?: T) => void, + fn: (item: T, parent?: T) => void, treeItems: T[], parent?: T ) { @@ -157,6 +157,16 @@ const TreeModelHelper = { }); }, + walkToParent>( + fn: (nParent: T) => void, + treeItem: T + ) { + if (treeItem.parent) { + fn(treeItem.parent); + TreeModelHelper.walkToParent(fn, treeItem.parent); + } + }, + modifyItemsWithIdsRecursive>( treeItems: T[], ids: string[], diff --git a/src/main.dev.ts b/src/main.dev.ts index 1f0cfb1..f252fff 100644 --- a/src/main.dev.ts +++ b/src/main.dev.ts @@ -89,7 +89,6 @@ const createWindow = async () => { process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true' ) { - // Doesnt work await installExtensions(); } diff --git a/src/package.json b/src/package.json index ca3f132..f646679 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "time-tracker", "productName": "TimeTracker", - "version": "1.0.6", + "version": "1.0.7", "description": "Start and stop time, jump between tasks, and add details on how time was spent.", "main": "./main.prod.js", "author": { diff --git a/src/screens/hours/components/HoursCard/HoursCard.tsx b/src/screens/hours/components/HoursCard/HoursCard.tsx index d5c9f54..1e9c709 100644 --- a/src/screens/hours/components/HoursCard/HoursCard.tsx +++ b/src/screens/hours/components/HoursCard/HoursCard.tsx @@ -1,24 +1,16 @@ import React, { useMemo } from 'react'; import { Card } from 'antd'; -import format from 'date-fns/format'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; import PlayStopButton from '../../../../components/PlayStopButton/PlayStopButton'; import rootStore from '../../../../modules/RootStore'; -import { msToTime } from '../../../../helpers/DateTime'; +import { msToTime, toTimeFormat } from '../../../../helpers/DateTime'; +import { getTaskTitlesPath } from '../../../../helpers/TaskHelper'; const { projectStore } = rootStore; -const formatStr = 'HH:mm'; -function timeFormat(date: Date | undefined) { - if (date) { - return format(date, formatStr); - } - return ''; -} - interface HoursCardProps { taskTime: TaskTimeItemModel; onClick: (taskTime: TaskTimeItemModel) => void; @@ -31,9 +23,11 @@ export default observer(function HoursCard({ const { task, time } = taskTime; const classes = useStyle(); const project = useMemo(() => projectStore.get(task.projectId), [task]); - const duration = time.end - ? msToTime(time.end.getTime() - time.start.getTime()) - : ''; + const duration = useMemo( + () => (time.end ? msToTime(time.end.getTime() - time.start.getTime()) : ''), + [time.end, time.start] + ); + const titlePath = useMemo(() => getTaskTitlesPath(task), [task]); return (
{project?.title}
+
{titlePath}
{task.title}
{time.description}
-
{`${timeFormat( - time.start - )} - ${timeFormat(time.end)}`}
+
+ {`${toTimeFormat(time.start)} - ${toTimeFormat(time.end)}`} +
{duration}
@@ -80,6 +75,9 @@ const useStyle = createUseStyles({ projectTitle: { fontSize: 12, }, + taskTitlePath: { + fontSize: 12, + }, taskTitle: { fontWeight: 'bold', fontSize: 12, diff --git a/src/screens/hours/components/TotalHours/TotalHours.tsx b/src/screens/hours/components/TotalHours/TotalHours.tsx index 9954df8..8aea906 100644 --- a/src/screens/hours/components/TotalHours/TotalHours.tsx +++ b/src/screens/hours/components/TotalHours/TotalHours.tsx @@ -6,7 +6,7 @@ import * as TaskHooks from '../../../../hooks/TaskHooks'; import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; import { estimateWorkingTimeEnd, - getTime, + toTimeFormat, msToTime, } from '../../../../helpers/DateTime'; import LabelWithTooltip, { ILabelWithTooltipProps } from './LabelWithTooltip'; @@ -38,7 +38,7 @@ const TotalHours = observer((props: TotalHoursProps) => { const items: ILabelWithTooltipProps[] = [ { - label: getTime(startWorkingTime), + label: toTimeFormat(startWorkingTime), tooltip: 'Start time', }, { @@ -53,7 +53,7 @@ const TotalHours = observer((props: TotalHoursProps) => { }, { icon: 'mi-notifications', - label: getTime(estimatedWorkingTimeEnd), + label: toTimeFormat(estimatedWorkingTimeEnd), tooltip: 'Estimated end time', }, { diff --git a/src/screens/projects/components/TreeList.tsx b/src/screens/projects/components/TreeList.tsx index 5cde8b4..7eda44a 100644 --- a/src/screens/projects/components/TreeList.tsx +++ b/src/screens/projects/components/TreeList.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { Empty, Tree } from 'antd'; +import { TreeProps } from 'antd/lib/tree/Tree'; import { observer } from 'mobx-react'; import { Key } from 'rc-tree/lib/interface'; import { IDragInfo } from '../../../types/IDragInfo'; -import { ITreeItem } from '../../../types/ITreeItem'; -import { TreeProps } from 'antd/lib/tree/Tree'; +import { ITreeItemWithParent } from '../../../types/ITreeItem'; interface TreeListProps { onSelect?: (selectedKeys: Key[]) => void; @@ -19,7 +19,7 @@ interface TreePropsExtended isDraggable?: () => boolean; } -export default function TreeList>( +export default function TreeList>( getData: () => T[], updateData: (items: T[]) => void, options: TreePropsExtended @@ -37,16 +37,16 @@ export default function TreeList>( info.dropPosition - Number(dropPos[dropPos.length - 1]); const loop = ( - items: ITreeItem[], + items: T[], key: string | number, - callback: (item: ITreeItem, key: number, items: ITreeItem[]) => void + callback: (item: T, key: number, items: T[]) => void ) => { for (let i = 0; i < items.length; i++) { if (items[i].key === key) { return callback(items[i], i, items); } if (items[i].children) { - loop(items[i].children as ITreeItem[], key, callback); + loop(items[i].children || [], key, callback); } } return undefined; @@ -54,7 +54,7 @@ export default function TreeList>( const dataCopy = [...data]; // Find dragObject - let dragObj: ITreeItem; + let dragObj: T; loop(dataCopy, dragKey, (item, index, arr) => { arr.splice(index, 1); dragObj = item; @@ -64,6 +64,7 @@ export default function TreeList>( // Drop on the content loop(dataCopy, dropKey, (item) => { item.children = item.children || []; + dragObj.parent = item; // where to insert item.children.unshift(dragObj); }); @@ -74,17 +75,19 @@ export default function TreeList>( ) { loop(dataCopy, dropKey, (item) => { item.children = item.children || []; + dragObj.parent = item; // where to insert item.children.unshift(dragObj); // in previous version, we use item.children.push(dragObj) to insert the // item to the tail of the children }); } else { - let ar: ITreeItem[]; + let ar: T[]; let i: number; loop(dataCopy, dropKey, (_item, index, arr) => { ar = arr; i = index; + dragObj.parent = undefined; }); if (dropPosition === -1) { // @ts-ignore diff --git a/src/types/ITreeItem.ts b/src/types/ITreeItem.ts index 31cf95b..7104c40 100644 --- a/src/types/ITreeItem.ts +++ b/src/types/ITreeItem.ts @@ -7,5 +7,5 @@ export interface ITreeItem = ITreeItem> { export interface ITreeItemWithParent< T extends ITreeItemWithParent = ITreeItemWithParent > extends ITreeItem { - parent: T | null; + parent: T | undefined; } From f258ad53ef471bcf86fb5a56768a0b75657955bf Mon Sep 17 00:00:00 2001 From: yadro Date: Thu, 25 Nov 2021 20:59:06 +0300 Subject: [PATCH 34/84] [TaskNode] Fix join slash --- src/screens/projects/components/TaskNode/TaskNode.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index de1118b..fa2bbb7 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -34,6 +34,11 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { return undefined; }, [task.datesInProgress]); + const timeData = useMemo( + () => [lastDateInProgress, duration].filter(Boolean).join(' / '), + [lastDateInProgress, duration] + ); + const preventDefault = useCallback((fn: () => void) => { return (e: SyntheticEvent) => { e.stopPropagation(); @@ -44,10 +49,7 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { return (
{task.title} - {lastDateInProgress && ( - {`${lastDateInProgress} /`} - )} - {duration} + {timeData} {Features.myDay && ( Date: Thu, 25 Nov 2021 21:39:10 +0300 Subject: [PATCH 35/84] [TaskNode] Popconfirm --- .vscode/settings.json | 4 +- src/helpers/StopPropagation.ts | 12 ++++++ .../projects/components/TaskNode/TaskNode.tsx | 39 ++++++++++++------- 3 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 src/helpers/StopPropagation.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index a566aed..544210d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -32,5 +32,7 @@ "test/**/__snapshots__": true, "yarn.lock": true, "*.{css,sass,scss}.d.ts": true - } + }, + + "cSpell.words": ["Popconfirm"] } diff --git a/src/helpers/StopPropagation.ts b/src/helpers/StopPropagation.ts new file mode 100644 index 0000000..7d09bef --- /dev/null +++ b/src/helpers/StopPropagation.ts @@ -0,0 +1,12 @@ +import React from 'react'; + +export const stopPropagation = (e: React.SyntheticEvent | undefined) => { + e?.stopPropagation(); +}; + +export const stopPropagationAndRun = (fn: () => void) => { + return (e: React.SyntheticEvent | undefined) => { + e?.stopPropagation(); + fn(); + }; +}; diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index fa2bbb7..3338857 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -1,10 +1,12 @@ -import React, { SyntheticEvent, useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { CaretRightFilled, DeleteOutlined, EnterOutlined, PauseOutlined, + QuestionCircleOutlined, } from '@ant-design/icons'; +import { Popconfirm } from 'antd'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; @@ -14,6 +16,10 @@ import * as TaskHooks from '../../../../hooks/TaskHooks'; import { Features } from '../../../../config'; import { last } from '../../../../helpers/ArrayHelper'; import { taskLastActiveDateFormat } from '../../../../helpers/DateTime'; +import { + stopPropagation, + stopPropagationAndRun, +} from '../../../../helpers/StopPropagation'; const { tasksStore } = rootStore; @@ -21,6 +27,8 @@ interface TaskNodeProps { task: TaskModel; } +const QUESTION = ; + export default observer(function TaskNode({ task }: TaskNodeProps) { const classes = useStyle(); @@ -39,13 +47,6 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { [lastDateInProgress, duration] ); - const preventDefault = useCallback((fn: () => void) => { - return (e: SyntheticEvent) => { - e.stopPropagation(); - fn(); - }; - }, []); - return (
{task.title} @@ -53,21 +54,31 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { {Features.myDay && ( tasksStore.addToMyDay(task))} + onClick={stopPropagationAndRun(() => tasksStore.addToMyDay(task))} /> )} {!task.active ? ( tasksStore.startTimer(task))} + onClick={stopPropagationAndRun(() => tasksStore.startTimer(task))} /> ) : ( tasksStore.stopTimer())} + onClick={stopPropagationAndRun(() => tasksStore.stopTimer())} /> )} - tasksStore.delete(task))} - /> + tasksStore.delete(task))} + onCancel={stopPropagation} + okText="Yes" + cancelText="No" + placement="topRight" + icon={QUESTION} + > + + + +
); From f3bb41be9ccd78b3e93fe680bc37a86d3ccc04d0 Mon Sep 17 00:00:00 2001 From: yadro Date: Thu, 25 Nov 2021 21:46:51 +0300 Subject: [PATCH 36/84] [Header] Refactoring --- src/components/Header/Header.tsx | 31 +++++++++++++++++++ .../HeaderLink.tsx} | 2 +- src/screens/Main.tsx | 23 ++------------ 3 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 src/components/Header/Header.tsx rename src/components/{HeaderMenu/HeaderMenu.tsx => HeaderLink/HeaderLink.tsx} (86%) diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx new file mode 100644 index 0000000..74ddeea --- /dev/null +++ b/src/components/Header/Header.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Layout } from 'antd'; +import { observer } from 'mobx-react'; + +import HeaderLink from '../HeaderLink/HeaderLink'; +import Profile from '../Profile/Profile'; +import TaskControl from '../TaskControl/TaskControl'; + +const { Header: HeaderBase } = Layout; + +function Header() { + return ( + + + Hours + + + Projects + + + Dashboard + + + + + + ); +} + +export default observer(Header); diff --git a/src/components/HeaderMenu/HeaderMenu.tsx b/src/components/HeaderLink/HeaderLink.tsx similarity index 86% rename from src/components/HeaderMenu/HeaderMenu.tsx rename to src/components/HeaderLink/HeaderLink.tsx index a56c4aa..6bb3036 100644 --- a/src/components/HeaderMenu/HeaderMenu.tsx +++ b/src/components/HeaderLink/HeaderLink.tsx @@ -6,7 +6,7 @@ interface HeaderMenuProps { children: React.ReactNode; } -export default observer(function HeaderMenu({ children }: HeaderMenuProps) { +export default observer(function HeaderLink({ children }: HeaderMenuProps) { const classes = useStyles(); return {children}; diff --git a/src/screens/Main.tsx b/src/screens/Main.tsx index 1e4426f..ffe8641 100644 --- a/src/screens/Main.tsx +++ b/src/screens/Main.tsx @@ -1,16 +1,12 @@ import React, { useEffect } from 'react'; -import { Route, Switch, Link, Redirect, useLocation } from 'react-router-dom'; +import { Route, Switch, Redirect, useLocation } from 'react-router-dom'; import { Layout } from 'antd'; import ProjectsScreen from './projects/ProjectsScreen'; -import TaskControl from '../components/TaskControl/TaskControl'; -import HeaderMenu from '../components/HeaderMenu/HeaderMenu'; import HoursScreen from './hours/HoursScreen'; import Dashboard from './dashboard/Dashboard'; -import Profile from '../components/Profile/Profile'; import GaService from '../services/gaService/GaService'; - -const { Header } = Layout; +import Header from '../components/Header/Header'; const Main = () => { const location = useLocation(); @@ -25,20 +21,7 @@ const Main = () => { return ( -
- - Hours - - - Projects - - - Dashboard - - - - -
+
From def6298235ea815a7268aea62173fc8511487526 Mon Sep 17 00:00:00 2001 From: yadro Date: Fri, 26 Nov 2021 00:18:30 +0300 Subject: [PATCH 37/84] Progress bar --- src/components/Header/Header.tsx | 5 +- src/components/ProgressBar/ProgressBar.tsx | 63 ++++++++++++++++++ src/helpers/DateTime.ts | 4 ++ src/helpers/TaskHelper.ts | 25 +++++-- src/hooks/TaskHooks.ts | 14 ---- src/hooks/UseInterval.ts | 11 ++++ src/modules/tasks/TaskStore.ts | 3 + src/modules/tasks/models/TaskModel.ts | 2 +- .../components/TotalHours/TotalHours.tsx | 65 ++++++++++--------- src/services/TaskTimeService.ts | 36 ++++++++++ 10 files changed, 179 insertions(+), 49 deletions(-) create mode 100644 src/components/ProgressBar/ProgressBar.tsx create mode 100644 src/hooks/UseInterval.ts create mode 100644 src/services/TaskTimeService.ts diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 74ddeea..9b35358 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -6,6 +6,7 @@ import { observer } from 'mobx-react'; import HeaderLink from '../HeaderLink/HeaderLink'; import Profile from '../Profile/Profile'; import TaskControl from '../TaskControl/TaskControl'; +import ProgressBar from '../ProgressBar/ProgressBar'; const { Header: HeaderBase } = Layout; @@ -21,7 +22,9 @@ function Header() { Dashboard - + + + diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx new file mode 100644 index 0000000..83f09eb --- /dev/null +++ b/src/components/ProgressBar/ProgressBar.tsx @@ -0,0 +1,63 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import { observer } from 'mobx-react'; +import { Slider } from 'antd'; +import { isSameDay } from 'date-fns'; + +import rootStore from '../../modules/RootStore'; +import { useInterval } from '../../hooks/UseInterval'; +import { getStartWorkingTime, getTimeItems } from '../../helpers/TaskHelper'; +import TaskTimeService from '../../services/TaskTimeService'; + +const { tasksStore, settingsStore } = rootStore; + +function ProgressBar() { + const { settings } = settingsStore; + const workingHoursMs = settings.numberOfWorkingHours; + + const [dayUpdateEveryDay, setDayUpdateEveryDay] = useState(new Date()); + const [timer, setTimer] = useState(new Date()); + + const shouldDayUpdate = useCallback(() => { + const now = new Date(); + setTimer(now); + if (!isSameDay(dayUpdateEveryDay, now)) { + setDayUpdateEveryDay(now); + } + }, [dayUpdateEveryDay]); + + useInterval(shouldDayUpdate); + + const tasks = useMemo(() => tasksStore.getTasksByDate(dayUpdateEveryDay), [ + tasksStore.tasks, + dayUpdateEveryDay, + ]); + + const timeItems = useMemo(() => getTimeItems(tasks, dayUpdateEveryDay), [ + tasks, + dayUpdateEveryDay, + ]); + + const workingTimeStart = useMemo(() => getStartWorkingTime(timeItems), [ + timeItems, + ]); + + const timeRangeItems = useMemo(() => timeItems.map((t) => t.time), [ + timeItems, + ]); + + const progress = useMemo( + () => + TaskTimeService.getDayProgress( + timeRangeItems, + workingTimeStart, + workingHoursMs + ), + [timer, timeRangeItems, workingTimeStart, workingHoursMs] + ); + + console.log(progress); + + return ; +} + +export default observer(ProgressBar); diff --git a/src/helpers/DateTime.ts b/src/helpers/DateTime.ts index 2f4706d..cc91e49 100644 --- a/src/helpers/DateTime.ts +++ b/src/helpers/DateTime.ts @@ -111,3 +111,7 @@ export function estimateWorkingTimeEnd( ? new Date(startDate.getTime() + restTimeMs + workingHoursMs) : undefined; } + +export function getRestHoursMs(workingHoursMs: number, durationMs: number) { + return workingHoursMs - durationMs; +} diff --git a/src/helpers/TaskHelper.ts b/src/helpers/TaskHelper.ts index ed13d86..6315ea2 100644 --- a/src/helpers/TaskHelper.ts +++ b/src/helpers/TaskHelper.ts @@ -1,4 +1,4 @@ -import { isSameDay, compareAsc } from 'date-fns'; +import { isSameDay, compareAsc, isBefore } from 'date-fns'; import TaskModel from '../modules/tasks/models/TaskModel'; import TaskTimeItemModel from '../modules/tasks/models/TaskTimeItemModel'; @@ -21,7 +21,7 @@ export function getTimeItems( tasks: TaskModel[], date: Date ): TaskTimeItemModel[] { - let taskTime: TaskTimeItemModel[] = []; + const taskTime: TaskTimeItemModel[] = []; tasks.forEach((task) => { const taskTimeItems: TaskTimeItemModel[] = []; for (let i = 0; i < task.time.length; i++) { @@ -33,9 +33,12 @@ export function getTimeItems( taskTimeItems.push(new TaskTimeItemModel(task, range, i)); } } - taskTime = taskTime.concat(taskTimeItems); + taskTime.push(...taskTimeItems); }); - taskTime = taskTime.sort((a, b) => compareAsc(a.time.start, b.time.start)); + taskTime.sort((a, b) => compareAsc(a.time.start, b.time.start)); + + console.log('getTimeItems', taskTime.length); + return taskTime; } @@ -71,3 +74,17 @@ export function getTaskTitlesPath(task: TaskModel) { } return titlePathStr; } + +export function getStartWorkingTime( + timeItems: TaskTimeItemModel[] +): Date | undefined { + let minTime: Date | undefined; + let tmpStartTime: Date | undefined; + timeItems.forEach((item) => { + tmpStartTime = item.time.start; + if (!minTime || isBefore(tmpStartTime, minTime)) { + minTime = tmpStartTime; + } + }); + return minTime; +} diff --git a/src/hooks/TaskHooks.ts b/src/hooks/TaskHooks.ts index f527bc6..15a417c 100644 --- a/src/hooks/TaskHooks.ts +++ b/src/hooks/TaskHooks.ts @@ -105,17 +105,3 @@ export function useTimeRangeDuration(timeRange: ITimeRangeModel | undefined) { return duration; } - -export function useStartWorkingTime( - timeItems: TaskTimeItemModel[] -): Date | undefined { - return useMemo(() => { - let minTime: Date | undefined; - timeItems.forEach((time) => { - if (!minTime || isBefore(time.time.start, minTime)) { - minTime = time.time.start; - } - }); - return minTime; - }, [timeItems]); -} diff --git a/src/hooks/UseInterval.ts b/src/hooks/UseInterval.ts new file mode 100644 index 0000000..d0324cb --- /dev/null +++ b/src/hooks/UseInterval.ts @@ -0,0 +1,11 @@ +import { useEffect } from 'react'; + +export function useInterval(fn: () => void, intervalMs: number = 1000) { + useEffect(() => { + let intervalId = setTimeout(function run() { + fn(); + intervalId = setTimeout(run, intervalMs); + }, intervalMs); + return () => clearTimeout(intervalId); + }, [fn]); +} diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 6ad1dfb..505187a 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -18,6 +18,8 @@ import { import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; import { ITreeItemWithParent } from '../../types/ITreeItem'; +// FIXME ts errors + export default class TaskStore { tasks: TasksByProject = {}; activeTask: TaskModel | undefined; @@ -83,6 +85,7 @@ export default class TaskStore { for (const tasks of Object.values(this.tasks)) { TreeModelHelper.getFlatItemsRecursiveBase(tasks, condition, result); } + console.log('getTasksByDate', result.length); return result; } diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index caeff97..74773ce 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -54,7 +54,7 @@ export default class TaskModel extends AbstractModel key: string = ''; title: string = ''; children: TaskModel[] = []; - parent: TaskModel | null = null; // update parent on drug&drop + parent: TaskModel | undefined = undefined; projectId: string = ''; checked: boolean = false; active: boolean = false; diff --git a/src/screens/hours/components/TotalHours/TotalHours.tsx b/src/screens/hours/components/TotalHours/TotalHours.tsx index 8aea906..48b182e 100644 --- a/src/screens/hours/components/TotalHours/TotalHours.tsx +++ b/src/screens/hours/components/TotalHours/TotalHours.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { observer } from 'mobx-react'; import { Space } from 'antd'; @@ -8,9 +8,11 @@ import { estimateWorkingTimeEnd, toTimeFormat, msToTime, + getRestHoursMs, } from '../../../../helpers/DateTime'; import LabelWithTooltip, { ILabelWithTooltipProps } from './LabelWithTooltip'; import rootStore from '../../../../modules/RootStore'; +import { getStartWorkingTime } from '../../../../helpers/TaskHelper'; interface TotalHoursProps { timeItems: TaskTimeItemModel[]; @@ -24,44 +26,49 @@ const TotalHours = observer((props: TotalHoursProps) => { const workingHoursMs = settings.numberOfWorkingHours; const { durationMs, restMs } = TaskHooks.useTimeItemsDuration(timeItems); - const startWorkingTime = TaskHooks.useStartWorkingTime(timeItems); + const startWorkingTime = useMemo(() => getStartWorkingTime(timeItems), [ + timeItems, + ]); const estimatedWorkingTimeEnd = estimateWorkingTimeEnd( startWorkingTime, restMs, workingHoursMs ); - const restHoursMs = workingHoursMs - durationMs; + const restHoursMs = getRestHoursMs(workingHoursMs, durationMs); + + const items: ILabelWithTooltipProps[] = useMemo( + () => [ + { + label: toTimeFormat(startWorkingTime), + tooltip: 'Start time', + }, + { + icon: 'mi-work-outline', + label: msToTime(durationMs, false), + tooltip: 'Working hours', + }, + { + icon: 'mi-local-cafe', + label: msToTime(restMs, false), + tooltip: 'Rest hours', + }, + { + icon: 'mi-notifications', + label: toTimeFormat(estimatedWorkingTimeEnd), + tooltip: 'Estimated end time', + }, + { + label: msToTime(restHoursMs, false), + tooltip: 'Time left', + }, + ], + [startWorkingTime, durationMs, restMs, estimatedWorkingTimeEnd, restHoursMs] + ); if (!timeItems.length) { return null; } - const items: ILabelWithTooltipProps[] = [ - { - label: toTimeFormat(startWorkingTime), - tooltip: 'Start time', - }, - { - icon: 'mi-work-outline', - label: msToTime(durationMs, false), - tooltip: 'Working hours', - }, - { - icon: 'mi-local-cafe', - label: msToTime(restMs, false), - tooltip: 'Rest hours', - }, - { - icon: 'mi-notifications', - label: toTimeFormat(estimatedWorkingTimeEnd), - tooltip: 'Estimated end time', - }, - { - label: msToTime(restHoursMs, false), - tooltip: 'Time left', - }, - ]; - return ( {items.map((props, index) => ( diff --git a/src/services/TaskTimeService.ts b/src/services/TaskTimeService.ts new file mode 100644 index 0000000..2459e7e --- /dev/null +++ b/src/services/TaskTimeService.ts @@ -0,0 +1,36 @@ +import { + calcDuration, + calcDurationGaps, + estimateWorkingTimeEnd, +} from '../helpers/DateTime'; +import { ITimeRangeModel } from '../modules/tasks/models/TaskModel'; + +const TaskTimeService = { + getDayProgress( + timeItems: ITimeRangeModel[], + workingTimeStart: Date | undefined, + workingHoursMs: number + ) { + if (!workingTimeStart) { + return 0; + } + + const durationMs = calcDuration(timeItems); + const restMs = calcDurationGaps(timeItems); + const estimatedWorkingTimeEnd = estimateWorkingTimeEnd( + workingTimeStart, + restMs, + workingHoursMs + ); + + if (estimatedWorkingTimeEnd) { + const durationWorkDayMs = + estimatedWorkingTimeEnd.getTime() - workingTimeStart.getTime() || 1; + return (durationMs * 100) / durationWorkDayMs; + } + + return 0; + }, +}; + +export default TaskTimeService; From 29f04e87eb5b2f3cd0916111930287554451baca Mon Sep 17 00:00:00 2001 From: yadro Date: Fri, 26 Nov 2021 00:50:35 +0300 Subject: [PATCH 38/84] Added labels --- src/components/ProgressBar/ProgressBar.tsx | 28 ++++++++++++++++++---- src/services/TaskTimeService.ts | 26 ++++++++++++++++---- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx index 83f09eb..ba822a7 100644 --- a/src/components/ProgressBar/ProgressBar.tsx +++ b/src/components/ProgressBar/ProgressBar.tsx @@ -2,11 +2,13 @@ import React, { useCallback, useMemo, useState } from 'react'; import { observer } from 'mobx-react'; import { Slider } from 'antd'; import { isSameDay } from 'date-fns'; +import { createUseStyles } from 'react-jss'; import rootStore from '../../modules/RootStore'; import { useInterval } from '../../hooks/UseInterval'; import { getStartWorkingTime, getTimeItems } from '../../helpers/TaskHelper'; import TaskTimeService from '../../services/TaskTimeService'; +import { toTimeFormat } from '../../helpers/DateTime'; const { tasksStore, settingsStore } = rootStore; @@ -14,6 +16,8 @@ function ProgressBar() { const { settings } = settingsStore; const workingHoursMs = settings.numberOfWorkingHours; + const style = useStyle(); + const [dayUpdateEveryDay, setDayUpdateEveryDay] = useState(new Date()); const [timer, setTimer] = useState(new Date()); @@ -26,7 +30,7 @@ function ProgressBar() { }, [dayUpdateEveryDay]); useInterval(shouldDayUpdate); - + 1 + 1; const tasks = useMemo(() => tasksStore.getTasksByDate(dayUpdateEveryDay), [ tasksStore.tasks, dayUpdateEveryDay, @@ -45,7 +49,7 @@ function ProgressBar() { timeItems, ]); - const progress = useMemo( + const { estimatedWorkingTimeEnd, progress } = useMemo( () => TaskTimeService.getDayProgress( timeRangeItems, @@ -55,9 +59,25 @@ function ProgressBar() { [timer, timeRangeItems, workingTimeStart, workingHoursMs] ); - console.log(progress); + const marks = useMemo( + () => ({ + 0: toTimeFormat(workingTimeStart), + 100: toTimeFormat(estimatedWorkingTimeEnd), + }), + [timer, workingTimeStart, estimatedWorkingTimeEnd] + ); - return ; + return ; } +const useStyle = createUseStyles({ + slider: { + '& .ant-slider-mark': { + '& .ant-slider-mark-text': { + color: 'white', + }, + }, + }, +}); + export default observer(ProgressBar); diff --git a/src/services/TaskTimeService.ts b/src/services/TaskTimeService.ts index 2459e7e..dc808f5 100644 --- a/src/services/TaskTimeService.ts +++ b/src/services/TaskTimeService.ts @@ -5,14 +5,26 @@ import { } from '../helpers/DateTime'; import { ITimeRangeModel } from '../modules/tasks/models/TaskModel'; +export type DayProgress = { + progress: number; + durationMs: number; + restMs: number; + estimatedWorkingTimeEnd: Date | undefined; +}; + const TaskTimeService = { getDayProgress( timeItems: ITimeRangeModel[], workingTimeStart: Date | undefined, workingHoursMs: number - ) { + ): DayProgress { if (!workingTimeStart) { - return 0; + return { + progress: 0, + durationMs: 0, + restMs: 0, + estimatedWorkingTimeEnd: undefined, + }; } const durationMs = calcDuration(timeItems); @@ -23,13 +35,19 @@ const TaskTimeService = { workingHoursMs ); + let progress = 0; if (estimatedWorkingTimeEnd) { const durationWorkDayMs = estimatedWorkingTimeEnd.getTime() - workingTimeStart.getTime() || 1; - return (durationMs * 100) / durationWorkDayMs; + progress = (durationMs * 100) / durationWorkDayMs; } - return 0; + return { + progress, + durationMs, + restMs, + estimatedWorkingTimeEnd, + }; }, }; From d932f05b88e73828b1ed0d917a66969d7bd32f59 Mon Sep 17 00:00:00 2001 From: yadro Date: Fri, 26 Nov 2021 23:39:41 +0300 Subject: [PATCH 39/84] ProgressBar --- package.json | 7 +- src/components/ProgressBar/ProgressBar.tsx | 57 +- src/helpers/ArrayHelper.ts | 22 +- src/helpers/DateTime.ts | 5 - src/helpers/TaskHelper.ts | 4 +- src/helpers/TreeModelHelper.test.ts | 2 - src/helpers/TreeModelHelper.ts | 2 +- src/hooks/TaskHooks.ts | 3 +- src/modules/tasks/TaskStore.ts | 25 +- .../tasks/models/TaskWithProjectNameModel.ts | 2 +- .../components/ProjectModals/ProjectModal.tsx | 3 +- src/screens/projects/components/TaskInput.tsx | 54 +- src/services/TaskTimeService.ts | 1 + yarn.lock | 2333 ++++++++++++++--- 14 files changed, 2087 insertions(+), 433 deletions(-) diff --git a/package.json b/package.json index 9ee4985..3a193df 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "start": "node -r @babel/register ./.erb/scripts/CheckPortInUse.js && cross-env yarn start:renderer", "start:main": "cross-env NODE_ENV=development electron -r ./.erb/scripts/BabelRegister ./src/main.dev.ts", "start:renderer": "cross-env NODE_ENV=development webpack serve --config ./.erb/configs/webpack.config.renderer.dev.babel.js", - "test": "jest" + "test": "jest", + "tsc": "tsc" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -166,6 +167,7 @@ "@types/react": "^16.9.44", "@types/react-dom": "^16.9.9", "@types/react-router-dom": "^5.1.6", + "@types/uuid": "^8.3.3", "@types/webpack-env": "^1.15.2", "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", @@ -250,7 +252,8 @@ "react-router-dom": "^5.2.0", "regenerator-runtime": "^0.13.5", "source-map-support": "^0.5.19", - "universal-analytics": "^0.4.23" + "universal-analytics": "^0.4.23", + "uuid": "^8.3.2" }, "devEngines": { "node": ">=14.x", diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx index ba822a7..d9c5075 100644 --- a/src/components/ProgressBar/ProgressBar.tsx +++ b/src/components/ProgressBar/ProgressBar.tsx @@ -19,26 +19,30 @@ function ProgressBar() { const style = useStyle(); const [dayUpdateEveryDay, setDayUpdateEveryDay] = useState(new Date()); - const [timer, setTimer] = useState(new Date()); + const [_tick, setTick] = useState(new Date()); const shouldDayUpdate = useCallback(() => { const now = new Date(); - setTimer(now); + setTick(now); if (!isSameDay(dayUpdateEveryDay, now)) { setDayUpdateEveryDay(now); } }, [dayUpdateEveryDay]); useInterval(shouldDayUpdate); - 1 + 1; - const tasks = useMemo(() => tasksStore.getTasksByDate(dayUpdateEveryDay), [ + + const tasksByProject = useMemo(() => Object.values(tasksStore.tasks), [ tasksStore.tasks, + tasksStore.versionHash, + ]); + + const tasks = useMemo(() => tasksStore.getTasksByDate(dayUpdateEveryDay), [ + tasksByProject, dayUpdateEveryDay, ]); const timeItems = useMemo(() => getTimeItems(tasks, dayUpdateEveryDay), [ tasks, - dayUpdateEveryDay, ]); const workingTimeStart = useMemo(() => getStartWorkingTime(timeItems), [ @@ -49,25 +53,36 @@ function ProgressBar() { timeItems, ]); - const { estimatedWorkingTimeEnd, progress } = useMemo( - () => - TaskTimeService.getDayProgress( - timeRangeItems, - workingTimeStart, - workingHoursMs - ), - [timer, timeRangeItems, workingTimeStart, workingHoursMs] + const { estimatedWorkingTimeEnd, progress } = TaskTimeService.getDayProgress( + timeRangeItems, + workingTimeStart, + workingHoursMs ); - const marks = useMemo( - () => ({ - 0: toTimeFormat(workingTimeStart), - 100: toTimeFormat(estimatedWorkingTimeEnd), - }), - [timer, workingTimeStart, estimatedWorkingTimeEnd] - ); + const progressRound = Math.round(progress); + const marks: Record = { + 0: toTimeFormat(workingTimeStart), + 100: toTimeFormat(estimatedWorkingTimeEnd), + }; + if (progressRound > 10 && progressRound < 90) { + marks[progressRound] = `${progressRound}%`; + } - return ; + const tipFormatter = useMemo(() => { + if (progressRound <= 10 || progressRound >= 90) { + return (value?: number) => `${value}%`; + } + return null; + }, [progressRound]); + + return ( + + ); } const useStyle = createUseStyles({ diff --git a/src/helpers/ArrayHelper.ts b/src/helpers/ArrayHelper.ts index cac4b2a..b47b214 100644 --- a/src/helpers/ArrayHelper.ts +++ b/src/helpers/ArrayHelper.ts @@ -1,8 +1,8 @@ type CallbackPrev = (prev: T | undefined, cur: T, index: number) => R; -export function iterPrevCurrent( +export function iterPrevCurrent( items: T[], - callback: CallbackPrev + callback: CallbackPrev ) { for (let i = 0; i < items.length; i++) { if (i === 0) { @@ -13,11 +13,11 @@ export function iterPrevCurrent( } } -export function mapPrevCurrent( +export function mapPrevCurrent( items: T[], - callback: CallbackPrev -): R[] { - const result: R[] = []; + callback: CallbackPrev +): Result[] { + const result: Result[] = []; for (let i = 0; i < items.length; i++) { if (i === 0) { result.push(callback(undefined, items[i], i)); @@ -30,11 +30,11 @@ export function mapPrevCurrent( type CallbackNext = (cur: T, next: T | undefined, index: number) => R; -export function mapCurrentNext( +export function mapCurrentNext( items: T[], - callback: CallbackNext -): R[] { - const result: R[] = []; + callback: CallbackNext +): Result[] { + const result: Result[] = []; for (let i = 0; i < items.length; i++) { if (i === items.length - 1) { result.push(callback(items[i], undefined, i)); @@ -47,4 +47,4 @@ export function mapCurrentNext( export function last(arr: T[]): T | undefined { return arr[arr.length - 1]; -} \ No newline at end of file +} diff --git a/src/helpers/DateTime.ts b/src/helpers/DateTime.ts index cc91e49..8125e9d 100644 --- a/src/helpers/DateTime.ts +++ b/src/helpers/DateTime.ts @@ -84,11 +84,6 @@ export function calcDurationGaps(taskTime: ITimeRangeModel[]): number { } }); - const lastTask = taskTime[taskTime.length - 1]; - if (lastTask && lastTask.end) { - result += new Date().getTime() - lastTask.end.getTime(); - } - return result; } diff --git a/src/helpers/TaskHelper.ts b/src/helpers/TaskHelper.ts index 6315ea2..1b29c0f 100644 --- a/src/helpers/TaskHelper.ts +++ b/src/helpers/TaskHelper.ts @@ -23,17 +23,15 @@ export function getTimeItems( ): TaskTimeItemModel[] { const taskTime: TaskTimeItemModel[] = []; tasks.forEach((task) => { - const taskTimeItems: TaskTimeItemModel[] = []; for (let i = 0; i < task.time.length; i++) { const range = task.time[i]; if ( isSameDay(range.start, date) || (range.end && isSameDay(range.end, date)) ) { - taskTimeItems.push(new TaskTimeItemModel(task, range, i)); + taskTime.push(new TaskTimeItemModel(task, range, i)); } } - taskTime.push(...taskTimeItems); }); taskTime.sort((a, b) => compareAsc(a.time.start, b.time.start)); diff --git a/src/helpers/TreeModelHelper.test.ts b/src/helpers/TreeModelHelper.test.ts index ff3271c..635e8d5 100644 --- a/src/helpers/TreeModelHelper.test.ts +++ b/src/helpers/TreeModelHelper.test.ts @@ -83,6 +83,4 @@ describe('TreeModelHelper', () => { const task22 = testTasks.proj[1].children[0]; expect(TreeModelHelper.getPathToNode(task22)).toStrictEqual(['2', '21']); }); - - test(''); }); diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index 3d86532..a8a3d6e 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -42,7 +42,7 @@ const TreeModelHelper = { details: [], expanded: true, inMyDay: new Date().toString(), - parent: null, + parent: undefined, time: [], withoutActions: true, }) diff --git a/src/hooks/TaskHooks.ts b/src/hooks/TaskHooks.ts index 15a417c..4e78287 100644 --- a/src/hooks/TaskHooks.ts +++ b/src/hooks/TaskHooks.ts @@ -1,5 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { isBefore } from 'date-fns'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { calcDuration, calcDurationGaps, msToTime } from '../helpers/DateTime'; import TaskModel, { ITimeRangeModel } from '../modules/tasks/models/TaskModel'; diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 505187a..6860153 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -1,5 +1,5 @@ -import { autorun, makeAutoObservable } from 'mobx'; - +import { autorun, makeAutoObservable, observable } from 'mobx'; +import { v4 as uuid } from 'uuid'; import TaskService from './TaskService'; import TaskModel, { ITimeRangeModel } from './models/TaskModel'; import { @@ -23,6 +23,7 @@ import { ITreeItemWithParent } from '../../types/ITreeItem'; export default class TaskStore { tasks: TasksByProject = {}; activeTask: TaskModel | undefined; + versionHash = uuid(); private tasksService = new TaskService(); private interval: NodeJS.Timeout | undefined; @@ -37,13 +38,14 @@ export default class TaskStore { } set(projectId: string, tasksInProject: TaskModel[]) { - this.tasks[projectId] = tasksInProject; + this.tasks[projectId] = observable.array(tasksInProject); this.tasksService.save(this.tasks); } setTime(task: TaskModel, timeIndex: number, timeRange: ITimeRangeModel) { task.time[timeIndex] = timeRange; this.tasksService.save(this.tasks); + this.updateVersion(); GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Update); } @@ -54,6 +56,7 @@ export default class TaskStore { task.time.splice(timeIndex, 1); this.tasksService.save(this.tasks); + this.updateVersion(); GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Delete); } @@ -92,10 +95,10 @@ export default class TaskStore { add(task: TaskModel) { const { projectId } = task; if (!Array.isArray(this.tasks[projectId])) { - this.tasks[projectId] = []; + this.tasks[projectId] = observable.array(); // TODO this.set() } this.tasks[projectId].push(task); - this.tasks[projectId] = this.tasks[projectId].slice(); + this.updateVersion(); this.tasksService.save(this.tasks); GaService.event(EEventCategory.Tasks, ETasksEvents.Create); } @@ -130,12 +133,14 @@ export default class TaskStore { } } this.tasksService.save(this.tasks); + this.updateVersion(); GaService.event(EEventCategory.Tasks, ETasksEvents.Delete); } deleteProjectTasks(projectKey: string) { delete this.tasks[projectKey]; this.tasksService.save(this.tasks); + this.updateVersion(); } startTimer(task: TaskModel) { @@ -144,6 +149,7 @@ export default class TaskStore { task.start(); this.setupReminder(task); this.tasksService.save(this.tasks); + this.updateVersion(); } stopTimer(silent?: boolean) { @@ -155,6 +161,7 @@ export default class TaskStore { if (!silent) { this.setupReminder(); this.tasksService.save(this.tasks); + this.updateVersion(); } } @@ -188,7 +195,7 @@ export default class TaskStore { checkTaskFn ); - this.set(projectId, this.tasks[projectId].slice()); + this.set(projectId, this.tasks[projectId]); } GaService.event(EEventCategory.Tasks, ETasksEvents.Check); } @@ -207,7 +214,7 @@ export default class TaskStore { markExpanded ); - this.set(projectId, this.tasks[projectId].slice()); + this.set(projectId, this.tasks[projectId]); } } @@ -275,4 +282,8 @@ export default class TaskStore { clearInterval(this.interval); } } + + private updateVersion() { + this.versionHash = uuid(); + } } diff --git a/src/modules/tasks/models/TaskWithProjectNameModel.ts b/src/modules/tasks/models/TaskWithProjectNameModel.ts index 11a349b..79df8c2 100644 --- a/src/modules/tasks/models/TaskWithProjectNameModel.ts +++ b/src/modules/tasks/models/TaskWithProjectNameModel.ts @@ -13,7 +13,7 @@ export class TaskWithProjectNameModel extends AbstractModel implements ITreeItemWithParent { key: string = ''; title: string = ''; - parent: TaskModel | null = null; + parent: TaskModel | undefined = undefined; children: TaskModel[] = []; constructor(props: ITaskWithProjectName) { diff --git a/src/screens/projects/components/ProjectModals/ProjectModal.tsx b/src/screens/projects/components/ProjectModals/ProjectModal.tsx index d6bb635..0993f13 100644 --- a/src/screens/projects/components/ProjectModals/ProjectModal.tsx +++ b/src/screens/projects/components/ProjectModals/ProjectModal.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { observer } from 'mobx-react'; import { Input, Modal, Space } from 'antd'; +import { v4 as uuid } from 'uuid'; import rootStore from '../../../../modules/RootStore'; import ProjectModel from '../../../../modules/projects/models/ProjectModel'; @@ -27,7 +28,7 @@ export default observer(function ProjectModal({ function handleOk() { projectStore.add( new ProjectModel({ - key: String(Date.now()), + key: uuid(), title: projectName, color: color || '', children: [], diff --git a/src/screens/projects/components/TaskInput.tsx b/src/screens/projects/components/TaskInput.tsx index 4bf65b1..0ac9992 100644 --- a/src/screens/projects/components/TaskInput.tsx +++ b/src/screens/projects/components/TaskInput.tsx @@ -1,6 +1,7 @@ -import React, { KeyboardEvent, useState } from 'react'; +import React, { KeyboardEvent, useCallback, useState } from 'react'; import { Input } from 'antd'; import { observer } from 'mobx-react'; +import { v4 as uuid } from 'uuid'; import rootStore from '../../../modules/RootStore'; import TaskModel from '../../../modules/tasks/models/TaskModel'; @@ -8,35 +9,40 @@ import TaskModel from '../../../modules/tasks/models/TaskModel'; export default observer(function TaskInput() { const [text, setText] = useState(''); - function handleKeyPress(event: KeyboardEvent) { - // Hotkey: Enter - if (event.key === 'Enter') { - const { tasksStore, projectStore } = rootStore; - tasksStore.add( - new TaskModel({ - key: String(Date.now()), - title: text, - projectId: projectStore.activeProject, - active: false, - time: [], - checked: false, - children: [], - datesInProgress: [], - details: [], - parent: null, // Add into root - expanded: true, - }) - ); - setText(''); - } - } + const handleKeyPress = useCallback( + (event: KeyboardEvent) => { + // Hotkey: Enter + if (event.key === 'Enter') { + const { tasksStore, projectStore } = rootStore; + tasksStore.add( + new TaskModel({ + key: uuid(), + title: text, + projectId: projectStore.activeProject, + active: false, + time: [], + checked: false, + children: [], + datesInProgress: [], + details: [], + parent: undefined, // Add into root + expanded: true, + }) + ); + setText(''); + } + }, + [text] + ); + + const handleChange = useCallback((e: any) => setText(e.target.value), []); return ( setText(e.target.value)} + onChange={handleChange} /> ); }); diff --git a/src/services/TaskTimeService.ts b/src/services/TaskTimeService.ts index dc808f5..376ed53 100644 --- a/src/services/TaskTimeService.ts +++ b/src/services/TaskTimeService.ts @@ -40,6 +40,7 @@ const TaskTimeService = { const durationWorkDayMs = estimatedWorkingTimeEnd.getTime() - workingTimeStart.getTime() || 1; progress = (durationMs * 100) / durationWorkDayMs; + progress = Math.min(progress, 100); } return { diff --git a/yarn.lock b/yarn.lock index 26b2a34..dea05ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,46 +41,45 @@ lodash "^4.17.15" resize-observer-polyfill "^1.5.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@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.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.12.7", "@babel/compat-data@^7.16.0": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.7.2", "@babel/core@^7.7.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" + semver "^6.3.0" 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" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== +"@babel/generator@^7.16.0", "@babel/generator@^7.7.2": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.16.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -116,15 +115,15 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" - integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== +"@babel/helper-compilation-targets@^7.12.5", "@babel/helper-compilation-targets@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== dependencies: - "@babel/compat-data" "^7.12.5" - "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.14.5" - semver "^5.5.0" + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.12.1": version "7.12.1" @@ -162,69 +161,68 @@ dependencies: "@babel/types" "^7.12.1" -"@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" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" -"@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" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.0" -"@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" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/helper-hoist-variables@^7.10.4", "@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.0" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== +"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.0" -"@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" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.16.0" -"@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" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - lodash "^4.17.19" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.0" -"@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.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== "@babel/helper-regex@^7.10.4": version "7.10.5" @@ -242,22 +240,22 @@ "@babel/helper-wrap-function" "^7.10.4" "@babel/types" "^7.12.1" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== +"@babel/helper-replace-supers@^7.12.1", "@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@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" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-simple-access@^7.12.1", "@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.0" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -266,22 +264,22 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.16.0" -"@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.10.4", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@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.1", "@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== "@babel/helper-wrap-function@^7.10.4": version "7.12.3" @@ -293,28 +291,28 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.15.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@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" - integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.1" @@ -481,19 +479,26 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" - integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.8.3": + 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-decorators@^7.12.1": version "7.12.1" @@ -544,14 +549,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-import-meta@^7.10.4": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -565,42 +570,42 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": 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" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -621,19 +626,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-top-level-await@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== +"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" -"@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-typescript@^7.12.1", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.12.1": version "7.12.1" @@ -1097,39 +1102,51 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.7.0": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" - integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" +"@babel/template@^7.10.4", "@babel/template@^7.16.0", "@babel/template@^7.3.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" 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.4.4", "@babel/types@^7.7.0": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@ctrl/tinycolor@^3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" @@ -1198,6 +1215,223 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.3.1.tgz#e8ea3a475d3f8162f23d69efbfaa9cbe486bee93" + integrity sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw== + dependencies: + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.3.1" + jest-util "^27.3.1" + slash "^3.0.0" + +"@jest/core@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.3.1.tgz#04992ef1b58b17c459afb87ab56d81e63d386925" + integrity sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg== + dependencies: + "@jest/console" "^27.3.1" + "@jest/reporters" "^27.3.1" + "@jest/test-result" "^27.3.1" + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^27.3.0" + jest-config "^27.3.1" + jest-haste-map "^27.3.1" + jest-message-util "^27.3.1" + jest-regex-util "^27.0.6" + jest-resolve "^27.3.1" + jest-resolve-dependencies "^27.3.1" + jest-runner "^27.3.1" + jest-runtime "^27.3.1" + jest-snapshot "^27.3.1" + jest-util "^27.3.1" + jest-validate "^27.3.1" + jest-watcher "^27.3.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.3.1.tgz#2182defbce8d385fd51c5e7c7050f510bd4c86b1" + integrity sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw== + dependencies: + "@jest/fake-timers" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + jest-mock "^27.3.0" + +"@jest/fake-timers@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.3.1.tgz#1fad860ee9b13034762cdb94266e95609dfce641" + integrity sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA== + dependencies: + "@jest/types" "^27.2.5" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.3.1" + jest-mock "^27.3.0" + jest-util "^27.3.1" + +"@jest/globals@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.3.1.tgz#ce1dfb03d379237a9da6c1b99ecfaca1922a5f9e" + integrity sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg== + dependencies: + "@jest/environment" "^27.3.1" + "@jest/types" "^27.2.5" + expect "^27.3.1" + +"@jest/reporters@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.3.1.tgz#28b5c1f5789481e23788048fa822ed15486430b9" + integrity sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.3.1" + "@jest/test-result" "^27.3.1" + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^27.3.1" + jest-resolve "^27.3.1" + jest-util "^27.3.1" + jest-worker "^27.3.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.0.6": + version "27.0.6" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" + integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.3.1.tgz#89adee8b771877c69b3b8d59f52f29dccc300194" + integrity sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg== + dependencies: + "@jest/console" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.3.1.tgz#4b3bde2dbb05ee74afdae608cf0768e3354683b1" + integrity sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA== + dependencies: + "@jest/test-result" "^27.3.1" + graceful-fs "^4.2.4" + jest-haste-map "^27.3.1" + jest-runtime "^27.3.1" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^27.3.1": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.3.1.tgz#ff80eafbeabe811e9025e4b6f452126718455220" + integrity sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.2.5" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.3.1" + jest-regex-util "^27.0.6" + jest-util "^27.3.1" + micromatch "^4.0.4" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.2.5": + version "27.2.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" + integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" @@ -1349,6 +1583,20 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1374,11 +1622,49 @@ optionalDependencies: prettier "*" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@trysound/sax@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + "@types/cacheable-request@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" @@ -1430,6 +1716,13 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + "@types/history@*": version "4.7.8" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" @@ -1445,10 +1738,37 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^26.0.24": + version "26.0.24" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" @@ -1490,6 +1810,11 @@ "@types/node" "*" xmlbuilder ">=11.0.1" +"@types/prettier@^2.1.5": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" + integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -1539,6 +1864,16 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb" integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ== +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/uuid@^8.3.3": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.3.tgz#c6a60686d953dbd1b1d45e66f4ecdbd5d471b4d0" + integrity sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA== + "@types/verror@^1.10.3": version "1.10.4" resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.4.tgz#805c0612b3a0c124cf99f517364142946b74ba3b" @@ -1554,7 +1889,14 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^16.0.2": +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0", "@types/yargs@^16.0.2": version "16.0.4" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== @@ -1586,6 +1928,18 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" +"@typescript-eslint/experimental-utils@^4.0.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/parser@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.4.1.tgz#25fde9c080611f303f2f33cedb145d2c59915b80" @@ -1606,6 +1960,14 @@ "@typescript-eslint/typescript-estree" "4.8.1" debug "^4.1.1" +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/scope-manager@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.4.1.tgz#d19447e60db2ce9c425898d62fa03b2cce8ea3f9" @@ -1622,6 +1984,11 @@ "@typescript-eslint/types" "4.8.1" "@typescript-eslint/visitor-keys" "4.8.1" +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + "@typescript-eslint/types@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.4.1.tgz#c507b35cf523bc7ba00aae5f75ee9b810cdabbc1" @@ -1632,6 +1999,19 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.1.tgz#23829c73c5fc6f4fcd5346a7780b274f72fee222" integrity sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA== +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/typescript-estree@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.4.1.tgz#598f6de488106c2587d47ca2462c60f6e2797cb8" @@ -1660,6 +2040,14 @@ semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + "@typescript-eslint/visitor-keys@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.4.1.tgz#1769dc7a9e2d7d2cfd3318b77ed8249187aed5c3" @@ -1848,6 +2236,11 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1861,25 +2254,38 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-jsx@^5.2.0: 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== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + acorn-walk@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16" integrity sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA== -acorn@^7.4.0: +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== -acorn@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" - integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== +acorn@^8.0.4, acorn@^8.2.4: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== address@^1.0.1: version "1.1.2" @@ -1948,12 +2354,12 @@ ansi-colors@^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-escapes@^4.3.0: - 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== +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-html@0.0.7, ansi-html@^0.0.7: version "0.0.7" @@ -1975,10 +2381,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" @@ -1999,6 +2405,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + antd@4.16.7: version "4.16.7" resolved "https://registry.yarnpkg.com/antd/-/antd-4.16.7.tgz#c51fb143288adb8b008a786efe8d5df13320ac4c" @@ -2055,6 +2466,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + app-builder-bin@3.5.13: version "3.5.13" resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.13.tgz#6dd7f4de34a4e408806f99b8c7d6ef1601305b7e" @@ -2368,6 +2787,34 @@ babel-eslint@^10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" +babel-jest@^26.1.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-jest@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.3.1.tgz#0636a3404c68e07001e434ac4956d82da8a80022" + integrity sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ== + dependencies: + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^27.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2390,11 +2837,76 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" +babel-plugin-istanbul@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" + integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" + integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== + dependencies: + babel-plugin-jest-hoist "^27.2.0" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -2557,6 +3069,11 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + 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" @@ -2623,16 +3140,23 @@ browserslist-config-erb@^0.0.1: resolved "https://registry.yarnpkg.com/browserslist-config-erb/-/browserslist-config-erb-0.0.1.tgz#0a93648bbe11fac5b9fe555bf061f31980db64db" integrity sha512-QQQzCXrYVVdSWxO0UuV+f2HGBt7xdGRRvgr49W1lcwoyXNpRQFVi5cTz8+B/rLHyBkWd4JbRFeTIKHAw7BpCBg== -browserslist@^4.0.0, browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.14.7, browserslist@^4.16.0, browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== +browserslist@^4.0.0, browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.14.7, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.17.5: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" buffer-crc32@~0.2.3: version "0.2.13" @@ -2837,10 +3361,17 @@ caniuse-lite@1.0.30001214: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219: - version "1.0.30001242" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001242.tgz#04201627abcd60dc89211f22cbe2347306cda46b" - integrity sha512-KvNuZ/duufelMB3w2xtf9gEWCSxJwUgoxOx5b6ScLXC4kPc9xsczUVCPrQU26j5kOsHM4pSUL54tAZt5THQKug== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001280: + version "1.0.30001283" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" + integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" caseless@~0.12.0: version "0.12.0" @@ -2875,6 +3406,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2921,10 +3457,10 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" - integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== +ci-info@^3.1.1, ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -2934,6 +3470,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3031,11 +3572,21 @@ clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + 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" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3088,7 +3639,7 @@ colors@^1.3.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3264,10 +3815,10 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -3576,6 +4127,23 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" @@ -3600,6 +4168,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + date-fns@2.20.1, date-fns@^2.0.1, date-fns@^2.15.0: version "2.20.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.20.1.tgz#7e60b7035284a5f83e37500376e738d9f49ecfd3" @@ -3631,6 +4208,11 @@ decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -3672,10 +4254,15 @@ deep-extend@^0.6.0, deep-extend@~0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -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= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +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" @@ -3777,6 +4364,11 @@ detect-libc@^1.0.2, detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" @@ -3790,6 +4382,16 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diff-sequences@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -3911,6 +4513,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domhandler@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" @@ -4092,10 +4701,10 @@ electron-rebuild@^2.3.2: tar "^6.0.5" yargs "^16.0.0" -electron-to-chromium@^1.3.723: - version "1.3.768" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.768.tgz#bbe47394f0073c947168589b7d19388518a7a9a9" - integrity sha512-I4UMZHhVSK2pwt8jOIxTi3GIuc41NkddtKT/hpuxp9GO5UWJgDKTBa4TACppbVAuKtKbMK6BhQZvT5tFF1bcNA== +electron-to-chromium@^1.3.896: + version "1.4.4" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz#57311918524c1a26878c330537f967804d43788a" + integrity sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg== electron-updater@^4.3.4: version "4.3.5" @@ -4137,6 +4746,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -4303,11 +4917,28 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-airbnb-base@14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" @@ -4432,6 +5063,13 @@ eslint-plugin-import@^2.22.0: resolve "^1.17.0" tsconfig-paths "^3.9.0" +eslint-plugin-jest@^24.1.3: + version "24.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" + integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + eslint-plugin-jsx-a11y@6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" @@ -4498,6 +5136,13 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.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" @@ -4560,7 +5205,7 @@ espree@^7.3.0: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4624,6 +5269,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -4652,6 +5302,26 @@ execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -4665,6 +5335,18 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expect@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.3.1.tgz#d0f170b1f5c8a2009bab0beffd4bb94f043e38e7" + integrity sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg== + dependencies: + "@jest/types" "^27.2.5" + ansi-styles "^5.0.0" + jest-get-type "^27.3.1" + jest-matcher-utils "^27.3.1" + jest-message-util "^27.3.1" + jest-regex-util "^27.0.6" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -4782,7 +5464,7 @@ fast-json-stable-stringify@^2.0.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, 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= @@ -4801,6 +5483,13 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -4966,6 +5655,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -5047,6 +5745,11 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" +fsevents@^2.1.2, fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5078,7 +5781,7 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -5102,6 +5805,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -5126,6 +5834,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5158,7 +5871,19 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -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.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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.1.1: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -5219,10 +5944,10 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== +globby@^11.0.1, globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -5321,6 +6046,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5480,11 +6210,23 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + html-entities@^1.2.1, html-entities@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5532,6 +6274,15 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy-middleware@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -5586,6 +6337,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + husky@^4.2.5: version "4.3.0" resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" @@ -5634,6 +6390,13 @@ icss-utils@^5.0.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84" integrity sha512-aF2Cf/CkEZrI/vsu5WI/I+akFgdbwQHVE9YRZxATrhH4PVIe6a3BIjwjEcW+z+jP/hNh+YvM3lAAn1wJQ6opSg== +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -5866,10 +6629,10 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== dependencies: has "^1.0.3" @@ -5949,6 +6712,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6044,6 +6812,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.0.4, is-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" @@ -6083,84 +6856,589 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384" + integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^27.3.0: + version "27.3.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.3.0.tgz#22a02cc2b34583fc66e443171dc271c0529d263c" + integrity sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg== + dependencies: + "@jest/types" "^27.2.5" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.3.1.tgz#1679e74387cbbf0c6a8b42de963250a6469e0797" + integrity sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw== + dependencies: + "@jest/environment" "^27.3.1" + "@jest/test-result" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.3.1" + is-generator-fn "^2.0.0" + jest-each "^27.3.1" + jest-matcher-utils "^27.3.1" + jest-message-util "^27.3.1" + jest-runtime "^27.3.1" + jest-snapshot "^27.3.1" + jest-util "^27.3.1" + pretty-format "^27.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.3.1.tgz#b576f9d146ba6643ce0a162d782b40152b6b1d16" + integrity sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q== + dependencies: + "@jest/core" "^27.3.1" + "@jest/test-result" "^27.3.1" + "@jest/types" "^27.2.5" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + jest-config "^27.3.1" + jest-util "^27.3.1" + jest-validate "^27.3.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.3.1.tgz#cb3b7f6aaa8c0a7daad4f2b9573899ca7e09bbad" + integrity sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^27.3.1" + "@jest/types" "^27.2.5" + babel-jest "^27.3.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-circus "^27.3.1" + jest-environment-jsdom "^27.3.1" + jest-environment-node "^27.3.1" + jest-get-type "^27.3.1" + jest-jasmine2 "^27.3.1" + jest-regex-util "^27.0.6" + jest-resolve "^27.3.1" + jest-runner "^27.3.1" + jest-util "^27.3.1" + jest-validate "^27.3.1" + micromatch "^4.0.4" + pretty-format "^27.3.1" + +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-diff@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.3.1.tgz#d2775fea15411f5f5aeda2a5e02c2f36440f6d55" + integrity sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.0.6" + jest-get-type "^27.3.1" + pretty-format "^27.3.1" + +jest-docblock@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" + integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.3.1.tgz#14c56bb4f18dd18dc6bdd853919b5f16a17761ff" + integrity sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ== + dependencies: + "@jest/types" "^27.2.5" + chalk "^4.0.0" + jest-get-type "^27.3.1" + jest-util "^27.3.1" + pretty-format "^27.3.1" + +jest-environment-jsdom@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.3.1.tgz#63ac36d68f7a9303494df783494856222b57f73e" + integrity sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg== + dependencies: + "@jest/environment" "^27.3.1" + "@jest/fake-timers" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + jest-mock "^27.3.0" + jest-util "^27.3.1" + jsdom "^16.6.0" + +jest-environment-node@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.3.1.tgz#af7d0eed04edafb740311b303f3fe7c8c27014bb" + integrity sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw== + dependencies: + "@jest/environment" "^27.3.1" + "@jest/fake-timers" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + jest-mock "^27.3.0" + jest-util "^27.3.1" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +jest-get-type@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.3.1.tgz#a8a2b0a12b50169773099eee60a0e6dd11423eff" + integrity sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg== -is-what@^3.12.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +jest-haste-map@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.3.1.tgz#7656fbd64bf48bda904e759fc9d93e2c807353ee" + integrity sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg== + dependencies: + "@jest/types" "^27.2.5" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.3.1" + jest-worker "^27.3.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.3.1.tgz#df6d3d07c7dafc344feb43a0072a6f09458d32b0" + integrity sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^27.3.1" + "@jest/source-map" "^27.0.6" + "@jest/test-result" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.3.1" + is-generator-fn "^2.0.0" + jest-each "^27.3.1" + jest-matcher-utils "^27.3.1" + jest-message-util "^27.3.1" + jest-runtime "^27.3.1" + jest-snapshot "^27.3.1" + jest-util "^27.3.1" + pretty-format "^27.3.1" + throat "^6.0.1" + +jest-leak-detector@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.3.1.tgz#7fb632c2992ef707a1e73286e1e704f9cc1772b2" + integrity sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg== + dependencies: + jest-get-type "^27.3.1" + pretty-format "^27.3.1" + +jest-matcher-utils@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz#257ad61e54a6d4044e080d85dbdc4a08811e9c1c" + integrity sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w== + dependencies: + chalk "^4.0.0" + jest-diff "^27.3.1" + jest-get-type "^27.3.1" + pretty-format "^27.3.1" + +jest-message-util@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.3.1.tgz#f7c25688ad3410ab10bcb862bcfe3152345c6436" + integrity sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.2.5" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + pretty-format "^27.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +jest-mock@^27.3.0: + version "27.3.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.3.0.tgz#ddf0ec3cc3e68c8ccd489bef4d1f525571a1b867" + integrity sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw== + dependencies: + "@jest/types" "^27.2.5" + "@types/node" "*" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-regex-util@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" + integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== + +jest-resolve-dependencies@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.3.1.tgz#85b99bdbdfa46e2c81c6228fc4c91076f624f6e2" + integrity sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A== + dependencies: + "@jest/types" "^27.2.5" + jest-regex-util "^27.0.6" + jest-snapshot "^27.3.1" + +jest-resolve@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.3.1.tgz#0e5542172a1aa0270be6f66a65888647bdd74a3e" + integrity sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw== + dependencies: + "@jest/types" "^27.2.5" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.3.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.3.1" + jest-validate "^27.3.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= +jest-runner@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.3.1.tgz#1d594dcbf3bd8600a7e839e790384559eaf96e3e" + integrity sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww== + dependencies: + "@jest/console" "^27.3.1" + "@jest/environment" "^27.3.1" + "@jest/test-result" "^27.3.1" + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-docblock "^27.0.6" + jest-environment-jsdom "^27.3.1" + jest-environment-node "^27.3.1" + jest-haste-map "^27.3.1" + jest-leak-detector "^27.3.1" + jest-message-util "^27.3.1" + jest-resolve "^27.3.1" + jest-runtime "^27.3.1" + jest-util "^27.3.1" + jest-worker "^27.3.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.3.1.tgz#80fa32eb85fe5af575865ddf379874777ee993d7" + integrity sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg== + dependencies: + "@jest/console" "^27.3.1" + "@jest/environment" "^27.3.1" + "@jest/globals" "^27.3.1" + "@jest/source-map" "^27.0.6" + "@jest/test-result" "^27.3.1" + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-haste-map "^27.3.1" + jest-message-util "^27.3.1" + jest-mock "^27.3.0" + jest-regex-util "^27.0.6" + jest-resolve "^27.3.1" + jest-snapshot "^27.3.1" + jest-util "^27.3.1" + jest-validate "^27.3.1" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^16.2.0" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" -isbinaryfile@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== +jest-serializer@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" + integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +jest-snapshot@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.3.1.tgz#1da5c0712a252d70917d46c037054f5918c49ee4" + integrity sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/parser" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.3.1" + graceful-fs "^4.2.4" + jest-diff "^27.3.1" + jest-get-type "^27.3.1" + jest-haste-map "^27.3.1" + jest-matcher-utils "^27.3.1" + jest-message-util "^27.3.1" + jest-resolve "^27.3.1" + jest-util "^27.3.1" + natural-compare "^1.4.0" + pretty-format "^27.3.1" + semver "^7.3.2" -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== dependencies: - isarray "1.0.0" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jest-util@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.3.1.tgz#a58cdc7b6c8a560caac9ed6bdfc4e4ff23f80429" + integrity sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw== + dependencies: + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.4" + picomatch "^2.2.3" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +jest-validate@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.3.1.tgz#3a395d61a19cd13ae9054af8cdaf299116ef8a24" + integrity sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q== + dependencies: + "@jest/types" "^27.2.5" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.3.1" + leven "^3.1.0" + pretty-format "^27.3.1" -jake@^10.6.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" - integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== +jest-watcher@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.3.1.tgz#ba5e0bc6aa843612b54ddb7f009d1cbff7e05f3e" + integrity sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA== dependencies: - async "0.9.x" - chalk "^2.4.2" - filelist "^1.0.1" - minimatch "^3.0.4" + "@jest/test-result" "^27.3.1" + "@jest/types" "^27.2.5" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.3.1" + string-length "^4.0.1" -jest-worker@^26.3.0, jest-worker@^26.6.1: +jest-worker@^26.3.0, jest-worker@^26.6.1, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -6169,6 +7447,24 @@ jest-worker@^26.3.0, jest-worker@^26.6.1: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" + integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.0.6: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.3.1.tgz#b5bab64e8f56b6f7e275ba1836898b0d9f1e5c8a" + integrity sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng== + dependencies: + "@jest/core" "^27.3.1" + import-local "^3.0.2" + jest-cli "^27.3.1" + js-base64@^2.1.8: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" @@ -6199,6 +7495,39 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -6507,6 +7836,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + klona@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" @@ -6573,6 +7907,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.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= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -6711,7 +8053,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6800,6 +8142,13 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -6923,13 +8272,13 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -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== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -7015,7 +8364,7 @@ minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7221,6 +8570,11 @@ node-gyp@^7.1.0: tar "^6.0.2" which "^2.0.2" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + "node-libs-browser@^1.0.0 || ^2.0.0": version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -7271,10 +8625,10 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== node-sass@^5.0.0: version "5.0.0" @@ -7381,7 +8735,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -7410,6 +8764,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -7524,7 +8883,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -7548,6 +8907,18 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + 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" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -7753,6 +9124,11 @@ parse-node-version@^1.0.1: resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -7869,10 +9245,15 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^2.0.0: version "2.3.0" @@ -7901,7 +9282,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -8222,6 +9603,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +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= + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -8239,6 +9625,26 @@ prettier@*, prettier@^2.0.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5" + integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA== + dependencies: + "@jest/types" "^27.2.5" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -8254,6 +9660,14 @@ progress@^2.0.0, progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -8281,7 +9695,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -psl@^1.1.28: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -8759,6 +10173,11 @@ react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-jss@^10.6.0: version "10.6.0" resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-10.6.0.tgz#3d1538d085c55f7b0bc3607a61943f588e56f0f6" @@ -9118,12 +10537,17 @@ 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.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.8.1, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -9214,6 +10638,11 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + run-parallel@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" @@ -9248,6 +10677,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" @@ -9281,6 +10725,13 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.20.1: version "0.20.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" @@ -9535,10 +10986,15 @@ side-channel@^1.0.2: es-abstract "^1.18.0-next.0" object-inspect "^1.8.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" @@ -9656,10 +11112,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.19: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -9782,6 +11238,13 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + stackframe@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" @@ -9841,6 +11304,14 @@ string-convert@^0.2.0: resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -9967,6 +11438,11 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10043,6 +11519,21 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + svgo@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.1.tgz#603a69ce50311c0e36791528f549644ec1b3f4bc" @@ -10061,6 +11552,11 @@ symbol-observable@1.2.0, symbol-observable@^1.2.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + table-layout@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.1.tgz#8411181ee951278ad0638aea2f779a9ce42894f9" @@ -10124,6 +11620,14 @@ temp-file@^3.4.0: async-exit-hook "^2.0.1" fs-extra "^10.0.0" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + terser-webpack-plugin@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#ec60542db2421f45735c719d2e17dabfbb2e3e42" @@ -10145,6 +11649,15 @@ terser@^5.3.8: source-map "~0.7.2" source-map-support "~0.5.19" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10160,6 +11673,11 @@ theming@^3.3.0: react-display-name "^0.2.4" tiny-warning "^1.0.2" +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -10206,6 +11724,11 @@ tmp@^0.2.0: dependencies: rimraf "^3.0.0" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -10263,6 +11786,15 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -10271,6 +11803,13 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -10315,10 +11854,10 @@ tslib@^2.1.0, tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsutils@^3.17.1, tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -10351,10 +11890,17 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -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== +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= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + 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.13.1: version "0.13.1" @@ -10366,6 +11912,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -10455,7 +12006,7 @@ universal-analytics@^0.4.23: request "^2.88.2" uuid "^3.0.0" -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -10595,11 +12146,25 @@ uuid@^3.0.0, uuid@^3.3.2, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== +v8-to-istanbul@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -10637,6 +12202,27 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + warning@^4.0.1, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -10666,6 +12252,16 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + webpack-bundle-analyzer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.1.0.tgz#31f9e5e187ee32fae2392b21806582cc6fe74cf9" @@ -10836,6 +12432,27 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -10879,7 +12496,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -word-wrap@^1.2.3: +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== @@ -10948,16 +12565,21 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.3.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== +ws@^7.3.1, ws@^7.4.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xmlbuilder@>=11.0.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" @@ -10968,6 +12590,11 @@ xmlbuilder@^9.0.7: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xmldom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" @@ -11037,7 +12664,7 @@ yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^16.0.0: +yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== From 0e453543d1f65ef6e15ce2d41c7d74baf540542c Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 16:34:16 +0300 Subject: [PATCH 40/84] Fix ts errors --- src/helpers/TreeModelHelper.test.ts | 27 ++++---- src/helpers/TreeModelHelper.ts | 63 +++++++++---------- src/modules/projects/models/ProjectModel.ts | 9 ++- src/modules/tasks/TaskService.ts | 19 +++--- src/modules/tasks/TaskStore.ts | 5 +- src/modules/tasks/models/TaskInMyDay.ts | 2 +- src/modules/tasks/models/TaskModel.ts | 5 +- .../tasks/models/TaskWithProjectNameModel.ts | 4 +- src/modules/tasks/models/TasksByProject.ts | 5 +- src/screens/projects/ProjectsScreen.tsx | 2 +- src/screens/projects/components/TreeList.tsx | 4 +- src/types/ITreeItem.ts | 10 ++- 12 files changed, 72 insertions(+), 83 deletions(-) diff --git a/src/helpers/TreeModelHelper.test.ts b/src/helpers/TreeModelHelper.test.ts index 635e8d5..f668b87 100644 --- a/src/helpers/TreeModelHelper.test.ts +++ b/src/helpers/TreeModelHelper.test.ts @@ -2,7 +2,6 @@ import TreeModelHelper from './TreeModelHelper'; import TaskFactory from '../modules/tasks/TaskFactory'; import { IJsonTaskModel } from '../modules/tasks/models/TaskModel'; import { TasksByProject } from '../modules/tasks/models/TasksByProject'; -import { ITreeItemWithParent } from '../types/ITreeItem'; describe('TreeModelHelper', () => { let testTasks: TasksByProject | undefined; @@ -19,19 +18,19 @@ describe('TreeModelHelper', () => { const task111: Partial = { key: '111', title: 'task1-1-1', - parent: null, + parent: undefined, children: [], }; const task11: Partial = { key: '11', title: 'task1-1', - parent: null, + parent: undefined, children: [task111 as IJsonTaskModel], }; const task1: Partial = { key: '1', title: 'task1', - parent: null, + parent: undefined, children: [task11 as IJsonTaskModel], }; @@ -41,19 +40,19 @@ describe('TreeModelHelper', () => { const task21: Partial = { key: '21', title: 'task21', - parent: null, + parent: undefined, children: [], }; const task22: Partial = { key: '22', title: 'task22', - parent: null, + parent: undefined, children: [], }; const task2: Partial = { key: '2', title: 'task2', - parent: null, + parent: undefined, children: [task21, task22] as IJsonTaskModel[], }; task21.parent = task2 as IJsonTaskModel; @@ -68,19 +67,17 @@ describe('TreeModelHelper', () => { if (!testTasks) { throw new Error(); } - const task111 = testTasks.proj[0].children[0].children[0]; - expect(TreeModelHelper.getPathToNode(task111)).toStrictEqual([ - '1', - '11', - '111', - ]); + const task111 = testTasks?.proj?.[0]?.children?.[0]?.children?.[0]; + const result = task111 ? TreeModelHelper.getPathToNode(task111) : undefined; + expect(result).toStrictEqual(['1', '11', '111']); }); test('getPathToNode #2', () => { if (!testTasks) { throw new Error(); } - const task22 = testTasks.proj[1].children[0]; - expect(TreeModelHelper.getPathToNode(task22)).toStrictEqual(['2', '21']); + const task22 = testTasks?.proj?.[1]?.children?.[0]; + const result = task22 ? TreeModelHelper.getPathToNode(task22) : undefined; + expect(result).toStrictEqual(['2', '21']); }); }); diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index a8a3d6e..f6036d4 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -52,7 +52,7 @@ const TreeModelHelper = { return TreeModelHelper.copyItemsToTree( sourceTree, - destProject.children, + destProject.children || [], keysToNode ); }, @@ -92,8 +92,8 @@ const TreeModelHelper = { if (nextDestNode) { // We already have a copy of node, go on keyIdx++; - sourceChildren = nextSourceNode.children; - destChildren = nextDestNode.children; + sourceChildren = nextSourceNode.children || []; + destChildren = nextDestNode.children || []; } else { // Make a copy from this node const restKeysToNode = keysToNode.slice(keyIdx); @@ -134,8 +134,8 @@ const TreeModelHelper = { return true; } - destChildren = copyNode.children; - sourceNode = sourceNode.children.find( + destChildren = copyNode.children || []; + sourceNode = sourceNode.children?.find( (node) => node.key === keysToNode[keyIdx] ); if (!sourceNode) { @@ -144,7 +144,7 @@ const TreeModelHelper = { } }, - walkRecursive>( + walkRecursive( fn: (item: T, parent?: T) => void, treeItems: T[], parent?: T @@ -152,22 +152,22 @@ const TreeModelHelper = { treeItems.forEach((item) => { fn(item, parent); if (item.children?.length) { - TreeModelHelper.walkRecursive(fn, item.children, item); + this.walkRecursive(fn, item.children as T[], item); } }); }, - walkToParent>( + walkToParent( fn: (nParent: T) => void, treeItem: T ) { if (treeItem.parent) { - fn(treeItem.parent); - TreeModelHelper.walkToParent(fn, treeItem.parent); + fn(treeItem.parent as T); + this.walkToParent(fn, treeItem.parent as T); } }, - modifyItemsWithIdsRecursive>( + modifyItemsWithIdsRecursive( treeItems: T[], ids: string[], fn: (treeItem: T, ids: string[]) => void @@ -175,21 +175,21 @@ const TreeModelHelper = { treeItems.forEach((item) => { fn(item, ids); if (Array.isArray(item.children) && item.children.length) { - TreeModelHelper.modifyItemsWithIdsRecursive(item.children, ids, fn); + this.modifyItemsWithIdsRecursive(item.children as T[], ids, fn); } }); }, - getItemRecursive>( - tasks: T[], + getItemRecursive( + items: T[], condition: (task: T) => boolean ): T | undefined { - for (const task of tasks) { - if (condition(task)) { - return task; + for (const item of items) { + if (condition(item)) { + return item; } - if (Array.isArray(task.children)) { - const found = this.getItemRecursive(task.children, condition); + if (item.children?.length) { + const found = this.getItemRecursive(item.children as T[], condition); if (found) { return found; } @@ -198,7 +198,7 @@ const TreeModelHelper = { return undefined; }, - getFlatItemsRecursive>( + getFlatItemsRecursive( tree: T[], condition: (task: T) => boolean ): T[] { @@ -209,33 +209,32 @@ const TreeModelHelper = { return result; }, - getFlatItemsRecursiveBase>( + getFlatItemsRecursiveBase( treeItems: T[], condition: (item: T) => boolean, result: T[] ): T[] { - for (const item of treeItems) { + treeItems.forEach((item) => { if (condition(item)) { result.push(item); } - if (Array.isArray(item.children)) { - this.getFlatItemsRecursiveBase(item.children, condition, result); + if (item.children?.length) { + this.getFlatItemsRecursiveBase(item.children as T[], condition, result); } - } + }); return result; }, - deleteItems>( + deleteItems( treeItems: T[], - condition: (task: T) => boolean + condition: (item: T) => boolean ): T[] { const result = treeItems.filter((t) => !condition(t)); - for (let i = 0; i < result.length; i++) { - const task = treeItems[i]; - if (Array.isArray(task.children)) { - treeItems[i].children = this.deleteItems(task.children, condition); + result.forEach((item) => { + if (item.children?.length) { + item.children = this.deleteItems(item.children as T[], condition); } - } + }); return result; }, }; diff --git a/src/modules/projects/models/ProjectModel.ts b/src/modules/projects/models/ProjectModel.ts index f26c3db..bf5f1c1 100644 --- a/src/modules/projects/models/ProjectModel.ts +++ b/src/modules/projects/models/ProjectModel.ts @@ -1,7 +1,7 @@ import * as colors from '@ant-design/colors'; import AbstractModel from '../../../base/AbstractModel'; -import { ITreeItem } from '../../../types/ITreeItem'; +import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem'; export enum DEFAULT_PROJECT_ID { MyDay = '0', @@ -25,16 +25,18 @@ export const DEFAULT_PROJECTS: IJsonProjectItem[] = [ }, ]; -export interface IJsonProjectItem extends ITreeItem { +export interface IJsonProjectItem extends ITreeItem { color: string; expanded: boolean; deletable: boolean; + children?: IJsonProjectItem[]; } -interface IProjectModel extends ITreeItem { +interface IProjectModel extends ITreeItemWithParent { color: string; expanded: boolean; deletable: boolean; + children?: IProjectModel[]; } export default class ProjectModel extends AbstractModel @@ -45,6 +47,7 @@ export default class ProjectModel extends AbstractModel expanded: boolean = false; deletable: boolean = true; children?: ProjectModel[] = []; + parent: ProjectModel | undefined; constructor(props: IJsonProjectItem) { super(); diff --git a/src/modules/tasks/TaskService.ts b/src/modules/tasks/TaskService.ts index 295b53d..584e7d7 100644 --- a/src/modules/tasks/TaskService.ts +++ b/src/modules/tasks/TaskService.ts @@ -7,12 +7,12 @@ import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; import TreeModelHelper from '../../helpers/TreeModelHelper'; import { ITreeItemWithParent } from '../../types/ITreeItem'; -const setParent = >(item: T, parent?: T) => { - item.parent = parent || null; +const setParent = (item: T, parent?: T) => { + item.parent = parent; }; -const clearParent = (item: ITreeItemWithParent) => { - item.parent = null; +const clearParent = (item: T) => { + item.parent = undefined; }; export default class TaskService extends AbstractServiceWithProfile< @@ -33,21 +33,16 @@ export default class TaskService extends AbstractServiceWithProfile< this.repository.save(copyData); } + // TODO ProjectService fill and remove parent private static fillParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive>( - setParent, - projectTasks - ); + TreeModelHelper.walkRecursive(setParent, projectTasks); }); } private static clearParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive>( - clearParent, - projectTasks - ); + TreeModelHelper.walkRecursive(clearParent, projectTasks); }); } } diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 6860153..07ebaba 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -16,9 +16,6 @@ import { ETimeRangeEvents, } from '../../services/gaService/EEvents'; import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; -import { ITreeItemWithParent } from '../../types/ITreeItem'; - -// FIXME ts errors export default class TaskStore { tasks: TasksByProject = {}; @@ -223,7 +220,7 @@ export default class TaskStore { condition: (task: TaskModel) => boolean ) { if (Array.isArray(this.tasks[projectId])) { - return TreeModelHelper.getFlatItemsRecursive( + return TreeModelHelper.getFlatItemsRecursive( this.tasks[projectId], condition ).map((task) => task.key); diff --git a/src/modules/tasks/models/TaskInMyDay.ts b/src/modules/tasks/models/TaskInMyDay.ts index b0ebe89..4a346d1 100644 --- a/src/modules/tasks/models/TaskInMyDay.ts +++ b/src/modules/tasks/models/TaskInMyDay.ts @@ -2,7 +2,7 @@ import TaskModel from './TaskModel'; export class TaskInMyDay extends TaskModel { origin: TaskModel | null = null; - children: TaskInMyDay[] = []; + children?: TaskInMyDay[] = []; constructor(originTaskModel: TaskModel, children: TaskInMyDay[]) { super(originTaskModel); diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index 74773ce..deff682 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -17,6 +17,7 @@ export interface ITimeRangeModel { } export interface IJsonTaskModel extends ITreeItemWithParent { + children?: IJsonTaskModel[]; projectId?: string; checked?: boolean; active?: boolean; @@ -50,10 +51,10 @@ const parseTimeRageItems = ( }; export default class TaskModel extends AbstractModel - implements ITreeItemWithParent { + implements ITreeItemWithParent { key: string = ''; title: string = ''; - children: TaskModel[] = []; + children?: TaskModel[] = []; parent: TaskModel | undefined = undefined; projectId: string = ''; checked: boolean = false; diff --git a/src/modules/tasks/models/TaskWithProjectNameModel.ts b/src/modules/tasks/models/TaskWithProjectNameModel.ts index 79df8c2..eaedb15 100644 --- a/src/modules/tasks/models/TaskWithProjectNameModel.ts +++ b/src/modules/tasks/models/TaskWithProjectNameModel.ts @@ -10,11 +10,11 @@ interface ITaskWithProjectName { } export class TaskWithProjectNameModel extends AbstractModel - implements ITreeItemWithParent { + implements ITreeItemWithParent { key: string = ''; title: string = ''; parent: TaskModel | undefined = undefined; - children: TaskModel[] = []; + children?: TaskModel[] = []; constructor(props: ITaskWithProjectName) { super(); diff --git a/src/modules/tasks/models/TasksByProject.ts b/src/modules/tasks/models/TasksByProject.ts index fb5d3ad..4c140c2 100644 --- a/src/modules/tasks/models/TasksByProject.ts +++ b/src/modules/tasks/models/TasksByProject.ts @@ -1,6 +1,5 @@ import TaskModel from './TaskModel'; -import { TaskInMyDay } from './TaskInMyDay'; -import { TaskWithProjectNameModel } from './TaskWithProjectNameModel'; -export type Task = TaskModel | TaskInMyDay | TaskWithProjectNameModel; +// export type Task = TaskModel | TaskInMyDay | TaskWithProjectNameModel; +export type Task = TaskModel; export type TasksByProject = Record; diff --git a/src/screens/projects/ProjectsScreen.tsx b/src/screens/projects/ProjectsScreen.tsx index 1241da8..26afe9f 100644 --- a/src/screens/projects/ProjectsScreen.tsx +++ b/src/screens/projects/ProjectsScreen.tsx @@ -50,7 +50,7 @@ const TaskList = TreeList( } ); -const ProjectList = TreeList( +const ProjectList = TreeList( () => projectStore.projects, (list: ProjectModel[]) => { projectStore.set(list); diff --git a/src/screens/projects/components/TreeList.tsx b/src/screens/projects/components/TreeList.tsx index 7eda44a..f8add83 100644 --- a/src/screens/projects/components/TreeList.tsx +++ b/src/screens/projects/components/TreeList.tsx @@ -19,7 +19,7 @@ interface TreePropsExtended isDraggable?: () => boolean; } -export default function TreeList>( +export default function TreeList( getData: () => T[], updateData: (items: T[]) => void, options: TreePropsExtended @@ -46,7 +46,7 @@ export default function TreeList>( return callback(items[i], i, items); } if (items[i].children) { - loop(items[i].children || [], key, callback); + loop((items[i].children || []) as T[], key, callback); } } return undefined; diff --git a/src/types/ITreeItem.ts b/src/types/ITreeItem.ts index 7104c40..b79f0a0 100644 --- a/src/types/ITreeItem.ts +++ b/src/types/ITreeItem.ts @@ -1,11 +1,9 @@ -export interface ITreeItem = ITreeItem> { +export interface ITreeItem { title: string; key: string; - children?: T[]; + children?: ITreeItem[]; } -export interface ITreeItemWithParent< - T extends ITreeItemWithParent = ITreeItemWithParent -> extends ITreeItem { - parent: T | undefined; +export interface ITreeItemWithParent extends ITreeItem { + parent: ITreeItemWithParent | undefined; } From 261d27b1aad89b7888cf653e239ea9ca3f487179 Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 22:02:20 +0300 Subject: [PATCH 41/84] Clear parents, make Projects observable --- src/helpers/TreeModelHelper.ts | 16 ++++++++++++++++ src/modules/projects/ProjectService.ts | 21 ++++++++++++++++++--- src/modules/projects/models/ProjectModel.ts | 16 ++++++++++++++-- src/modules/tasks/TaskService.ts | 14 ++------------ src/modules/tasks/models/TaskModel.ts | 4 ++++ 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/helpers/TreeModelHelper.ts b/src/helpers/TreeModelHelper.ts index f6036d4..09fe94f 100644 --- a/src/helpers/TreeModelHelper.ts +++ b/src/helpers/TreeModelHelper.ts @@ -237,6 +237,22 @@ const TreeModelHelper = { }); return result; }, + + fillParent(items: T[]) { + TreeModelHelper.walkRecursive(setParent, items); + }, + + clearParent(items: T[]) { + TreeModelHelper.walkRecursive(clearParent, items); + }, +}; + +const setParent = (item: T, parent?: T) => { + item.parent = parent; +}; + +const clearParent = (item: T) => { + item.parent = undefined; }; export default TreeModelHelper; diff --git a/src/modules/projects/ProjectService.ts b/src/modules/projects/ProjectService.ts index 328722d..650916d 100644 --- a/src/modules/projects/ProjectService.ts +++ b/src/modules/projects/ProjectService.ts @@ -1,7 +1,12 @@ -import ProjectModel, { DEFAULT_PROJECTS } from './models/ProjectModel'; +import ProjectModel, { + DEFAULT_PROJECTS, + IJsonProjectItem, +} from './models/ProjectModel'; import ProjectFactory from './ProjectFactory'; import ProjectRepository from './ProjectRepository'; import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; +import TreeModelHelper from '../../helpers/TreeModelHelper'; +import { toJS } from 'mobx'; export default class ProjectService extends AbstractServiceWithProfile< ProjectModel[] @@ -11,11 +16,21 @@ export default class ProjectService extends AbstractServiceWithProfile< getAll(): ProjectModel[] { const data = this.repository.restore(DEFAULT_PROJECTS); - + ProjectService.fillParent(data); return this.factory.createProjects(data); } save(data: ProjectModel[]): void { - this.repository.save(data); + const copyData = toJS(data); + ProjectService.clearParent(copyData); + this.repository.save(copyData); + } + + private static fillParent(data: IJsonProjectItem[]) { + TreeModelHelper.fillParent(data); + } + + private static clearParent(data: ProjectModel[]) { + TreeModelHelper.clearParent(data); } } diff --git a/src/modules/projects/models/ProjectModel.ts b/src/modules/projects/models/ProjectModel.ts index bf5f1c1..f120e84 100644 --- a/src/modules/projects/models/ProjectModel.ts +++ b/src/modules/projects/models/ProjectModel.ts @@ -1,7 +1,8 @@ import * as colors from '@ant-design/colors'; +import { makeObservable, observable } from 'mobx'; import AbstractModel from '../../../base/AbstractModel'; -import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem'; +import { ITreeItemWithParent } from '../../../types/ITreeItem'; export enum DEFAULT_PROJECT_ID { MyDay = '0', @@ -22,10 +23,11 @@ export const DEFAULT_PROJECTS: IJsonProjectItem[] = [ color: colors.blue.primary || '', deletable: false, expanded: false, + parent: undefined, }, ]; -export interface IJsonProjectItem extends ITreeItem { +export interface IJsonProjectItem extends ITreeItemWithParent { color: string; expanded: boolean; deletable: boolean; @@ -58,5 +60,15 @@ export default class ProjectModel extends AbstractModel }; this.load(newProps); + + makeObservable(this, { + key: observable, + title: observable, + color: observable, + expanded: observable, + deletable: observable, + children: observable, + // parent: none, + }); } } diff --git a/src/modules/tasks/TaskService.ts b/src/modules/tasks/TaskService.ts index 584e7d7..c08e31c 100644 --- a/src/modules/tasks/TaskService.ts +++ b/src/modules/tasks/TaskService.ts @@ -5,15 +5,6 @@ import TaskFactory from './TaskFactory'; import { TasksByProject } from './models/TasksByProject'; import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile'; import TreeModelHelper from '../../helpers/TreeModelHelper'; -import { ITreeItemWithParent } from '../../types/ITreeItem'; - -const setParent = (item: T, parent?: T) => { - item.parent = parent; -}; - -const clearParent = (item: T) => { - item.parent = undefined; -}; export default class TaskService extends AbstractServiceWithProfile< TasksByProject @@ -33,16 +24,15 @@ export default class TaskService extends AbstractServiceWithProfile< this.repository.save(copyData); } - // TODO ProjectService fill and remove parent private static fillParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive(setParent, projectTasks); + TreeModelHelper.fillParent(projectTasks); }); } private static clearParent(data: TasksByProject) { Object.values(data).forEach((projectTasks) => { - TreeModelHelper.walkRecursive(clearParent, projectTasks); + TreeModelHelper.clearParent(projectTasks); }); } } diff --git a/src/modules/tasks/models/TaskModel.ts b/src/modules/tasks/models/TaskModel.ts index deff682..723f3fa 100644 --- a/src/modules/tasks/models/TaskModel.ts +++ b/src/modules/tasks/models/TaskModel.ts @@ -83,12 +83,16 @@ export default class TaskModel extends AbstractModel key: observable, title: observable, children: observable, + // parent: none projectId: observable, checked: observable, active: observable, + expanded: observable, + inMyDay: observable, time: observable, datesInProgress: observable, details: observable, + withoutActions: observable, duration: computed, setTitle: action, setDetails: action, From 8e09dd0720ff273ab199d3ea529ef16bc470c415 Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 22:30:49 +0300 Subject: [PATCH 42/84] Hide progress bar --- package.json | 1 + src/components/Header/Header.tsx | 8 +++++--- src/types/Types.d.ts | 6 ++++++ yarn.lock | 5 +++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 3a193df..35b6ed6 100644 --- a/package.json +++ b/package.json @@ -248,6 +248,7 @@ "moment": "2.29.1", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-hook-media-query": "^1.0.5", "react-jss": "^10.6.0", "react-router-dom": "^5.2.0", "regenerator-runtime": "^0.13.5", diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 9b35358..653e8bd 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Layout } from 'antd'; import { observer } from 'mobx-react'; +import useMediaQuery from 'react-hook-media-query'; import HeaderLink from '../HeaderLink/HeaderLink'; import Profile from '../Profile/Profile'; @@ -10,7 +11,10 @@ import ProgressBar from '../ProgressBar/ProgressBar'; const { Header: HeaderBase } = Layout; +const query = '(min-width: 950px)'; function Header() { + const isBigScreen = useMediaQuery(query); + return ( @@ -22,9 +26,7 @@ function Header() { Dashboard - - - + {isBigScreen && } diff --git a/src/types/Types.d.ts b/src/types/Types.d.ts index 629fdb8..29d3733 100644 --- a/src/types/Types.d.ts +++ b/src/types/Types.d.ts @@ -3,3 +3,9 @@ declare module 'universal-analytics' { export default ua; } + +declare module 'react-hook-media-query' { + const useMediaQuery: (query: string) => boolean; + + export default useMediaQuery; +} diff --git a/yarn.lock b/yarn.lock index dea05ed..eaf3367 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10168,6 +10168,11 @@ react-dom@^17.0.1: object-assign "^4.1.1" scheduler "^0.20.1" +react-hook-media-query@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-hook-media-query/-/react-hook-media-query-1.0.5.tgz#e5d8282c5cd5b54f7b72923f6b05c92ab3e74ba8" + integrity sha512-3Sj6ChZQC/13/8w3Endyp+4erVnVgFWRnA8J8COKrx1JBC0/T2Uwt6c5Bo5lGFGQGSicTXwSxOKEy7+vKjLqFw== + react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" From 01820b96663fab77083fde1d554427a325cbc858 Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 22:53:57 +0300 Subject: [PATCH 43/84] Dont stop timer if remove another task --- src/modules/RootStore.ts | 2 +- src/modules/tasks/TaskStore.ts | 8 +++++--- src/screens/projects/components/TaskNode/TaskNode.tsx | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/modules/RootStore.ts b/src/modules/RootStore.ts index d4f8b1b..7fd240d 100644 --- a/src/modules/RootStore.ts +++ b/src/modules/RootStore.ts @@ -20,7 +20,7 @@ export class RootStore { } deleteProject(project: ProjectModel) { - this.tasksStore.deleteProjectTasks(project.key); + this.tasksStore.removeProjectTasks(project.key); this.projectStore.delete(project); } } diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 07ebaba..16bbe72 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -114,12 +114,14 @@ export default class TaskStore { ); } - delete(task: TaskModel) { + remove(task: TaskModel) { function condition(_task: TaskModel) { return _task.key === task.key; } - this.stopTimer(); + if (task.active) { + this.stopTimer(); + } for (const projectKey in this.tasks) { if (this.tasks.hasOwnProperty(projectKey)) { @@ -134,7 +136,7 @@ export default class TaskStore { GaService.event(EEventCategory.Tasks, ETasksEvents.Delete); } - deleteProjectTasks(projectKey: string) { + removeProjectTasks(projectKey: string) { delete this.tasks[projectKey]; this.tasksService.save(this.tasks); this.updateVersion(); diff --git a/src/screens/projects/components/TaskNode/TaskNode.tsx b/src/screens/projects/components/TaskNode/TaskNode.tsx index 3338857..fe6dd91 100644 --- a/src/screens/projects/components/TaskNode/TaskNode.tsx +++ b/src/screens/projects/components/TaskNode/TaskNode.tsx @@ -68,7 +68,7 @@ export default observer(function TaskNode({ task }: TaskNodeProps) { )} tasksStore.delete(task))} + onConfirm={stopPropagationAndRun(() => tasksStore.remove(task))} onCancel={stopPropagation} okText="Yes" cancelText="No" From 4af999d0b4f0a46d5d07a1cf23f8f01ae6f8a121 Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 23:39:43 +0300 Subject: [PATCH 44/84] Dont hide paused task, remove less --- src/App.global.less | 12 +--- src/components/Header/Header.tsx | 10 +++- .../PlayStopButton/PlayStopButton.tsx | 38 ++++++------ src/components/TaskControl/TaskControl.less | 35 ----------- src/components/TaskControl/TaskControl.tsx | 58 ++++++++++++++----- .../TimeRangeModal/TimeRangeModal.tsx | 2 +- src/consts/index.ts | 1 + src/helpers/TaskHelper.ts | 2 - src/modules/tasks/TaskStore.ts | 5 +- .../components/DrawerTask/DrawerTask.tsx | 3 +- .../DrawerTask/components/Duration.tsx | 15 +++-- 11 files changed, 91 insertions(+), 90 deletions(-) delete mode 100644 src/components/TaskControl/TaskControl.less create mode 100644 src/consts/index.ts diff --git a/src/App.global.less b/src/App.global.less index 63c517a..1ec37b4 100644 --- a/src/App.global.less +++ b/src/App.global.less @@ -1,7 +1,7 @@ @font-face { - font-family: "Material Icons"; - src: url("~material-icons/iconfont/material-icons.woff2") format("woff2"), - url("~material-icons/iconfont/material-icons.woff2") format("woff"); + font-family: 'Material Icons'; + src: url('~material-icons/iconfont/material-icons.woff2') format('woff2'), + url('~material-icons/iconfont/material-icons.woff2') format('woff'); } @import '~material-icons/css/material-icons.min.css'; @@ -16,9 +16,3 @@ display: flex; align-items: center; } - -.flex-1 { - flex: 1 -} - -@purple: #713A91; diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 653e8bd..37aff46 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -3,6 +3,7 @@ import { Link } from 'react-router-dom'; import { Layout } from 'antd'; import { observer } from 'mobx-react'; import useMediaQuery from 'react-hook-media-query'; +import { createUseStyles } from 'react-jss'; import HeaderLink from '../HeaderLink/HeaderLink'; import Profile from '../Profile/Profile'; @@ -13,6 +14,7 @@ const { Header: HeaderBase } = Layout; const query = '(min-width: 950px)'; function Header() { + const style = useStyle(); const isBigScreen = useMediaQuery(query); return ( @@ -26,7 +28,7 @@ function Header() { Dashboard - {isBigScreen && } + {isBigScreen && } @@ -34,3 +36,9 @@ function Header() { } export default observer(Header); + +const useStyle = createUseStyles({ + flex1: { + flex: 1, + }, +}); diff --git a/src/components/PlayStopButton/PlayStopButton.tsx b/src/components/PlayStopButton/PlayStopButton.tsx index 3f7089d..e90097f 100644 --- a/src/components/PlayStopButton/PlayStopButton.tsx +++ b/src/components/PlayStopButton/PlayStopButton.tsx @@ -1,7 +1,6 @@ -import React, { SyntheticEvent } from 'react'; +import React, { SyntheticEvent, useCallback } from 'react'; import { CaretRightFilled, PauseOutlined } from '@ant-design/icons'; import { observer } from 'mobx-react'; -import clsx from 'clsx'; import { createUseStyles } from 'react-jss'; import CircleButton from '../CircleButton/CircleButton'; @@ -15,28 +14,25 @@ interface PlayStopButtonProps { className?: string; } -export default observer(function PlayStopButton({ - task, - className, -}: PlayStopButtonProps) { +function PlayStopButton({ task, className }: PlayStopButtonProps) { const classes = useStyles(); - function handleClick(e: SyntheticEvent) { - e.stopPropagation(); - if (task) { - if (!task?.active) { - tasksStore.startTimer(task); - } else { - tasksStore.stopTimer(); + const toggleTask = useCallback( + (e: SyntheticEvent) => { + e.stopPropagation(); + if (task) { + if (!task?.active) { + tasksStore.startTimer(task); + } else { + tasksStore.stopTimer(); + } } - } - } + }, + [task] + ); return ( - + {!task?.active ? ( ) : ( @@ -44,7 +40,9 @@ export default observer(function PlayStopButton({ )} ); -}); +} + +export default observer(PlayStopButton); const useStyles = createUseStyles({ icon: { diff --git a/src/components/TaskControl/TaskControl.less b/src/components/TaskControl/TaskControl.less deleted file mode 100644 index 6ea85ae..0000000 --- a/src/components/TaskControl/TaskControl.less +++ /dev/null @@ -1,35 +0,0 @@ -@import '../../App.global'; - -.task-control { - display: inline-flex; - align-items: center; - height: 44px; - margin-left: 20px; - padding: 8px; - border-radius: 5px; - line-height: 16px; - color: white; - background-color: @purple; /* TODO refactor and use Theme */ -} - -.task-control__info { - display: inline-flex; - flex: 1; - flex-direction: column; - margin-right: 8px; - width: 140px; -} - -.task-control__project { - font-size: 12px; -} - -.task-control__info span { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.task-control__duration { - margin-right: 8px; -} diff --git a/src/components/TaskControl/TaskControl.tsx b/src/components/TaskControl/TaskControl.tsx index 70cf67e..6643588 100644 --- a/src/components/TaskControl/TaskControl.tsx +++ b/src/components/TaskControl/TaskControl.tsx @@ -1,16 +1,16 @@ import React, { useMemo } from 'react'; import { observer } from 'mobx-react'; -import { PauseOutlined } from '@ant-design/icons'; - -import './TaskControl.less'; +import { createUseStyles } from 'react-jss'; import rootStore from '../../modules/RootStore'; import * as TaskHooks from '../../hooks/TaskHooks'; -import CircleButton from '../CircleButton/CircleButton'; +import PlayStopButton from '../PlayStopButton/PlayStopButton'; +import { PURPLE_COLOR } from '../../consts'; const { tasksStore, projectStore } = rootStore; -export default observer(function TaskControl() { +function TaskControl() { + const styles = useStyles(); const task = tasksStore.activeTask; const duration = TaskHooks.useTaskDuration(task); @@ -20,17 +20,49 @@ export default observer(function TaskControl() { if (task) { return ( - -
- {project?.title} + +
+ {project?.title} {task.title}
- {duration} - tasksStore.stopTimer()}> - - + {duration} +
); } - return No active tasks; + return No active tasks; +} + +export default observer(TaskControl); + +const useStyles = createUseStyles({ + root: { + display: 'inline-flex', + alignItems: 'center', + height: '44px', + marginLeft: '20px', + padding: '8px', + borderRadius: '5px', + lineHeight: '16px', + color: 'white', + backgroundColor: PURPLE_COLOR, + }, + project: { + fontSize: '12px', + }, + info: { + display: 'inline-flex', + flex: 1, + flexDirection: 'column', + marginRight: '8px', + width: '140px', + '& span': { + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + }, + }, + duration: { + marginRight: '8px', + }, }); diff --git a/src/components/TimeRangeModal/TimeRangeModal.tsx b/src/components/TimeRangeModal/TimeRangeModal.tsx index 9018763..8bda135 100644 --- a/src/components/TimeRangeModal/TimeRangeModal.tsx +++ b/src/components/TimeRangeModal/TimeRangeModal.tsx @@ -74,7 +74,7 @@ const TimeRangeModal = observer( function handleDelete() { if (taskTime) { - tasksStore.deleteTime(taskTime.task, taskTime.index); + tasksStore.removeTime(taskTime.task, taskTime.index); } onClose(); } diff --git a/src/consts/index.ts b/src/consts/index.ts new file mode 100644 index 0000000..012e828 --- /dev/null +++ b/src/consts/index.ts @@ -0,0 +1 @@ +export const PURPLE_COLOR = '#713A91'; diff --git a/src/helpers/TaskHelper.ts b/src/helpers/TaskHelper.ts index 1b29c0f..611044e 100644 --- a/src/helpers/TaskHelper.ts +++ b/src/helpers/TaskHelper.ts @@ -35,8 +35,6 @@ export function getTimeItems( }); taskTime.sort((a, b) => compareAsc(a.time.start, b.time.start)); - console.log('getTimeItems', taskTime.length); - return taskTime; } diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 16bbe72..d205bec 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -46,7 +46,7 @@ export default class TaskStore { GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Update); } - deleteTime(task: TaskModel, timeIndex: number) { + removeTime(task: TaskModel, timeIndex: number) { if (task.active) { this.stopTimer(); } @@ -85,7 +85,6 @@ export default class TaskStore { for (const tasks of Object.values(this.tasks)) { TreeModelHelper.getFlatItemsRecursiveBase(tasks, condition, result); } - console.log('getTasksByDate', result.length); return result; } @@ -154,7 +153,7 @@ export default class TaskStore { stopTimer(silent?: boolean) { if (this.activeTask) { this.activeTask.stop(); - this.activeTask = undefined; + // this.activeTask = undefined; } if (!silent) { diff --git a/src/screens/projects/components/DrawerTask/DrawerTask.tsx b/src/screens/projects/components/DrawerTask/DrawerTask.tsx index 206ff30..cc0cb76 100644 --- a/src/screens/projects/components/DrawerTask/DrawerTask.tsx +++ b/src/screens/projects/components/DrawerTask/DrawerTask.tsx @@ -13,6 +13,7 @@ import TimeRangeModal from '../../../../components/TimeRangeModal/TimeRangeModal import { Undefined } from '../../../../types/CommonTypes'; import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; import IModalProps from '../../../../types/IModalProps'; +import { PURPLE_COLOR } from '../../../../consts'; const { TextArea } = Input; @@ -56,7 +57,7 @@ export default observer(function DrawerTask({ Mark as done
- + {project?.title} diff --git a/src/screens/projects/components/DrawerTask/components/Duration.tsx b/src/screens/projects/components/DrawerTask/components/Duration.tsx index fc1e678..9f4f913 100644 --- a/src/screens/projects/components/DrawerTask/components/Duration.tsx +++ b/src/screens/projects/components/DrawerTask/components/Duration.tsx @@ -7,26 +7,28 @@ import IconTile from '../../../../../components/IconTile/IconTile'; import PlayStopButton from '../../../../../components/PlayStopButton/PlayStopButton'; import TaskModel from '../../../../../modules/tasks/models/TaskModel'; import * as TaskHooks from '../../../../../hooks/TaskHooks'; +import { PURPLE_COLOR } from '../../../../../consts'; interface DurationProps { task?: TaskModel; } - -export default observer(function Duration({ task }: DurationProps) { +function Duration({ task }: DurationProps) { const classes = useStyle(); const duration = TaskHooks.useTaskDuration(task, true); return (
- + {duration} - +
); -}); +} + +export default observer(Duration); const useStyle = createUseStyles({ root: { @@ -37,4 +39,7 @@ const useStyle = createUseStyles({ duration: { paddingLeft: 8, }, + flex1: { + flex: 1, + }, }); From 1e5a8bb3a60be14521296c0a0bfe726668a588bb Mon Sep 17 00:00:00 2001 From: yadro Date: Sat, 27 Nov 2021 23:56:46 +0300 Subject: [PATCH 45/84] Move files --- src/components/{CircleButton => }/CircleButton.tsx | 0 src/components/{Header => }/Header.tsx | 8 ++++---- src/components/{HeaderLink => }/HeaderLink.tsx | 0 src/components/{IconTile => }/IconTile.tsx | 0 src/components/{PlayStopButton => }/PlayStopButton.tsx | 6 +++--- src/components/{Profile => }/Profile.tsx | 6 +++--- src/components/{ProgressBar => }/ProgressBar.tsx | 10 +++++----- src/components/{SelectDate => }/SelectDate.tsx | 0 src/components/{TaskControl => }/TaskControl.tsx | 8 ++++---- .../{components => }/TimeRangeDuration.tsx | 4 ++-- src/components/TimeRangeModal/TimeRangeModal.tsx | 2 +- src/screens/Main.tsx | 2 +- src/screens/dashboard/Dashboard.tsx | 2 +- src/screens/hours/HoursScreen.tsx | 2 +- src/screens/hours/components/HoursCard/HoursCard.tsx | 2 +- .../projects/components/DrawerTask/DrawerTask.tsx | 2 +- .../components/DrawerTask/components/Duration.tsx | 4 ++-- .../projects/components/HoursByTask/HoursByTask.tsx | 2 +- .../projects/components/ProjectModals/ProjectModal.tsx | 1 + 19 files changed, 31 insertions(+), 30 deletions(-) rename src/components/{CircleButton => }/CircleButton.tsx (100%) rename src/components/{Header => }/Header.tsx (82%) rename src/components/{HeaderLink => }/HeaderLink.tsx (100%) rename src/components/{IconTile => }/IconTile.tsx (100%) rename src/components/{PlayStopButton => }/PlayStopButton.tsx (86%) rename src/components/{Profile => }/Profile.tsx (83%) rename src/components/{ProgressBar => }/ProgressBar.tsx (88%) rename src/components/{SelectDate => }/SelectDate.tsx (100%) rename src/components/{TaskControl => }/TaskControl.tsx (87%) rename src/components/TimeRangeModal/{components => }/TimeRangeDuration.tsx (68%) diff --git a/src/components/CircleButton/CircleButton.tsx b/src/components/CircleButton.tsx similarity index 100% rename from src/components/CircleButton/CircleButton.tsx rename to src/components/CircleButton.tsx diff --git a/src/components/Header/Header.tsx b/src/components/Header.tsx similarity index 82% rename from src/components/Header/Header.tsx rename to src/components/Header.tsx index 37aff46..0922a97 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header.tsx @@ -5,10 +5,10 @@ import { observer } from 'mobx-react'; import useMediaQuery from 'react-hook-media-query'; import { createUseStyles } from 'react-jss'; -import HeaderLink from '../HeaderLink/HeaderLink'; -import Profile from '../Profile/Profile'; -import TaskControl from '../TaskControl/TaskControl'; -import ProgressBar from '../ProgressBar/ProgressBar'; +import HeaderLink from './HeaderLink'; +import Profile from './Profile'; +import TaskControl from './TaskControl'; +import ProgressBar from './ProgressBar'; const { Header: HeaderBase } = Layout; diff --git a/src/components/HeaderLink/HeaderLink.tsx b/src/components/HeaderLink.tsx similarity index 100% rename from src/components/HeaderLink/HeaderLink.tsx rename to src/components/HeaderLink.tsx diff --git a/src/components/IconTile/IconTile.tsx b/src/components/IconTile.tsx similarity index 100% rename from src/components/IconTile/IconTile.tsx rename to src/components/IconTile.tsx diff --git a/src/components/PlayStopButton/PlayStopButton.tsx b/src/components/PlayStopButton.tsx similarity index 86% rename from src/components/PlayStopButton/PlayStopButton.tsx rename to src/components/PlayStopButton.tsx index e90097f..f6babe1 100644 --- a/src/components/PlayStopButton/PlayStopButton.tsx +++ b/src/components/PlayStopButton.tsx @@ -3,9 +3,9 @@ import { CaretRightFilled, PauseOutlined } from '@ant-design/icons'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; -import CircleButton from '../CircleButton/CircleButton'; -import rootStore from '../../modules/RootStore'; -import TaskModel from '../../modules/tasks/models/TaskModel'; +import CircleButton from './CircleButton'; +import rootStore from '../modules/RootStore'; +import TaskModel from '../modules/tasks/models/TaskModel'; const { tasksStore } = rootStore; diff --git a/src/components/Profile/Profile.tsx b/src/components/Profile.tsx similarity index 83% rename from src/components/Profile/Profile.tsx rename to src/components/Profile.tsx index ba31731..7725bcb 100644 --- a/src/components/Profile/Profile.tsx +++ b/src/components/Profile.tsx @@ -3,9 +3,9 @@ import { Space } from 'antd'; import { SettingOutlined } from '@ant-design/icons'; import { createUseStyles } from 'react-jss'; -import rootStore from '../../modules/RootStore'; -import useModal from '../../hooks/ModalHook'; -import SettingsModal from '../SettingsModal/SettingsModal'; +import rootStore from '../modules/RootStore'; +import useModal from '../hooks/ModalHook'; +import SettingsModal from './SettingsModal/SettingsModal'; const { settingsStore } = rootStore; diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar.tsx similarity index 88% rename from src/components/ProgressBar/ProgressBar.tsx rename to src/components/ProgressBar.tsx index d9c5075..6d5f29b 100644 --- a/src/components/ProgressBar/ProgressBar.tsx +++ b/src/components/ProgressBar.tsx @@ -4,11 +4,11 @@ import { Slider } from 'antd'; import { isSameDay } from 'date-fns'; import { createUseStyles } from 'react-jss'; -import rootStore from '../../modules/RootStore'; -import { useInterval } from '../../hooks/UseInterval'; -import { getStartWorkingTime, getTimeItems } from '../../helpers/TaskHelper'; -import TaskTimeService from '../../services/TaskTimeService'; -import { toTimeFormat } from '../../helpers/DateTime'; +import rootStore from '../modules/RootStore'; +import { useInterval } from '../hooks/UseInterval'; +import { getStartWorkingTime, getTimeItems } from '../helpers/TaskHelper'; +import TaskTimeService from '../services/TaskTimeService'; +import { toTimeFormat } from '../helpers/DateTime'; const { tasksStore, settingsStore } = rootStore; diff --git a/src/components/SelectDate/SelectDate.tsx b/src/components/SelectDate.tsx similarity index 100% rename from src/components/SelectDate/SelectDate.tsx rename to src/components/SelectDate.tsx diff --git a/src/components/TaskControl/TaskControl.tsx b/src/components/TaskControl.tsx similarity index 87% rename from src/components/TaskControl/TaskControl.tsx rename to src/components/TaskControl.tsx index 6643588..6f4fe0a 100644 --- a/src/components/TaskControl/TaskControl.tsx +++ b/src/components/TaskControl.tsx @@ -2,10 +2,10 @@ import React, { useMemo } from 'react'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; -import rootStore from '../../modules/RootStore'; -import * as TaskHooks from '../../hooks/TaskHooks'; -import PlayStopButton from '../PlayStopButton/PlayStopButton'; -import { PURPLE_COLOR } from '../../consts'; +import rootStore from '../modules/RootStore'; +import * as TaskHooks from '../hooks/TaskHooks'; +import PlayStopButton from './PlayStopButton'; +import { PURPLE_COLOR } from '../consts'; const { tasksStore, projectStore } = rootStore; diff --git a/src/components/TimeRangeModal/components/TimeRangeDuration.tsx b/src/components/TimeRangeModal/TimeRangeDuration.tsx similarity index 68% rename from src/components/TimeRangeModal/components/TimeRangeDuration.tsx rename to src/components/TimeRangeModal/TimeRangeDuration.tsx index 50736a8..27790c0 100644 --- a/src/components/TimeRangeModal/components/TimeRangeDuration.tsx +++ b/src/components/TimeRangeModal/TimeRangeDuration.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import * as TaskHooks from '../../../hooks/TaskHooks'; -import { ITimeRangeModel } from '../../../modules/tasks/models/TaskModel'; +import * as TaskHooks from '../../hooks/TaskHooks'; +import { ITimeRangeModel } from '../../modules/tasks/models/TaskModel'; interface TimeRangeDurationProps { timeRange?: ITimeRangeModel; diff --git a/src/components/TimeRangeModal/TimeRangeModal.tsx b/src/components/TimeRangeModal/TimeRangeModal.tsx index 8bda135..383834e 100644 --- a/src/components/TimeRangeModal/TimeRangeModal.tsx +++ b/src/components/TimeRangeModal/TimeRangeModal.tsx @@ -10,7 +10,7 @@ import rootStore from '../../modules/RootStore'; import TaskTimeItemModel from '../../modules/tasks/models/TaskTimeItemModel'; import { ITimeRangeModel } from '../../modules/tasks/models/TaskModel'; import { Undefined } from '../../types/CommonTypes'; -import TimeRangeDuration from './components/TimeRangeDuration'; +import TimeRangeDuration from './TimeRangeDuration'; import IModalProps from '../../types/IModalProps'; const { tasksStore } = rootStore; diff --git a/src/screens/Main.tsx b/src/screens/Main.tsx index ffe8641..7cc471d 100644 --- a/src/screens/Main.tsx +++ b/src/screens/Main.tsx @@ -6,7 +6,7 @@ import ProjectsScreen from './projects/ProjectsScreen'; import HoursScreen from './hours/HoursScreen'; import Dashboard from './dashboard/Dashboard'; import GaService from '../services/gaService/GaService'; -import Header from '../components/Header/Header'; +import Header from '../components/Header'; const Main = () => { const location = useLocation(); diff --git a/src/screens/dashboard/Dashboard.tsx b/src/screens/dashboard/Dashboard.tsx index 1789a39..7cb6471 100644 --- a/src/screens/dashboard/Dashboard.tsx +++ b/src/screens/dashboard/Dashboard.tsx @@ -3,7 +3,7 @@ import { createUseStyles } from 'react-jss'; import { Layout, Space } from 'antd'; import { observer } from 'mobx-react'; -import SelectDate from '../../components/SelectDate/SelectDate'; +import SelectDate from '../../components/SelectDate'; import rootStore from '../../modules/RootStore'; import { getTasksWithTotalTimeForDay } from '../../helpers/TaskHelper'; import HoursWithDuration from './components/HoursWithDuration'; diff --git a/src/screens/hours/HoursScreen.tsx b/src/screens/hours/HoursScreen.tsx index fa46421..39110da 100644 --- a/src/screens/hours/HoursScreen.tsx +++ b/src/screens/hours/HoursScreen.tsx @@ -5,7 +5,7 @@ import { observer } from 'mobx-react'; import rootStore from '../../modules/RootStore'; import HoursCard from './components/HoursCard/HoursCard'; import { getTimeItems } from '../../helpers/TaskHelper'; -import SelectDate from '../../components/SelectDate/SelectDate'; +import SelectDate from '../../components/SelectDate'; import TimeRangeModal from '../../components/TimeRangeModal/TimeRangeModal'; import TaskTimeItemModel from '../../modules/tasks/models/TaskTimeItemModel'; import { Undefined } from '../../types/CommonTypes'; diff --git a/src/screens/hours/components/HoursCard/HoursCard.tsx b/src/screens/hours/components/HoursCard/HoursCard.tsx index 1e9c709..82851ba 100644 --- a/src/screens/hours/components/HoursCard/HoursCard.tsx +++ b/src/screens/hours/components/HoursCard/HoursCard.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; -import PlayStopButton from '../../../../components/PlayStopButton/PlayStopButton'; +import PlayStopButton from '../../../../components/PlayStopButton'; import rootStore from '../../../../modules/RootStore'; import { msToTime, toTimeFormat } from '../../../../helpers/DateTime'; import { getTaskTitlesPath } from '../../../../helpers/TaskHelper'; diff --git a/src/screens/projects/components/DrawerTask/DrawerTask.tsx b/src/screens/projects/components/DrawerTask/DrawerTask.tsx index cc0cb76..8365a55 100644 --- a/src/screens/projects/components/DrawerTask/DrawerTask.tsx +++ b/src/screens/projects/components/DrawerTask/DrawerTask.tsx @@ -7,7 +7,7 @@ import { createUseStyles } from 'react-jss'; import TaskModel from '../../../../modules/tasks/models/TaskModel'; import rootStore from '../../../../modules/RootStore'; import HoursByTask from '../HoursByTask/HoursByTask'; -import IconTile from '../../../../components/IconTile/IconTile'; +import IconTile from '../../../../components/IconTile'; import Duration from './components/Duration'; import TimeRangeModal from '../../../../components/TimeRangeModal/TimeRangeModal'; import { Undefined } from '../../../../types/CommonTypes'; diff --git a/src/screens/projects/components/DrawerTask/components/Duration.tsx b/src/screens/projects/components/DrawerTask/components/Duration.tsx index 9f4f913..633e4b3 100644 --- a/src/screens/projects/components/DrawerTask/components/Duration.tsx +++ b/src/screens/projects/components/DrawerTask/components/Duration.tsx @@ -3,8 +3,8 @@ import { ClockCircleOutlined } from '@ant-design/icons'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; -import IconTile from '../../../../../components/IconTile/IconTile'; -import PlayStopButton from '../../../../../components/PlayStopButton/PlayStopButton'; +import IconTile from '../../../../../components/IconTile'; +import PlayStopButton from '../../../../../components/PlayStopButton'; import TaskModel from '../../../../../modules/tasks/models/TaskModel'; import * as TaskHooks from '../../../../../hooks/TaskHooks'; import { PURPLE_COLOR } from '../../../../../consts'; diff --git a/src/screens/projects/components/HoursByTask/HoursByTask.tsx b/src/screens/projects/components/HoursByTask/HoursByTask.tsx index a7eb6ef..85daeb2 100644 --- a/src/screens/projects/components/HoursByTask/HoursByTask.tsx +++ b/src/screens/projects/components/HoursByTask/HoursByTask.tsx @@ -12,7 +12,7 @@ import TaskModel, { import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; import { mapPrevCurrent } from '../../../../helpers/ArrayHelper'; import HoursItem from './components/HoursItem'; -import IconTile from '../../../../components/IconTile/IconTile'; +import IconTile from '../../../../components/IconTile'; import { calcDuration, msToTime } from '../../../../helpers/DateTime'; function dateFormat(date: Date) { diff --git a/src/screens/projects/components/ProjectModals/ProjectModal.tsx b/src/screens/projects/components/ProjectModals/ProjectModal.tsx index 0993f13..e774afc 100644 --- a/src/screens/projects/components/ProjectModals/ProjectModal.tsx +++ b/src/screens/projects/components/ProjectModals/ProjectModal.tsx @@ -34,6 +34,7 @@ export default observer(function ProjectModal({ children: [], expanded: true, deletable: true, + parent: undefined, }) ); onClose(); From 1d4250f31637b8b702b60d35d2bba7ef0c817012 Mon Sep 17 00:00:00 2001 From: yadro Date: Sun, 28 Nov 2021 10:08:47 +0300 Subject: [PATCH 46/84] Fix update prop issue --- package.json | 2 +- src/modules/tasks/TaskStore.ts | 6 +- yarn.lock | 251 ++++++++++++++++++--------------- 3 files changed, 144 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index 35b6ed6..7d71bb7 100644 --- a/package.json +++ b/package.json @@ -231,7 +231,7 @@ "@ant-design/colors": "6.0.0", "@ant-design/icons": "4.6.2", "@sentry/electron": "2.5.0", - "antd": "4.16.7", + "antd": "4.17.2", "caniuse-lite": "1.0.30001214", "clsx": "^1.1.1", "date-fns": "2.20.1", diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index d205bec..3cba600 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -35,7 +35,7 @@ export default class TaskStore { } set(projectId: string, tasksInProject: TaskModel[]) { - this.tasks[projectId] = observable.array(tasksInProject); + this.tasks[projectId] = tasksInProject; this.tasksService.save(this.tasks); } @@ -91,9 +91,9 @@ export default class TaskStore { add(task: TaskModel) { const { projectId } = task; if (!Array.isArray(this.tasks[projectId])) { - this.tasks[projectId] = observable.array(); // TODO this.set() + this.tasks[projectId] = []; } - this.tasks[projectId].push(task); + this.tasks[projectId] = [...this.tasks[projectId], task]; this.updateVersion(); this.tasksService.save(this.tasks); GaService.event(EEventCategory.Tasks, ETasksEvents.Create); diff --git a/yarn.lock b/yarn.lock index eaf3367..6205b4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,12 +14,12 @@ dependencies: "@ctrl/tinycolor" "^3.4.0" -"@ant-design/icons-svg@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" - integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== +"@ant-design/icons-svg@^4.0.0", "@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== -"@ant-design/icons@4.6.2", "@ant-design/icons@^4.6.2": +"@ant-design/icons@4.6.2": version "4.6.2" resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.6.2.tgz#290f2e8cde505ab081fda63e511e82d3c48be982" integrity sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A== @@ -30,6 +30,17 @@ classnames "^2.2.6" rc-util "^5.9.4" +"@ant-design/icons@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f" + integrity sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + "@ant-design/react-slick@~0.28.1": version "0.28.2" resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.28.2.tgz#d2826f8a837b86b8d9cb0c38533ee8a491621f1b" @@ -2410,53 +2421,54 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -antd@4.16.7: - version "4.16.7" - resolved "https://registry.yarnpkg.com/antd/-/antd-4.16.7.tgz#c51fb143288adb8b008a786efe8d5df13320ac4c" - integrity sha512-9XQnTpQ21zqnXWAvFvt1mm0j5+r4E7N/eK0kSEBqxuoTCzTrrn5iwhXFEZ2htJx9QJFlihST/T1Wd8JzRf9J3Q== +antd@4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.17.2.tgz#c50123e6da990d8a41bc1ed6fbfc6d587b014ae0" + integrity sha512-1/xwj72mzg2ly5byvnxsgucEL5JMrinlsaAr4Y+vjobmTBSI9l9zOVkwwOG8kPIrFkhrzC1I42n6GZKnTwfZmg== dependencies: "@ant-design/colors" "^6.0.0" - "@ant-design/icons" "^4.6.2" + "@ant-design/icons" "^4.7.0" "@ant-design/react-slick" "~0.28.1" "@babel/runtime" "^7.12.5" + "@ctrl/tinycolor" "^3.4.0" array-tree-filter "^2.1.0" classnames "^2.2.6" copy-to-clipboard "^3.2.0" lodash "^4.17.21" + memoize-one "^6.0.0" moment "^2.25.3" - rc-cascader "~1.4.0" + rc-cascader "~2.2.0" rc-checkbox "~2.3.0" rc-collapse "~3.1.0" - rc-dialog "~8.5.1" - rc-drawer "~4.3.0" + rc-dialog "~8.6.0" + rc-drawer "~4.4.2" rc-dropdown "~3.2.0" - rc-field-form "~1.20.0" - rc-image "~5.2.4" - rc-input-number "~7.1.0" + rc-field-form "~1.21.0" + rc-image "~5.2.5" + rc-input-number "~7.3.0" rc-mentions "~1.6.1" rc-menu "~9.0.12" - rc-motion "^2.4.0" + rc-motion "^2.4.4" rc-notification "~4.5.7" - rc-pagination "~3.1.6" - rc-picker "~2.5.10" + rc-pagination "~3.1.9" + rc-picker "~2.5.17" rc-progress "~3.1.0" rc-rate "~2.9.0" rc-resize-observer "^1.0.0" - rc-select "~12.1.6" - rc-slider "~9.7.1" + rc-select "~13.1.0-alpha.0" + rc-slider "~9.7.4" rc-steps "~4.1.0" rc-switch "~3.2.0" - rc-table "~7.15.1" - rc-tabs "~11.9.1" + rc-table "~7.19.0" + rc-tabs "~11.10.0" rc-textarea "~0.3.0" rc-tooltip "~5.1.1" - rc-tree "~4.2.1" - rc-tree-select "~4.3.0" - rc-trigger "^5.2.1" + rc-tree "~5.3.0" + rc-tree-select "~4.7.0" + rc-trigger "^5.2.10" rc-upload "~4.3.0" - rc-util "^5.13.1" + rc-util "^5.14.0" scroll-into-view-if-needed "^2.2.25" - warning "^4.0.3" anymatch@^2.0.0: version "2.0.0" @@ -2723,10 +2735,10 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async-validator@^3.0.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.1.tgz#cd62b9688b2465f48420e27adb47760ab1b5559f" - integrity sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ== +async-validator@^4.0.2: + version "4.0.7" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" + integrity sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ== async@0.9.x: version "0.9.2" @@ -4177,11 +4189,21 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@2.20.1, date-fns@^2.0.1, date-fns@^2.15.0: +date-fns@2.20.1: version "2.20.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.20.1.tgz#7e60b7035284a5f83e37500376e738d9f49ecfd3" integrity sha512-8P5M8Kxbnovd0zfvOs7ipkiVJ3/zZQ0F/nrBW4x5E+I0uAZVZ80h6CKd24fSXQ5TLK5hXMtI4yb2O5rEZdUt2A== +date-fns@2.x, date-fns@^2.0.1: + version "2.26.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.26.0.tgz#fa45305543c392c4f914e50775fd2a4461e60fbd" + integrity sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg== + +dayjs@1.x: + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -8204,6 +8226,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -9813,13 +9840,14 @@ rc-align@^4.0.0: rc-util "^5.3.0" resize-observer-polyfill "^1.5.1" -rc-cascader@~1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.4.2.tgz#caa81098e3ef4d5f823f9156f6d8d6dbd6321afa" - integrity sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ== +rc-cascader@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-2.2.1.tgz#ec6cfa9d631e6e787abedb2db8c6b014ba1e15b6" + integrity sha512-4saWcwpmxxh5fhUdaDgOLF2gWL8KNxLwWqELX702HNXEt2yU7AixjfvgEORNsnQZleT2W2AaGMkRDeWrwt8fMw== dependencies: "@babel/runtime" "^7.12.5" array-tree-filter "^2.1.0" + rc-tree-select "~4.7.0" rc-trigger "^5.0.4" rc-util "^5.0.1" warning "^4.0.1" @@ -9843,20 +9871,20 @@ rc-collapse@~3.1.0: rc-util "^5.2.1" shallowequal "^1.1.0" -rc-dialog@~8.5.0, rc-dialog@~8.5.1: - version "8.5.2" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.5.2.tgz#530e289c25a31c15c85a0e8a4ba3f33414bff418" - integrity sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw== +rc-dialog@~8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.6.0.tgz#3b228dac085de5eed8c6237f31162104687442e7" + integrity sha512-GSbkfqjqxpZC5/zc+8H332+q5l/DKUhpQr0vdX2uDsxo5K0PhvaMEVjyoJUTkZ3+JstEADQji1PVLVb/2bJeOQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" rc-motion "^2.3.0" rc-util "^5.6.1" -rc-drawer@~4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.3.1.tgz#356333a7af01b777abd685c96c2ce62efb44f3f3" - integrity sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg== +rc-drawer@~4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.4.3.tgz#2094937a844e55dc9644236a2d9fba79c344e321" + integrity sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -9871,29 +9899,29 @@ rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: classnames "^2.2.6" rc-trigger "^5.0.4" -rc-field-form@~1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.20.0.tgz#2201092095429f7f020825462835c4086d2baf16" - integrity sha512-jkzsIfXR7ywEYdeAtktt1aLff88wxIPDLpq7KShHNl4wlsWrCE+TzkXBfjvVzYOVZt5GGrD8YDqNO/q6eaR/eA== +rc-field-form@~1.21.0: + version "1.21.2" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.21.2.tgz#85bda1ee006ae9f1d146e1000337c69b4bb6d101" + integrity sha512-LR/bURt/Tf5g39mb0wtMtQuWn42d/7kEzpzlC5fNC7yaRVmLTtlPP4sBBlaViETM9uZQKLoaB0Pt9Mubhm9gow== dependencies: "@babel/runtime" "^7.8.4" - async-validator "^3.0.3" + async-validator "^4.0.2" rc-util "^5.8.0" -rc-image@~5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.2.4.tgz#ff1059f937bde6ca918c6f1beb316beba911f255" - integrity sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q== +rc-image@~5.2.5: + version "5.2.5" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.2.5.tgz#44e6ffc842626827960e7ab72e1c0d6f3a8ce440" + integrity sha512-qUfZjYIODxO0c8a8P5GeuclYXZjzW4hV/5hyo27XqSFo1DmTCs2HkVeQObkcIk5kNsJtgsj1KoPThVsSc/PXOw== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" - rc-dialog "~8.5.0" + rc-dialog "~8.6.0" rc-util "^5.0.6" -rc-input-number@~7.1.0: - version "7.1.4" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.1.4.tgz#9d7410c91ff8dc6384d0233c20df278982989f9a" - integrity sha512-EG4iqkqyqzLRu/Dq+fw2od7nlgvXLEatE+J6uhi3HXE1qlM3C7L6a7o/hL9Ly9nimkES2IeQoj3Qda3I0izj3Q== +rc-input-number@~7.3.0: + version "7.3.4" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.3.4.tgz#674aea98260250287d36e330a7e065b174486e9d" + integrity sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" @@ -9924,7 +9952,7 @@ rc-menu@^9.0.0, rc-menu@~9.0.12: rc-util "^5.12.0" shallowequal "^1.1.0" -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0, rc-motion@^2.4.3: +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4: version "2.4.4" resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" integrity sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ== @@ -9953,22 +9981,23 @@ rc-overflow@^1.0.0, rc-overflow@^1.2.0: rc-resize-observer "^1.0.0" rc-util "^5.5.1" -rc-pagination@~3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.6.tgz#db3c06e50270b52fe272ac527c1fdc2c8d28af1f" - integrity sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw== +rc-pagination@~3.1.9: + version "3.1.14" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.14.tgz#1f7d0342edb80dca0989e4ddbe937b1d4657d88d" + integrity sha512-tcugvxrtPiVU00Uh0IwC8NIUlxa4KtA9pXcaMNJdSHeO2uQqVkHEwllsULTAWRF3zRV2ozo2weP/DRKIUrX+Zg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" -rc-picker@~2.5.10: - version "2.5.10" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.5.10.tgz#0db17c535a37abbe5d016bdcdfb13d6626f802d0" - integrity sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA== +rc-picker@~2.5.17: + version "2.5.19" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.5.19.tgz#73d07546fac3992f0bfabf2789654acada39e46f" + integrity sha512-u6myoCu/qiQ0vLbNzSzNrzTQhs7mldArCpPHrEI6OUiifs+IPXmbesqSm0zilJjfzrZJLgYeyyOMSznSlh0GKA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" - date-fns "^2.15.0" + date-fns "2.x" + dayjs "1.x" moment "^2.24.0" rc-trigger "^5.0.4" rc-util "^5.4.0" @@ -10001,10 +10030,10 @@ rc-resize-observer@^1.0.0: rc-util "^5.0.0" resize-observer-polyfill "^1.5.1" -rc-select@^12.0.0, rc-select@~12.1.6: - version "12.1.9" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-12.1.9.tgz#87b1bbb58649bc4a4d7961c1f1aa36a16c011a59" - integrity sha512-jsqcdby3Ag9ohYQ0d4vS4Q2jeWjj6kb2NHS9WcQSse0/5lCb3mqXI/1fkKRRIhdQvMBklYh4ctSox3mDrZiB8A== +rc-select@~13.1.0-alpha.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-13.1.1.tgz#851315d08a743504db57c7a5358cc907b69b45a5" + integrity sha512-Oy4L27x5QgGR8902pw0bJVjrTWFnKPKvdLHzJl5pjiA+jM1hpzDfLGg/bY2ntk5ElxxQKZUwbFKUeqfCQU7SrQ== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -10014,10 +10043,10 @@ rc-select@^12.0.0, rc-select@~12.1.6: rc-util "^5.9.8" rc-virtual-list "^3.2.0" -rc-slider@~9.7.1: - version "9.7.2" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.2.tgz#282f571f7582752ebaa33964e441184f4e79ad74" - integrity sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g== +rc-slider@~9.7.4: + version "9.7.4" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.4.tgz#430c860723bf6445ebf53517b550417a2f25eed1" + integrity sha512-pjLKLiDKiaL7/pNywfIBD+lDo5TtVo05KuIBSWEIoqu6FHh6IMWvthCiaODuYaVs3RLeF2nXOP5AjkD2Lt2Rwg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" @@ -10043,21 +10072,21 @@ rc-switch@~3.2.0: classnames "^2.2.1" rc-util "^5.0.1" -rc-table@~7.15.1: - version "7.15.2" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.15.2.tgz#f6ab73b2cfb1c76f3cf9682c855561423c6b5b22" - integrity sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ== +rc-table@~7.19.0: + version "7.19.2" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.19.2.tgz#976337a5dace3b8e04bea9554d72bc83aa5ab301" + integrity sha512-NdpnoM50MK02H5/hGOsObfxCvGFUG5cHB9turE5BKJ81T5Ycbq193w5tLhnpILXe//Oanzr47MdMxkUnVGP+qg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" rc-resize-observer "^1.0.0" - rc-util "^5.13.0" + rc-util "^5.14.0" shallowequal "^1.1.0" -rc-tabs@~11.9.1: - version "11.9.1" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.9.1.tgz#5b2e74da9a276978c2172ef9a05ae8af14da74cb" - integrity sha512-CLNx3qaWnO8KBWPd+7r52Pfk0MoPyKtlr+2ltWq2I9iqAjd1nZu6iBpQP7wbWBwIomyeFNw/WjHdRN7VcX5Qtw== +rc-tabs@~11.10.0: + version "11.10.4" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.10.4.tgz#36ea00a02466c90d8f843322660c713c2a45e6ed" + integrity sha512-FXihSD9DEF7G/C5iIHNon5jzIO66Two0aeB6uHCmSYibasCsnuBFslHXb9Pa4woqs+vVNjiKRgoDZfurwx1rzg== dependencies: "@babel/runtime" "^7.11.2" classnames "2.x" @@ -10084,32 +10113,32 @@ rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: "@babel/runtime" "^7.11.2" rc-trigger "^5.0.0" -rc-tree-select@~4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.3.1.tgz#4881bae5f6a5d696c5f61e52ad9489313f356eb4" - integrity sha512-OeV8u5kBEJ8MbatP04Rh8T3boOHGjdGBTEm1a0bubBbB2GNNhlMOr4ZxezkHYtXf02JdBS/WyydmI/RMjXgtJA== +rc-tree-select@~4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.7.0.tgz#4e612d5ba3f30a51f590e3c0e38e1e4c49f34aef" + integrity sha512-xcc2yPpQieTW6BcRkcKbT1dcAYCQ7ARtkoHlS9EsNdd6xgw9LA6rek6PMed8r/VRMfiKtWV4c4xijW5PI6s4Rw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" - rc-select "^12.0.0" - rc-tree "^4.0.0" - rc-util "^5.0.5" + rc-select "~13.1.0-alpha.0" + rc-tree "~5.3.0" + rc-util "^5.7.0" -rc-tree@^4.0.0, rc-tree@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-4.2.2.tgz#4429187cbbfbecbe989714a607e3de8b3ab7763f" - integrity sha512-V1hkJt092VrOVjNyfj5IYbZKRMHxWihZarvA5hPL/eqm7o2+0SNkeidFYm7LVVBrAKBpOpa0l8xt04uiqOd+6w== +rc-tree@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.3.0.tgz#766195ffbd65741000d4caf66980bd474d8ac9a2" + integrity sha512-A9GpRalG9sCsC+D3Dw9AB3a2gggf7KUT1FoCGGrbmCH1vsBYfTm3Z4RqEUrWtC7793HRccUTxqnENymkKS99lw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^2.0.1" rc-util "^5.0.0" - rc-virtual-list "^3.0.1" + rc-virtual-list "^3.4.1" -rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.3.tgz#8c55046ab432d7b52d51c69afb57ebb5bbe37e17" - integrity sha512-6Fokao07HUbqKIDkDRFEM0AGZvsvK0Fbp8A/KFgl1ngaqfO1nY037cISCG1Jm5fxImVsXp9awdkP7Vu5cxjjog== +rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10: + version "5.2.10" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" + integrity sha512-FkUf4H9BOFDaIwu42fvRycXMAvkttph9AlbCZXssZDVzz2L+QZ0ERvfB/4nX3ZFPh1Zd+uVGr1DEDeXxq4J1TA== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" @@ -10126,19 +10155,19 @@ rc-upload@~4.3.0: classnames "^2.2.5" rc-util "^5.2.0" -rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.13.0, rc-util@^5.13.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: - version "5.13.2" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.13.2.tgz#a8a0bb77743351841ba8bed6393e03b8d2f685c8" - integrity sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog== +rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.14.0, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: + version "5.15.0" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.15.0.tgz#3527bd6c5806cf04476e17a0c7bf094fc8ea4666" + integrity sha512-8RI8sjOCXD3FhD3dzQNBQetpGol6BBd3sHQ/8jSGk9NPT0CH3JGtBfPODnASyE7AdDpCFQMOmgcp9CBs3S/1hg== dependencies: "@babel/runtime" "^7.12.5" react-is "^16.12.0" shallowequal "^1.1.0" -rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz#2c92a40f4425e19881b38134d6bd286a11137d2d" - integrity sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q== +rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.2.tgz#1078327aa7230b5e456d679ed2ce99f3c036ebd1" + integrity sha512-OyVrrPvvFcHvV0ssz5EDZ+7Rf5qLat/+mmujjchNw5FfbJWNDwkpQ99EcVE6+FtNRmX9wFa1LGNpZLUTvp/4GQ== dependencies: classnames "^2.2.6" rc-resize-observer "^1.0.0" @@ -12228,7 +12257,7 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.12" -warning@^4.0.1, warning@^4.0.3: +warning@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== From 24fd38339e9a67a5447aa689a1a099f81e8edf8c Mon Sep 17 00:00:00 2001 From: yadro Date: Sun, 28 Nov 2021 10:10:56 +0300 Subject: [PATCH 47/84] [ProgressBar] fix calculation --- src/services/TaskTimeService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/TaskTimeService.ts b/src/services/TaskTimeService.ts index 376ed53..a182992 100644 --- a/src/services/TaskTimeService.ts +++ b/src/services/TaskTimeService.ts @@ -39,7 +39,7 @@ const TaskTimeService = { if (estimatedWorkingTimeEnd) { const durationWorkDayMs = estimatedWorkingTimeEnd.getTime() - workingTimeStart.getTime() || 1; - progress = (durationMs * 100) / durationWorkDayMs; + progress = ((durationMs + restMs) * 100) / durationWorkDayMs; progress = Math.min(progress, 100); } From 76ab1939582d7ac44ad77ddf78770db8bca847cd Mon Sep 17 00:00:00 2001 From: yadro Date: Sun, 28 Nov 2021 17:22:43 +0300 Subject: [PATCH 48/84] Throttle --- src/config.ts | 2 ++ src/helpers/Throttle.ts | 14 +++++++++++++ src/modules/tasks/TaskStore.ts | 38 ++++++++++++++++------------------ 3 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 src/helpers/Throttle.ts diff --git a/src/config.ts b/src/config.ts index f7de88e..452891d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,3 +1,5 @@ export const Features = { myDay: false, }; + +export const THROTTLE_SAVE_JSON_MS = 500; diff --git a/src/helpers/Throttle.ts b/src/helpers/Throttle.ts new file mode 100644 index 0000000..3cddc32 --- /dev/null +++ b/src/helpers/Throttle.ts @@ -0,0 +1,14 @@ +export default function throttle(func: (...args: any[]) => void, ms: number) { + let timer: number | undefined; + + function wrapper(this: any, ...args: any[]) { + if (timer !== undefined) { + window.clearTimeout(timer); + } + timer = window.setTimeout(() => { + func.apply(this, args); + }, ms); + } + + return wrapper; +} diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 3cba600..ceb38c3 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -1,4 +1,4 @@ -import { autorun, makeAutoObservable, observable } from 'mobx'; +import { autorun, makeAutoObservable } from 'mobx'; import { v4 as uuid } from 'uuid'; import TaskService from './TaskService'; import TaskModel, { ITimeRangeModel } from './models/TaskModel'; @@ -16,6 +16,8 @@ import { ETimeRangeEvents, } from '../../services/gaService/EEvents'; import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel'; +import throttle from '../../helpers/Throttle'; +import { THROTTLE_SAVE_JSON_MS } from '../../config'; export default class TaskStore { tasks: TasksByProject = {}; @@ -23,6 +25,10 @@ export default class TaskStore { versionHash = uuid(); private tasksService = new TaskService(); private interval: NodeJS.Timeout | undefined; + private saveInStorage = throttle(() => { + this.tasksService.save(this.tasks); + this.updateVersion(); + }, THROTTLE_SAVE_JSON_MS); constructor(private rootStore: RootStore) { makeAutoObservable(this); @@ -36,13 +42,12 @@ export default class TaskStore { set(projectId: string, tasksInProject: TaskModel[]) { this.tasks[projectId] = tasksInProject; - this.tasksService.save(this.tasks); + this.saveInStorage(); } setTime(task: TaskModel, timeIndex: number, timeRange: ITimeRangeModel) { task.time[timeIndex] = timeRange; - this.tasksService.save(this.tasks); - this.updateVersion(); + this.saveInStorage(); GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Update); } @@ -51,9 +56,8 @@ export default class TaskStore { this.stopTimer(); } - task.time.splice(timeIndex, 1); - this.tasksService.save(this.tasks); - this.updateVersion(); + task.time.splice(timeIndex, 1); // TODO move to task + this.saveInStorage(); GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Delete); } @@ -94,8 +98,7 @@ export default class TaskStore { this.tasks[projectId] = []; } this.tasks[projectId] = [...this.tasks[projectId], task]; - this.updateVersion(); - this.tasksService.save(this.tasks); + this.saveInStorage(); GaService.event(EEventCategory.Tasks, ETasksEvents.Create); } @@ -130,15 +133,13 @@ export default class TaskStore { ); } } - this.tasksService.save(this.tasks); - this.updateVersion(); + this.saveInStorage(); GaService.event(EEventCategory.Tasks, ETasksEvents.Delete); } removeProjectTasks(projectKey: string) { delete this.tasks[projectKey]; - this.tasksService.save(this.tasks); - this.updateVersion(); + this.saveInStorage(); } startTimer(task: TaskModel) { @@ -146,20 +147,17 @@ export default class TaskStore { this.activeTask = task; task.start(); this.setupReminder(task); - this.tasksService.save(this.tasks); - this.updateVersion(); + this.saveInStorage(); } stopTimer(silent?: boolean) { if (this.activeTask) { this.activeTask.stop(); - // this.activeTask = undefined; } if (!silent) { this.setupReminder(); - this.tasksService.save(this.tasks); - this.updateVersion(); + this.saveInStorage(); } } @@ -193,7 +191,7 @@ export default class TaskStore { checkTaskFn ); - this.set(projectId, this.tasks[projectId]); + this.saveInStorage(); } GaService.event(EEventCategory.Tasks, ETasksEvents.Check); } @@ -212,7 +210,7 @@ export default class TaskStore { markExpanded ); - this.set(projectId, this.tasks[projectId]); + this.saveInStorage(); } } From 6b4082cbbe9972fcba7ead176fa0844597bae6d6 Mon Sep 17 00:00:00 2001 From: yadro Date: Sun, 28 Nov 2021 17:52:19 +0300 Subject: [PATCH 49/84] Refactoring --- src/helpers/ArrayHelper.ts | 4 ++ src/screens/projects/ProjectsScreen.tsx | 49 ++++++++++++++++--------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/helpers/ArrayHelper.ts b/src/helpers/ArrayHelper.ts index b47b214..48f70fe 100644 --- a/src/helpers/ArrayHelper.ts +++ b/src/helpers/ArrayHelper.ts @@ -48,3 +48,7 @@ export function mapCurrentNext( export function last(arr: T[]): T | undefined { return arr[arr.length - 1]; } + +export function first(arr: T[]): T | undefined { + return arr[0]; +} diff --git a/src/screens/projects/ProjectsScreen.tsx b/src/screens/projects/ProjectsScreen.tsx index 26afe9f..499bce2 100644 --- a/src/screens/projects/ProjectsScreen.tsx +++ b/src/screens/projects/ProjectsScreen.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { Button, Layout, Space } from 'antd'; import { observer } from 'mobx-react'; import { Key } from 'rc-tree/lib/interface'; @@ -17,6 +17,8 @@ import TaskNode from './components/TaskNode/TaskNode'; import DrawerTask from './components/DrawerTask/DrawerTask'; import ProjectNode from './components/ProjectNode/ProjectNode'; import EditProjectModal from './components/ProjectModals/EditProjectModal'; +import { first } from '../../helpers/ArrayHelper'; +import clsx from 'clsx'; const { Sider } = Layout; @@ -75,6 +77,16 @@ const ProjectList = TreeList( } ); +function handleSelectProject(items: Key[]) { + if (items.length > 0) { + projectStore.setActiveProject(first(items) as string); + } +} + +function clearEditableProject() { + projectStore.setEditableProject(undefined); +} + export default observer(function Projects() { const classes = useStyles(); const [showProjectModal, setShowProjectModal] = useState(false); @@ -85,24 +97,26 @@ export default observer(function Projects() { setShowProjectModal(true); } - function handleSelectProject(items: Key[]) { - if (items.length > 0) { - projectStore.setActiveProject(items[0] as string); - } - } - - function handleSelectTask(items: Key[]) { + const handleSelectTask = useCallback((items: Key[]) => { if (items.length > 0) { setDrawerVisible(true); - const task = tasksStore.getTaskByKey(items[0] as string); + const task = tasksStore.getTaskByKey(first(items) as string); setSelectedTask(task); } - } + }, []); + ''; + const handleCloseDrawer = useCallback(() => { + setDrawerVisible(false); + }, []); + + const handleHideProjectModal = useCallback(() => { + setShowProjectModal(false); + }, []); return ( - +
- { - const title = e.target.value; - if (task) { - task.setTitle(title); - } - }} + onChange={handleTitleChange} />