From 0b7ce82aaa21018da084149bb52b5c90b2273bc8 Mon Sep 17 00:00:00 2001 From: Mo Date: Tue, 7 Jun 2022 11:52:15 -0500 Subject: [PATCH] feat: add desktop repo (#1071) --- .dockerignore | 2 +- .eslintignore | 2 + .github/codeql/codeql-config.yml | 4 + .github/workflows/desktop.dev.yml | 27 + .github/workflows/git-sync.yml | 2 +- .github/workflows/{beta.yml => web.beta.yml} | 3 + .github/workflows/{dev.yml => web.dev.yml} | 4 +- .github/workflows/{prod.yml => web.prod.yml} | 4 +- CODE_OF_CONDUCT.md | 76 - README.md | 4 +- docker/entrypoint.sh | 4 +- linter.tsconfig.json | 4 + package.json | 5 +- packages/desktop/.env.sample | 1 + packages/desktop/.eslintrc | 42 + packages/desktop/.gitignore | 15 + packages/desktop/.husky/pre-commit | 2 + packages/desktop/.mocharc.json | 5 + packages/desktop/.npmrc | 6 + packages/desktop/.nvmrc | 1 + packages/desktop/.prettierignore | 8 + packages/desktop/.prettierrc | 6 + packages/desktop/LICENSE | 661 ++ packages/desktop/README.md | 81 + packages/desktop/SECURITY.md | 37 + packages/desktop/app/@types/modules.ts | 4 + packages/desktop/app/application.ts | 179 + .../app/enableExperimentalWebFeatures.ts | 16 + .../app/grantLinuxPasswordsAccess.html | 95 + packages/desktop/app/icon/Icon-256x256.png | Bin 0 -> 7125 bytes packages/desktop/app/icon/Icon-512x512.png | Bin 0 -> 15785 bytes packages/desktop/app/index.html | 113 + packages/desktop/app/index.ts | 126 + .../Main/Backups/BackupsManager.ts | 245 + .../Main/Backups/BackupsManagerInterface.ts | 13 + .../app/javascripts/Main/ExtensionsServer.ts | 115 + .../Main/FileBackups/FileBackupsManager.ts | 156 + .../Main/FileBackups/FileDownloader.ts | 54 + .../Main/FileBackups/FileNetworking.ts | 22 + .../app/javascripts/Main/Keychain/Keychain.ts | 104 + .../Main/Keychain/KeychainInterface.ts | 9 + .../Main/Menus/MenuManagerInterface.ts | 4 + .../app/javascripts/Main/Menus/Menus.ts | 667 ++ .../javascripts/Main/Packages/Networking.ts | 75 + .../Main/Packages/PackageManager.ts | 374 + .../Main/Packages/PackageManagerInterface.ts | 35 + .../javascripts/Main/Remote/DataInterface.ts | 3 + .../javascripts/Main/Remote/RemoteBridge.ts | 204 + .../javascripts/Main/Search/SearchManager.ts | 15 + .../Main/Search/SearchManagerInterface.ts | 3 + .../javascripts/Main/SpellcheckerManager.ts | 214 + .../desktop/app/javascripts/Main/Store.ts | 185 + .../app/javascripts/Main/Strings/english.ts | 160 + .../app/javascripts/Main/Strings/french.ts | 42 + .../app/javascripts/Main/Strings/index.ts | 70 + .../app/javascripts/Main/Strings/types.ts | 109 + .../app/javascripts/Main/TrayManager.ts | 109 + .../app/javascripts/Main/Types/Constants.ts | 6 + .../app/javascripts/Main/Types/Paths.ts | 69 + .../app/javascripts/Main/Types/Platforms.ts | 31 + .../app/javascripts/Main/UpdateManager.ts | 249 + .../app/javascripts/Main/Utils/FileUtils.ts | 272 + .../app/javascripts/Main/Utils/Testing.ts | 61 + .../app/javascripts/Main/Utils/Utils.ts | 44 + .../desktop/app/javascripts/Main/Window.ts | 333 + .../app/javascripts/Main/ZoomManager.ts | 16 + .../Renderer/CrossProcessBridge.ts | 52 + .../app/javascripts/Renderer/DesktopDevice.ts | 154 + .../app/javascripts/Renderer/Preload.ts | 42 + .../app/javascripts/Renderer/Renderer.ts | 164 + .../Renderer/grantLinuxPasswordsAccess.js | 22 + .../app/javascripts/Shared/CommandLineArgs.ts | 4 + .../app/javascripts/Shared/IpcMessages.ts | 14 + packages/desktop/app/package.json | 11 + packages/desktop/app/stylesheets/renderer.css | 83 + packages/desktop/app/yarn.lock | 448 + packages/desktop/babel.config.js | 30 + .../build/entitlements.mac.inherit.plist | 14 + packages/desktop/build/icon.icns | Bin 0 -> 103873 bytes packages/desktop/build/icon.ico | Bin 0 -> 370070 bytes .../build/icon.iconset/icon_128x128.png | Bin 0 -> 2980 bytes .../build/icon.iconset/icon_128x128@2x.png | Bin 0 -> 7570 bytes .../desktop/build/icon.iconset/icon_16x16.png | Bin 0 -> 503 bytes .../build/icon.iconset/icon_16x16@2x.png | Bin 0 -> 853 bytes .../build/icon.iconset/icon_256x256.png | Bin 0 -> 6887 bytes .../build/icon.iconset/icon_256x256@2x.png | Bin 0 -> 17279 bytes .../desktop/build/icon.iconset/icon_32x32.png | Bin 0 -> 853 bytes .../build/icon.iconset/icon_32x32@2x.png | Bin 0 -> 1152 bytes .../build/icon.iconset/icon_512x512.png | Bin 0 -> 17279 bytes .../build/icon.iconset/icon_512x512@2x.png | Bin 0 -> 47812 bytes packages/desktop/build/icon/Icon-512x512.png | Bin 0 -> 15785 bytes packages/desktop/build/installer.nsh | 7 + packages/desktop/commitlint.config.js | 3 + packages/desktop/desktop.webpack.common.js | 143 + packages/desktop/desktop.webpack.dev.js | 14 + packages/desktop/desktop.webpack.prod.js | 10 + packages/desktop/dev-app-update.yml | 4 + packages/desktop/linter.tsconfig.json | 3 + packages/desktop/package.json | 161 + packages/desktop/test/TestIpcMessage.ts | 52 + packages/desktop/test/backupsManager.spec.ts | 123 + packages/desktop/test/data/zip-file.zip | Bin 0 -> 303 bytes packages/desktop/test/driver.ts | 203 + packages/desktop/test/extServer.spec.ts | 130 + packages/desktop/test/fakePaths.ts | 29 + packages/desktop/test/fileUtils.spec.ts | 111 + packages/desktop/test/menus.spec.ts | 49 + packages/desktop/test/networking.spec.ts | 58 + packages/desktop/test/packageManager.spec.ts | 158 + .../desktop/test/spellcheckerManager.spec.ts | 38 + packages/desktop/test/storage.spec.ts | 130 + packages/desktop/test/testUtils.ts | 21 + packages/desktop/test/updates.spec.ts | 21 + packages/desktop/test/utils.spec.ts | 14 + packages/desktop/test/window.spec.ts | 16 + packages/desktop/tsconfig.json | 21 + packages/desktop/yarn.lock | 7412 +++++++++++++++++ packages/web/.eslintrc | 9 +- packages/web/jest.config.js | 2 +- packages/web/linter.tsconfig.json | 3 + packages/web/package.json | 9 +- packages/web/src/javascripts/App.tsx | 1 + .../web/src/javascripts/Constants/Version.ts | 10 +- ...ck-defaults.js => web.webpack-defaults.js} | 0 ...ebpack.config.js => web.webpack.config.js} | 6 +- .../{webpack.dev.js => web.webpack.dev.js} | 4 +- .../{webpack.prod.js => web.webpack.prod.js} | 4 +- scripts/desktop/afterSignHook.js | 37 + scripts/desktop/build.mjs | 224 + scripts/desktop/change-version.mjs | 15 + scripts/desktop/create-draft-release.mjs | 25 + scripts/desktop/fix-mac-zip.js | 79 + scripts/desktop/sums.mjs | 37 + scripts/desktop/utils.mjs | 44 + yarn.lock | 1916 ++++- 135 files changed, 17821 insertions(+), 180 deletions(-) create mode 100644 .eslintignore create mode 100644 .github/workflows/desktop.dev.yml rename .github/workflows/{beta.yml => web.beta.yml} (97%) rename .github/workflows/{dev.yml => web.dev.yml} (97%) rename .github/workflows/{prod.yml => web.prod.yml} (97%) delete mode 100644 CODE_OF_CONDUCT.md create mode 100644 linter.tsconfig.json create mode 100644 packages/desktop/.env.sample create mode 100644 packages/desktop/.eslintrc create mode 100644 packages/desktop/.gitignore create mode 100755 packages/desktop/.husky/pre-commit create mode 100644 packages/desktop/.mocharc.json create mode 100644 packages/desktop/.npmrc create mode 100644 packages/desktop/.nvmrc create mode 100644 packages/desktop/.prettierignore create mode 100644 packages/desktop/.prettierrc create mode 100644 packages/desktop/LICENSE create mode 100644 packages/desktop/README.md create mode 100644 packages/desktop/SECURITY.md create mode 100644 packages/desktop/app/@types/modules.ts create mode 100644 packages/desktop/app/application.ts create mode 100644 packages/desktop/app/enableExperimentalWebFeatures.ts create mode 100644 packages/desktop/app/grantLinuxPasswordsAccess.html create mode 100644 packages/desktop/app/icon/Icon-256x256.png create mode 100644 packages/desktop/app/icon/Icon-512x512.png create mode 100644 packages/desktop/app/index.html create mode 100644 packages/desktop/app/index.ts create mode 100644 packages/desktop/app/javascripts/Main/Backups/BackupsManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Backups/BackupsManagerInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/ExtensionsServer.ts create mode 100644 packages/desktop/app/javascripts/Main/FileBackups/FileBackupsManager.ts create mode 100644 packages/desktop/app/javascripts/Main/FileBackups/FileDownloader.ts create mode 100644 packages/desktop/app/javascripts/Main/FileBackups/FileNetworking.ts create mode 100644 packages/desktop/app/javascripts/Main/Keychain/Keychain.ts create mode 100644 packages/desktop/app/javascripts/Main/Keychain/KeychainInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/Menus/MenuManagerInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/Menus/Menus.ts create mode 100644 packages/desktop/app/javascripts/Main/Packages/Networking.ts create mode 100644 packages/desktop/app/javascripts/Main/Packages/PackageManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Packages/PackageManagerInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/Remote/DataInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/Remote/RemoteBridge.ts create mode 100644 packages/desktop/app/javascripts/Main/Search/SearchManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Search/SearchManagerInterface.ts create mode 100644 packages/desktop/app/javascripts/Main/SpellcheckerManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Store.ts create mode 100644 packages/desktop/app/javascripts/Main/Strings/english.ts create mode 100644 packages/desktop/app/javascripts/Main/Strings/french.ts create mode 100644 packages/desktop/app/javascripts/Main/Strings/index.ts create mode 100644 packages/desktop/app/javascripts/Main/Strings/types.ts create mode 100644 packages/desktop/app/javascripts/Main/TrayManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Types/Constants.ts create mode 100644 packages/desktop/app/javascripts/Main/Types/Paths.ts create mode 100644 packages/desktop/app/javascripts/Main/Types/Platforms.ts create mode 100644 packages/desktop/app/javascripts/Main/UpdateManager.ts create mode 100644 packages/desktop/app/javascripts/Main/Utils/FileUtils.ts create mode 100644 packages/desktop/app/javascripts/Main/Utils/Testing.ts create mode 100644 packages/desktop/app/javascripts/Main/Utils/Utils.ts create mode 100644 packages/desktop/app/javascripts/Main/Window.ts create mode 100644 packages/desktop/app/javascripts/Main/ZoomManager.ts create mode 100644 packages/desktop/app/javascripts/Renderer/CrossProcessBridge.ts create mode 100644 packages/desktop/app/javascripts/Renderer/DesktopDevice.ts create mode 100644 packages/desktop/app/javascripts/Renderer/Preload.ts create mode 100644 packages/desktop/app/javascripts/Renderer/Renderer.ts create mode 100644 packages/desktop/app/javascripts/Renderer/grantLinuxPasswordsAccess.js create mode 100644 packages/desktop/app/javascripts/Shared/CommandLineArgs.ts create mode 100644 packages/desktop/app/javascripts/Shared/IpcMessages.ts create mode 100644 packages/desktop/app/package.json create mode 100644 packages/desktop/app/stylesheets/renderer.css create mode 100644 packages/desktop/app/yarn.lock create mode 100644 packages/desktop/babel.config.js create mode 100644 packages/desktop/build/entitlements.mac.inherit.plist create mode 100755 packages/desktop/build/icon.icns create mode 100755 packages/desktop/build/icon.ico create mode 100644 packages/desktop/build/icon.iconset/icon_128x128.png create mode 100644 packages/desktop/build/icon.iconset/icon_128x128@2x.png create mode 100644 packages/desktop/build/icon.iconset/icon_16x16.png create mode 100644 packages/desktop/build/icon.iconset/icon_16x16@2x.png create mode 100644 packages/desktop/build/icon.iconset/icon_256x256.png create mode 100644 packages/desktop/build/icon.iconset/icon_256x256@2x.png create mode 100644 packages/desktop/build/icon.iconset/icon_32x32.png create mode 100644 packages/desktop/build/icon.iconset/icon_32x32@2x.png create mode 100644 packages/desktop/build/icon.iconset/icon_512x512.png create mode 100644 packages/desktop/build/icon.iconset/icon_512x512@2x.png create mode 100644 packages/desktop/build/icon/Icon-512x512.png create mode 100644 packages/desktop/build/installer.nsh create mode 100644 packages/desktop/commitlint.config.js create mode 100644 packages/desktop/desktop.webpack.common.js create mode 100644 packages/desktop/desktop.webpack.dev.js create mode 100644 packages/desktop/desktop.webpack.prod.js create mode 100644 packages/desktop/dev-app-update.yml create mode 100644 packages/desktop/linter.tsconfig.json create mode 100644 packages/desktop/package.json create mode 100644 packages/desktop/test/TestIpcMessage.ts create mode 100644 packages/desktop/test/backupsManager.spec.ts create mode 100644 packages/desktop/test/data/zip-file.zip create mode 100644 packages/desktop/test/driver.ts create mode 100644 packages/desktop/test/extServer.spec.ts create mode 100644 packages/desktop/test/fakePaths.ts create mode 100644 packages/desktop/test/fileUtils.spec.ts create mode 100644 packages/desktop/test/menus.spec.ts create mode 100644 packages/desktop/test/networking.spec.ts create mode 100644 packages/desktop/test/packageManager.spec.ts create mode 100644 packages/desktop/test/spellcheckerManager.spec.ts create mode 100644 packages/desktop/test/storage.spec.ts create mode 100644 packages/desktop/test/testUtils.ts create mode 100644 packages/desktop/test/updates.spec.ts create mode 100644 packages/desktop/test/utils.spec.ts create mode 100644 packages/desktop/test/window.spec.ts create mode 100644 packages/desktop/tsconfig.json create mode 100644 packages/desktop/yarn.lock create mode 100644 packages/web/linter.tsconfig.json rename packages/web/{webpack-defaults.js => web.webpack-defaults.js} (100%) rename packages/web/{webpack.config.js => web.webpack.config.js} (90%) rename packages/web/{webpack.dev.js => web.webpack.dev.js} (85%) rename packages/web/{webpack.prod.js => web.webpack.prod.js} (63%) create mode 100644 scripts/desktop/afterSignHook.js create mode 100644 scripts/desktop/build.mjs create mode 100644 scripts/desktop/change-version.mjs create mode 100644 scripts/desktop/create-draft-release.mjs create mode 100644 scripts/desktop/fix-mac-zip.js create mode 100644 scripts/desktop/sums.mjs create mode 100644 scripts/desktop/utils.mjs diff --git a/.dockerignore b/.dockerignore index c00b3c8cc..539d819c1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ -# git .git/ .gitignore .eslintcache @@ -7,3 +6,4 @@ dist packages/web-server/public/assets packages/web-server/tmp packages/web-server/vendor/bundles +packages/desktop \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..d024ec89a --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules +packages/*/coverage \ No newline at end of file diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index d5e9370a1..173a9940d 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -6,7 +6,11 @@ queries: paths: - packages/web/src/javascripts +- packages/desktop/app paths-ignore: - bin - node_modules +- build +- dist +- packages/desktop/app/dist \ No newline at end of file diff --git a/.github/workflows/desktop.dev.yml b/.github/workflows/desktop.dev.yml new file mode 100644 index 000000000..6c4775048 --- /dev/null +++ b/.github/workflows/desktop.dev.yml @@ -0,0 +1,27 @@ +name: Dev + +on: + push: + branches: + - develop + paths: + - packages/desktop/** + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/desktop + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '14.x' + registry-url: 'https://registry.npmjs.org' + - run: yarn setup + - run: node scripts/build.mjs appimage-x64 + - uses: actions/upload-artifact@v2 + with: + name: 'AppImage' + path: dist/*.AppImage diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml index bf427817b..18900de87 100644 --- a/.github/workflows/git-sync.yml +++ b/.github/workflows/git-sync.yml @@ -6,7 +6,7 @@ jobs: - name: git-sync uses: wei/git-sync@v3 with: - source_repo: "standardnotes/web" + source_repo: "standardnotes/app" source_branch: "refs/remotes/source/*" destination_repo: "standardnotes/private-web" destination_branch: "refs/heads/*" diff --git a/.github/workflows/beta.yml b/.github/workflows/web.beta.yml similarity index 97% rename from .github/workflows/beta.yml rename to .github/workflows/web.beta.yml index 094216b34..34f901a66 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/web.beta.yml @@ -3,6 +3,9 @@ name: Beta on: push: branches: [ beta/* ] + paths: + - packages/web-server/** + - packages/web/** workflow_dispatch: jobs: diff --git a/.github/workflows/dev.yml b/.github/workflows/web.dev.yml similarity index 97% rename from .github/workflows/dev.yml rename to .github/workflows/web.dev.yml index 48a9ed82e..208865412 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/web.dev.yml @@ -8,8 +8,8 @@ on: push: branches: [ develop ] paths: - - packages/web-server - - packages/web + - packages/web-server/** + - packages/web/** workflow_dispatch: jobs: diff --git a/.github/workflows/prod.yml b/.github/workflows/web.prod.yml similarity index 97% rename from .github/workflows/prod.yml rename to .github/workflows/web.prod.yml index 0c3fe5c2d..d79c18ff9 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/web.prod.yml @@ -8,8 +8,8 @@ on: push: branches: [ main ] paths: - - packages/web-server - - packages/web + - packages/web-server/** + - packages/web/** jobs: test: diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 4eca6c46f..000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at help@standardnotes.org. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/README.md b/README.md index f77a05ac2..e7133af4d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Standard Notes is a simple and private notes app available on most platforms, in
[![latest release version](https://img.shields.io/github/v/release/standardnotes/desktop)](https://github.com/standardnotes/desktop/releases) -[![License](https://img.shields.io/github/license/standardnotes/web?color=blue)](https://github.com/standardnotes/web/blob/main/LICENSE) +[![License](https://img.shields.io/github/license/standardnotes/app?color=blue)](https://github.com/standardnotes/app/blob/main/LICENSE) [![Slack](https://img.shields.io/badge/slack-standardnotes-CC2B5E.svg?style=flat&logo=slack)](https://standardnotes.com/slack) [![Twitter Follow](https://img.shields.io/badge/follow-%40standardnotes-blue.svg?style=flat&logo=twitter)](https://twitter.com/standardnotes) @@ -58,8 +58,6 @@ Developers can create and publish their own extensions. Visit the [documentation Questions? Find answers on our [Help page](https://standardnotes.com/help). -🙏 - --- ### Docker setup diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index b249e0f3b..5fddfdae0 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -8,7 +8,7 @@ case "$COMMAND" in echo "Prestart Step 1/1 - Removing server lock" rm -f /app/packages/web-server/tmp/pids/server.pid echo "Starting Server..." - yarn start:web + yarn start:server:web ;; 'start-local' ) @@ -21,7 +21,7 @@ case "$COMMAND" in echo "Prestart Step 4/4 - Building" yarn build echo "Starting Server..." - yarn start:web + yarn start:server:web ;; * ) diff --git a/linter.tsconfig.json b/linter.tsconfig.json new file mode 100644 index 000000000..ab671ac7f --- /dev/null +++ b/linter.tsconfig.json @@ -0,0 +1,4 @@ +{ + "exclude": ["node_modules"], + "extends": "./node_modules/@standardnotes/config/src/linter.tsconfig.json" +} diff --git a/package.json b/package.json index 956a95451..b304af3e5 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,9 @@ "test": "lerna run test --parallel", "clean": "lerna run clean", "build": "lerna run build", - "start:web": "lerna run start --scope=@standardnotes/web-server", - "start:web:localhost": "lerna run start:no-binding --scope=@standardnotes/web-server", + "build:web": "lerna run build --scope=@standardnotes/web", + "start:server:web": "lerna run start --scope=@standardnotes/web-server", + "start:server:web:localhost": "lerna run start:no-binding --scope=@standardnotes/web-server", "prepare": "husky install" }, "devDependencies": { diff --git a/packages/desktop/.env.sample b/packages/desktop/.env.sample new file mode 100644 index 000000000..1f3308255 --- /dev/null +++ b/packages/desktop/.env.sample @@ -0,0 +1 @@ +DEFAULT_SYNC_SERVER=https://api.standardnotes.com \ No newline at end of file diff --git a/packages/desktop/.eslintrc b/packages/desktop/.eslintrc new file mode 100644 index 000000000..2734a4925 --- /dev/null +++ b/packages/desktop/.eslintrc @@ -0,0 +1,42 @@ +{ + "env": { + "node": true, + "commonjs": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "../../node_modules/@standardnotes/config/src/.eslintrc" + ], + "parser": "@typescript-eslint/parser", + "ignorePatterns": ["test", "scripts", ".eslintrc", "tsconfig.json", "node_modules"], + "rules": { + /** Style */ + "quotes": ["error", "single", { "avoidEscape": true }], + + /** Preferences */ + "no-console": "off", + "accessor-pairs": 0, + "no-nonoctal-decimal-escape": 0, + "no-unsafe-optional-chaining": 0, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/no-use-before-define": ["error", "nofunc"], + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-var-requires": 0, + /** + * The following rules are disabled because they are already implemented + * in the TypeScript configuration, or vice-versa + */ + "no-unused-vars": 0, + "no-useless-constructor": 0, + "no-unused-expressions": 0, + "@typescript-eslint/camelcase": 0 + }, + "plugins": ["@typescript-eslint"], + "globals": { + "zip": true + } +} diff --git a/packages/desktop/.gitignore b/packages/desktop/.gitignore new file mode 100644 index 000000000..8fee389e5 --- /dev/null +++ b/packages/desktop/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +.DS_Store +dist/ +npm-debug.log +test/data/tmp/ + +/app/dist +.vscode +.idea +.env +.env.production +.env.development + +codeqldb +yarn-error.log \ No newline at end of file diff --git a/packages/desktop/.husky/pre-commit b/packages/desktop/.husky/pre-commit new file mode 100755 index 000000000..6700f5128 --- /dev/null +++ b/packages/desktop/.husky/pre-commit @@ -0,0 +1,2 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" diff --git a/packages/desktop/.mocharc.json b/packages/desktop/.mocharc.json new file mode 100644 index 000000000..5b54079a7 --- /dev/null +++ b/packages/desktop/.mocharc.json @@ -0,0 +1,5 @@ +{ + "extension": ["ts"], + "spec": "test/*.spec.ts", + "require": "ts-node/register/transpile-only" +} diff --git a/packages/desktop/.npmrc b/packages/desktop/.npmrc new file mode 100644 index 000000000..81355292b --- /dev/null +++ b/packages/desktop/.npmrc @@ -0,0 +1,6 @@ +runtime = electron +target = 5.0.10 +target_arch = x64 +disturl = https://atom.io/download/atom-shell +export npm_config_runtime=electron +export npm_config_build_from_source=true diff --git a/packages/desktop/.nvmrc b/packages/desktop/.nvmrc new file mode 100644 index 000000000..c6244cda0 --- /dev/null +++ b/packages/desktop/.nvmrc @@ -0,0 +1 @@ +14.17.3 diff --git a/packages/desktop/.prettierignore b/packages/desktop/.prettierignore new file mode 100644 index 000000000..a2bdd1d35 --- /dev/null +++ b/packages/desktop/.prettierignore @@ -0,0 +1,8 @@ +node_modules/ +dist/ +app/dist/ +test/data/tmp/ +web/ +.github +codeqldb +*.js \ No newline at end of file diff --git a/packages/desktop/.prettierrc b/packages/desktop/.prettierrc new file mode 100644 index 000000000..c9cb3989c --- /dev/null +++ b/packages/desktop/.prettierrc @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "printWidth": 120, + "semi": false +} diff --git a/packages/desktop/LICENSE b/packages/desktop/LICENSE new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/packages/desktop/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/packages/desktop/README.md b/packages/desktop/README.md new file mode 100644 index 000000000..ae49f2491 --- /dev/null +++ b/packages/desktop/README.md @@ -0,0 +1,81 @@ +# Standard Notes + +
+ +[![latest release version](https://img.shields.io/github/v/release/standardnotes/desktop)](https://github.com/standardnotes/desktop/releases) +[![License](https://img.shields.io/github/license/standardnotes/desktop?color=blue)](https://github.com/standardnotes/desktop/blob/master/LICENSE) +[![Slack](https://img.shields.io/badge/slack-standardnotes-CC2B5E.svg?style=flat&logo=slack)](https://standardnotes.com/slack) +[![Twitter Follow](https://img.shields.io/badge/follow-%40standardnotes-blue.svg?style=flat&logo=twitter)](https://twitter.com/standardnotes) + +
+ +This application makes use of the core JS/CSS/HTML code found in the [web repo](https://github.com/standardnotes/app). For issues related to the actual app experience, please post issues in the web repo. + +## Running Locally + +Make sure [Yarn](https://classic.yarnpkg.com/en/) is installed on your system. + +```bash +yarn setup +yarn build:web # Or `yarn dev:web` +yarn dev + +# In another terminal +yarn start +``` + +We use [commitlint](https://github.com/conventional-changelog/commitlint) to validate commit messages. +Before making a pull request, make sure to check the output of the following commands: + +```bash +yarn lint +yarn test # Make sure to start `yarn dev` before running the tests, and quit any running Standard Notes applications so they don't conflict. +``` + +Pull requests should target the `develop` branch. + +### Installing dependencies + +To determine where to install a dependency: + +- If it is only required for building, install it in `package.json`'s `devDependencies` +- If it is required at runtime but can be packaged by webpack, install it in `package.json`'s `dependencies`. +- If it must be distributed as a node module (not packaged by webpack), install it in `app/package.json`'s `dependencies` + - Also make sure to declare it as an external commonjs dependency in `webpack.common.js`. + +## Building + +Build for all platforms: + +- `yarn release` + +## Building natively on arm64 + +Building arm64 releases on amd64 systems is only possible with AppImage, Debian and universal "dir" targets. + +Building arm64 releases natively on arm64 systems requires some additional preparation: + +- `export npm_config_target_arch=arm64` +- `export npm_config_arch=arm64` + +A native `fpm` installation is needed for Debian builds. `fpm` needs to be available in `$PATH`, which can be achieved by running + +- `gem install fpm --no-document` + +and making sure `$GEM_HOME/bin` is added to `$PATH`. + +Snap releases also require a working snapcraft / `snapd` installation. + +Building can then be done by running: + +- `yarn setup` + +Followed by + +- `node scripts/build.mjs deb-arm64` + +## Installation + +On Linux, download the latest AppImage from the [Releases](https://github.com/standardnotes/desktop/releases/latest) page, and give it executable permission: + +`chmod u+x standard-notes*.AppImage` diff --git a/packages/desktop/SECURITY.md b/packages/desktop/SECURITY.md new file mode 100644 index 000000000..8313f85d3 --- /dev/null +++ b/packages/desktop/SECURITY.md @@ -0,0 +1,37 @@ +Thank you for your work in helping keep Standard Notes safe and secure. If you believe you've found a security issue in our product, we encourage you to notify us. We welcome working with you to resolve the issue promptly. + +# Disclosure Policy + +- Let us know as soon as possible upon discovery of a potential security issue, and we'll make every + effort to quickly resolve the issue. Please email [security@standardnotes.com](mailto:security@standardnotes.com) for a direct response. +- Provide us a reasonable amount of time to resolve the issue before any disclosure to the public or a + third-party. We may publicly disclose the issue before resolving it, if appropriate. +- Make a good faith effort to avoid privacy violations, destruction of data, and interruption or + degradation of our service. Only interact with accounts you own or with explicit permission of the + account holder. + +# In-scope + +- Security issues in any current release of Standard Notes. Our product downloads are available on our homepage at https://standardnotes.com, and our source code is available at https://github.com/standardnotes. + +# Exclusions + +The following bug classes are out-of scope: + +- Bugs that are already reported on any of Standard Notes' issue trackers (https://github.com/standardnotes), or that we already know of. +- Issues in an upstream software dependency (ex: Electron, React Native) which are already reported to the upstream maintainer. +- Attacks requiring physical access to a user's device. +- Self-XSS +- Issues related to software or protocols not under SN's control +- Vulnerabilities in outdated versions of Standard Notes +- Missing security best practices that do not directly lead to a vulnerability +- Issues that do not have any impact on the general public + +While researching, we'd like to ask you to refrain from: + +- Denial of service +- Spamming +- Social engineering (including phishing) of Standard Notes' staff or contractors +- Any physical attempts against Standard Notes' property or data centers + +Thank you for helping keep Standard Notes secure! diff --git a/packages/desktop/app/@types/modules.ts b/packages/desktop/app/@types/modules.ts new file mode 100644 index 000000000..44aa36b09 --- /dev/null +++ b/packages/desktop/app/@types/modules.ts @@ -0,0 +1,4 @@ +declare module '*.html' { + const content: string + export default content +} diff --git a/packages/desktop/app/application.ts b/packages/desktop/app/application.ts new file mode 100644 index 000000000..a63dd5b32 --- /dev/null +++ b/packages/desktop/app/application.ts @@ -0,0 +1,179 @@ +import { App, Shell } from 'electron' +import { createExtensionsServer } from './javascripts/Main/ExtensionsServer' +import { isLinux, isMac, isWindows } from './javascripts/Main/Types/Platforms' +import { Store, StoreKeys } from './javascripts/Main/Store' +import { AppName, initializeStrings } from './javascripts/Main/Strings' +import { createWindowState, WindowState } from './javascripts/Main/Window' +import { Keychain } from './javascripts/Main/Keychain/Keychain' +import { isDev, isTesting } from './javascripts/Main/Utils/Utils' +import { Urls, Paths } from './javascripts/Main/Types/Paths' +import { action, makeObservable, observable } from 'mobx' +import { UpdateState } from './javascripts/Main/UpdateManager' +import { handleTestMessage } from './javascripts/Main/Utils/Testing' +import { MessageType } from '../test/TestIpcMessage' + +const deepLinkScheme = 'standardnotes' + +export class AppState { + readonly version: string + readonly store: Store + readonly startUrl = Urls.indexHtml + readonly isPrimaryInstance: boolean + public willQuitApp = false + public lastBackupDate: number | null = null + public windowState?: WindowState + public deepLinkUrl?: string + public readonly updates: UpdateState + + constructor(app: Electron.App) { + this.version = app.getVersion() + this.store = new Store(Paths.userDataDir) + this.isPrimaryInstance = app.requestSingleInstanceLock() + makeObservable(this, { + lastBackupDate: observable, + setBackupCreationDate: action, + }) + this.updates = new UpdateState(this) + + if (isTesting()) { + handleTestMessage(MessageType.AppStateCall, (method, ...args) => { + ;(this as any)[method](...args) + }) + } + } + + setBackupCreationDate(date: number | null): void { + this.lastBackupDate = date + } +} + +export function initializeApplication(args: { app: Electron.App; ipcMain: Electron.IpcMain; shell: Shell }): void { + const { app } = args + + app.name = AppName + + const state = new AppState(app) + + void setupDeepLinking(app) + + registerSingleInstanceHandler(app, state) + + registerAppEventListeners({ + ...args, + state, + }) + + if (isDev()) { + /** Expose the app's state as a global variable. Useful for debugging */ + ;(global as any).appState = state + } +} + +function focusWindow(appState: AppState) { + const window = appState.windowState?.window + + if (window) { + if (!window.isVisible()) { + window.show() + } + if (window.isMinimized()) { + window.restore() + } + window.focus() + } +} + +function registerSingleInstanceHandler(app: Electron.App, appState: AppState) { + app.on('second-instance', (_event: Event, argv: string[]) => { + if (isWindows()) { + appState.deepLinkUrl = argv.find((arg) => arg.startsWith(deepLinkScheme)) + } + + /* Someone tried to run a second instance, we should focus our window. */ + focusWindow(appState) + }) +} + +function registerAppEventListeners(args: { + app: Electron.App + ipcMain: Electron.IpcMain + shell: Shell + state: AppState +}) { + const { app, state } = args + + app.on('window-all-closed', () => { + if (!isMac()) { + app.quit() + } + }) + + app.on('before-quit', () => { + state.willQuitApp = true + }) + + app.on('activate', () => { + const windowState = state.windowState + if (!windowState) { + return + } + windowState.window.show() + }) + + app.on('open-url', (_event, url) => { + state.deepLinkUrl = url + focusWindow(state) + }) + + app.on('ready', () => { + if (!state.isPrimaryInstance) { + console.warn('Quiting app and focusing existing instance.') + app.quit() + return + } + + void finishApplicationInitialization(args) + }) +} + +async function setupDeepLinking(app: Electron.App) { + if (!app.isDefaultProtocolClient(deepLinkScheme)) { + app.setAsDefaultProtocolClient(deepLinkScheme) + } +} + +async function finishApplicationInitialization({ app, shell, state }: { app: App; shell: Shell; state: AppState }) { + const keychainWindow = await Keychain.ensureKeychainAccess(state.store) + + initializeStrings(app.getLocale()) + initializeExtensionsServer(state.store) + + const windowState = await createWindowState({ + shell, + appState: state, + appLocale: app.getLocale(), + teardown() { + state.windowState = undefined + }, + }) + + /** + * Close the keychain window after the main window is created, otherwise the + * app will quit automatically + */ + keychainWindow?.close() + + state.windowState = windowState + + if ((isWindows() || isLinux()) && state.windowState.trayManager.shouldMinimizeToTray()) { + state.windowState.trayManager.createTrayIcon() + } + + void windowState.window.loadURL(state.startUrl) +} + +function initializeExtensionsServer(store: Store) { + const host = createExtensionsServer() + + store.set(StoreKeys.ExtServerHost, host) +} diff --git a/packages/desktop/app/enableExperimentalWebFeatures.ts b/packages/desktop/app/enableExperimentalWebFeatures.ts new file mode 100644 index 000000000..c88e7264a --- /dev/null +++ b/packages/desktop/app/enableExperimentalWebFeatures.ts @@ -0,0 +1,16 @@ +import { app } from 'electron' + +/** + * @FIXME + * Due to a bug in Electron (https://github.com/electron/electron/issues/28422), + * downloading a file using the File System Access API does not work, causing an exception: + * "Uncaught DOMException: The request is not allowed by the user agent or the platform in the current context." + * + * The following workaround fixes the issue by enabling experimental web platform features + * which makes the file system access permission always be true. + * + * Since this workaround involves enabling experimental features, it could lead + * to other issues. This should be removed as soon as the upstream bug is fixed. + */ +export const enableExperimentalFeaturesForFileAccessFix = () => + app.commandLine.appendSwitch('enable-experimental-web-platform-features') diff --git a/packages/desktop/app/grantLinuxPasswordsAccess.html b/packages/desktop/app/grantLinuxPasswordsAccess.html new file mode 100644 index 000000000..d5f9a87be --- /dev/null +++ b/packages/desktop/app/grantLinuxPasswordsAccess.html @@ -0,0 +1,95 @@ + + + + + + Standard Notes + + + + + +
+
+
+
+
+
Password service access
+
+
+

Choose how you want Standard Notes to store your account keys

+

+ Standard Notes can either use your operating system's password manager or its own local storage + facility. +

+

+ Standard Notes currently does not have access to your system password service. + If you grant it access, you must quit the app for the change to come into effect. +

+
+
+ + +
+
+
+ Learn more + +
+
+
+
+
+ + diff --git a/packages/desktop/app/icon/Icon-256x256.png b/packages/desktop/app/icon/Icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..22c61c41bcf4d89ee76e8b9d8d410a57b46e512d GIT binary patch literal 7125 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 SC8G}iJj3Xk=#**UZvF?3xbBev literal 0 HcmV?d00001 diff --git a/packages/desktop/app/icon/Icon-512x512.png b/packages/desktop/app/icon/Icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0042a46b14cc88f53f5a0ba4622b678dd5881e GIT binary patch literal 15785 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/app/index.html b/packages/desktop/app/index.html new file mode 100644 index 000000000..16979ee14 --- /dev/null +++ b/packages/desktop/app/index.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + +
+
+ + diff --git a/packages/desktop/app/index.ts b/packages/desktop/app/index.ts new file mode 100644 index 000000000..18abc8dd5 --- /dev/null +++ b/packages/desktop/app/index.ts @@ -0,0 +1,126 @@ +import { app, ipcMain, shell } from 'electron' +import path from 'path' +import fs from 'fs-extra' +import log from 'electron-log' +import './@types/modules' +import { initializeApplication } from './application' +import { isSnap } from './javascripts/Main/Types/Constants' +import { isTesting } from './javascripts/Main/Utils/Utils' +import { setupTesting } from './javascripts/Main/Utils/Testing' +import { CommandLineArgs } from './javascripts/Shared/CommandLineArgs' +import { Store, StoreKeys } from './javascripts/Main/Store' +import { Paths } from './javascripts/Main/Types/Paths' +import { enableExperimentalFeaturesForFileAccessFix } from './enableExperimentalWebFeatures' + +enableExperimentalFeaturesForFileAccessFix() + +require('@electron/remote/main').initialize() + +/** Allow a custom userData path to be used. */ +const userDataPathIndex = process.argv.indexOf(CommandLineArgs.UserDataPath) + +if (userDataPathIndex > 0) { + let userDataPath = process.argv[userDataPathIndex + 1] + if (typeof userDataPath === 'string') { + userDataPath = path.resolve(userDataPath) + + /** Make sure the path is actually a writeable folder */ + try { + fs.closeSync(fs.openSync(path.join(userDataPath, 'sn-test-file'), 'w')) + } catch (e) { + console.error('Failed to write to provided user data path. Aborting') + app.exit(1) + } + + app.setPath('userData', userDataPath) + } +} else if (isSnap) { + migrateSnapStorage() +} + +if (isTesting()) { + setupTesting() +} + +log.transports.file.level = 'info' + +process.on('uncaughtException', (err) => { + console.error('Uncaught exception', err) +}) + +initializeApplication({ + app, + shell, + ipcMain, +}) + +/** + * By default, app.get('userData') points to the snap's current revision + * folder. This causes issues when updating the snap while the app is + * running, because it will not copy over anything that is saved to + * localStorage or IndexedDB after the installation has completed. + * + * To counteract this, we change the userData directory to be the snap's + * 'common' directory, shared by all revisions. + * We also migrate existing content in the the default user folder to the + * common directory. + */ +function migrateSnapStorage() { + const snapUserCommonDir = process.env['SNAP_USER_COMMON'] + if (!snapUserCommonDir) { + return + } + + const legacyUserDataPath = app.getPath('userData') + app.setPath('userData', snapUserCommonDir) + console.log(`Set user data dir to ${snapUserCommonDir}`) + + const legacyFiles = fs + .readdirSync(legacyUserDataPath) + .filter( + (fileName) => + fileName !== 'SS' && + fileName !== 'SingletonLock' && + fileName !== 'SingletonCookie' && + fileName !== 'Dictionaries' && + fileName !== 'Standard Notes', + ) + + if (legacyFiles.length) { + for (const fileName of legacyFiles) { + const fullFilePath = path.join(legacyUserDataPath, fileName) + const dest = snapUserCommonDir + console.log(`Migration: moving ${fullFilePath} to ${dest}`) + try { + fs.moveSync(fullFilePath, path.join(dest, fileName), { + overwrite: false, + }) + } catch (error: any) { + console.error(`Migration: error occured while moving ${fullFilePath} to ${dest}:`, error?.message ?? error) + } + } + + console.log(`Migration: finished moving contents to ${snapUserCommonDir}.`) + + const snapUserData = process.env['SNAP_USER_DATA'] + const store = new Store(snapUserCommonDir) + if (snapUserData && store.data.backupsLocation.startsWith(path.resolve(snapUserData, '..'))) { + /** + * Backups location has not been altered by the user. Move it to the + * user documents directory + */ + console.log(`Migration: moving ${store.data.backupsLocation} to ${Paths.documentsDir}`) + const newLocation = path.join(Paths.documentsDir, path.basename(store.data.backupsLocation)) + try { + fs.copySync(store.data.backupsLocation, newLocation) + } catch (error: any) { + console.error( + `Migration: error occured while moving ${store.data.backupsLocation} to ${Paths.documentsDir}:`, + error?.message ?? error, + ) + } + store.set(StoreKeys.BackupsLocation, newLocation) + console.log('Migration: finished moving backups directory.') + } + } +} diff --git a/packages/desktop/app/javascripts/Main/Backups/BackupsManager.ts b/packages/desktop/app/javascripts/Main/Backups/BackupsManager.ts new file mode 100644 index 000000000..a2d1d5d7f --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Backups/BackupsManager.ts @@ -0,0 +1,245 @@ +import { dialog, WebContents, shell } from 'electron' +import { promises as fs } from 'fs' +import path from 'path' +import { AppMessageType, MessageType } from '../../../../test/TestIpcMessage' +import { AppState } from '../../../application' +import { MessageToWebApp } from '../../Shared/IpcMessages' +import { BackupsManagerInterface } from './BackupsManagerInterface' +import { + deleteDir, + deleteDirContents, + ensureDirectoryExists, + FileDoesNotExist, + moveFiles, + openDirectoryPicker, +} from '../Utils/FileUtils' +import { Paths } from '../Types/Paths' +import { StoreKeys } from '../Store' +import { backups as str } from '../Strings' +import { handleTestMessage, send } from '../Utils/Testing' +import { isTesting, last } from '../Utils/Utils' + +function log(...message: any) { + console.log('BackupsManager:', ...message) +} + +function logError(...message: any) { + console.error('BackupsManager:', ...message) +} + +export const enum EnsureRecentBackupExists { + Success = 0, + BackupsAreDisabled = 1, + FailedToCreateBackup = 2, +} + +export const BackupsDirectoryName = 'Standard Notes Backups' +const BackupFileExtension = '.txt' + +function backupFileNameToDate(string: string): number { + string = path.basename(string, '.txt') + const dateTimeDelimiter = string.indexOf('T') + const date = string.slice(0, dateTimeDelimiter) + + const time = string.slice(dateTimeDelimiter + 1).replace(/-/g, ':') + return Date.parse(date + 'T' + time) +} + +function dateToSafeFilename(date: Date) { + return date.toISOString().replace(/:/g, '-') +} + +async function copyDecryptScript(location: string) { + try { + await ensureDirectoryExists(location) + await fs.copyFile(Paths.decryptScript, path.join(location, path.basename(Paths.decryptScript))) + } catch (error) { + console.error(error) + } +} + +export function createBackupsManager(webContents: WebContents, appState: AppState): BackupsManagerInterface { + let backupsLocation = appState.store.get(StoreKeys.BackupsLocation) + let backupsDisabled = appState.store.get(StoreKeys.BackupsDisabled) + let needsBackup = false + + if (!backupsDisabled) { + void copyDecryptScript(backupsLocation) + } + + determineLastBackupDate(backupsLocation) + .then((date) => appState.setBackupCreationDate(date)) + .catch(console.error) + + async function setBackupsLocation(location: string) { + const previousLocation = backupsLocation + if (previousLocation === location) { + return + } + + const newLocation = path.join(location, BackupsDirectoryName) + let previousLocationFiles = await fs.readdir(previousLocation) + const backupFiles = previousLocationFiles + .filter((fileName) => fileName.endsWith(BackupFileExtension)) + .map((fileName) => path.join(previousLocation, fileName)) + + await moveFiles(backupFiles, newLocation) + await copyDecryptScript(newLocation) + + previousLocationFiles = await fs.readdir(previousLocation) + if (previousLocationFiles.length === 0 || previousLocationFiles[0] === path.basename(Paths.decryptScript)) { + await deleteDir(previousLocation) + } + + /** Wait for the operation to be successful before saving new location */ + backupsLocation = newLocation + appState.store.set(StoreKeys.BackupsLocation, backupsLocation) + } + + async function saveBackupData(data: any) { + if (backupsDisabled) { + return + } + + let success: boolean + let name: string | undefined + + try { + name = await writeDataToFile(data) + log(`Data backup successfully saved: ${name}`) + success = true + appState.setBackupCreationDate(Date.now()) + } catch (err) { + success = false + logError('An error occurred saving backup file', err) + } + + webContents.send(MessageToWebApp.FinishedSavingBackup, { success }) + + if (isTesting()) { + send(AppMessageType.SavedBackup) + } + + return name + } + + function performBackup() { + if (backupsDisabled) { + return + } + + webContents.send(MessageToWebApp.PerformAutomatedBackup) + } + + async function writeDataToFile(data: any): Promise { + await ensureDirectoryExists(backupsLocation) + + const name = dateToSafeFilename(new Date()) + BackupFileExtension + const filePath = path.join(backupsLocation, name) + await fs.writeFile(filePath, data) + return name + } + + let interval: NodeJS.Timeout | undefined + function beginBackups() { + if (interval) { + clearInterval(interval) + } + + needsBackup = true + const hoursInterval = 12 + const seconds = hoursInterval * 60 * 60 + const milliseconds = seconds * 1000 + interval = setInterval(performBackup, milliseconds) + } + + function toggleBackupsStatus() { + backupsDisabled = !backupsDisabled + appState.store.set(StoreKeys.BackupsDisabled, backupsDisabled) + /** Create a backup on reactivation. */ + if (!backupsDisabled) { + performBackup() + } + } + + if (isTesting()) { + handleTestMessage(MessageType.DataArchive, (data: any) => saveBackupData(data)) + handleTestMessage(MessageType.BackupsAreEnabled, () => !backupsDisabled) + handleTestMessage(MessageType.ToggleBackupsEnabled, toggleBackupsStatus) + handleTestMessage(MessageType.BackupsLocation, () => backupsLocation) + handleTestMessage(MessageType.PerformBackup, performBackup) + handleTestMessage(MessageType.CopyDecryptScript, copyDecryptScript) + handleTestMessage(MessageType.ChangeBackupsLocation, setBackupsLocation) + } + + return { + get backupsAreEnabled() { + return !backupsDisabled + }, + get backupsLocation() { + return backupsLocation + }, + saveBackupData, + performBackup, + beginBackups, + toggleBackupsStatus, + async backupsCount(): Promise { + let files = await fs.readdir(backupsLocation) + files = files.filter((fileName) => fileName.endsWith(BackupFileExtension)) + return files.length + }, + applicationDidBlur() { + if (needsBackup) { + needsBackup = false + performBackup() + } + }, + viewBackups() { + void shell.openPath(backupsLocation) + }, + async deleteBackups() { + await deleteDirContents(backupsLocation) + return copyDecryptScript(backupsLocation) + }, + + async changeBackupsLocation() { + const path = await openDirectoryPicker() + + if (!path) { + return + } + + try { + await setBackupsLocation(path) + performBackup() + } catch (e) { + logError(e) + void dialog.showMessageBox({ + message: str().errorChangingDirectory(e), + }) + } + }, + } +} + +async function determineLastBackupDate(backupsLocation: string): Promise { + try { + const files = (await fs.readdir(backupsLocation)) + .filter((filename) => filename.endsWith(BackupFileExtension) && !Number.isNaN(backupFileNameToDate(filename))) + .sort() + const lastBackupFileName = last(files) + if (!lastBackupFileName) { + return null + } + const backupDate = backupFileNameToDate(lastBackupFileName) + if (Number.isNaN(backupDate)) { + return null + } + return backupDate + } catch (error: any) { + if (error.code !== FileDoesNotExist) { + console.error(error) + } + return null + } +} diff --git a/packages/desktop/app/javascripts/Main/Backups/BackupsManagerInterface.ts b/packages/desktop/app/javascripts/Main/Backups/BackupsManagerInterface.ts new file mode 100644 index 000000000..28019813a --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Backups/BackupsManagerInterface.ts @@ -0,0 +1,13 @@ +export interface BackupsManagerInterface { + backupsAreEnabled: boolean + toggleBackupsStatus(): void + backupsLocation: string + backupsCount(): Promise + applicationDidBlur(): void + changeBackupsLocation(): void + beginBackups(): void + performBackup(): void + deleteBackups(): Promise + viewBackups(): void + saveBackupData(data: unknown): void +} diff --git a/packages/desktop/app/javascripts/Main/ExtensionsServer.ts b/packages/desktop/app/javascripts/Main/ExtensionsServer.ts new file mode 100644 index 000000000..071697f82 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/ExtensionsServer.ts @@ -0,0 +1,115 @@ +import fs from 'fs' +import http, { IncomingMessage, ServerResponse } from 'http' +import mime from 'mime-types' +import path from 'path' +import { URL } from 'url' +import { FileDoesNotExist } from './Utils/FileUtils' +import { Paths } from './Types/Paths' +import { extensions as str } from './Strings' + +const Protocol = 'http' + +function logError(...message: any) { + console.error('extServer:', ...message) +} + +function log(...message: any) { + console.log('extServer:', ...message) +} + +export function normalizeFilePath(requestUrl: string, host: string): string { + const isThirdPartyComponent = requestUrl.startsWith('/Extensions') + const isNativeComponent = requestUrl.startsWith('/components') + if (!isThirdPartyComponent && !isNativeComponent) { + throw new Error(`URL '${requestUrl}' falls outside of the extensions/features domain.`) + } + + const removedPrefix = requestUrl.replace('/components', '').replace('/Extensions', '') + + const base = `${Protocol}://${host}` + const url = new URL(removedPrefix, base) + + /** + * Normalize path (parse '..' and '.') so that we prevent path traversal by + * joining a fully resolved path to the Extensions dir. + */ + const modifiedReqUrl = path.normalize(url.pathname) + if (isThirdPartyComponent) { + return path.join(Paths.extensionsDir, modifiedReqUrl) + } else { + return path.join(Paths.components, modifiedReqUrl) + } +} + +async function handleRequest(request: IncomingMessage, response: ServerResponse) { + try { + if (!request.url) { + throw new Error('No url.') + } + if (!request.headers.host) { + throw new Error('No `host` header.') + } + + const filePath = normalizeFilePath(request.url, request.headers.host) + + const stat = await fs.promises.lstat(filePath) + + if (!stat.isFile()) { + throw new Error('Client requested something that is not a file.') + } + + const mimeType = mime.lookup(path.parse(filePath).ext) + + response.setHeader('Access-Control-Allow-Origin', '*') + response.setHeader('Cache-Control', 'max-age=604800') + response.setHeader('Content-Type', `${mimeType}; charset=utf-8`) + + const data = fs.readFileSync(filePath) + + response.writeHead(200) + + response.end(data) + } catch (error: any) { + onRequestError(error, response) + } +} + +function onRequestError(error: Error | { code: string }, response: ServerResponse) { + let responseCode: number + let message: string + + if ('code' in error && error.code === FileDoesNotExist) { + responseCode = 404 + message = str().missingExtension + } else { + logError(error) + responseCode = 500 + message = str().unableToLoadExtension + } + + response.writeHead(responseCode) + response.end(message) +} + +export function createExtensionsServer(): string { + const port = 45653 + const ip = '127.0.0.1' + const host = `${Protocol}://${ip}:${port}` + + const initCallback = () => { + log(`Server started at ${host}`) + } + + try { + http + .createServer(handleRequest) + .listen(port, ip, initCallback) + .on('error', (err) => { + console.error('Error listening on extServer', err) + }) + } catch (error) { + console.error('Error creating ext server', error) + } + + return host +} diff --git a/packages/desktop/app/javascripts/Main/FileBackups/FileBackupsManager.ts b/packages/desktop/app/javascripts/Main/FileBackups/FileBackupsManager.ts new file mode 100644 index 000000000..8d55f754b --- /dev/null +++ b/packages/desktop/app/javascripts/Main/FileBackups/FileBackupsManager.ts @@ -0,0 +1,156 @@ +import { FileBackupsDevice, FileBackupsMapping } from '@web/Application/Device/DesktopSnjsExports' +import { AppState } from 'app/application' +import { StoreKeys } from '../Store' +import { + ensureDirectoryExists, + moveDirContents, + openDirectoryPicker, + readJSONFile, + writeFile, + writeJSONFile, +} from '../Utils/FileUtils' +import { FileDownloader } from './FileDownloader' +import { shell } from 'electron' + +export const FileBackupsConstantsV1 = { + Version: '1.0.0', + MetadataFileName: 'metadata.sn.json', + BinaryFileName: 'file.encrypted', +} + +export class FilesBackupManager implements FileBackupsDevice { + constructor(private appState: AppState) {} + + public isFilesBackupsEnabled(): Promise { + return Promise.resolve(this.appState.store.get(StoreKeys.FileBackupsEnabled)) + } + + public async enableFilesBackups(): Promise { + const currentLocation = await this.getFilesBackupsLocation() + + if (!currentLocation) { + const result = await this.changeFilesBackupsLocation() + + if (!result) { + return + } + } + + this.appState.store.set(StoreKeys.FileBackupsEnabled, true) + + const mapping = this.getMappingFileFromDisk() + + if (!mapping) { + await this.saveFilesBackupsMappingFile(this.defaultMappingFileValue()) + } + } + + public disableFilesBackups(): Promise { + this.appState.store.set(StoreKeys.FileBackupsEnabled, false) + + return Promise.resolve() + } + + public async changeFilesBackupsLocation(): Promise { + const newPath = await openDirectoryPicker() + + if (!newPath) { + return undefined + } + + const oldPath = await this.getFilesBackupsLocation() + + if (oldPath) { + await moveDirContents(oldPath, newPath) + } + + this.appState.store.set(StoreKeys.FileBackupsLocation, newPath) + + return newPath + } + + public getFilesBackupsLocation(): Promise { + return Promise.resolve(this.appState.store.get(StoreKeys.FileBackupsLocation)) + } + + private getMappingFileLocation(): string { + const base = this.appState.store.get(StoreKeys.FileBackupsLocation) + return `${base}/info.json` + } + + private async getMappingFileFromDisk(): Promise { + return readJSONFile(this.getMappingFileLocation()) + } + + private defaultMappingFileValue(): FileBackupsMapping { + return { version: FileBackupsConstantsV1.Version, files: {} } + } + + async getFilesBackupsMappingFile(): Promise { + const data = await this.getMappingFileFromDisk() + + if (!data) { + return this.defaultMappingFileValue() + } + + return data + } + + async openFilesBackupsLocation(): Promise { + const location = await this.getFilesBackupsLocation() + + void shell.openPath(location) + } + + async saveFilesBackupsMappingFile(file: FileBackupsMapping): Promise<'success' | 'failed'> { + await writeJSONFile(this.getMappingFileLocation(), file) + + return 'success' + } + + async saveFilesBackupsFile( + uuid: string, + metaFile: string, + downloadRequest: { + chunkSizes: number[] + valetToken: string + url: string + }, + ): Promise<'success' | 'failed'> { + const backupsDir = await this.getFilesBackupsLocation() + + const fileDir = `${backupsDir}/${uuid}` + const metaFilePath = `${fileDir}/${FileBackupsConstantsV1.MetadataFileName}` + const binaryPath = `${fileDir}/${FileBackupsConstantsV1.BinaryFileName}` + + await ensureDirectoryExists(fileDir) + + await writeFile(metaFilePath, metaFile) + + const downloader = new FileDownloader( + downloadRequest.chunkSizes, + downloadRequest.valetToken, + downloadRequest.url, + binaryPath, + ) + + const result = await downloader.run() + + if (result === 'success') { + const mapping = await this.getFilesBackupsMappingFile() + + mapping.files[uuid] = { + backedUpOn: new Date(), + absolutePath: fileDir, + relativePath: uuid, + metadataFileName: FileBackupsConstantsV1.MetadataFileName, + binaryFileName: FileBackupsConstantsV1.BinaryFileName, + version: FileBackupsConstantsV1.Version, + } + + await this.saveFilesBackupsMappingFile(mapping) + } + + return result + } +} diff --git a/packages/desktop/app/javascripts/Main/FileBackups/FileDownloader.ts b/packages/desktop/app/javascripts/Main/FileBackups/FileDownloader.ts new file mode 100644 index 000000000..e0c804cbd --- /dev/null +++ b/packages/desktop/app/javascripts/Main/FileBackups/FileDownloader.ts @@ -0,0 +1,54 @@ +import { WriteStream, createWriteStream } from 'fs' +import { downloadData } from './FileNetworking' + +export class FileDownloader { + writeStream: WriteStream + + constructor(private chunkSizes: number[], private valetToken: string, private url: string, filePath: string) { + this.writeStream = createWriteStream(filePath, { flags: 'a' }) + } + + public async run(): Promise<'success' | 'failed'> { + const result = await this.downloadChunk(0, 0) + + this.writeStream.close() + + return result + } + + private async downloadChunk(chunkIndex = 0, contentRangeStart: number): Promise<'success' | 'failed'> { + const pullChunkSize = this.chunkSizes[chunkIndex] + + const headers = { + 'x-valet-token': this.valetToken, + 'x-chunk-size': pullChunkSize.toString(), + range: `bytes=${contentRangeStart}-`, + } + + const response = await downloadData(this.writeStream, this.url, headers) + + if (!String(response.status).startsWith('2')) { + return 'failed' + } + + const contentRangeHeader = response.headers['content-range'] as string + if (!contentRangeHeader) { + return 'failed' + } + + const matches = contentRangeHeader.match(/(^[a-zA-Z][\w]*)\s+(\d+)\s?-\s?(\d+)?\s?\/?\s?(\d+|\*)?/) + if (!matches || matches.length !== 5) { + return 'failed' + } + + const rangeStart = +matches[2] + const rangeEnd = +matches[3] + const totalSize = +matches[4] + + if (rangeEnd < totalSize - 1) { + return this.downloadChunk(++chunkIndex, rangeStart + pullChunkSize) + } + + return 'success' + } +} diff --git a/packages/desktop/app/javascripts/Main/FileBackups/FileNetworking.ts b/packages/desktop/app/javascripts/Main/FileBackups/FileNetworking.ts new file mode 100644 index 000000000..da99e9954 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/FileBackups/FileNetworking.ts @@ -0,0 +1,22 @@ +import { WriteStream } from 'fs' +import axios, { AxiosResponseHeaders, AxiosRequestHeaders } from 'axios' + +export async function downloadData( + writeStream: WriteStream, + url: string, + headers: AxiosRequestHeaders, +): Promise<{ + headers: AxiosResponseHeaders + status: number +}> { + const response = await axios.get(url, { + responseType: 'arraybuffer', + headers: headers, + }) + + if (String(response.status).startsWith('2')) { + writeStream.write(response.data) + } + + return { headers: response.headers, status: response.status } +} diff --git a/packages/desktop/app/javascripts/Main/Keychain/Keychain.ts b/packages/desktop/app/javascripts/Main/Keychain/Keychain.ts new file mode 100644 index 000000000..e78c30144 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Keychain/Keychain.ts @@ -0,0 +1,104 @@ +import { app, BrowserWindow, ipcMain } from 'electron' +import keytar from 'keytar' +import { isLinux } from '../Types/Platforms' +import { AppName } from '../Strings' +import { keychainAccessIsUserConfigurable } from '../Types/Constants' +import { isDev, isTesting } from '../Utils/Utils' +import { MessageToMainProcess } from '../../Shared/IpcMessages' +import { Urls, Paths } from '../Types/Paths' +import { Store, StoreKeys } from '../Store' +import { KeychainInterface } from './KeychainInterface' + +const ServiceName = isTesting() ? AppName + ' (Testing)' : isDev() ? AppName + ' (Development)' : AppName +const AccountName = 'Standard Notes Account' + +async function ensureKeychainAccess(store: Store): Promise { + if (!isLinux()) { + /** Assume keychain is accessible */ + return + } + const useNativeKeychain = store.get(StoreKeys.UseNativeKeychain) + if (useNativeKeychain === null) { + /** + * App has never attempted to access keychain before. Do it and set the + * store value according to what happens + */ + try { + await getKeychainValue() + store.set(StoreKeys.UseNativeKeychain, true) + } catch (_) { + /** Can't access keychain. */ + if (keychainAccessIsUserConfigurable) { + return askForKeychainAccess(store) + } else { + /** User can't configure keychain access, fall back to local storage */ + store.set(StoreKeys.UseNativeKeychain, false) + } + } + } +} + +function askForKeychainAccess(store: Store): Promise { + const window = new BrowserWindow({ + width: 540, + height: 400, + center: true, + show: false, + webPreferences: { + preload: Paths.grantLinuxPasswordsAccessJs, + nodeIntegration: false, + contextIsolation: true, + }, + autoHideMenuBar: true, + }) + + window.on('ready-to-show', window.show) + + void window.loadURL(Urls.grantLinuxPasswordsAccessHtml) + + const quit = () => { + app.quit() + } + ipcMain.once(MessageToMainProcess.Quit, quit) + window.once('close', quit) + + ipcMain.on(MessageToMainProcess.LearnMoreAboutKeychainAccess, () => { + window.setSize(window.getSize()[0], 600, true) + }) + + return new Promise((resolve) => { + ipcMain.once(MessageToMainProcess.UseLocalstorageForKeychain, () => { + store.set(StoreKeys.UseNativeKeychain, false) + ipcMain.removeListener(MessageToMainProcess.Quit, quit) + window.removeListener('close', quit) + resolve(window) + }) + }) +} + +async function getKeychainValue(): Promise { + try { + const value = await keytar.getPassword(ServiceName, AccountName) + if (value) { + return JSON.parse(value) + } + } catch (error) { + console.error(error) + throw error + } +} + +function setKeychainValue(value: unknown): Promise { + return keytar.setPassword(ServiceName, AccountName, JSON.stringify(value)) +} + +function clearKeychainValue(): Promise { + return keytar.deletePassword(ServiceName, AccountName) +} + +export const Keychain: KeychainInterface = { + ensureKeychainAccess, + getKeychainValue, + setKeychainValue, + clearKeychainValue, +} diff --git a/packages/desktop/app/javascripts/Main/Keychain/KeychainInterface.ts b/packages/desktop/app/javascripts/Main/Keychain/KeychainInterface.ts new file mode 100644 index 000000000..6ff11e362 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Keychain/KeychainInterface.ts @@ -0,0 +1,9 @@ +import { BrowserWindow } from 'electron' +import { Store } from '../Store' + +export interface KeychainInterface { + ensureKeychainAccess(store: Store): Promise + getKeychainValue(): Promise + setKeychainValue(value: unknown): Promise + clearKeychainValue(): Promise +} diff --git a/packages/desktop/app/javascripts/Main/Menus/MenuManagerInterface.ts b/packages/desktop/app/javascripts/Main/Menus/MenuManagerInterface.ts new file mode 100644 index 000000000..81ee695e8 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Menus/MenuManagerInterface.ts @@ -0,0 +1,4 @@ +export interface MenuManagerInterface { + reload(): void + popupMenu(): void +} diff --git a/packages/desktop/app/javascripts/Main/Menus/Menus.ts b/packages/desktop/app/javascripts/Main/Menus/Menus.ts new file mode 100644 index 000000000..5daa25c3c --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Menus/Menus.ts @@ -0,0 +1,667 @@ +import { AppState } from 'app/application' +import { + app, + BrowserWindow, + ContextMenuParams, + dialog, + Menu, + MenuItemConstructorOptions, + shell, + WebContents, +} from 'electron' +import { autorun } from 'mobx' +import { autoUpdatingAvailable } from '../Types/Constants' +import { isLinux, isMac } from '../Types/Platforms' +import { Store, StoreKeys } from '../Store' +import { appMenu as str, contextMenu } from '../Strings' +import { handleTestMessage } from '../Utils/Testing' +import { TrayManager } from '../TrayManager' +import { SpellcheckerManager } from './../SpellcheckerManager' +import { BackupsManagerInterface } from './../Backups/BackupsManagerInterface' +import { MessageType } from './../../../../test/TestIpcMessage' +import { checkForUpdate, openChangelog, showUpdateInstallationDialog } from '../UpdateManager' +import { isDev, isTesting } from '../Utils/Utils' +import { MenuManagerInterface } from './MenuManagerInterface' + +export const enum MenuId { + SpellcheckerLanguages = 'SpellcheckerLanguages', +} + +const Separator: MenuItemConstructorOptions = { + type: 'separator', +} + +export function buildContextMenu(webContents: WebContents, params: ContextMenuParams): Menu { + if (!params.isEditable) { + return Menu.buildFromTemplate([ + { + role: 'copy', + }, + ]) + } + + return Menu.buildFromTemplate([ + ...suggestionsMenu(params.selectionText, params.misspelledWord, params.dictionarySuggestions, webContents), + Separator, + { + role: 'undo', + }, + { + role: 'redo', + }, + Separator, + { + role: 'cut', + }, + { + role: 'copy', + }, + { + role: 'paste', + }, + { + role: 'pasteAndMatchStyle', + }, + { + role: 'selectAll', + }, + ]) +} + +function suggestionsMenu( + selection: string, + misspelledWord: string, + suggestions: string[], + webContents: WebContents, +): MenuItemConstructorOptions[] { + if (misspelledWord.length === 0) { + return [] + } + + const learnSpelling = { + label: contextMenu().learnSpelling, + click() { + webContents.session.addWordToSpellCheckerDictionary(misspelledWord) + }, + } + + if (suggestions.length === 0) { + return [ + { + label: contextMenu().noSuggestions, + enabled: false, + }, + Separator, + learnSpelling, + ] + } + + return [ + ...suggestions.map((suggestion) => ({ + label: suggestion, + click() { + webContents.replaceMisspelling(suggestion) + }, + })), + Separator, + learnSpelling, + ] +} + +export function createMenuManager({ + window, + appState, + backupsManager, + trayManager, + store, + spellcheckerManager, +}: { + window: Electron.BrowserWindow + appState: AppState + backupsManager: BackupsManagerInterface + trayManager: TrayManager + store: Store + spellcheckerManager?: SpellcheckerManager +}): MenuManagerInterface { + let menu: Menu + + if (isTesting()) { + // eslint-disable-next-line no-var + var hasReloaded = false + // eslint-disable-next-line no-var + var hasReloadedTimeout: any + handleTestMessage(MessageType.AppMenuItems, () => + menu.items.map((item) => ({ + label: item.label, + role: item.role, + submenu: { + items: item.submenu?.items?.map((subItem) => ({ + id: subItem.id, + label: subItem.label, + })), + }, + })), + ) + handleTestMessage(MessageType.ClickLanguage, (code) => { + menu.getMenuItemById(MessageType.ClickLanguage + code)!.click() + }) + handleTestMessage(MessageType.HasReloadedMenu, () => hasReloaded) + } + + function reload() { + if (isTesting()) { + // eslint-disable-next-line block-scoped-var + hasReloaded = true + // eslint-disable-next-line block-scoped-var + clearTimeout(hasReloadedTimeout) + // eslint-disable-next-line block-scoped-var + hasReloadedTimeout = setTimeout(() => { + // eslint-disable-next-line block-scoped-var + hasReloaded = false + }, 300) + } + + menu = Menu.buildFromTemplate([ + ...(isMac() ? [macAppMenu(app.name)] : []), + editMenu(spellcheckerManager, reload), + viewMenu(window, store, reload), + windowMenu(store, trayManager, reload), + backupsMenu(backupsManager, reload), + updateMenu(window, appState), + ...(isLinux() ? [keyringMenu(window, store)] : []), + helpMenu(window, shell), + ]) + Menu.setApplicationMenu(menu) + } + autorun(() => { + reload() + }) + + return { + reload, + popupMenu() { + if (isDev()) { + /** Check the state */ + if (!menu) { + throw new Error('called popupMenu() before loading') + } + } + // eslint-disable-next-line no-unused-expressions + menu?.popup() + }, + } +} + +const enum Roles { + Undo = 'undo', + Redo = 'redo', + Cut = 'cut', + Copy = 'copy', + Paste = 'paste', + PasteAndMatchStyle = 'pasteAndMatchStyle', + SelectAll = 'selectAll', + Reload = 'reload', + ToggleDevTools = 'toggleDevTools', + ResetZoom = 'resetZoom', + ZoomIn = 'zoomIn', + ZoomOut = 'zoomOut', + ToggleFullScreen = 'togglefullscreen', + Window = 'window', + Minimize = 'minimize', + Close = 'close', + Help = 'help', + About = 'about', + Services = 'services', + Hide = 'hide', + HideOthers = 'hideOthers', + UnHide = 'unhide', + Quit = 'quit', + StartSeeking = 'startSpeaking', + StopSeeking = 'stopSpeaking', + Zoom = 'zoom', + Front = 'front', +} + +const KeyCombinations = { + CmdOrCtrlW: 'CmdOrCtrl + W', + CmdOrCtrlM: 'CmdOrCtrl + M', + AltM: 'Alt + m', +} + +const enum MenuItemTypes { + CheckBox = 'checkbox', + Radio = 'radio', +} + +const Urls = { + Support: 'mailto:help@standardnotes.com', + Website: 'https://standardnotes.com', + GitHub: 'https://github.com/standardnotes', + Slack: 'https://standardnotes.com/slack', + Twitter: 'https://twitter.com/StandardNotes', + GitHubReleases: 'https://github.com/standardnotes/desktop/releases', +} + +function macAppMenu(appName: string): MenuItemConstructorOptions { + return { + role: 'appMenu', + label: appName, + submenu: [ + { + role: Roles.About, + }, + Separator, + { + role: Roles.Services, + submenu: [], + }, + Separator, + { + role: Roles.Hide, + }, + { + role: Roles.HideOthers, + }, + { + role: Roles.UnHide, + }, + Separator, + { + role: Roles.Quit, + }, + ], + } +} + +function editMenu(spellcheckerManager: SpellcheckerManager | undefined, reload: () => any): MenuItemConstructorOptions { + if (isDev()) { + /** Check for invalid state */ + if (!isMac() && spellcheckerManager === undefined) { + throw new Error('spellcheckerManager === undefined') + } + } + + return { + role: 'editMenu', + label: str().edit, + submenu: [ + { + role: Roles.Undo, + }, + { + role: Roles.Redo, + }, + Separator, + { + role: Roles.Cut, + }, + { + role: Roles.Copy, + }, + { + role: Roles.Paste, + }, + { + role: Roles.PasteAndMatchStyle, + }, + { + role: Roles.SelectAll, + }, + ...(isMac() ? [Separator, macSpeechMenu()] : [spellcheckerMenu(spellcheckerManager!, reload)]), + ], + } +} + +function macSpeechMenu(): MenuItemConstructorOptions { + return { + label: str().speech, + submenu: [ + { + role: Roles.StopSeeking, + }, + { + role: Roles.StopSeeking, + }, + ], + } +} + +function spellcheckerMenu(spellcheckerManager: SpellcheckerManager, reload: () => any): MenuItemConstructorOptions { + return { + id: MenuId.SpellcheckerLanguages, + label: str().spellcheckerLanguages, + submenu: spellcheckerManager.languages().map( + ({ name, code, enabled }): MenuItemConstructorOptions => ({ + ...(isTesting() ? { id: MessageType.ClickLanguage + code } : {}), + label: name, + type: MenuItemTypes.CheckBox, + checked: enabled, + click: () => { + if (enabled) { + spellcheckerManager.removeLanguage(code) + } else { + spellcheckerManager.addLanguage(code) + } + reload() + }, + }), + ), + } +} + +function viewMenu(window: Electron.BrowserWindow, store: Store, reload: () => any): MenuItemConstructorOptions { + return { + label: str().view, + submenu: [ + { + role: Roles.Reload, + }, + { + role: Roles.ToggleDevTools, + }, + Separator, + { + role: Roles.ResetZoom, + }, + { + role: Roles.ZoomIn, + }, + { + role: Roles.ZoomOut, + }, + Separator, + { + role: Roles.ToggleFullScreen, + }, + ...(isMac() ? [] : [Separator, ...menuBarOptions(window, store, reload)]), + ], + } +} + +function menuBarOptions(window: Electron.BrowserWindow, store: Store, reload: () => any) { + const useSystemMenuBar = store.get(StoreKeys.UseSystemMenuBar) + let isMenuBarVisible = store.get(StoreKeys.MenuBarVisible) + window.setMenuBarVisibility(isMenuBarVisible) + return [ + { + visible: !isMac() && useSystemMenuBar, + label: str().hideMenuBar, + accelerator: KeyCombinations.AltM, + click: () => { + isMenuBarVisible = !isMenuBarVisible + window.setMenuBarVisibility(isMenuBarVisible) + store.set(StoreKeys.MenuBarVisible, isMenuBarVisible) + }, + }, + { + label: str().useThemedMenuBar, + type: MenuItemTypes.CheckBox, + checked: !useSystemMenuBar, + click: () => { + store.set(StoreKeys.UseSystemMenuBar, !useSystemMenuBar) + reload() + void dialog.showMessageBox({ + title: str().preferencesChanged.title, + message: str().preferencesChanged.message, + }) + }, + }, + ] +} + +function windowMenu(store: Store, trayManager: TrayManager, reload: () => any): MenuItemConstructorOptions { + return { + role: Roles.Window, + submenu: [ + { + role: Roles.Minimize, + }, + { + role: Roles.Close, + }, + Separator, + ...(isMac() ? macWindowItems() : [minimizeToTrayItem(store, trayManager, reload)]), + ], + } +} + +function macWindowItems(): MenuItemConstructorOptions[] { + return [ + { + label: str().close, + accelerator: KeyCombinations.CmdOrCtrlW, + role: Roles.Close, + }, + { + label: str().minimize, + accelerator: KeyCombinations.CmdOrCtrlM, + role: Roles.Minimize, + }, + { + label: str().zoom, + role: Roles.Zoom, + }, + Separator, + { + label: str().bringAllToFront, + role: Roles.Front, + }, + ] +} + +function minimizeToTrayItem(store: Store, trayManager: TrayManager, reload: () => any) { + const minimizeToTray = trayManager.shouldMinimizeToTray() + return { + label: str().minimizeToTrayOnClose, + type: MenuItemTypes.CheckBox, + checked: minimizeToTray, + click() { + store.set(StoreKeys.MinimizeToTray, !minimizeToTray) + if (trayManager.shouldMinimizeToTray()) { + trayManager.createTrayIcon() + } else { + trayManager.destroyTrayIcon() + } + reload() + }, + } +} + +function backupsMenu(archiveManager: BackupsManagerInterface, reload: () => any) { + return { + label: str().backups, + submenu: [ + { + label: archiveManager.backupsAreEnabled ? str().disableAutomaticBackups : str().enableAutomaticBackups, + click() { + archiveManager.toggleBackupsStatus() + reload() + }, + }, + Separator, + { + label: str().changeBackupsLocation, + click() { + archiveManager.changeBackupsLocation() + }, + }, + { + label: str().openBackupsLocation, + click() { + void shell.openPath(archiveManager.backupsLocation) + }, + }, + ], + } +} + +function updateMenu(window: BrowserWindow, appState: AppState) { + const updateState = appState.updates + let label + if (updateState.checkingForUpdate) { + label = str().checkingForUpdate + } else if (updateState.updateNeeded) { + label = str().updateAvailable + } else { + label = str().updates + } + const submenu: MenuItemConstructorOptions[] = [] + const structure = { label, submenu } + + if (autoUpdatingAvailable) { + if (updateState.autoUpdateDownloaded && updateState.latestVersion) { + submenu.push({ + label: str().installPendingUpdate(updateState.latestVersion), + click() { + void showUpdateInstallationDialog(window, appState) + }, + }) + } + + submenu.push({ + type: 'checkbox', + checked: updateState.enableAutoUpdate, + label: str().enableAutomaticUpdates, + click() { + updateState.toggleAutoUpdate() + }, + }) + + submenu.push(Separator) + } + + const latestVersion = updateState.latestVersion + + submenu.push({ + label: str().yourVersion(appState.version), + }) + + submenu.push({ + label: latestVersion ? str().latestVersion(latestVersion) : str().releaseNotes, + click() { + openChangelog(updateState) + }, + }) + + if (latestVersion) { + submenu.push({ + label: str().viewReleaseNotes(latestVersion), + click() { + openChangelog(updateState) + }, + }) + } + + if (autoUpdatingAvailable) { + submenu.push(Separator) + + if (!updateState.checkingForUpdate) { + submenu.push({ + label: str().checkForUpdate, + click() { + void checkForUpdate(appState, updateState, true) + }, + }) + } + + if (updateState.lastCheck && !updateState.checkingForUpdate) { + submenu.push({ + label: str().lastUpdateCheck(updateState.lastCheck), + }) + } + } + + return structure +} + +function helpMenu(window: Electron.BrowserWindow, shell: Electron.Shell) { + return { + role: Roles.Help, + submenu: [ + { + label: str().emailSupport, + click() { + void shell.openExternal(Urls.Support) + }, + }, + { + label: str().website, + click() { + void shell.openExternal(Urls.Website) + }, + }, + { + label: str().gitHub, + click() { + void shell.openExternal(Urls.GitHub) + }, + }, + { + label: str().slack, + click() { + void shell.openExternal(Urls.Slack) + }, + }, + { + label: str().twitter, + click() { + void shell.openExternal(Urls.Twitter) + }, + }, + Separator, + { + label: str().toggleErrorConsole, + click() { + window.webContents.toggleDevTools() + }, + }, + { + label: str().openDataDirectory, + click() { + const userDataPath = app.getPath('userData') + void shell.openPath(userDataPath) + }, + }, + { + label: str().clearCacheAndReload, + async click() { + await window.webContents.session.clearCache() + window.reload() + }, + }, + Separator, + { + label: str().version(app.getVersion()), + click() { + void shell.openExternal(Urls.GitHubReleases) + }, + }, + ], + } +} + +/** It's called keyring on Ubuntu */ +function keyringMenu(window: BrowserWindow, store: Store): MenuItemConstructorOptions { + const useNativeKeychain = store.get(StoreKeys.UseNativeKeychain) + return { + label: str().security.security, + submenu: [ + { + enabled: !useNativeKeychain, + checked: useNativeKeychain ?? false, + type: 'checkbox', + label: str().security.useKeyringtoStorePassword, + async click() { + store.set(StoreKeys.UseNativeKeychain, true) + const { response } = await dialog.showMessageBox(window, { + message: str().security.enabledKeyringAccessMessage, + buttons: [str().security.enabledKeyringQuitNow, str().security.enabledKeyringPostpone], + }) + if (response === 0) { + app.quit() + } + }, + }, + ], + } +} diff --git a/packages/desktop/app/javascripts/Main/Packages/Networking.ts b/packages/desktop/app/javascripts/Main/Packages/Networking.ts new file mode 100644 index 000000000..45c8f53f5 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Packages/Networking.ts @@ -0,0 +1,75 @@ +import { IncomingMessage, net } from 'electron' +import fs from 'fs' +import path from 'path' +import { pipeline as pipelineFn } from 'stream' +import { promisify } from 'util' +import { MessageType } from '../../../../test/TestIpcMessage' +import { ensureDirectoryExists } from '../Utils/FileUtils' +import { handleTestMessage } from '../Utils/Testing' +import { isTesting } from '../Utils/Utils' + +const pipeline = promisify(pipelineFn) + +if (isTesting()) { + handleTestMessage(MessageType.GetJSON, getJSON) + handleTestMessage(MessageType.DownloadFile, downloadFile) +} + +/** + * Downloads a file to the specified destination. + * @param filePath path to the saved file (will be created if it does + * not exist) + */ +export async function downloadFile(url: string, filePath: string): Promise { + await ensureDirectoryExists(path.dirname(filePath)) + const response = await get(url) + await pipeline( + /** + * IncomingMessage doesn't implement *every* property of ReadableStream + * but still all the ones that pipeline needs + * @see https://www.electronjs.org/docs/api/incoming-message + */ + response as any, + fs.createWriteStream(filePath), + ) +} + +export async function getJSON(url: string): Promise { + const response = await get(url) + let data = '' + return new Promise((resolve, reject) => { + response + .on('data', (chunk) => { + data += chunk + }) + .on('error', reject) + .on('end', () => { + try { + const parsed = JSON.parse(data) + resolve(parsed) + } catch (error) { + resolve(undefined) + } + }) + }) +} + +export function get(url: string): Promise { + const enum Method { + Get = 'GET', + } + const enum RedirectMode { + Follow = 'follow', + } + + return new Promise((resolve, reject) => { + const request = net.request({ + url, + method: Method.Get, + redirect: RedirectMode.Follow, + }) + request.on('response', resolve) + request.on('error', reject) + request.end() + }) +} diff --git a/packages/desktop/app/javascripts/Main/Packages/PackageManager.ts b/packages/desktop/app/javascripts/Main/Packages/PackageManager.ts new file mode 100644 index 000000000..1a3d62962 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Packages/PackageManager.ts @@ -0,0 +1,374 @@ +import compareVersions from 'compare-versions' +import fs from 'fs' +import path from 'path' +import { MessageToWebApp } from '../../Shared/IpcMessages' +import { + debouncedJSONDiskWriter, + deleteDir, + deleteDirContents, + ensureDirectoryExists, + extractNestedZip, + FileDoesNotExist, + readJSONFile, +} from '../Utils/FileUtils' +import { downloadFile, getJSON } from './Networking' +import { Paths } from '../Types/Paths' +import { AppName } from '../Strings' +import { timeout } from '../Utils/Utils' +import log from 'electron-log' +import { Component, MappingFile, PackageManagerInterface, SyncTask, PackageInfo } from './PackageManagerInterface' + +function logMessage(...message: any) { + log.info('PackageManager:', ...message) +} + +function logError(...message: any) { + console.error('PackageManager:', ...message) +} + +/** + * Safe component mapping manager that queues its disk writes + */ +class MappingFileHandler { + static async create() { + let mapping: MappingFile + + try { + const result = await readJSONFile(Paths.extensionsMappingJson) + mapping = result || {} + } catch (error: any) { + /** + * Mapping file might be absent (first start, corrupted data) + */ + if (error.code === FileDoesNotExist) { + await ensureDirectoryExists(path.dirname(Paths.extensionsMappingJson)) + } else { + logError(error) + } + mapping = {} + } + + return new MappingFileHandler(mapping) + } + + constructor(private mapping: MappingFile) {} + + get = (componendId: string) => { + return this.mapping[componendId] + } + + set = (componentId: string, location: string, version: string) => { + this.mapping[componentId] = { + location, + version, + } + this.writeToDisk() + } + + remove = (componentId: string) => { + delete this.mapping[componentId] + this.writeToDisk() + } + + getInstalledVersionForComponent = async (component: Component): Promise => { + const version = this.get(component.uuid)?.version + if (version) { + return version + } + + /** + * If the mapping has no version (pre-3.5 installs) check the component's + * package.json file + */ + const paths = pathsForComponent(component) + const packagePath = path.join(paths.absolutePath, 'package.json') + const response = await readJSONFile<{ version: string }>(packagePath) + if (!response) { + return '' + } + this.set(component.uuid, paths.relativePath, response.version) + return response.version + } + + private writeToDisk = debouncedJSONDiskWriter(100, Paths.extensionsMappingJson, () => this.mapping) +} + +export async function initializePackageManager(webContents: Electron.WebContents): Promise { + const syncTasks: SyncTask[] = [] + let isRunningTasks = false + + const mapping = await MappingFileHandler.create() + + return { + syncComponents: async (components: Component[]) => { + logMessage( + 'received sync event for:', + components + .map( + ({ content, deleted }) => + // eslint-disable-next-line camelcase + `${content?.name} (${content?.package_info?.version}) ` + `(deleted: ${deleted})`, + ) + .join(', '), + ) + syncTasks.push({ components }) + + if (isRunningTasks) { + return + } + + isRunningTasks = true + await runTasks(webContents, mapping, syncTasks) + isRunningTasks = false + }, + } +} + +async function runTasks(webContents: Electron.WebContents, mapping: MappingFileHandler, tasks: SyncTask[]) { + while (tasks.length > 0) { + try { + const oppositeTask = await runTask(webContents, mapping, tasks[0], tasks.slice(1)) + if (oppositeTask) { + tasks.splice(tasks.indexOf(oppositeTask), 1) + } + } catch (error) { + logError(error) + } finally { + /** Remove the task from the queue. */ + tasks.splice(0, 1) + } + } +} + +/** + * @param nextTasks the tasks that follow this one. Useful to see if we + * need to run it at all (for example in the case of a succession of + * install/uninstall) + * @returns If a task opposite to this one was found, returns that tas without + * doing anything. Otherwise undefined. + */ +async function runTask( + webContents: Electron.WebContents, + mapping: MappingFileHandler, + task: SyncTask, + nextTasks: SyncTask[], +): Promise { + const maxTries = 3 + /** Try to execute the task with up to three tries. */ + for (let tries = 1; tries <= maxTries; tries++) { + try { + if (task.components.length === 1 && nextTasks.length > 0) { + /** + * This is a single-component task, AKA an installation or + * deletion + */ + const component = task.components[0] + /** + * See if there is a task opposite to this one, to avoid doing + * unnecessary processing + */ + const oppositeTask = nextTasks.find((otherTask) => { + if (otherTask.components.length > 1) { + /** Only check single-component tasks. */ + return false + } + const otherComponent = otherTask.components[0] + return component.uuid === otherComponent.uuid && component.deleted !== otherComponent.deleted + }) + if (oppositeTask) { + /** Found an opposite task. return it to the caller and do nothing */ + return oppositeTask + } + } + await syncComponents(webContents, mapping, task.components) + /** Everything went well, leave the loop */ + return + } catch (error) { + if (tries < maxTries) { + continue + } else { + throw error + } + } + } +} + +async function syncComponents(webContents: Electron.WebContents, mapping: MappingFileHandler, components: Component[]) { + /** + * Incoming `components` are what should be installed. For every component, + * check the filesystem and see if that component is installed. If not, + * install it. + */ + await Promise.all( + components.map(async (component) => { + if (component.deleted) { + /** Uninstall */ + logMessage(`Uninstalling ${component.content?.name}`) + await uninstallComponent(mapping, component.uuid) + return + } + + // eslint-disable-next-line camelcase + if (!component.content?.package_info) { + logMessage('Package info is null, skipping') + return + } + + const paths = pathsForComponent(component) + const version = component.content.package_info.version + if (!component.content.local_url) { + /** + * We have a component but it is not mapped to anything on the file system + */ + await installComponent(webContents, mapping, component, component.content.package_info, version) + } else { + try { + /** Will trigger an error if the directory does not exist. */ + await fs.promises.lstat(paths.absolutePath) + if (!component.content.autoupdateDisabled) { + await checkForUpdate(webContents, mapping, component) + } + } catch (error: any) { + if (error.code === FileDoesNotExist) { + /** We have a component but no content. Install the component */ + await installComponent(webContents, mapping, component, component.content.package_info, version) + } else { + throw error + } + } + } + }), + ) +} + +async function checkForUpdate(webContents: Electron.WebContents, mapping: MappingFileHandler, component: Component) { + const installedVersion = await mapping.getInstalledVersionForComponent(component) + + const latestUrl = component.content?.package_info?.latest_url + if (!latestUrl) { + return + } + + const latestJson = await getJSON(latestUrl) + if (!latestJson) { + return + } + + const latestVersion = latestJson.version + logMessage( + `Checking for update for ${component.content?.name}\n` + + `Latest: ${latestVersion} | Installed: ${installedVersion}`, + ) + + if (compareVersions(latestVersion, installedVersion) === 1) { + /** Latest version is greater than installed version */ + logMessage('Downloading new version', latestVersion) + await installComponent(webContents, mapping, component, latestJson, latestVersion) + } +} + +async function installComponent( + webContents: Electron.WebContents, + mapping: MappingFileHandler, + component: Component, + packageInfo: PackageInfo, + version: string, +) { + if (!component.content) { + return + } + const downloadUrl = packageInfo.download_url + if (!downloadUrl) { + return + } + const name = component.content.name + + logMessage('Installing ', name, downloadUrl) + + const sendInstalledMessage = (component: Component, error?: { message: string; tag: string }) => { + if (error) { + logError(`Error when installing component ${name}: ` + error.message) + } else { + logMessage(`Installed component ${name} (${version})`) + } + webContents.send(MessageToWebApp.InstallComponentComplete, { + component, + error, + }) + } + + const paths = pathsForComponent(component) + try { + logMessage(`Downloading from ${downloadUrl}`) + /** Download the zip and clear the component's directory in parallel */ + await Promise.all([ + downloadFile(downloadUrl, paths.downloadPath), + (async () => { + /** Clear the component's directory before extracting the zip. */ + await ensureDirectoryExists(paths.absolutePath) + await deleteDirContents(paths.absolutePath) + })(), + ]) + + logMessage('Extracting', paths.downloadPath, 'to', paths.absolutePath) + await extractNestedZip(paths.downloadPath, paths.absolutePath) + + let main = 'index.html' + try { + /** Try to read 'sn.main' field from 'package.json' file */ + const packageJsonPath = path.join(paths.absolutePath, 'package.json') + const packageJson = await readJSONFile<{ + sn?: { main?: string } + version?: string + }>(packageJsonPath) + + if (packageJson?.sn?.main) { + main = packageJson.sn.main + } + } catch (error) { + logError(error) + } + + component.content.local_url = 'sn://' + paths.relativePath + '/' + main + component.content.package_info.download_url = packageInfo.download_url + component.content.package_info.latest_url = packageInfo.latest_url + component.content.package_info.url = packageInfo.url + component.content.package_info.version = packageInfo.version + mapping.set(component.uuid, paths.relativePath, version) + + sendInstalledMessage(component) + } catch (error: any) { + logMessage(`Error while installing ${component.content.name}`, error.message) + + /** + * Waiting five seconds prevents clients from spamming install requests + * of faulty components + */ + const fiveSeconds = 5000 + await timeout(fiveSeconds) + + sendInstalledMessage(component, { + message: error.message, + tag: 'error-downloading', + }) + } +} + +function pathsForComponent(component: Pick) { + const relativePath = path.join(Paths.extensionsDirRelative, component.content!.package_info.identifier) + return { + relativePath, + absolutePath: path.join(Paths.userDataDir, relativePath), + downloadPath: path.join(Paths.tempDir, AppName, 'downloads', component.content!.name + '.zip'), + } +} + +async function uninstallComponent(mapping: MappingFileHandler, uuid: string) { + const componentMapping = mapping.get(uuid) + if (!componentMapping || !componentMapping.location) { + /** No mapping for component */ + return + } + await deleteDir(path.join(Paths.userDataDir, componentMapping.location)) + mapping.remove(uuid) +} diff --git a/packages/desktop/app/javascripts/Main/Packages/PackageManagerInterface.ts b/packages/desktop/app/javascripts/Main/Packages/PackageManagerInterface.ts new file mode 100644 index 000000000..2c21e7356 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Packages/PackageManagerInterface.ts @@ -0,0 +1,35 @@ +export interface PackageManagerInterface { + syncComponents(components: Component[]): Promise +} + +export interface Component { + uuid: string + deleted: boolean + content?: { + name?: string + autoupdateDisabled: boolean + local_url?: string + package_info: PackageInfo + } +} + +export type PackageInfo = { + identifier: string + version: string + download_url: string + latest_url: string + url: string +} + +export interface SyncTask { + components: Component[] +} + +export interface MappingFile { + [key: string]: Readonly | undefined +} + +export interface ComponentMapping { + location: string + version?: string +} diff --git a/packages/desktop/app/javascripts/Main/Remote/DataInterface.ts b/packages/desktop/app/javascripts/Main/Remote/DataInterface.ts new file mode 100644 index 000000000..2391446e2 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Remote/DataInterface.ts @@ -0,0 +1,3 @@ +export interface RemoteDataInterface { + destroySensitiveDirectories(): void +} diff --git a/packages/desktop/app/javascripts/Main/Remote/RemoteBridge.ts b/packages/desktop/app/javascripts/Main/Remote/RemoteBridge.ts new file mode 100644 index 000000000..e046afdc0 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Remote/RemoteBridge.ts @@ -0,0 +1,204 @@ +import { CrossProcessBridge } from '../../Renderer/CrossProcessBridge' +import { Store, StoreKeys } from '../Store' + +const path = require('path') +const rendererPath = path.join('file://', __dirname, '/renderer.js') + +import { app, BrowserWindow } from 'electron' +import { KeychainInterface } from '../Keychain/KeychainInterface' +import { BackupsManagerInterface } from '../Backups/BackupsManagerInterface' +import { PackageManagerInterface, Component } from '../Packages/PackageManagerInterface' +import { SearchManagerInterface } from '../Search/SearchManagerInterface' +import { RemoteDataInterface } from './DataInterface' +import { MenuManagerInterface } from '../Menus/MenuManagerInterface' +import { FileBackupsDevice, FileBackupsMapping } from '@web/Application/Device/DesktopSnjsExports' + +/** + * Read https://github.com/electron/remote to understand how electron/remote works. + * RemoteBridge is imported from the Preload process but is declared and created on the main process. + */ +export class RemoteBridge implements CrossProcessBridge { + constructor( + private window: BrowserWindow, + private keychain: KeychainInterface, + private backups: BackupsManagerInterface, + private packages: PackageManagerInterface, + private search: SearchManagerInterface, + private data: RemoteDataInterface, + private menus: MenuManagerInterface, + private fileBackups: FileBackupsDevice, + ) {} + + get exposableValue(): CrossProcessBridge { + return { + extServerHost: this.extServerHost, + useNativeKeychain: this.useNativeKeychain, + isMacOS: this.isMacOS, + appVersion: this.appVersion, + useSystemMenuBar: this.useSystemMenuBar, + rendererPath: this.rendererPath, + closeWindow: this.closeWindow.bind(this), + minimizeWindow: this.minimizeWindow.bind(this), + maximizeWindow: this.maximizeWindow.bind(this), + unmaximizeWindow: this.unmaximizeWindow.bind(this), + isWindowMaximized: this.isWindowMaximized.bind(this), + getKeychainValue: this.getKeychainValue.bind(this), + setKeychainValue: this.setKeychainValue.bind(this), + clearKeychainValue: this.clearKeychainValue.bind(this), + localBackupsCount: this.localBackupsCount.bind(this), + viewlocalBackups: this.viewlocalBackups.bind(this), + deleteLocalBackups: this.deleteLocalBackups.bind(this), + displayAppMenu: this.displayAppMenu.bind(this), + saveDataBackup: this.saveDataBackup.bind(this), + syncComponents: this.syncComponents.bind(this), + onMajorDataChange: this.onMajorDataChange.bind(this), + onSearch: this.onSearch.bind(this), + onInitialDataLoad: this.onInitialDataLoad.bind(this), + destroyAllData: this.destroyAllData.bind(this), + getFilesBackupsMappingFile: this.getFilesBackupsMappingFile.bind(this), + saveFilesBackupsFile: this.saveFilesBackupsFile.bind(this), + isFilesBackupsEnabled: this.isFilesBackupsEnabled.bind(this), + enableFilesBackups: this.enableFilesBackups.bind(this), + disableFilesBackups: this.disableFilesBackups.bind(this), + changeFilesBackupsLocation: this.changeFilesBackupsLocation.bind(this), + getFilesBackupsLocation: this.getFilesBackupsLocation.bind(this), + openFilesBackupsLocation: this.openFilesBackupsLocation.bind(this), + } + } + + get extServerHost() { + return Store.get(StoreKeys.ExtServerHost) + } + + get useNativeKeychain() { + return Store.get(StoreKeys.UseNativeKeychain) ?? true + } + + get rendererPath() { + return rendererPath + } + + get isMacOS() { + return process.platform === 'darwin' + } + + get appVersion() { + return app.getVersion() + } + + get useSystemMenuBar() { + return Store.get(StoreKeys.UseSystemMenuBar) + } + + closeWindow() { + this.window.close() + } + + minimizeWindow() { + this.window.minimize() + } + + maximizeWindow() { + this.window.maximize() + } + + unmaximizeWindow() { + this.window.unmaximize() + } + + isWindowMaximized() { + return this.window.isMaximized() + } + + async getKeychainValue() { + return this.keychain.getKeychainValue() + } + + async setKeychainValue(value: unknown) { + return this.keychain.setKeychainValue(value) + } + + async clearKeychainValue() { + return this.keychain.clearKeychainValue() + } + + async localBackupsCount() { + return this.backups.backupsCount() + } + + viewlocalBackups() { + this.backups.viewBackups() + } + + async deleteLocalBackups() { + return this.backups.deleteBackups() + } + + syncComponents(components: Component[]) { + void this.packages.syncComponents(components) + } + + onMajorDataChange() { + this.backups.performBackup() + } + + onSearch(text: string) { + this.search.findInPage(text) + } + + onInitialDataLoad() { + this.backups.beginBackups() + } + + destroyAllData() { + this.data.destroySensitiveDirectories() + } + + saveDataBackup(data: unknown) { + this.backups.saveBackupData(data) + } + + displayAppMenu() { + this.menus.popupMenu() + } + + getFilesBackupsMappingFile(): Promise { + return this.fileBackups.getFilesBackupsMappingFile() + } + + saveFilesBackupsFile( + uuid: string, + metaFile: string, + downloadRequest: { + chunkSizes: number[] + valetToken: string + url: string + }, + ): Promise<'success' | 'failed'> { + return this.fileBackups.saveFilesBackupsFile(uuid, metaFile, downloadRequest) + } + + public isFilesBackupsEnabled(): Promise { + return this.fileBackups.isFilesBackupsEnabled() + } + + public enableFilesBackups(): Promise { + return this.fileBackups.enableFilesBackups() + } + + public disableFilesBackups(): Promise { + return this.fileBackups.disableFilesBackups() + } + + public changeFilesBackupsLocation(): Promise { + return this.fileBackups.changeFilesBackupsLocation() + } + + public getFilesBackupsLocation(): Promise { + return this.fileBackups.getFilesBackupsLocation() + } + + public openFilesBackupsLocation(): Promise { + return this.fileBackups.openFilesBackupsLocation() + } +} diff --git a/packages/desktop/app/javascripts/Main/Search/SearchManager.ts b/packages/desktop/app/javascripts/Main/Search/SearchManager.ts new file mode 100644 index 000000000..e776dc7e6 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Search/SearchManager.ts @@ -0,0 +1,15 @@ +import { WebContents } from 'electron' +import { SearchManagerInterface } from './SearchManagerInterface' + +export function initializeSearchManager(webContents: WebContents): SearchManagerInterface { + return { + findInPage(text: string) { + webContents.stopFindInPage('clearSelection') + if (text && text.length > 0) { + // This option arrangement is required to avoid an issue where clicking on a + // different note causes scroll to jump. + webContents.findInPage(text) + } + }, + } +} diff --git a/packages/desktop/app/javascripts/Main/Search/SearchManagerInterface.ts b/packages/desktop/app/javascripts/Main/Search/SearchManagerInterface.ts new file mode 100644 index 000000000..2091edb50 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Search/SearchManagerInterface.ts @@ -0,0 +1,3 @@ +export interface SearchManagerInterface { + findInPage(text: string): void +} diff --git a/packages/desktop/app/javascripts/Main/SpellcheckerManager.ts b/packages/desktop/app/javascripts/Main/SpellcheckerManager.ts new file mode 100644 index 000000000..b2290e051 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/SpellcheckerManager.ts @@ -0,0 +1,214 @@ +/* eslint-disable no-inline-comments */ +import { isMac } from './Types/Platforms' +import { Store, StoreKeys } from './Store' +import { isDev } from './Utils/Utils' + +export enum Language { + AF = 'af', + ID = 'id', + CA = 'ca', + CS = 'cs', + CY = 'cy', + DA = 'da', + DE = 'de', + SH = 'sh', + ET = 'et', + EN_AU = 'en-AU', + EN_CA = 'en-CA', + EN_GB = 'en-GB', + EN_US = 'en-US', + ES = 'es', + ES_419 = 'es-419', + ES_ES = 'es-ES', + ES_US = 'es-US', + ES_MX = 'es-MX', + ES_AR = 'es-AR', + FO = 'fo', + FR = 'fr', + HR = 'hr', + IT = 'it', + PL = 'pl', + LV = 'lv', + LT = 'lt', + HU = 'hu', + NL = 'nl', + NB = 'nb', + PT_BR = 'pt-BR', + PT_PT = 'pt-PT', + RO = 'ro', + SQ = 'sq', + SK = 'sk', + SL = 'sl', + SV = 'sv', + VI = 'vi', + TR = 'tr', + EL = 'el', + BG = 'bg', + RU = 'ru', + SR = 'sr', + TG = 'tg', + UK = 'uk', + HY = 'hy', + HE = 'he', + FA = 'fa', + HI = 'hi', + TA = 'ta', + KO = 'ko', +} + +function isLanguage(language: any): language is Language { + return Object.values(Language).includes(language) +} + +function log(...message: any) { + console.log('spellcheckerMaager:', ...message) +} + +export interface SpellcheckerManager { + languages(): Array<{ + code: string + name: string + enabled: boolean + }> + addLanguage(code: string): void + removeLanguage(code: string): void +} + +export function createSpellcheckerManager( + store: Store, + webContents: Electron.WebContents, + userLocale: string, +): SpellcheckerManager | undefined { + /** + * On MacOS the system spellchecker is used and every related Electron method + * is a no-op. Return early to prevent unnecessary code execution/allocations + */ + if (isMac()) { + return + } + + const session = webContents.session + + /** + * Mapping of language codes predominantly based on + * https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + */ + const LanguageCodes: Readonly> = { + af: 'Afrikaans' /** Afrikaans */, + id: 'Bahasa Indonesia' /** Indonesian */, + ca: 'Català, Valencià' /** Catalan, Valencian */, + cs: 'Čeština, Český Jazyk' /** Czech */, + cy: 'Cymraeg' /** Welsh */, + da: 'Dansk' /** Danish */, + de: 'Deutsch' /** German */, + sh: 'Deutsch, Schaffhausen' /** German, Canton of Schaffhausen */, + et: 'Eesti, Eesti Keel' /** Estonian */, + 'en-AU': 'English, Australia', + 'en-CA': 'English, Canada', + 'en-GB': 'English, Great Britain', + 'en-US': 'English, United States', + es: 'Español' /** Spanish, Castilian */, + 'es-419': 'Español, America Latina' /** Spanish, Latin American */, + 'es-ES': 'Español, España' /** Spanish, Spain */, + 'es-US': 'Español, Estados Unidos de América' /** Spanish, United States */, + 'es-MX': 'Español, Estados Unidos Mexicanos' /** Spanish, Mexico */, + 'es-AR': 'Español, República Argentina' /** Spanish, Argentine Republic */, + fo: 'Føroyskt' /** Faroese */, + fr: 'Français' /** French */, + hr: 'Hrvatski Jezik' /** Croatian */, + it: 'Italiano' /** Italian */, + pl: 'Język Polski, Polszczyzna' /** Polish */, + lv: 'Latviešu Valoda' /** Latvian */, + lt: 'Lietuvių Kalba' /** Lithuanian */, + hu: 'Magyar' /** Hungarian */, + nl: 'Nederlands, Vlaams' /** Dutch, Flemish */, + nb: 'Norsk Bokmål' /** Norwegian Bokmål */, + 'pt-BR': 'Português, Brasil' /** Portuguese, Brazil */, + 'pt-PT': 'Português, República Portuguesa' /** Portuguese, Portugal */, + ro: 'Română' /** Romanian, Moldavian, Moldovan */, + sq: 'Shqip' /** Albanian */, + sk: 'Slovenčina, Slovenský Jazyk' /** Slovak */, + sl: 'Slovenski Jezik, Slovenščina' /** Slovenian */, + sv: 'Svenska' /** Swedish */, + vi: 'Tiếng Việt' /** Vietnamese */, + tr: 'Türkçe' /** Turkish */, + el: 'ελληνικά' /** Greek */, + bg: 'български език' /** Bulgarian */, + ru: 'Русский' /** Russian */, + sr: 'српски језик' /** Serbian */, + tg: 'тоҷикӣ, toçikī, تاجیکی‎' /** Tajik */, + uk: 'Українська' /** Ukrainian */, + hy: 'Հայերեն' /** Armenian */, + he: 'עברית' /** Hebrew */, + fa: 'فارسی' /** Persian */, + hi: 'हिन्दी, हिंदी' /** Hindi */, + ta: 'தமிழ்' /** Tamil */, + ko: '한국어' /** Korean */, + } + + const availableSpellCheckerLanguages = Object.values(Language).filter((language) => + session.availableSpellCheckerLanguages.includes(language), + ) + + if (isDev() && availableSpellCheckerLanguages.length !== session.availableSpellCheckerLanguages.length) { + /** This means that not every available language has been accounted for. */ + const firstOutlier = session.availableSpellCheckerLanguages.find( + (language, index) => availableSpellCheckerLanguages[index] !== language, + ) + throw new Error(`Found unsupported language code: ${firstOutlier}`) + } + + setSpellcheckerLanguages() + + function setSpellcheckerLanguages() { + const { session } = webContents + let selectedCodes = store.get(StoreKeys.SelectedSpellCheckerLanguageCodes) + + if (selectedCodes === null) { + /** First-time setup. Set a default language */ + selectedCodes = determineDefaultSpellcheckerLanguageCodes(session.availableSpellCheckerLanguages, userLocale) + store.set(StoreKeys.SelectedSpellCheckerLanguageCodes, selectedCodes) + } + session.setSpellCheckerLanguages([...selectedCodes]) + } + + function determineDefaultSpellcheckerLanguageCodes( + availableSpellCheckerLanguages: string[], + userLocale: string, + ): Set { + const localeIsSupported = availableSpellCheckerLanguages.includes(userLocale) + if (localeIsSupported && isLanguage(userLocale)) { + return new Set([userLocale]) + } else { + log(`Spellchecker doesn't support locale '${userLocale}'.`) + return new Set() + } + } + + function selectedLanguageCodes(): Set { + return store.get(StoreKeys.SelectedSpellCheckerLanguageCodes) || new Set() + } + + return { + languages() { + const codes = selectedLanguageCodes() + return availableSpellCheckerLanguages.map((code) => ({ + code, + name: LanguageCodes[code], + enabled: codes.has(code), + })) + }, + addLanguage(code: Language) { + const selectedCodes = selectedLanguageCodes() + selectedCodes.add(code) + store.set(StoreKeys.SelectedSpellCheckerLanguageCodes, selectedCodes) + session.setSpellCheckerLanguages(Array.from(selectedCodes)) + }, + removeLanguage(code: Language) { + const selectedCodes = selectedLanguageCodes() + selectedCodes.delete(code) + store.set(StoreKeys.SelectedSpellCheckerLanguageCodes, selectedCodes) + session.setSpellCheckerLanguages(Array.from(selectedCodes)) + }, + } +} diff --git a/packages/desktop/app/javascripts/Main/Store.ts b/packages/desktop/app/javascripts/Main/Store.ts new file mode 100644 index 000000000..5410ead25 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Store.ts @@ -0,0 +1,185 @@ +import fs from 'fs' +import path from 'path' +import { MessageType } from '../../../test/TestIpcMessage' +import { Language } from './SpellcheckerManager' +import { ensureIsBoolean, isTesting, isDev, isBoolean } from './Utils/Utils' +import { FileDoesNotExist } from './Utils/FileUtils' +import { BackupsDirectoryName } from './Backups/BackupsManager' +import { handleTestMessage } from './Utils/Testing' + +const app = process.type === 'browser' ? require('electron').app : require('@electron/remote').app + +function logError(...message: any) { + console.error('store:', ...message) +} + +export enum StoreKeys { + ExtServerHost = 'extServerHost', + UseSystemMenuBar = 'useSystemMenuBar', + MenuBarVisible = 'isMenuBarVisible', + BackupsLocation = 'backupsLocation', + BackupsDisabled = 'backupsDisabled', + MinimizeToTray = 'minimizeToTray', + EnableAutoUpdate = 'enableAutoUpdates', + ZoomFactor = 'zoomFactor', + SelectedSpellCheckerLanguageCodes = 'selectedSpellCheckerLanguageCodes', + UseNativeKeychain = 'useNativeKeychain', + + FileBackupsEnabled = 'fileBackupsEnabled', + FileBackupsLocation = 'fileBackupsLocation', +} + +interface StoreData { + [StoreKeys.ExtServerHost]: string + [StoreKeys.UseSystemMenuBar]: boolean + [StoreKeys.MenuBarVisible]: boolean + [StoreKeys.BackupsLocation]: string + [StoreKeys.BackupsDisabled]: boolean + [StoreKeys.MinimizeToTray]: boolean + [StoreKeys.EnableAutoUpdate]: boolean + [StoreKeys.UseNativeKeychain]: boolean | null + [StoreKeys.ZoomFactor]: number + [StoreKeys.SelectedSpellCheckerLanguageCodes]: Set | null + [StoreKeys.FileBackupsEnabled]: boolean + [StoreKeys.FileBackupsLocation]: string +} + +function createSanitizedStoreData(data: any = {}): StoreData { + return { + [StoreKeys.MenuBarVisible]: ensureIsBoolean(data[StoreKeys.MenuBarVisible], true), + [StoreKeys.UseSystemMenuBar]: ensureIsBoolean(data[StoreKeys.UseSystemMenuBar], false), + [StoreKeys.BackupsDisabled]: ensureIsBoolean(data[StoreKeys.BackupsDisabled], false), + [StoreKeys.MinimizeToTray]: ensureIsBoolean(data[StoreKeys.MinimizeToTray], false), + [StoreKeys.EnableAutoUpdate]: ensureIsBoolean(data[StoreKeys.EnableAutoUpdate], true), + [StoreKeys.UseNativeKeychain]: isBoolean(data[StoreKeys.UseNativeKeychain]) + ? data[StoreKeys.UseNativeKeychain] + : null, + [StoreKeys.ExtServerHost]: data[StoreKeys.ExtServerHost], + [StoreKeys.BackupsLocation]: sanitizeBackupsLocation(data[StoreKeys.BackupsLocation]), + [StoreKeys.ZoomFactor]: sanitizeZoomFactor(data[StoreKeys.ZoomFactor]), + [StoreKeys.SelectedSpellCheckerLanguageCodes]: sanitizeSpellCheckerLanguageCodes( + data[StoreKeys.SelectedSpellCheckerLanguageCodes], + ), + [StoreKeys.FileBackupsEnabled]: ensureIsBoolean(data[StoreKeys.FileBackupsEnabled], false), + [StoreKeys.FileBackupsLocation]: data[StoreKeys.FileBackupsLocation], + } +} + +function sanitizeZoomFactor(factor?: any): number { + if (typeof factor === 'number' && factor > 0) { + return factor + } else { + return 1 + } +} + +function sanitizeBackupsLocation(location?: unknown): string { + const defaultPath = path.join( + isTesting() ? app.getPath('userData') : isDev() ? app.getPath('documents') : app.getPath('home'), + BackupsDirectoryName, + ) + + if (typeof location !== 'string') { + return defaultPath + } + + try { + const stat = fs.lstatSync(location) + if (stat.isDirectory()) { + return location + } + /** Path points to something other than a directory */ + return defaultPath + } catch (e) { + /** Path does not point to a valid directory */ + logError(e) + return defaultPath + } +} + +function sanitizeSpellCheckerLanguageCodes(languages?: unknown): Set | null { + if (!languages) { + return null + } + if (!Array.isArray(languages)) { + return null + } + + const set = new Set() + const validLanguages = Object.values(Language) + for (const language of languages) { + if (validLanguages.includes(language)) { + set.add(language) + } + } + return set +} + +export function serializeStoreData(data: StoreData): string { + return JSON.stringify(data, (_key, value) => { + if (value instanceof Set) { + return Array.from(value) + } + return value + }) +} + +function parseDataFile(filePath: string) { + try { + const fileData = fs.readFileSync(filePath) + const userData = JSON.parse(fileData.toString()) + return createSanitizedStoreData(userData) + } catch (error: any) { + console.log('Error reading store file', error) + if (error.code !== FileDoesNotExist) { + logError(error) + } + + return createSanitizedStoreData({}) + } +} + +export class Store { + static instance: Store + readonly path: string + readonly data: StoreData + + static getInstance(): Store { + if (!this.instance) { + /** + * Renderer process has to get `app` module via `remote`, whereas the main process + * can get it directly app.getPath('userData') will return a string of the user's + * app data directory path. + * TODO(baptiste): stop using Store in the renderer process. + */ + const userDataPath = app.getPath('userData') + this.instance = new Store(userDataPath) + } + return this.instance + } + + static get(key: T): StoreData[T] { + return this.getInstance().get(key) + } + + constructor(userDataPath: string) { + this.path = path.join(userDataPath, 'user-preferences.json') + this.data = parseDataFile(this.path) + + if (isTesting()) { + handleTestMessage(MessageType.StoreSettingsLocation, () => this.path) + handleTestMessage(MessageType.StoreSet, (key, value) => { + this.set(key, value) + }) + } + } + + get(key: T): StoreData[T] { + return this.data[key] + } + + set(key: T, val: StoreData[T]): void { + this.data[key] = val + fs.writeFileSync(this.path, serializeStoreData(this.data)) + } +} diff --git a/packages/desktop/app/javascripts/Main/Strings/english.ts b/packages/desktop/app/javascripts/Main/Strings/english.ts new file mode 100644 index 000000000..039b30e3d --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Strings/english.ts @@ -0,0 +1,160 @@ +import { Strings } from './types' + +export function createEnglishStrings(): Strings { + return { + appMenu: { + edit: 'Edit', + view: 'View', + hideMenuBar: 'Hide Menu Bar', + useThemedMenuBar: 'Use Themed Menu Bar', + minimizeToTrayOnClose: 'Minimize To Tray On Close', + backups: 'Backups', + enableAutomaticUpdates: 'Enable Automatic Updates', + automaticUpdatesDisabled: 'Automatic Updates Disabled', + disableAutomaticBackups: 'Disable Automatic Backups', + enableAutomaticBackups: 'Enable Automatic Backups', + changeBackupsLocation: 'Change Backups Location', + openBackupsLocation: 'Open Backups Location', + emailSupport: 'Email Support', + website: 'Website', + gitHub: 'GitHub', + slack: 'Slack', + twitter: 'Twitter', + toggleErrorConsole: 'Toggle Error Console', + openDataDirectory: 'Open Data Directory', + clearCacheAndReload: 'Clear Cache and Reload', + speech: 'Speech', + close: 'Close', + minimize: 'Minimize', + zoom: 'Zoom', + bringAllToFront: 'Bring All to Front', + checkForUpdate: 'Check for Update', + checkingForUpdate: 'Checking for update…', + updateAvailable: '(1) Update Available', + updates: 'Updates', + releaseNotes: 'Release Notes', + openDownloadLocation: 'Open Download Location', + downloadingUpdate: 'Downloading Update…', + manuallyDownloadUpdate: 'Manually Download Update', + spellcheckerLanguages: 'Spellchecker Languages', + installPendingUpdate(versionNumber: string) { + return `Install Pending Update (${versionNumber})` + }, + lastUpdateCheck(date: Date) { + return `Last checked ${date.toLocaleString()}` + }, + version(number: string) { + return `Version: ${number}` + }, + yourVersion(number: string) { + return `Your Version: ${number}` + }, + latestVersion(number: string) { + return `Latest Version: ${number}` + }, + viewReleaseNotes(versionNumber: string) { + return `View ${versionNumber} Release Notes` + }, + preferencesChanged: { + title: 'Preference Changed', + message: + 'Your menu bar preference has been saved. Please restart the ' + 'application for the change to take effect.', + }, + security: { + security: 'Security', + useKeyringtoStorePassword: 'Use password storage to store password', + enabledKeyringAccessMessage: + "Standard Notes will try to use your system's password storage " + + 'facility to store your password the next time you start it.', + enabledKeyringQuitNow: 'Quit Now', + enabledKeyringPostpone: 'Postpone', + }, + }, + contextMenu: { + learnSpelling: 'Learn Spelling', + noSuggestions: 'No Suggestions', + }, + tray: { + show: 'Show', + hide: 'Hide', + quit: 'Quit', + }, + extensions: { + missingExtension: + 'The extension was not found on your system, possibly because it is ' + + "still downloading. If the extension doesn't load, " + + 'try uninstalling then reinstalling the extension.', + unableToLoadExtension: + 'Unable to load extension. Please restart the application and ' + + 'try again. If the issue persists, try uninstalling then ' + + 'reinstalling the extension.', + }, + updates: { + automaticUpdatesEnabled: { + title: 'Automatic Updates Enabled.', + message: + 'Automatic updates have been enabled. Please note that ' + + 'this functionality is currently in beta, and that you are advised ' + + 'to periodically check in and ensure you are running the ' + + 'latest version.', + }, + finishedChecking: { + title: 'Finished checking for updates.', + error(description: string) { + return ( + 'An issue occurred while checking for updates. ' + + 'Please try again.\nIf this issue persists please contact ' + + `support with the following information: ${description}` + ) + }, + updateAvailable(newVersion: string) { + return ( + `A new update is available (version ${newVersion}). ` + + 'You can wait for the app to update itself, or manually ' + + 'download and install this update.' + ) + }, + noUpdateAvailable(currentVersion: string) { + return `Your version (${currentVersion}) is the latest available version.` + }, + }, + updateReady: { + title: 'Update Ready', + message(version: string) { + return `A new update (version ${version}) is ready to install.` + }, + quitAndInstall: 'Quit and Install', + installLater: 'Install Later', + noRecentBackupMessage: + 'An update is ready to install, but your backups folder does not ' + + 'appear to contain a recent enough backup. Please download a ' + + 'backup manually before proceeding with the installation.', + noRecentBackupDetail(lastBackupDate: number | null) { + const downloadInstructions = + 'You can download a backup from the Account menu ' + 'in the bottom-left corner of the app.' + const lastAutomaticBackup = + lastBackupDate === null + ? 'Your backups folder is empty.' + : `Your latest automatic backup is from ${new Date(lastBackupDate).toLocaleString()}.` + return `${downloadInstructions}\n${lastAutomaticBackup}` + }, + noRecentBackupChecbox: 'I have downloaded a backup, proceed with installation', + }, + errorDownloading: { + title: 'Error Downloading', + message: 'An error occurred while trying to download your ' + 'update file. Please try again.', + }, + unknownVersionName: 'Unknown', + }, + backups: { + errorChangingDirectory(error: any): string { + return ( + 'An error occurred while changing your backups directory. ' + + 'If this issue persists, please contact support with the following ' + + 'information: \n' + + JSON.stringify(error) + ) + }, + }, + } +} diff --git a/packages/desktop/app/javascripts/Main/Strings/french.ts b/packages/desktop/app/javascripts/Main/Strings/french.ts new file mode 100644 index 000000000..b8f3a510b --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Strings/french.ts @@ -0,0 +1,42 @@ +import { Strings } from './types' +import { createEnglishStrings } from './english' +import { isDev } from '../Utils/Utils' + +export function createFrenchStrings(): Strings { + const fallback = createEnglishStrings() + if (!isDev()) { + /** + * Le Français est une langue expérimentale. + * Don't show it in production yet. + */ + return fallback + } + return { + appMenu: { + ...fallback.appMenu, + edit: 'Édition', + view: 'Affichage', + }, + contextMenu: { + learnSpelling: "Mémoriser l'orthographe", + noSuggestions: 'Aucune suggestion', + }, + tray: { + show: 'Afficher', + hide: 'Masquer', + quit: 'Quitter', + }, + extensions: fallback.extensions, + updates: fallback.updates, + backups: { + errorChangingDirectory(error: any): string { + return ( + "Une erreur s'est produite lors du déplacement du dossier de " + + 'sauvegardes. Si le problème est récurrent, contactez le support ' + + 'technique (en anglais) avec les informations suivantes:\n' + + JSON.stringify(error) + ) + }, + }, + } +} diff --git a/packages/desktop/app/javascripts/Main/Strings/index.ts b/packages/desktop/app/javascripts/Main/Strings/index.ts new file mode 100644 index 000000000..3b8d8bd71 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Strings/index.ts @@ -0,0 +1,70 @@ +import { createEnglishStrings } from './english' +import { createFrenchStrings } from './french' +import { Strings } from './types' +import { isDev } from '../Utils/Utils' + +let strings: Strings + +/** + * MUST be called (once) before using any other export in this file. + * @param locale The user's locale + * @see https://www.electronjs.org/docs/api/locales + */ +export function initializeStrings(locale: string): void { + if (isDev()) { + if (strings) { + throw new Error('`strings` has already been initialized') + } + } + + if (strings) { + return + } + + strings = stringsForLocale(locale) +} + +export function str(): Strings { + if (isDev()) { + if (!strings) { + throw new Error('tried to access strings before they were initialized.') + } + } + return strings +} + +export function appMenu() { + return str().appMenu +} + +export function contextMenu() { + return str().contextMenu +} + +export function tray() { + return str().tray +} + +export function extensions() { + return str().extensions +} + +export function updates() { + return str().updates +} + +export function backups() { + return str().backups +} + +function stringsForLocale(locale: string): Strings { + if (locale === 'en' || locale.startsWith('en-')) { + return createEnglishStrings() + } else if (locale === 'fr' || locale.startsWith('fr-')) { + return createFrenchStrings() + } + + return createEnglishStrings() +} + +export const AppName = 'Standard Notes' diff --git a/packages/desktop/app/javascripts/Main/Strings/types.ts b/packages/desktop/app/javascripts/Main/Strings/types.ts new file mode 100644 index 000000000..54469a6f2 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Strings/types.ts @@ -0,0 +1,109 @@ +export interface Strings { + appMenu: AppMenuStrings + contextMenu: ContextMenuStrings + tray: TrayStrings + extensions: ExtensionsStrings + updates: UpdateStrings + backups: BackupsStrings +} + +interface AppMenuStrings { + edit: string + view: string + hideMenuBar: string + useThemedMenuBar: string + minimizeToTrayOnClose: string + backups: string + enableAutomaticUpdates: string + automaticUpdatesDisabled: string + disableAutomaticBackups: string + enableAutomaticBackups: string + changeBackupsLocation: string + openBackupsLocation: string + emailSupport: string + website: string + gitHub: string + slack: string + twitter: string + toggleErrorConsole: string + openDataDirectory: string + clearCacheAndReload: string + speech: string + close: string + minimize: string + zoom: string + bringAllToFront: string + checkForUpdate: string + checkingForUpdate: string + updateAvailable: string + updates: string + releaseNotes: string + openDownloadLocation: string + downloadingUpdate: string + manuallyDownloadUpdate: string + spellcheckerLanguages: string + installPendingUpdate(versionNumber: string): string + lastUpdateCheck(date: Date): string + version(number: string): string + yourVersion(number: string): string + latestVersion(number: string): string + viewReleaseNotes(versionNumber: string): string + preferencesChanged: { + title: string + message: string + } + security: { + security: string + useKeyringtoStorePassword: string + enabledKeyringAccessMessage: string + enabledKeyringQuitNow: string + enabledKeyringPostpone: string + } +} + +interface ContextMenuStrings { + learnSpelling: string + noSuggestions: string +} + +interface TrayStrings { + show: string + hide: string + quit: string +} + +interface ExtensionsStrings { + unableToLoadExtension: string + missingExtension: string +} + +interface UpdateStrings { + automaticUpdatesEnabled: { + title: string + message: string + } + finishedChecking: { + title: string + error(description: string): string + updateAvailable(newVersion: string): string + noUpdateAvailable(currentVersion: string): string + } + updateReady: { + title: string + message(version: string): string + quitAndInstall: string + installLater: string + noRecentBackupMessage: string + noRecentBackupDetail(lastBackupDate: number | null): string + noRecentBackupChecbox: string + } + errorDownloading: { + title: string + message: string + } + unknownVersionName: string +} + +interface BackupsStrings { + errorChangingDirectory(error: any): string +} diff --git a/packages/desktop/app/javascripts/Main/TrayManager.ts b/packages/desktop/app/javascripts/Main/TrayManager.ts new file mode 100644 index 000000000..5ab6e3b79 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/TrayManager.ts @@ -0,0 +1,109 @@ +import { Menu, Tray } from 'electron' +import path from 'path' +import { isLinux, isWindows } from './Types/Platforms' +import { Store, StoreKeys } from './Store' +import { AppName, tray as str } from './Strings' +import { isDev } from './Utils/Utils' + +const icon = path.join(__dirname, '/icon/Icon-256x256.png') + +export interface TrayManager { + shouldMinimizeToTray(): boolean + createTrayIcon(): void + destroyTrayIcon(): void +} + +export function createTrayManager(window: Electron.BrowserWindow, store: Store): TrayManager { + let tray: Tray | undefined + let updateContextMenu: (() => void) | undefined + + function showWindow() { + window.show() + + if (isLinux()) { + /* On some versions of GNOME the window may not be on top when + restored. */ + window.setAlwaysOnTop(true) + window.focus() + window.setAlwaysOnTop(false) + } + } + + return { + shouldMinimizeToTray() { + return store.get(StoreKeys.MinimizeToTray) + }, + + createTrayIcon() { + tray = new Tray(icon) + tray.setToolTip(AppName) + + if (isWindows()) { + /* On Windows, right-clicking invokes the menu, as opposed to + left-clicking for the other platforms. So we map left-clicking + to the conventional action of showing the app. */ + tray.on('click', showWindow) + } + + const SHOW_WINDOW_ID = 'SHOW_WINDOW' + const HIDE_WINDOW_ID = 'HIDE_WINDOW' + const trayContextMenu = Menu.buildFromTemplate([ + { + id: SHOW_WINDOW_ID, + label: str().show, + click: showWindow, + }, + { + id: HIDE_WINDOW_ID, + label: str().hide, + click() { + window.hide() + }, + }, + { + type: 'separator', + }, + { + role: 'quit', + label: str().quit, + }, + ]) + + updateContextMenu = function updateContextMenu() { + if (window.isVisible()) { + trayContextMenu.getMenuItemById(SHOW_WINDOW_ID)!.visible = false + trayContextMenu.getMenuItemById(HIDE_WINDOW_ID)!.visible = true + } else { + trayContextMenu.getMenuItemById(SHOW_WINDOW_ID)!.visible = true + trayContextMenu.getMenuItemById(HIDE_WINDOW_ID)!.visible = false + } + + tray!.setContextMenu(trayContextMenu) + } + updateContextMenu() + + window.on('hide', updateContextMenu) + window.on('focus', updateContextMenu) + window.on('blur', updateContextMenu) + }, + + destroyTrayIcon() { + if (isDev()) { + /** Check our state */ + if (!updateContextMenu) { + throw new Error('updateContextMenu === undefined') + } + if (!tray) { + throw new Error('tray === undefined') + } + } + + window.off('hide', updateContextMenu!) + window.off('focus', updateContextMenu!) + window.off('blur', updateContextMenu!) + tray!.destroy() + tray = undefined + updateContextMenu = undefined + }, + } +} diff --git a/packages/desktop/app/javascripts/Main/Types/Constants.ts b/packages/desktop/app/javascripts/Main/Types/Constants.ts new file mode 100644 index 000000000..135c0e548 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Types/Constants.ts @@ -0,0 +1,6 @@ +/** Build-time constants */ +declare const IS_SNAP: boolean + +export const isSnap = IS_SNAP +export const autoUpdatingAvailable = !isSnap +export const keychainAccessIsUserConfigurable = isSnap diff --git a/packages/desktop/app/javascripts/Main/Types/Paths.ts b/packages/desktop/app/javascripts/Main/Types/Paths.ts new file mode 100644 index 000000000..c5cbe0f1a --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Types/Paths.ts @@ -0,0 +1,69 @@ +import path from 'path' +import index from '../../../index.html' +import grantLinuxPasswordsAccess from '../../../grantLinuxPasswordsAccess.html' +import decryptScript from 'decrypt/dist/decrypt.html' +import { app } from 'electron' + +function url(fileName: string): string { + if ('APP_RELATIVE_PATH' in process.env) { + return path.join('file://', __dirname, process.env.APP_RELATIVE_PATH as string, fileName) + } + return path.join('file://', __dirname, fileName) +} + +function filePath(fileName: string): string { + if ('APP_RELATIVE_PATH' in process.env) { + return path.join(__dirname, process.env.APP_RELATIVE_PATH as string, fileName) + } + return path.join(__dirname, fileName) +} + +export const Urls = { + get indexHtml(): string { + return url(index) + }, + get grantLinuxPasswordsAccessHtml(): string { + return url(grantLinuxPasswordsAccess) + }, +} + +/** + * App paths can be modified at runtime, most frequently at startup, so don't + * store the results of these getters in long-lived constants (like static class + * fields). + */ +export const Paths = { + get userDataDir(): string { + return app.getPath('userData') + }, + get documentsDir(): string { + return app.getPath('documents') + }, + get tempDir(): string { + return app.getPath('temp') + }, + get extensionsDirRelative(): string { + return 'Extensions' + }, + get extensionsDir(): string { + return path.join(Paths.userDataDir, 'Extensions') + }, + get extensionsMappingJson(): string { + return path.join(Paths.extensionsDir, 'mapping.json') + }, + get windowPositionJson(): string { + return path.join(Paths.userDataDir, 'window-position.json') + }, + get decryptScript(): string { + return filePath(decryptScript) + }, + get preloadJs(): string { + return path.join(__dirname, 'javascripts/renderer/preload.js') + }, + get components(): string { + return `${app.getAppPath()}/dist/web/components` + }, + get grantLinuxPasswordsAccessJs(): string { + return path.join(__dirname, 'javascripts/renderer/grantLinuxPasswordsAccess.js') + }, +} diff --git a/packages/desktop/app/javascripts/Main/Types/Platforms.ts b/packages/desktop/app/javascripts/Main/Types/Platforms.ts new file mode 100644 index 000000000..0017b7a73 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Types/Platforms.ts @@ -0,0 +1,31 @@ +/** + * TODO(baptiste): precompute these booleans at compile-time + * (requires one webpack build per platform) + */ + +export function isWindows(): boolean { + return process.platform === 'win32' +} +export function isMac(): boolean { + return process.platform === 'darwin' +} +export function isLinux(): boolean { + return process.platform === 'linux' +} + +export type InstallerKey = 'mac' | 'windows' | 'appimage_64' | 'appimage_32' +export function getInstallerKey(): InstallerKey { + if (isWindows()) { + return 'windows' + } else if (isMac()) { + return 'mac' + } else if (isLinux()) { + if (process.arch === 'x32') { + return 'appimage_32' + } else { + return 'appimage_64' + } + } else { + throw new Error(`Unknown platform: ${process.platform}`) + } +} diff --git a/packages/desktop/app/javascripts/Main/UpdateManager.ts b/packages/desktop/app/javascripts/Main/UpdateManager.ts new file mode 100644 index 000000000..4ad193cac --- /dev/null +++ b/packages/desktop/app/javascripts/Main/UpdateManager.ts @@ -0,0 +1,249 @@ +import compareVersions from 'compare-versions' +import { BrowserWindow, dialog, shell } from 'electron' +import electronLog from 'electron-log' +import { autoUpdater } from 'electron-updater' +import { action, autorun, computed, makeObservable, observable } from 'mobx' +import { autoUpdatingAvailable } from './Types/Constants' +import { MessageType } from '../../../test/TestIpcMessage' +import { AppState } from '../../application' +import { BackupsManagerInterface } from './Backups/BackupsManagerInterface' +import { StoreKeys } from './Store' +import { updates as str } from './Strings' +import { handleTestMessage } from './Utils/Testing' +import { isTesting } from './Utils/Utils' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function logError(...message: any) { + console.error('updateManager:', ...message) +} + +if (isTesting()) { + // eslint-disable-next-line no-var + var notifiedStateUpdate = false +} + +export class UpdateState { + latestVersion: string | null = null + enableAutoUpdate: boolean + checkingForUpdate = false + autoUpdateDownloaded = false + lastCheck: Date | null = null + + constructor(private appState: AppState) { + this.enableAutoUpdate = autoUpdatingAvailable && appState.store.get(StoreKeys.EnableAutoUpdate) + makeObservable(this, { + latestVersion: observable, + enableAutoUpdate: observable, + checkingForUpdate: observable, + autoUpdateDownloaded: observable, + lastCheck: observable, + + updateNeeded: computed, + + toggleAutoUpdate: action, + setCheckingForUpdate: action, + autoUpdateHasBeenDownloaded: action, + checkedForUpdate: action, + }) + + if (isTesting()) { + handleTestMessage(MessageType.UpdateState, () => ({ + lastCheck: this.lastCheck, + })) + } + } + + get updateNeeded(): boolean { + if (this.latestVersion) { + return compareVersions(this.latestVersion, this.appState.version) === 1 + } else { + return false + } + } + + toggleAutoUpdate(): void { + this.enableAutoUpdate = !this.enableAutoUpdate + this.appState.store.set(StoreKeys.EnableAutoUpdate, this.enableAutoUpdate) + } + + setCheckingForUpdate(checking: boolean): void { + this.checkingForUpdate = checking + } + + autoUpdateHasBeenDownloaded(version: string | null): void { + this.autoUpdateDownloaded = true + this.latestVersion = version + } + + checkedForUpdate(latestVersion: string | null): void { + this.lastCheck = new Date() + this.latestVersion = latestVersion + } +} + +let updatesSetup = false + +export function setupUpdates(window: BrowserWindow, appState: AppState, backupsManager: BackupsManagerInterface): void { + if (!autoUpdatingAvailable) { + return + } + if (updatesSetup) { + throw Error('Already set up updates.') + } + const { store } = appState + + autoUpdater.logger = electronLog + + const updateState = appState.updates + + function checkUpdateSafety(): boolean { + let canUpdate: boolean + if (appState.store.get(StoreKeys.BackupsDisabled)) { + canUpdate = true + } else { + canUpdate = updateState.enableAutoUpdate && isLessThanOneHourFromNow(appState.lastBackupDate) + } + autoUpdater.autoInstallOnAppQuit = canUpdate + autoUpdater.autoDownload = canUpdate + return canUpdate + } + autorun(checkUpdateSafety) + + const oneHour = 1 * 60 * 60 * 1000 + setInterval(checkUpdateSafety, oneHour) + + autoUpdater.on('update-downloaded', (info: { version?: string }) => { + window.webContents.send('update-available', null) + updateState.autoUpdateHasBeenDownloaded(info.version || null) + }) + + autoUpdater.on('error', logError) + autoUpdater.on('update-available', (info: { version?: string }) => { + updateState.checkedForUpdate(info.version || null) + if (updateState.enableAutoUpdate) { + const canUpdate = checkUpdateSafety() + if (!canUpdate) { + backupsManager.performBackup() + } + } + }) + autoUpdater.on('update-not-available', (info: { version?: string }) => { + updateState.checkedForUpdate(info.version || null) + }) + + updatesSetup = true + + if (isTesting()) { + handleTestMessage(MessageType.AutoUpdateEnabled, () => store.get(StoreKeys.EnableAutoUpdate)) + handleTestMessage(MessageType.CheckForUpdate, () => checkForUpdate(appState, updateState)) + // eslint-disable-next-line block-scoped-var + handleTestMessage(MessageType.UpdateManagerNotifiedStateChange, () => notifiedStateUpdate) + } else { + void checkForUpdate(appState, updateState) + } +} + +export function openChangelog(state: UpdateState): void { + const url = 'https://github.com/standardnotes/desktop/releases' + if (state.latestVersion) { + void shell.openExternal(`${url}/tag/v${state.latestVersion}`) + } else { + void shell.openExternal(url) + } +} + +function quitAndInstall(window: BrowserWindow) { + setTimeout(() => { + // index.js prevents close event on some platforms + window.removeAllListeners('close') + window.close() + autoUpdater.quitAndInstall(false) + }, 0) +} + +function isLessThanOneHourFromNow(date: number | null) { + const now = Date.now() + const onHourMs = 1 * 60 * 60 * 1000 + return now - (date ?? 0) < onHourMs +} + +export async function showUpdateInstallationDialog(parentWindow: BrowserWindow, appState: AppState): Promise { + if (!appState.updates.latestVersion) { + return + } + + if (appState.lastBackupDate && isLessThanOneHourFromNow(appState.lastBackupDate)) { + const result = await dialog.showMessageBox(parentWindow, { + type: 'info', + title: str().updateReady.title, + message: str().updateReady.message(appState.updates.latestVersion), + buttons: [str().updateReady.installLater, str().updateReady.quitAndInstall], + cancelId: 0, + }) + + const buttonIndex = result.response + if (buttonIndex === 1) { + quitAndInstall(parentWindow) + } + } else { + const cancelId = 0 + const result = await dialog.showMessageBox({ + type: 'warning', + title: str().updateReady.title, + message: str().updateReady.noRecentBackupMessage, + detail: str().updateReady.noRecentBackupDetail(appState.lastBackupDate), + checkboxLabel: str().updateReady.noRecentBackupChecbox, + checkboxChecked: false, + buttons: [str().updateReady.installLater, str().updateReady.quitAndInstall], + cancelId, + }) + + if (!result.checkboxChecked || result.response === cancelId) { + return + } + quitAndInstall(parentWindow) + } +} + +export async function checkForUpdate(appState: AppState, state: UpdateState, userTriggered = false): Promise { + if (!autoUpdatingAvailable) { + return + } + + if (state.enableAutoUpdate || userTriggered) { + state.setCheckingForUpdate(true) + + try { + const result = await autoUpdater.checkForUpdates() + + if (!result) { + return + } + + state.checkedForUpdate(result.updateInfo.version) + + if (userTriggered) { + let message + if (state.updateNeeded && state.latestVersion) { + message = str().finishedChecking.updateAvailable(state.latestVersion) + } else { + message = str().finishedChecking.noUpdateAvailable(appState.version) + } + + void dialog.showMessageBox({ + title: str().finishedChecking.title, + message, + }) + } + } catch (error) { + if (userTriggered) { + void dialog.showMessageBox({ + title: str().finishedChecking.title, + message: str().finishedChecking.error(JSON.stringify(error)), + }) + } + } finally { + state.setCheckingForUpdate(false) + } + } +} diff --git a/packages/desktop/app/javascripts/Main/Utils/FileUtils.ts b/packages/desktop/app/javascripts/Main/Utils/FileUtils.ts new file mode 100644 index 000000000..8b8e9aa55 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Utils/FileUtils.ts @@ -0,0 +1,272 @@ +import fs, { PathLike } from 'fs' +import { debounce } from 'lodash' +import path from 'path' +import yauzl from 'yauzl' +import { removeFromArray } from '../Utils/Utils' +import { dialog } from 'electron' + +export const FileDoesNotExist = 'ENOENT' +export const FileAlreadyExists = 'EEXIST' +const CrossDeviceLink = 'EXDEV' +const OperationNotPermitted = 'EPERM' +const DeviceIsBusy = 'EBUSY' + +export function debouncedJSONDiskWriter(durationMs: number, location: string, data: () => unknown): () => void { + let writingToDisk = false + return debounce(async () => { + if (writingToDisk) { + return + } + writingToDisk = true + try { + await writeJSONFile(location, data()) + } catch (error) { + console.error(error) + } finally { + writingToDisk = false + } + }, durationMs) +} + +export async function openDirectoryPicker(): Promise { + const result = await dialog.showOpenDialog({ + properties: ['openDirectory', 'showHiddenFiles', 'createDirectory'], + }) + + return result.filePaths[0] +} + +export async function readJSONFile(filepath: string): Promise { + try { + const data = await fs.promises.readFile(filepath, 'utf8') + return JSON.parse(data) + } catch (error) { + return undefined + } +} + +export function readJSONFileSync(filepath: string): T { + const data = fs.readFileSync(filepath, 'utf8') + return JSON.parse(data) +} + +export async function writeJSONFile(filepath: string, data: unknown): Promise { + await ensureDirectoryExists(path.dirname(filepath)) + await fs.promises.writeFile(filepath, JSON.stringify(data, null, 2), 'utf8') +} + +export async function writeFile(filepath: string, data: string): Promise { + await ensureDirectoryExists(path.dirname(filepath)) + await fs.promises.writeFile(filepath, data, 'utf8') +} + +export function writeJSONFileSync(filepath: string, data: unknown): void { + fs.writeFileSync(filepath, JSON.stringify(data, null, 2), 'utf8') +} + +export async function ensureDirectoryExists(dirPath: string): Promise { + try { + const stat = await fs.promises.lstat(dirPath) + if (!stat.isDirectory()) { + throw new Error('Tried to create a directory where a file of the same ' + `name already exists: ${dirPath}`) + } + } catch (error: any) { + if (error.code === FileDoesNotExist) { + /** + * No directory here. Make sure there is a *parent* directory, and then + * create it. + */ + await ensureDirectoryExists(path.dirname(dirPath)) + + /** Now that its parent(s) exist, create the directory */ + try { + await fs.promises.mkdir(dirPath) + } catch (error: any) { + if (error.code === FileAlreadyExists) { + /** + * A concurrent process must have created the directory already. + * Make sure it *is* a directory and not something else. + */ + await ensureDirectoryExists(dirPath) + } else { + throw error + } + } + } else { + throw error + } + } +} + +/** + * Deletes a directory (handling recursion.) + * @param {string} dirPath the path of the directory + */ +export async function deleteDir(dirPath: string): Promise { + try { + await deleteDirContents(dirPath) + } catch (error: any) { + if (error.code === FileDoesNotExist) { + /** Directory has already been deleted. */ + return + } + throw error + } + await fs.promises.rmdir(dirPath) +} + +export async function deleteDirContents(dirPath: string): Promise { + /** + * Scan the directory up to ten times, to handle cases where files are being added while + * the directory's contents are being deleted + */ + for (let i = 1, maxTries = 10; i < maxTries; i++) { + const children = await fs.promises.readdir(dirPath, { + withFileTypes: true, + }) + + if (children.length === 0) { + break + } + + for (const child of children) { + const childPath = path.join(dirPath, child.name) + if (child.isDirectory()) { + await deleteDirContents(childPath) + try { + await fs.promises.rmdir(childPath) + } catch (error) { + if (error !== FileDoesNotExist) { + throw error + } + } + } else { + await deleteFile(childPath) + } + } + } +} + +function isChildOfDir(parent: string, potentialChild: string) { + const relative = path.relative(parent, potentialChild) + return relative && !relative.startsWith('..') && !path.isAbsolute(relative) +} + +export async function moveDirContents(srcDir: string, destDir: string): Promise { + let fileNames = await fs.promises.readdir(srcDir) + await ensureDirectoryExists(destDir) + + if (isChildOfDir(srcDir, destDir)) { + fileNames = fileNames.filter((name) => { + return !isChildOfDir(destDir, path.join(srcDir, name)) + }) + removeFromArray(fileNames, path.basename(destDir)) + } + + return moveFiles( + fileNames.map((fileName) => path.join(srcDir, fileName)), + destDir, + ) +} + +export async function extractNestedZip(source: string, dest: string): Promise { + return new Promise((resolve, reject) => { + yauzl.open(source, { lazyEntries: true, autoClose: true }, (err, zipFile) => { + let cancelled = false + const tryReject = (err: Error) => { + if (!cancelled) { + cancelled = true + reject(err) + } + } + if (err) { + return tryReject(err) + } + if (!zipFile) { + return tryReject(new Error('zipFile === undefined')) + } + + zipFile.readEntry() + zipFile.on('close', resolve) + zipFile.on('entry', (entry) => { + if (cancelled) { + return + } + if (entry.fileName.endsWith('/')) { + /** entry is a directory, skip and read next entry */ + zipFile.readEntry() + return + } + + zipFile.openReadStream(entry, async (err, stream) => { + if (cancelled) { + return + } + if (err) { + return tryReject(err) + } + if (!stream) { + return tryReject(new Error('stream === undefined')) + } + stream.on('error', tryReject) + const filepath = path.join( + dest, + /** + * Remove the first element of the entry's path, which is the base + * directory we want to ignore + */ + entry.fileName.substring(entry.fileName.indexOf('/') + 1), + ) + try { + await ensureDirectoryExists(path.dirname(filepath)) + } catch (error: any) { + return tryReject(error) + } + const writeStream = fs.createWriteStream(filepath).on('error', tryReject).on('error', tryReject) + + stream.pipe(writeStream).on('close', () => { + zipFile.readEntry() + }) + }) + }) + }) + }) +} + +export async function moveFiles(sources: string[], destDir: string): Promise { + await ensureDirectoryExists(destDir) + return Promise.all(sources.map((fileName) => moveFile(fileName, path.join(destDir, path.basename(fileName))))) +} + +async function moveFile(source: PathLike, destination: PathLike) { + try { + await fs.promises.rename(source, destination) + } catch (error: any) { + if (error.code === CrossDeviceLink) { + /** Fall back to copying and then deleting. */ + await fs.promises.copyFile(source, destination) + await fs.promises.unlink(source) + } else { + throw error + } + } +} + +/** Deletes a file, handling EPERM and EBUSY errors on Windows. */ +export async function deleteFile(filePath: PathLike): Promise { + for (let i = 1, maxTries = 10; i < maxTries; i++) { + try { + await fs.promises.unlink(filePath) + break + } catch (error: any) { + if (error.code === OperationNotPermitted || error.code === DeviceIsBusy) { + await new Promise((resolve) => setTimeout(resolve, 300)) + continue + } else if (error.code === FileDoesNotExist) { + /** Already deleted */ + break + } + throw error + } + } +} diff --git a/packages/desktop/app/javascripts/Main/Utils/Testing.ts b/packages/desktop/app/javascripts/Main/Utils/Testing.ts new file mode 100644 index 000000000..521f7ae13 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Utils/Testing.ts @@ -0,0 +1,61 @@ +import { app, BrowserWindow } from 'electron' +import { AppMessageType, MessageType, TestIPCMessage } from '../../../../test/TestIpcMessage' +import { isTesting } from '../Utils/Utils' + +const messageHandlers: { + [key in MessageType]?: (...args: any) => unknown +} = {} + +export function handleTestMessage(type: MessageType, handler: (...args: any) => unknown): void { + if (!isTesting()) { + throw Error('Tried to invoke test handler in non-test build.') + } + + messageHandlers[type] = handler +} + +export function send(type: AppMessageType, data?: unknown): void { + if (!isTesting()) { + return + } + + process.send!({ type, data }) +} + +export function setupTesting(): void { + process.on('message', async (message: TestIPCMessage) => { + const handler = messageHandlers[message.type] + + if (!handler) { + process.send!({ + id: message.id, + reject: `No handler registered for message type ${MessageType[message.type]}`, + }) + return + } + + try { + let returnValue = handler(...message.args) + if (returnValue instanceof Promise) { + returnValue = await returnValue + } + process.send!({ + id: message.id, + resolve: returnValue, + }) + } catch (error: any) { + process.send!({ + id: message.id, + reject: error.toString(), + }) + } + }) + + handleTestMessage(MessageType.WindowCount, () => BrowserWindow.getAllWindows().length) + + app.on('ready', () => { + setTimeout(() => { + send(AppMessageType.Ready) + }, 200) + }) +} diff --git a/packages/desktop/app/javascripts/Main/Utils/Utils.ts b/packages/desktop/app/javascripts/Main/Utils/Utils.ts new file mode 100644 index 000000000..74225ef8d --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Utils/Utils.ts @@ -0,0 +1,44 @@ +import { CommandLineArgs } from '../../Shared/CommandLineArgs' + +export function isDev(): boolean { + return process.env.NODE_ENV === 'development' +} + +export function isTesting(): boolean { + return isDev() && process.argv.includes(CommandLineArgs.Testing) +} + +export function isBoolean(arg: unknown): arg is boolean { + return typeof arg === 'boolean' +} + +export function ensureIsBoolean(arg: unknown, fallbackValue: boolean): boolean { + if (isBoolean(arg)) { + return arg + } + return fallbackValue +} + +export function stringOrNull(arg: unknown): string | null { + if (typeof arg === 'string') { + return arg + } + return null +} + +/** Ensures a path's drive letter is lowercase. */ +export function lowercaseDriveLetter(filePath: string): string { + return filePath.replace(/^\/[A-Z]:\//, (letter) => letter.toLowerCase()) +} + +export function timeout(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +export function removeFromArray(array: T[], toRemove: T): void { + array.splice(array.indexOf(toRemove), 1) +} + +export function last(array: T[]): T | undefined { + return array[array.length - 1] +} diff --git a/packages/desktop/app/javascripts/Main/Window.ts b/packages/desktop/app/javascripts/Main/Window.ts new file mode 100644 index 000000000..9f636683b --- /dev/null +++ b/packages/desktop/app/javascripts/Main/Window.ts @@ -0,0 +1,333 @@ +import { BrowserWindow, Rectangle, screen, Shell } from 'electron' +import fs from 'fs' +import { debounce } from 'lodash' +import path from 'path' +import { AppMessageType, MessageType } from '../../../test/TestIpcMessage' +import { AppState } from '../../application' +import { MessageToWebApp } from '../Shared/IpcMessages' +import { createBackupsManager } from './Backups/BackupsManager' +import { BackupsManagerInterface } from './Backups/BackupsManagerInterface' +import { buildContextMenu, createMenuManager } from './Menus/Menus' +import { initializePackageManager } from './Packages/PackageManager' +import { isMac, isWindows } from './Types/Platforms' +import { initializeSearchManager } from './Search/SearchManager' +import { createSpellcheckerManager } from './SpellcheckerManager' +import { Store, StoreKeys } from './Store' +import { handleTestMessage, send } from './Utils/Testing' +import { createTrayManager, TrayManager } from './TrayManager' +import { checkForUpdate, setupUpdates } from './UpdateManager' +import { isTesting, lowercaseDriveLetter } from './Utils/Utils' +import { initializeZoomManager } from './ZoomManager' +import { Paths } from './Types/Paths' +import { clearSensitiveDirectories } from '@standardnotes/electron-clear-data' +import { RemoteBridge } from './Remote/RemoteBridge' +import { Keychain } from './Keychain/Keychain' +import { MenuManagerInterface } from './Menus/MenuManagerInterface' +import { FilesBackupManager } from './FileBackups/FileBackupsManager' + +const WINDOW_DEFAULT_WIDTH = 1100 +const WINDOW_DEFAULT_HEIGHT = 800 +const WINDOW_MIN_WIDTH = 300 +const WINDOW_MIN_HEIGHT = 400 + +export interface WindowState { + window: Electron.BrowserWindow + menuManager: MenuManagerInterface + backupsManager: BackupsManagerInterface + trayManager: TrayManager +} + +function hideWindowsTaskbarPreviewThumbnail(window: BrowserWindow) { + if (isWindows()) { + window.setThumbnailClip({ x: 0, y: 0, width: 1, height: 1 }) + } +} + +export async function createWindowState({ + shell, + appState, + appLocale, + teardown, +}: { + shell: Shell + appLocale: string + appState: AppState + teardown: () => void +}): Promise { + const window = await createWindow(appState.store) + + const services = await createWindowServices(window, appState, appLocale) + + require('@electron/remote/main').enable(window.webContents) + ;(global as any).RemoteBridge = new RemoteBridge( + window, + Keychain, + services.backupsManager, + services.packageManager, + services.searchManager, + { + destroySensitiveDirectories: () => { + const restart = true + clearSensitiveDirectories(restart) + }, + }, + services.menuManager, + services.fileBackupsManager, + ) + + const shouldOpenUrl = (url: string) => url.startsWith('http') || url.startsWith('mailto') + + window.on('closed', teardown) + + window.on('show', () => { + void checkForUpdate(appState, appState.updates, false) + hideWindowsTaskbarPreviewThumbnail(window) + }) + + window.on('focus', () => { + window.webContents.send(MessageToWebApp.WindowFocused, null) + }) + + window.on('blur', () => { + window.webContents.send(MessageToWebApp.WindowBlurred, null) + services.backupsManager.applicationDidBlur() + }) + + window.once('ready-to-show', () => { + window.show() + }) + + window.on('close', (event) => { + if (!appState.willQuitApp && (isMac() || services.trayManager.shouldMinimizeToTray())) { + /** + * On MacOS, closing a window does not quit the app. On Window and Linux, + * it only does if you haven't enabled minimize to tray. + */ + event.preventDefault() + /** + * Handles Mac full screen issue where pressing close results + * in a black screen. + */ + if (window.isFullScreen()) { + window.setFullScreen(false) + } + window.hide() + } + }) + + window.webContents.session.setSpellCheckerDictionaryDownloadURL('https://dictionaries.standardnotes.org/9.4.4/') + + /** handle link clicks */ + window.webContents.on('new-window', (event, url) => { + if (shouldOpenUrl(url)) { + void shell.openExternal(url) + } + event.preventDefault() + }) + + /** + * handle link clicks (this event is fired instead of 'new-window' when + * target is not set to _blank, such as with window.location.assign) + */ + window.webContents.on('will-navigate', (event, url) => { + /** Check for windowUrl equality in the case of window.reload() calls. */ + if (fileUrlsAreEqual(url, appState.startUrl)) { + return + } + if (shouldOpenUrl(url)) { + void shell.openExternal(url) + } + event.preventDefault() + }) + + window.webContents.on('context-menu', (_event, params) => { + buildContextMenu(window.webContents, params).popup() + }) + + return { + window, + ...services, + } +} + +async function createWindow(store: Store): Promise { + const useSystemMenuBar = store.get(StoreKeys.UseSystemMenuBar) + const position = await getPreviousWindowPosition() + const window = new BrowserWindow({ + ...position.bounds, + minWidth: WINDOW_MIN_WIDTH, + minHeight: WINDOW_MIN_HEIGHT, + show: false, + icon: path.join(__dirname, '/icon/Icon-512x512.png'), + titleBarStyle: isMac() || useSystemMenuBar ? 'hiddenInset' : undefined, + frame: isMac() ? false : useSystemMenuBar, + webPreferences: { + spellcheck: true, + nodeIntegration: isTesting(), + contextIsolation: true, + preload: Paths.preloadJs, + }, + }) + if (position.isFullScreen) { + window.setFullScreen(true) + } + + if (position.isMaximized) { + window.maximize() + } + persistWindowPosition(window) + + if (isTesting()) { + handleTestMessage(MessageType.SpellCheckerLanguages, () => window.webContents.session.getSpellCheckerLanguages()) + handleTestMessage(MessageType.SetLocalStorageValue, async (key, value) => { + await window.webContents.executeJavaScript(`localStorage.setItem("${key}", "${value}")`) + window.webContents.session.flushStorageData() + }) + handleTestMessage(MessageType.SignOut, () => window.webContents.executeJavaScript('window.device.onSignOut(false)')) + window.webContents.once('did-finish-load', () => { + send(AppMessageType.WindowLoaded) + }) + } + + return window +} + +async function createWindowServices(window: Electron.BrowserWindow, appState: AppState, appLocale: string) { + const packageManager = await initializePackageManager(window.webContents) + const searchManager = initializeSearchManager(window.webContents) + initializeZoomManager(window, appState.store) + + const backupsManager = createBackupsManager(window.webContents, appState) + const updateManager = setupUpdates(window, appState, backupsManager) + const trayManager = createTrayManager(window, appState.store) + const spellcheckerManager = createSpellcheckerManager(appState.store, window.webContents, appLocale) + + if (isTesting()) { + handleTestMessage(MessageType.SpellCheckerManager, () => spellcheckerManager) + } + + const menuManager = createMenuManager({ + appState, + window, + backupsManager, + trayManager, + store: appState.store, + spellcheckerManager, + }) + + const fileBackupsManager = new FilesBackupManager(appState) + + return { + backupsManager, + updateManager, + trayManager, + spellcheckerManager, + menuManager, + packageManager, + searchManager, + fileBackupsManager, + } +} + +/** + * Check file urls for equality by decoding components + * In packaged app, spaces in navigation events urls can contain %20 + * but not in windowUrl. + */ +function fileUrlsAreEqual(a: string, b: string): boolean { + /** Catch exceptions in case of malformed urls. */ + try { + /** + * Craft URL objects to eliminate production URL values that can + * contain "#!/" suffixes (on Windows) + */ + let aPath = new URL(decodeURIComponent(a)).pathname + let bPath = new URL(decodeURIComponent(b)).pathname + if (isWindows()) { + /** On Windows, drive letter casing is inconsistent */ + aPath = lowercaseDriveLetter(aPath) + bPath = lowercaseDriveLetter(bPath) + } + return aPath === bPath + } catch (error) { + return false + } +} + +interface WindowPosition { + bounds: Rectangle + isMaximized: boolean + isFullScreen: boolean +} + +async function getPreviousWindowPosition() { + let position: WindowPosition + try { + position = JSON.parse(await fs.promises.readFile(path.join(Paths.userDataDir, 'window-position.json'), 'utf8')) + } catch (e) { + return { + bounds: { + width: WINDOW_DEFAULT_WIDTH, + height: WINDOW_DEFAULT_HEIGHT, + }, + } + } + + const options: Partial = {} + const bounds = position.bounds + if (bounds) { + /** Validate coordinates. Keep them if the window can fit on a screen */ + const area = screen.getDisplayMatching(bounds).workArea + if ( + bounds.x >= area.x && + bounds.y >= area.y && + bounds.x + bounds.width <= area.x + area.width && + bounds.y + bounds.height <= area.y + area.height + ) { + options.x = bounds.x + options.y = bounds.y + } + if (bounds.width <= area.width || bounds.height <= area.height) { + options.width = bounds.width + options.height = bounds.height + } + } + + return { + isMaximized: position.isMaximized, + isFullScreen: position.isFullScreen, + bounds: { + width: WINDOW_DEFAULT_WIDTH, + height: WINDOW_DEFAULT_HEIGHT, + ...options, + }, + } +} + +function persistWindowPosition(window: BrowserWindow) { + let writingToDisk = false + + const saveWindowBounds = debounce(async () => { + const position: WindowPosition = { + bounds: window.getNormalBounds(), + isMaximized: window.isMaximized(), + isFullScreen: window.isFullScreen(), + } + + if (writingToDisk) { + return + } + + writingToDisk = true + try { + await fs.promises.writeFile(Paths.windowPositionJson, JSON.stringify(position), 'utf-8') + } catch (error) { + console.error('Could not write to window-position.json', error) + } finally { + writingToDisk = false + } + }, 500) + + window.on('resize', saveWindowBounds) + window.on('move', saveWindowBounds) +} diff --git a/packages/desktop/app/javascripts/Main/ZoomManager.ts b/packages/desktop/app/javascripts/Main/ZoomManager.ts new file mode 100644 index 000000000..1ff242f61 --- /dev/null +++ b/packages/desktop/app/javascripts/Main/ZoomManager.ts @@ -0,0 +1,16 @@ +import { BrowserWindow } from 'electron' +import { Store, StoreKeys } from './Store' + +export function initializeZoomManager(window: BrowserWindow, store: Store): void { + window.webContents.on('dom-ready', () => { + const zoomFactor = store.get(StoreKeys.ZoomFactor) + if (zoomFactor) { + window.webContents.zoomFactor = zoomFactor + } + }) + + window.on('close', () => { + const zoomFactor = window.webContents.zoomFactor + store.set(StoreKeys.ZoomFactor, zoomFactor) + }) +} diff --git a/packages/desktop/app/javascripts/Renderer/CrossProcessBridge.ts b/packages/desktop/app/javascripts/Renderer/CrossProcessBridge.ts new file mode 100644 index 000000000..00152197c --- /dev/null +++ b/packages/desktop/app/javascripts/Renderer/CrossProcessBridge.ts @@ -0,0 +1,52 @@ +import { Component } from '../Main/Packages/PackageManagerInterface' +import { FileBackupsDevice } from '@web/Application/Device/DesktopSnjsExports' + +export interface CrossProcessBridge extends FileBackupsDevice { + get extServerHost(): string + + get useNativeKeychain(): boolean + + get rendererPath(): string + + get isMacOS(): boolean + + get appVersion(): string + + get useSystemMenuBar(): boolean + + closeWindow(): void + + minimizeWindow(): void + + maximizeWindow(): void + + unmaximizeWindow(): void + + isWindowMaximized(): boolean + + getKeychainValue(): Promise + + setKeychainValue: (value: unknown) => Promise + + clearKeychainValue(): Promise + + localBackupsCount(): Promise + + viewlocalBackups(): void + + deleteLocalBackups(): Promise + + saveDataBackup(data: unknown): void + + displayAppMenu(): void + + syncComponents(components: Component[]): void + + onMajorDataChange(): void + + onSearch(text: string): void + + onInitialDataLoad(): void + + destroyAllData(): void +} diff --git a/packages/desktop/app/javascripts/Renderer/DesktopDevice.ts b/packages/desktop/app/javascripts/Renderer/DesktopDevice.ts new file mode 100644 index 000000000..dddd1a6c8 --- /dev/null +++ b/packages/desktop/app/javascripts/Renderer/DesktopDevice.ts @@ -0,0 +1,154 @@ +import { WebOrDesktopDevice } from '@web/Application/Device/WebOrDesktopDevice' +import { Component } from '../Main/Packages/PackageManagerInterface' +import { + RawKeychainValue, + Environment, + DesktopDeviceInterface, + FileBackupsMapping, +} from '@web/Application/Device/DesktopSnjsExports' +import { CrossProcessBridge } from './CrossProcessBridge' + +const FallbackLocalStorageKey = 'keychain' + +export class DesktopDevice extends WebOrDesktopDevice implements DesktopDeviceInterface { + public environment: Environment.Desktop = Environment.Desktop + + constructor( + private remoteBridge: CrossProcessBridge, + private useNativeKeychain: boolean, + public extensionsServerHost: string, + appVersion: string, + ) { + super(appVersion) + } + + async getKeychainValue() { + if (this.useNativeKeychain) { + const keychainValue = await this.remoteBridge.getKeychainValue() + return keychainValue + } else { + const value = window.localStorage.getItem(FallbackLocalStorageKey) + if (value) { + return JSON.parse(value) + } + } + } + + async setKeychainValue(value: RawKeychainValue) { + if (this.useNativeKeychain) { + await this.remoteBridge.setKeychainValue(value) + } else { + window.localStorage.setItem(FallbackLocalStorageKey, JSON.stringify(value)) + } + } + + async clearRawKeychainValue() { + if (this.useNativeKeychain) { + await this.remoteBridge.clearKeychainValue() + } else { + window.localStorage.removeItem(FallbackLocalStorageKey) + } + } + + syncComponents(components: Component[]) { + this.remoteBridge.syncComponents(components) + } + + onMajorDataChange() { + this.remoteBridge.onMajorDataChange() + } + + onSearch(text: string) { + this.remoteBridge.onSearch(text) + } + + onInitialDataLoad() { + this.remoteBridge.onInitialDataLoad() + } + + async clearAllDataFromDevice(workspaceIdentifiers: string[]): Promise<{ killsApplication: boolean }> { + await super.clearAllDataFromDevice(workspaceIdentifiers) + + this.remoteBridge.destroyAllData() + + return { killsApplication: true } + } + + async downloadBackup() { + const receiver = window.webClient + + receiver.didBeginBackup() + + try { + const data = await receiver.requestBackupFile() + if (data) { + this.remoteBridge.saveDataBackup(data) + } else { + receiver.didFinishBackup(false) + } + } catch (error) { + console.error(error) + receiver.didFinishBackup(false) + } + } + + async localBackupsCount() { + return this.remoteBridge.localBackupsCount() + } + + viewlocalBackups() { + this.remoteBridge.viewlocalBackups() + } + + async deleteLocalBackups() { + return this.remoteBridge.deleteLocalBackups() + } + + public isFilesBackupsEnabled(): Promise { + return this.remoteBridge.isFilesBackupsEnabled() + } + + public enableFilesBackups(): Promise { + return this.remoteBridge.enableFilesBackups() + } + + public disableFilesBackups(): Promise { + return this.remoteBridge.disableFilesBackups() + } + + public changeFilesBackupsLocation(): Promise { + return this.remoteBridge.changeFilesBackupsLocation() + } + + public getFilesBackupsLocation(): Promise { + return this.remoteBridge.getFilesBackupsLocation() + } + + async getFilesBackupsMappingFile(): Promise { + return this.remoteBridge.getFilesBackupsMappingFile() + } + + async openFilesBackupsLocation(): Promise { + return this.remoteBridge.openFilesBackupsLocation() + } + + async saveFilesBackupsFile( + uuid: string, + metaFile: string, + downloadRequest: { + chunkSizes: number[] + valetToken: string + url: string + }, + ): Promise<'success' | 'failed'> { + return this.remoteBridge.saveFilesBackupsFile(uuid, metaFile, downloadRequest) + } + + async performHardReset(): Promise { + console.error('performHardReset is not yet implemented') + } + + isDeviceDestroyed(): boolean { + return false + } +} diff --git a/packages/desktop/app/javascripts/Renderer/Preload.ts b/packages/desktop/app/javascripts/Renderer/Preload.ts new file mode 100644 index 000000000..94f70d8d9 --- /dev/null +++ b/packages/desktop/app/javascripts/Renderer/Preload.ts @@ -0,0 +1,42 @@ +import { MessageToWebApp } from '../Shared/IpcMessages' +const { ipcRenderer } = require('electron') +const path = require('path') +const rendererPath = path.join('file://', __dirname, '/renderer.js') +const RemoteBridge = require('@electron/remote').getGlobal('RemoteBridge') +const { contextBridge } = require('electron') + +process.once('loaded', function () { + contextBridge.exposeInMainWorld('electronRemoteBridge', RemoteBridge.exposableValue) + + listenForIpcEventsFromMainProcess() +}) + +function listenForIpcEventsFromMainProcess() { + const sendMessageToRenderProcess = (message: string, payload = {}) => { + window.postMessage(JSON.stringify({ message, data: payload }), rendererPath) + } + + ipcRenderer.on(MessageToWebApp.UpdateAvailable, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.UpdateAvailable, data) + }) + + ipcRenderer.on(MessageToWebApp.PerformAutomatedBackup, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.PerformAutomatedBackup, data) + }) + + ipcRenderer.on(MessageToWebApp.FinishedSavingBackup, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.FinishedSavingBackup, data) + }) + + ipcRenderer.on(MessageToWebApp.WindowBlurred, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.WindowBlurred, data) + }) + + ipcRenderer.on(MessageToWebApp.WindowFocused, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.WindowFocused, data) + }) + + ipcRenderer.on(MessageToWebApp.InstallComponentComplete, function (_event, data) { + sendMessageToRenderProcess(MessageToWebApp.InstallComponentComplete, data) + }) +} diff --git a/packages/desktop/app/javascripts/Renderer/Renderer.ts b/packages/desktop/app/javascripts/Renderer/Renderer.ts new file mode 100644 index 000000000..94856de55 --- /dev/null +++ b/packages/desktop/app/javascripts/Renderer/Renderer.ts @@ -0,0 +1,164 @@ +import { DesktopDevice } from './DesktopDevice' +import { MessageToWebApp } from '../Shared/IpcMessages' +import { DesktopClientRequiresWebMethods } from '@web/Application/Device/DesktopSnjsExports' +import { StartApplication } from '@web/Application/Device/StartApplication' +import { CrossProcessBridge } from './CrossProcessBridge' + +declare const DEFAULT_SYNC_SERVER: string +declare const WEBSOCKET_URL: string +declare const ENABLE_UNFINISHED_FEATURES: string +declare const PURCHASE_URL: string +declare const PLANS_URL: string +declare const DASHBOARD_URL: string + +declare global { + interface Window { + device: DesktopDevice + electronRemoteBridge: CrossProcessBridge + dashboardUrl: string + webClient: DesktopClientRequiresWebMethods + electronAppVersion: string + enableUnfinishedFeatures: boolean + plansUrl: string + purchaseUrl: string + startApplication: StartApplication + zip: any + } +} + +const loadWindowVarsRequiredByWebApp = () => { + window.dashboardUrl = DASHBOARD_URL + window.enableUnfinishedFeatures = ENABLE_UNFINISHED_FEATURES === 'true' + window.plansUrl = PLANS_URL + window.purchaseUrl = PURCHASE_URL +} + +const loadAndStartApplication = async () => { + const remoteBridge: CrossProcessBridge = window.electronRemoteBridge + + await configureWindow(remoteBridge) + + window.device = await createDesktopDevice(remoteBridge) + + window.startApplication(DEFAULT_SYNC_SERVER, window.device, window.enableUnfinishedFeatures, WEBSOCKET_URL) + + listenForMessagesSentFromMainToPreloadToUs(window.device) +} + +window.onload = () => { + loadWindowVarsRequiredByWebApp() + + void loadAndStartApplication() +} + +/** @returns whether the keychain structure is up to date or not */ +async function migrateKeychain(remoteBridge: CrossProcessBridge): Promise { + if (!remoteBridge.useNativeKeychain) { + /** User chose not to use keychain, do not migrate. */ + return false + } + + const key = 'keychain' + const localStorageValue = window.localStorage.getItem(key) + + if (localStorageValue) { + /** Migrate to native keychain */ + console.warn('Migrating keychain from localStorage to native keychain.') + window.localStorage.removeItem(key) + await remoteBridge.setKeychainValue(JSON.parse(localStorageValue)) + } + + return true +} + +async function createDesktopDevice(remoteBridge: CrossProcessBridge): Promise { + const useNativeKeychain = await migrateKeychain(remoteBridge) + const extensionsServerHost = remoteBridge.extServerHost + const appVersion = remoteBridge.appVersion + + return new DesktopDevice(remoteBridge, useNativeKeychain, extensionsServerHost, appVersion) +} + +async function configureWindow(remoteBridge: CrossProcessBridge) { + const isMacOS = remoteBridge.isMacOS + const useSystemMenuBar = remoteBridge.useSystemMenuBar + const appVersion = remoteBridge.appVersion + + window.electronAppVersion = appVersion + + /* + Title bar events + */ + document.getElementById('menu-btn')!.addEventListener('click', () => { + remoteBridge.displayAppMenu() + }) + + document.getElementById('min-btn')!.addEventListener('click', () => { + remoteBridge.minimizeWindow() + }) + + document.getElementById('max-btn')!.addEventListener('click', async () => { + if (remoteBridge.isWindowMaximized()) { + remoteBridge.unmaximizeWindow() + } else { + remoteBridge.maximizeWindow() + } + }) + + document.getElementById('close-btn')!.addEventListener('click', () => { + remoteBridge.closeWindow() + }) + + // For Mac inset window + const sheet = document.styleSheets[0] + if (isMacOS) { + sheet.insertRule('#navigation { padding-top: 25px !important; }', sheet.cssRules.length) + } + + if (isMacOS || useSystemMenuBar) { + // !important is important here because #desktop-title-bar has display: flex. + sheet.insertRule('#desktop-title-bar { display: none !important; }', sheet.cssRules.length) + } else { + /* Use custom title bar. Take the sn-titlebar-height off of + the app content height so its not overflowing */ + sheet.insertRule('body { padding-top: var(--sn-desktop-titlebar-height); }', sheet.cssRules.length) + sheet.insertRule( + `.main-ui-view { height: calc(100vh - var(--sn-desktop-titlebar-height)) !important; + min-height: calc(100vh - var(--sn-desktop-titlebar-height)) !important; }`, + sheet.cssRules.length, + ) + } +} + +function listenForMessagesSentFromMainToPreloadToUs(device: DesktopDevice) { + window.addEventListener('message', async (event) => { + // We don't have access to the full file path. + if (event.origin !== 'file://') { + return + } + let payload + try { + payload = JSON.parse(event.data) + } catch (e) { + // message doesn't belong to us + return + } + const receiver = window.webClient + const message = payload.message + const data = payload.data + + if (message === MessageToWebApp.WindowBlurred) { + receiver.windowLostFocus() + } else if (message === MessageToWebApp.WindowFocused) { + receiver.windowGainedFocus() + } else if (message === MessageToWebApp.InstallComponentComplete) { + receiver.onComponentInstallationComplete(data.component, data.error) + } else if (message === MessageToWebApp.UpdateAvailable) { + receiver.updateAvailable() + } else if (message === MessageToWebApp.PerformAutomatedBackup) { + void device.downloadBackup() + } else if (message === MessageToWebApp.FinishedSavingBackup) { + receiver.didFinishBackup(data.success) + } + }) +} diff --git a/packages/desktop/app/javascripts/Renderer/grantLinuxPasswordsAccess.js b/packages/desktop/app/javascripts/Renderer/grantLinuxPasswordsAccess.js new file mode 100644 index 000000000..5e4f1b793 --- /dev/null +++ b/packages/desktop/app/javascripts/Renderer/grantLinuxPasswordsAccess.js @@ -0,0 +1,22 @@ +/* eslint-disable no-undef */ +const { ipcRenderer } = require('electron') +import { MessageToMainProcess } from '../Shared/IpcMessages' + +document.addEventListener('DOMContentLoaded', () => { + document.getElementById('use-storage-button').addEventListener('click', () => { + ipcRenderer.send(MessageToMainProcess.UseLocalstorageForKeychain) + }) + + document.getElementById('quit-button').addEventListener('click', () => { + ipcRenderer.send(MessageToMainProcess.Quit) + }) + + const learnMoreButton = document.getElementById('learn-more') + learnMoreButton.addEventListener('click', (event) => { + ipcRenderer.send(MessageToMainProcess.LearnMoreAboutKeychainAccess) + event.preventDefault() + const moreInfo = document.getElementById('more-info') + moreInfo.style.display = 'block' + learnMoreButton.style.display = 'none' + }) +}) diff --git a/packages/desktop/app/javascripts/Shared/CommandLineArgs.ts b/packages/desktop/app/javascripts/Shared/CommandLineArgs.ts new file mode 100644 index 000000000..15c620f94 --- /dev/null +++ b/packages/desktop/app/javascripts/Shared/CommandLineArgs.ts @@ -0,0 +1,4 @@ +export const CommandLineArgs = { + Testing: '--testing-INSECURE', + UserDataPath: '--experimental-user-data-path', +} diff --git a/packages/desktop/app/javascripts/Shared/IpcMessages.ts b/packages/desktop/app/javascripts/Shared/IpcMessages.ts new file mode 100644 index 000000000..300669b0f --- /dev/null +++ b/packages/desktop/app/javascripts/Shared/IpcMessages.ts @@ -0,0 +1,14 @@ +export enum MessageToWebApp { + UpdateAvailable = 'update-available', + PerformAutomatedBackup = 'download-backup', + FinishedSavingBackup = 'finished-saving-backup', + WindowBlurred = 'window-blurred', + WindowFocused = 'window-focused', + InstallComponentComplete = 'install-component-complete', +} + +export enum MessageToMainProcess { + UseLocalstorageForKeychain = 'UseLocalstorageForKeychain', + LearnMoreAboutKeychainAccess = 'LearnMoreAboutKeychainAccess', + Quit = 'Quit', +} diff --git a/packages/desktop/app/package.json b/packages/desktop/app/package.json new file mode 100644 index 000000000..fbc1a655e --- /dev/null +++ b/packages/desktop/app/package.json @@ -0,0 +1,11 @@ +{ + "name": "standard-notes", + "productName": "Standard Notes", + "description": "An end-to-end encrypted notes app for digitalists and professionals.", + "author": "Standard Notes ", + "version": "3.20.2", + "main": "./dist/index.js", + "dependencies": { + "keytar": "^7.9.0" + } +} diff --git a/packages/desktop/app/stylesheets/renderer.css b/packages/desktop/app/stylesheets/renderer.css new file mode 100644 index 000000000..db45764d1 --- /dev/null +++ b/packages/desktop/app/stylesheets/renderer.css @@ -0,0 +1,83 @@ +:root { + --sn-desktop-titlebar-height: 35px; + --sn-desktop-titlebar-icon-font-size: 16px; +} + +/* To offset frameless window nav buttons on Mac */ +.mac-desktop #editor-column, +.mac-desktop #notes-column { + transition: 0.15s padding ease; +} + +.mac-desktop #app.collapsed-notes.collapsed-navigation #editor-column { + padding-top: 18px; +} + +.mac-desktop #app.collapsed-navigation #notes-column { + padding-top: 18px; +} + +panel-resizer { + -webkit-app-region: no-drag; +} + +#desktop-title-bar { + -webkit-app-region: drag; + padding: 0; + margin: 0; + height: var(--sn-desktop-titlebar-height); + line-height: var(--sn-desktop-titlebar-height); + vertical-align: middle; + background: var(--sn-stylekit-contrast-background-color) !important; + border-bottom: 1px solid var(--sn-stylekit-contrast-border-color); + display: flex; + justify-content: space-between; + z-index: 99999; + position: absolute; + width: 100%; + top: 0; +} + +#desktop-title-bar button { + -webkit-app-region: no-drag; + margin: 0; + background: none; + border: none; + padding: 0 10px; + color: var(--sn-stylekit-contrast-foreground-color); + vertical-align: middle; + height: 100%; +} + +#desktop-title-bar button svg { + max-width: var(--sn-desktop-titlebar-icon-font-size); +} + +#desktop-title-bar button:hover svg, +#desktop-title-bar button:focus svg { + color: var(--sn-stylekit-info-color); +} +#desktop-title-bar button:focus { + box-shadow: none; +} + +#desktop-title-bar .title-bar-left-buttons, +#desktop-title-bar .title-bar-right-buttons { + font-size: 0; +} + +/* Required for BrowserWindow titleBarStyle: 'hiddenInset' */ +.mac-desktop #navigation, +.mac-desktop #navigation .section-title-bar, +.mac-desktop #notes-title-bar, +.mac-desktop #editor-title-bar, +.mac-desktop #lock-screen { + -webkit-app-region: drag; +} + +input, +#navigation #navigation-content, +.component-view-container, +.panel-resizer { + -webkit-app-region: no-drag; +} diff --git a/packages/desktop/app/yarn.lock b/packages/desktop/app/yarn.lock new file mode 100644 index 000000000..a42015d7a --- /dev/null +++ b/packages/desktop/app/yarn.lock @@ -0,0 +1,448 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +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== + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +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= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "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== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +keytar@^7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb" + integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ== + dependencies: + node-addon-api "^4.3.0" + prebuild-install "^7.0.1" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +node-abi@^3.3.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32" + integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw== + dependencies: + semver "^7.3.5" + +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +prebuild-install@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" + integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +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== + dependencies: + lru-cache "^6.0.0" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +signal-exit@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.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" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/packages/desktop/babel.config.js b/packages/desktop/babel.config.js new file mode 100644 index 000000000..6f9733ecc --- /dev/null +++ b/packages/desktop/babel.config.js @@ -0,0 +1,30 @@ +module.exports = function (api) { + api.cache(true) + + const presets = [ + [ + '@babel/preset-env', + { + targets: { + electron: 9, + }, + }, + ], + ] + + const ignore = [ + './app/compiled', + './app/assets', + './app/stylesheets', + './app/dist', + './app/node_modules', + './node_modules', + './package.json', + './npm-debug.log', + ] + + return { + ignore, + presets, + } +} diff --git a/packages/desktop/build/entitlements.mac.inherit.plist b/packages/desktop/build/entitlements.mac.inherit.plist new file mode 100644 index 000000000..6bc22e913 --- /dev/null +++ b/packages/desktop/build/entitlements.mac.inherit.plist @@ -0,0 +1,14 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-library-validation + + + diff --git a/packages/desktop/build/icon.icns b/packages/desktop/build/icon.icns new file mode 100755 index 0000000000000000000000000000000000000000..ad707617476b8b9ae0acba394d889f08faf49c5b GIT binary patch literal 103873 zcmd431yoc~_~?6P7+{8wZiSJQ?oeu^K{}*M1VlmvX@nV41O#c65(ES(LAnN!PNgKI zJEXhb;eY?{-nZ6^`_@}`-FFu=bLO10XUDhq{=RR2zkP79ad8JAi7gH`fd?>^iq-LrYcC{YA5y>U`{2zY@d^qKFtMbP*w;o@t zv#~AGvHcAAG+dV8robtR{M<|M>AA0t^+L|m%eVE>`us7k_&(iIC8*qeUl`D4UJM*_ zg_LKQt3#F+-O&pIbe^AKqU9oNa zF_FVE<0M(Zp4D9Dt@vd}kaD}q;3{*y*j{Mw-`Vhq@W-oScqa|DU1H(%cb$}!2f8x+ z8ZnlRPqpNsXWPA&R0g}*@3UExS}9zx6d5T_!sG%*C-;}X?%Cf{shivoR5LzE@N#pu zbF#2}_=d<3<%Z7u(WbEjLlyWVgN)C**hX=}*qfQS@aJ^*vZe7ulWpuI`um8A@b!Pp zJ`qQAnEZI|othKQhNix6#)7|;fB&NoG~rK&sGD~G6Ke$eJVpYp?guLwD0r2>yM-- z5A+`2(Ia%^;+~Uwxf{iVPo=fco-Uv9dx~-9>x}Z#LsI|k21Ws>c{@{BRH&4qH|=^!@HzdGI6+qP)A> zQ$@qLhSZU3FH4{&(_6C+EQ{w?o;p1NLt*))rKPrKp7)q}CY~}|;qtOqRc9{-u0C zI3ZqK@vyzsB?DX-_fIRqZY#EGb=FJZB9e!8M>t7$LMw(SaaMs>WW+DrqwmDd2xF?N znB?a;%N^HpMNuE$q5|)n#^CT!S}*W2sDIl)?FuedBiQGpog~TdQv~5|ZwC>$%D$Hg z(^x6Adg-tZBPvh+BJUvEJV&Aa!I_umoz$f2guuIj3IUe*{G7{RM5wg7M zdrR?#;b!)$Drzc}$XNwB*a(ON0AbPpg&snK$*b# zU|wJiZvCeoGBqsW-m9AE@&Z<6J7v-F)q>A6C*O+|xL zc4C{pvlR~a$P?y%N$i!E*L%XL!}j@eu|8`ySJGdr%7agz3|g{4g@w`OCG0xvsER9!5|M&r2m}*2A>X6uNJz$H}}ioZ0gg` zzLEOTanC1-43CP+ivAFcePeJQD|C0}a5VKSwlziclrOwta(C|G9ABGXUqocjCd@de zCA@10Pa&H2qB%Y>R1^0orTmmeV$_;&QSrBnC4QHlPu*gL<6q+ZoKR^XEj~vLVep;= z#>hwEPFSJ!m?!?$lTR~lk$*k!j+ygNUl|7;{(W~PdxufE;Rz?3Ox_)iX1bF!STA~> zGjUk!<@2V!`nI++Wy`Yp0()MLCdOpPK3fL4zAEYGRPNgk`;Bq_Hq-ezj~OKVU}lpvzct+OqJH;a{|hfCj;;5O{>0aR{ujtH**TM)68A85^1KGWvq z@J|-+Uf&}GchXdvQFW=U1<&cxGc9{fy@9Bw0pEdP>oMo+wTr1e-cnOdxBV!y#h@4P zKW%3DBYpv6s~`D~OC(3X4#?hV6XqyVu(S7Ji#4KRv6Ac|(9n{ZK4@VIlob%r*5O9suj7eb z?)El$HQBN`Hh=o6@O$m6z)|CylREgANcC^k==91C7kL$md)N*kW^kv<&86HM9_xQgr#TX>66f z!t%?Yi|RibXvBp5^9;#RB9DW7a)dqt6>oEtpD`Xh&Oyg<7Y?r}S>Q7{hpNv-p*X*g zXANJNc5SXCy1nmQCQ})8kz+4PP?IrutG+ZIR_V}tmHD$a1h_lP{+oNqvH3_qU1$PV zqBfepxWXx)9c4?S_Xh3Qw#DHo6D^!OV!lL;?dp9&_A@vF{W0x0L={@*5MlhS_pKGR zWl{OO!Jf-N)2qA8c~hVkpr?xf1-NKL z@BbLcp$-wx()qBDXWUD4*Vq_{VF`h#viZ5sZuG?UtP$+cWXhoebvjxvK?}FR{FHEo zQf8>Pr4mkg{jHV{e=mdAX=ktK*_6JJl0rke&94}^VLMDi+76We{WHf`1}~hPdby}i zp@fJ!I4e0K@(C9$8<1{!Z)e1l{1w@oj_5j-jbotB_Wdh}0;(N=yiya@AcyKxYyrz` zFnE?;p+g*L)`w^K0{nMTK)S9*d{n=nP^$VG({ud_6p4w&Mfg4TU>)e7_YkfCLX+~< zBN|d%{+XO8IkX>|BGgn4eb4)p(N^RE9xW47%uhQ~aYyyi@tM|es=q>NfD25~TKFC{ z;r5W*Z(M!-z#o}L;ef5QD`~*9Y#r!bl*omYBWEa3Ax9C-AcuZ-;xnqtMFEh6chg!u zmT2{ox2HD}gXk7KyV%$6&?!;ISijYQhWG^BrX`^hQwXoKtp>uJX%1zOS?T~C^aSmT z)~DTqW|t9}MeyJEOxc)u1j<4@I0ROq$C|Fm@Os_;C{4C5X9^ct5CxI>!GB=i4U6?a z51wC?K);ZqD=kgX^+=*)8UtuZ{r4xAM6g$IBrleT7RUYJxcCDYT-~89wwp}g0r8^l zj@f`acX($S9*!Tpn-?tv5g@#G9!;V%P9&sECfdiC@(Nto`*pTeE}8_4ubPoJD#5vVVTMwdtQD=FdA8mbY;i@uPxGNwca$q?GyJuGGwq$7$c9UwX#QeNk z73%7%BjJDIN|VQs)529}BtLUo(z7U7S!G=B;gTTA%j@_L7K@$1-Ltxj{x+UlVLx#7 z;w@mykPiw3u*t5jKK^^Uzf#(4$>;ANN1Lx_{k^uixjDTFlh9}=f4xSE^x9kOs#@rX zX?~O5(#9^We;XP<8RqK-cur7F@$~xz{B}5<(KzrTN|Ea)rxzJa5@DX`Ar@HHBxLR`-~X^>%g#?}e! z`2BlFzFL_mvKH5-Cz_Wivu+Jb{zYSstqtKqx~}x6Kbov^ z_CrL$5se|?s{`Mx=my?lHQ?b?;ZYdShp^D>9~_eeQGXoua@x!=*|IINcexf%9# z;((=@u7!a_L_|!iq|NS^sR8zGoN?B8pncy5QLPr7Xwsu|f5n2wLou(KaOqLOVnKqsR^s4-H_e8{I*z4-*Oe)4Vxn_GlFww5GCg~y(4gaj}_A^a32VPfYWMnkc zVp(*#N-dkGJr+CP^FxO0I+@|zCdlV9n>F0tth2g;_V^mHiN(dmGpWpSGP)UGi^|%X znwpw3?z=Aw2$&Ji>Br=}Zt{$#a_;~5`j3EP*2^^JxB^0CCc0>%-fR1akcKbqhtnL> zv)^usbNi^g{+T+Djn}QMKQ}lE3BU*+Hi3ErWR%iEvHJUv7%E-&0vwYjt=A&9{B} z90Kj9+0FTTL2Ib#UOTng+1aU~zT&HMx5T{3zm|d9*W5^d;rqLf_sz!gchb21r$q*i z3o&lG~Q6E8zS!ImWVMt)J^X`9%TDl~>j z>iGGCQbBJA_8VvHQEdK-^yL&v5a+8~U2uLT{-~9p`u~HUiTn(|V2a_r%RH`ZXMN)# z|2JPNm@O2=E`ix|!P-yPLEB0Wkvz@ZWs(n-T!Pew|(w0B&FWr>~xl zh%z7X>DYd~-M42Ku_b6#A5GT~X=G(+EBxoBBJ}4QI5Z_!C}H+D4_BuMvRhZ5lj?g7 zE+;{;yx_-{gnO_rkKR6H=E;ptrjD|ST>`>rohT%|nf#Kx&M&unkNy2G?RI-5SNQg2 zb0k-$4*h4gr?&(9%`;a7-vfx){{>z~?6aoR0VZNIG~rFlxoypJPWFT0`>*>pY$`W< z={51a*ev@TOh%>ZlKnn1n!9{iC|Rc~OqVyFF_<+d>`2SA?bFEQ(hy#;&o=7}p-D`C zgBSOXMZ9M^WuIp3ACvI@&n#;N$JkP5-qUGX*`1HUW+h!D4R*#2oSml{<>cL>(EoyEpvv}}x+sr}t2DTFlgka`E6?$Jhd~>t(sHZt1|HZHQwYn92*HYO!Z2Ya+ zyy$#HvUOdveB6BMJ+?n1gWRy0{5vW8AlZ27b58=t(@%r12cNdYyD+H-evgv6ou`%g z?}g0yr_zMyk(P%SKTg*gtvW=Yr=UIiVVoU@I@9+eNap#o(Kx-J5AC%UO?K~+xqFk^7ivT# zA59ihpa$j)EetytEIKgaCRL3M%N10ClXoi%kqxcn*m#7bQVPic9P6u+dv zG@9~oxZ_F02iu7vOy>Ds(P`)%;p;P@X6GQd6?mJMw`x76L= zHNF0R-nQMtDQ^rDIT6)rXrS2V`4wbbz z&bU9C)UuQ2pYBS3lcPyY&JUwEQk|B3ZbN(UyrKWO&sSQ zAxxH|t@Uw-__nF%FZ_9SO@ywyNvzgRz(cDIwCStbu6T|W5{uovA6Y*01B*w0$EEiv zHlZ2})Ub=GMcvmuKYln660$fd7s>2QRwDsBH7Axt{np`vRJ{UyTKeCp#Q_r1?6p z$>2fRhO)lKmtJGjT#<9$xBM#N79_@O%-`)u4v!!4p(3UKHRYs ziYYnD#lQAhjxJ|wu*u5DS;hT1O`#%3GW%t=^m_lgDX7IV6es4R3LeIPOKuG@#n=9- zS=6@%KdU3a$+O)VJ!UZE9iO~+FP^x&;2%>YN&smb1(cinjxht=d zgY;Y!BjE?oUvvsCGOWnnZ)5t!g{HkQkiDvDNkMetI1+bUKKkpyZ6A4ef@1Jw$jH?t zhkmwUK7(LR!l{#H<+Amqxy|*e@o6`Xg9|0YjxL zG7?}jA~P=uPvr(~)BaR|j&savtvy)ku5Z(lrV_CEQE>he4&3I!5B%G3-tOa(0|ZCF z!iX_hCA*Ss+!?8yx4y!El1G+sE6zIZ>%@ zWdf)CP*QR}A${Uo>BEbSIOKz&64i0D21Qq@zAlA34Q^R8L&#$}EZyV#FEh{revmgb z(RUo9%-}%O*epr?^+S0=(?G}i1O`nuOx^MZy=GIEj?R&4qD!)*%mq-Y6rGuH5&Dr@QFex&NCv1+lN)7S^4#= zkY`@(+an^G!p|PnG9!rap&o6<^LZBds7)infZ6Z7K%rG_*n){;!-q3rZB7bAEQ%j? z@qx3_ekMceAfdJ9mul7QpLNKyo>HG_ zruz|p15N$jPxetln!TX`$GZHm=TRnWh}CvyNXV~Gai^8U`F{#SCfP7NWIK-Q`H`~L zQz|9VU#MuD3DES@TPjWedLB#7DybqJVQ!(j^STF`XexelI1qy5kGa+biZysI z*+BoxhodXZ#GX#1S5JoI%V*IKxr){*mjjH39bno>|&vKwwN#Q zoOSQtrvTQ0>(<8ZKvn@1G*k(WJ_1CN@M`w3G!=J&FXqHb8H9V4{*Y(0=OK^c&ahQ$}aF|{RqG){>w_dPw;?!&WYG`x$k zR?BiD0R#<3p6UU^+JX-{^nl!!G#H)&GKx-kwr>wzB@i3x1V_^s)~=k_hGA%1ZB@{) zIz*=;N{S$gmaF4Ev6vVP`@LckGSd-Btj>yp;;_#yd_|4M^Fk!#Di`ImG}FFmMpDJ1 zC81~1z}H5=6q=Rd8-kVwaDRXW$)V^qI2!FHp@5|#40;6Mm54g;%IB>H2_>I6Aj zWh^uwsJcbrk_-!z!!FnQ7{flSyJ}TPJ)rcfJJ*X9z}~ zsJPt>9~1FO|X02eD}?UD&2S4Tr*XVc|}RIp+Y0<`mwDH#N73V@4j zkqpm!k9LMq0+S)NugO&eAOxr&uUi@{kV)7*pbFuB&Khe4r9{KFZ+}pNf{}N?iDLOk z71;vbMNHopiH12*WC4HJd$;0ILEv5T2KQ(5h(BNz$~00YIWRDavQt%o4HvIhuR8I= zaW)Ripf@_inODX?aXP^lvbw&m#{b$R!xtJV_b}j0tntp;fl0=heE6+c)CE|^?lz7I z3i^#K3-}q90ous_+1FGKH?ZC`A7^mhZ2hrrlSB5ELT&K#On@Cev71RXivY*c&Snie z;&TQl&BOZGTQ?WA0la~Cj&Z1U@SAQk;TnJ-0&oAnOo%GX{5;2xLmbe-;jAI0(}7<< zwVgOj2n5n~UOu$RQG&_hV)4eCs=M^iO{cDWh^HUGl85S(``@ExU}gv)@JIFbCAOB8 zlo0GooHI3aV&}ll<7As`&`yoBCuDVZsMCfgnlD+Wd<&s40+Cz65~+K zurxT@NN0VFoDT(MolQe?LuQ>(EA>fKaj0wX*O$Wc0TBoX6bT#0={&GjSoy7n9ofJ>hGmtMylag7&ger{|9U1yeeMe(w167z zFS8v)wt>X-l9#s2DD`=p)qX zw^b^PTn?KADB#FE$RIs-z(WwdfL6hfYKc%%wjZDg1HgtuJ)s&%ObuKcm}egFRYgKz zX;S!B8+=x#rXLNtb~P4Yx0MToKN<1(o(RUxWq@r)RgveCQWIcZWkc{+nv0bjTt|Oa zCvhVd6|pBrf{yGM3$QnR6$>+w`%y~c$7aZElsSR9N_5xSzT%* zjQAW63R{Kaj)?|zm(2C|vj=2=j3?cU&d(33S^Qv;S^PK>F`y`zF`Ea#Pic;R{hyr? ztg)I<%_r>!Bw51g=V&ljDcIuo@ot9iIxo^1ZaMX&hJ}TFk-g1jlmax*L@PYLOAgcaOIf0N-IA6Y&mJG|ZR7Dg$b?f%roW(7tPV zmFJawKOCllWJN~jwMSLXDl3ZNW;uBq8X7VjbA$5%i_m|Q>Lx|(&wa`7pa*nUdU<;O zY?R6J`;9?c}g+QByg3Y3?9}&MsOhQSyjFgq}{Q&tH!>Jzv z%!5NXW&gev<73{f*8L#|FpFJn9kP$0#EVHhMG^YjXdM?7&En`XK?)df zi8A^)biBL6Q0&t}9FGcvZ%#KddYdL{x7ab%q?1p_9Xt1nHOh@LJ*U~LXkBjZuo2p-caqUhXloHDyou&TiZ za5Xo}3iCR#?Ny>>&@3ra#O`1Bk;q=`tO#*T;C%7jh?#IEK;1vdWt1wjJUbZD8q3zb z8E@UNMH9LwtWh*w1~4vuv(N%DTwr;P6S%!*Qu%zOw9rae{2?@zt;}I4PjudlmS4J7 z?DJ#)Do)_JL>l5w-G0AhAn%L&Tb1(&aW&`~hqmu}LH?kMk{|Gfjk~M5eB@vBlSyw( zgHqT7x*cvtjZFW&uEv{~wtly~=3c)@Grqvnw>XnP6TY@yuzA2+@%NO zG8VY)xcl;;|g~Jt+-1F){0L%Qq553yE~;VVb{`mdfgM-?%_>Ky~MU)PAq~64~rb z*FBR!e^rKJS=d8AK)1-H+=m#&8|vEv`9dG2>2v>C?c&W(q+v1_JFP3MCof;C`vDV# zWu8|tg`ijKX{ruEyQhPpT7OLo?-MAVzG=luh#&|Xz535wVi8w=mnPvJXI?LR2BccYdJ+F9S&p<;f3z-?7r&xzCH4PIc&brp7esONt!XfFRMz)bYrmV5XO*!zhhzVm@ft^xEHAx&;h@YL51~7+ zta2Jy%66iJ`)hQfpJ+mjIna{<@$4FBpH3o@EVs`koiAJd7?1!Ssg3Be!(<2TrXxcB zhMg{HzoUlm&=eKq25eDTwyLLihbbb{d)ScaSW!J?DBC4HA2ELSTLP z>03xQ{A3DjTbW0H+I>HE%{1?Ke4S~q-8?L^zF?FI5)kDW!wgJJ=~uSu1#hXC+aRFB^h9! z@|;4oDIPy%#;{VvqGzrAqt-jpM>?KK^OS%@0drRE zg8*1m^|Y_!nB;cDevi-oavu+MWXFbFuPV|3_Bp@VKqjDm^_}ED>4$Vu;AvM#!z!| zwYB_A3uHBMv%x*e4}MjxQLrMiSni9hJwh4&nO8#^B&BAx7^=G6ZOI5MbhPldG28{a_H{|c_6<1H6 z2voi2mWmZSp*=TvEP_APAuSj0to59XAm+MG1X_V!Jyy1Y1nW%oKArS?Cj= zk&^et6;>d!i=r2OUfA$7#7CWVkO6~g()eb~IAhLHoiWC1T)yax2rwHN+xK211&9Os zD%-{$TjE#-TkKD-N88rn8S^BPWa$pc=)ro2g36YXofX}w2+YMeEUh@-BGZ_)?E7M0 zd`q7i9u~PZK&4HISH@9ZtD?#`y)^|g#G_(R>B?byR%*vovD@TcFDn@zMwta$ng$4m z1FQb#_$?*Dl<{MGt@l`kv32>Z`^^&(X86QTixVtg5;pu7eYr5VgZcA`Y9smTR$;Zp z5|3d|Hfvrkw7;VjeDc)X+&oyy=glW0Q&Up~J{r16H#HrWp!eH!Zc4^maeYa(g@04p zMZBRCzDe$D9~Q!`>wUxGl9tZn+zO|Cv;!oL&_vF(phrj2Y3Mz{I(Y0f)AV{$nd$ZS zt*z>r>8dAfZ?`f7ukHuYVO(y(pSlZ}dht5CRGkz&JM8-#TZN;)HDWb{dMt@Tre)YKacO>#cg=z9HLV-<&E`n9UjEgNDzjU4x z9doFYsw!yVZxe86e2~#86^&o!Alyygpd%=NBV#f;JLb{5^^8uE$d*XugK|$|yI^z| zG3HrT>cYJZz)^b?H6qmRF*w^%gIB9LWVUj5%vnW{=i~kE2(9IZ>E1Rhcps{Aih}Vf zQyssS))D}tg2_Y93hw&R4mY{Ysb57#13_d3y6+qw{3S9|Z>_ln-)riwYgjJ#_NlLX zt^P$sT0p8;zoBVaDg!clB8i{#|$#XT*&_>)W&9SUdT$6wN zW7wFI9E;T|52;F@Bod1uabCl2!Q$VqHucjPd2P(%Yoj!6{w1Mu(NUU1FBcmVtvy~f z`DSmddb97%z1mTFE!t68R9oxLtub`^x^Ku9j0g-`x+<+~)GU_`@)*)rZz~ds?f^3M z4^nUUu|Cqv#$>R~tP=juf`KS5#D(m)TKo8e7S5_09{S(Ntbhc#0ek!ZZ!$}-^S_f> zzXXGk*Bt}*kNX#dh&p#DwRJFsA&;pESV`M(i;X=h6^ej~Q^8MAZtFqTfL22eY3Tz;G$?ms@(LhGvd?FLquv?AP^9+h@8r zfAo;B?|0muvCo|Gx;~PL*#MOixOV$r>=mquWjYYf+X)#;3Ln|tp7vF!w@jlvoBRC4 z==O@=m9}8+G)d#x;C@(G6Hm{K#j1f{Q!+`Tz;w*5X{ZCY&RZrZ z^6nh}?x8t%UP|x2%qhPITn+XFh!?XQ^v93BjtB`@_*;sXG-v?*oio8LooHaecU-X? z_~EQbfjHfq%8*bB>t?G6T(~n51uJL#^?xUE>6M!(>w~^sBZ)ZBz#dP>-HrUHBocM9 zcC@tcaS1&f`EUXk>2@)4-FQ0xWY&`J@pn1F8NYQcPdY(;uKer z`xyS43(%=0>=EnVbvsQID)FEHWWX82j=@mGM(#-SJDqFp^9JrjmgMMhz#J%n=Bw?| zXeUX5MSSvqmdN>!N(^`bmAmk8L`cl2ciW@mX{k$R&ZmV6NR56LuMGLpe=o!=k-_I< zJ+sp);iYiu;(7Q9Z-(JTOHF%BK+RVFkjW4;%z+FD{HeGRCOSqLz*l@V#`SL^yQSbR zash{-A?qZ+Ph7)~pO`ro53=Lf+-M!QVkpgn%FkU^vwFy#gr4HM7$h`pp7!65;P-gw zT4g%BH}ry(qj{&;uxS(DV4z1Rz4?hbmwDJD!^54yQe)GTqjuR=(J9gU4k2HmgKHPb zO;r-TBUfs5S2pRNJLKM@v|vBVNY4yNhWREBNXjECn9)JCNp)#~Ltcw_J~G_z-ZnWb zlfq#qrGDX9yYy%#VPTNUwNP@_1O{d{GqFSb;2O;@%s9&hk*)dSIo`glx|U_z_o*7~YL%Lm^5oV@NS||7qXPKrZ z#l{P0x6D=#1-N~K&lf}tSwU2=w=e~LtsMTA<=tHg&%~v=dUHs>lr4VRwP=0$aZ%DG zeB64#Oa%*pHjOcgY-J3+IybaT{7q@Aws>Uqn+(-2>9iO9Dgd8Pg}Q|gQaf;G^qrBQ z`?C6p)f3{Ex=Upa~K>Y z3&XD?84Oxf3cmzlq1g#luCelgNpLf`1B41mN0wc0e@UbySyb zPim^I&MH*}D}yN;W!m?9Mp`^W{hbq-=;)$yT>o=6+1#Cy(*r9cpdrdU?t8$QeHM}U zdx8?6r5xrn7oOaA?=b%ME;SaV2A_TGy|KH(7dLNmsQNMW;keuM;LDY~&zeT+h)6@5T8R(C3XQ@V*%OKuwu%IBmkR|^>WTb z*mkG1<*jXR2uxQQ+3OR2edVC*nqWW!h*xA+t}~G7s&nQ=bZ;lo6DZ$NXYJqnW#T58QS4mBojjmA?x&cc%_mm4DL!g zP(*ez-K~F`O$e-nzkLX>AK8jmgRHHyy5(YO^~d6=H$SQ#(q2YOBKUbR!1{;NY5Mmm zTARl^KUrfrp`W%jj9(?B++dCccG&8Mw(?`l?g~R^!%qvzE-OEtgEh)(O=IG_Edmu7r4ks&MST)n z^5-`kP-6oV%R*##=7iVfFJ)cPejg|SN;V-Rk(=hltqEY<)r(vu3VjkajVEG)Hv~oh z!2hHS5ip6A^1(yEo{3ZvTJ_3+m*FTz=cwV{6f!A6#M5^udsyrlAF!?%1t;wnxDm%k z^qtIaWRR04CZe_Kzf8=HeV(_@~mk2#>$~!Z2Nu$8C@mPS zg(8<3^((GY`x{lVek1%DA+&7P@&GIJ4W398{g3!~R35w&U*spF4R3RK`CXta$Q)qn zzmGTw2OjiO$5BCI@i7wcXP<;p71`i_B z4o-x2ID|yI^hK=Ga{15^+52f=o5R)6P}eUoA1TD=6f`kJV7yO7(3d(L7RO;F55!f+ zu^}Pk_f*kPZE`}xIF#)TPEe8_Qv08Nt!!6Sz=m~lVq!74_0zZg{hzFZG??}E^(N1k zzJBYtSvfha4p<(uD#YTx4?p}jgGzq&;&@ZZvpWc*yC4({N==PLe*`g-%P8R^Md)LY z&lFkNv9r#ygIMz8;Sb&SXetm!a;KysKofw5&e}DW>9bmef*_N?&Q1>MLY@WG81wT` z{eQ_0IZ}$VVD1z^g6$*xs;ic`Y>3fOE}#Y)BKs7etlBaVPe`|Y2a7855UgN9sT@5D zx&+eAgn@U;|H<+!Lq*WAZVnXWUgn(`R?IMX_j4101As`-0=q^=l2H{}0Nz!3P4ycf zznA%+C@;}+x8zO)$NGs?@}-GtBe0W<*|Zd4cMI9q1Jq-;F4H!l2mRrusz`9FH;`Il zL9YyLqyQD~1!87;0|Qn|qz)cmg0K^oEB?aT|wn<>Gfo#e$q$V9Eq>gs${&StrSKGRJdaagt>#}_L#|N)x*7j^GUGs2J zwRB`?Grs(ll^b$G1btiw_>+H$`Y?Bw)e3{Af{;o^DFD+j^$Dx>SPKj~=R^7(lgd6yz2%NB5Z6{)j!4TL@)!GH2DurRG{D=cN-(0o0ZI*&=7a>OT+1Iz;{z@Z9OCih-U6E(n|pk^ zjEc}aL<%L^dz|F$Lw~kp5P`(8fhDm*vjA4pf!=hO8hIHr5GRbA#Trn;ig^lhzqqA= zDOIG-O+V}kyOXOVfpc`06jkogJEfYX3>AZAb@bL^z;-J`AGh~8A<$Gdz6xE$;KXJ_ z{2@ojrMk0$W+(<$B=VsOhJ7n2oxO+$s=qjx69U!MTO0RZeo3!k3bkrWVbpQML41xu zQ)PZ*2Hcp+SYBTkKOt9n2kP(l;?L?$pKf?qu|Nf$cEy;Yf;P z!st#U#*;xTl^U(mvY2y6i5Xx(r{E)4A7UTVfR^u`B=_^Y)R&r22M$sOap4JKu%&`F zzb*KAWWgzgl(EVE_5Chj?dRuLLG>K8d+5Ih&wp_vRQgl3Bdmgh<&Q05XwPyXPdrupY<~kL-k(1wntc)L{qmNn0&}lRagvQO(X=VJG z1AZr>ci1ICX`$EnP?V52IRVe{8Qkw;oJgNJIGh&skmu;29Uy4px&CxX*-oX(K?3qJ z`PqsAncx9hj{u`5CIB;zMc}0e0XlsntoCUL7L1Y3(CB5uCqAp@;R3e&(_l>WdeSyZ z)zsUCypssSYg*O7(LS4K^&c6(q1;R~v~YMY3GoxslN1So5mD4^H=UD0Xs_APs*u4Q z+|~m{x?wAE?2cmVkbN*(B&mL^*fgI6nkx&9eZKbRCfw$vPg0D8RDdimq%`Yrj1MhH zCO`*4lM^t~l{=1=h?fOL{0DNp;Zz^Xl_~G{Or`ASP=eL-QDEMgkL16i4*U-*tT_wD z9D_=KvY@9)BtnY81pP4u3+rD?r~e!Vwce#n4v#|}Av(<~Xxh{i043AFSP@>J6Gv_I zE(uO$z}Z?p!+$AC1Ox8P_u8&mc$Z!-N@0$^cd;#$cL~P*Ee$7}NS6>mjnl z=?(#~d0z;T`&BEMfsCJsZ+t2e7`UYAOMa^NQJoYs>;$$cLG(%UR1}8orbS=32@##qM+xh9>GSKgf^l>A*3YW(O)|8#oj4R1j94r5X2<;< zX>=i%K1)0&6nq3Bz+w1{P9W#X3@-(J_v2K7FgqUOQ$}W&IgQgGmEKn5VNrHN@daErxn-;DNv+RbbPEsnkMJWVu zd4D5lLPgk4r&LoWMi~?Bh2u1Z_mdX&id%bGyLvR)GT?MY2wd}!uQDTp1Dh#VI+Rhj zI-lACq{fq^z+w&#<~?BMJr{a?_tGnX4gNHRD+2%n<7XSC&4#F~0VXCOWQJCw3I-@4 z3EseFqs6CBoEF-nzebs~gT9Lz+-b6EtE>KB9bxG;xTOz5OL9pS%?lZH0pu8H|CEFL zs(z^;|BeZ1ziJjaB5RvJrmK{4a`zF66mXoA^`0aL7IXgswBzLP3(dIpAQOUc(2ArCKhwTJQa*vRgc znAPre%wL@J5uHGp0pjao30bSjtAb?jpJdWZI}?tjm3(G30ut+Aax~>IV8zJcov0HQ z`wXAu;3wQBuhpNy41lMudrU_I-C{OSVbu9VRG_(Nvyby zEcN;9#SWzL(Ejh!Npo}!M*G1loa_>`6k=p_c=%u<2$zr=?;*BYbN+Kp8Wr?T^-RF| z9(QR2dFci7W=DJ=DImpU(|DLHRU89B4(KA7NgH;45T3V3GaUa@!H0h;UvwvMx@)6A zs0W4k>>YjryY4S%6?W~{o;>XPHi_(;^Pmd{j+V7J_4h-MAceN{%tHdHx8e&d0%+&r zQibiWLV5m!taauz4crdA*d2RyInO_h8Rw?J11b--ex5=^*8~{CI`Clzca9&4&yIF5 z1^S0Nb;Rp{5J?TnAm(%uDsk=hGQe!|*`eSVM%L^+B9FBmcwVD)_W}5C1KuzP`~9o6 z-}v**rn(;_i9NSz_07`qG3bW5vE9|2m}$3e&itv7>FIaB0zxiR2KN@Iy)S%|W#d)( z;HW7#i9o5_dxoVJjW*lUjT@TMhr{E0xLI{4{buYC8U%LEu*m3Tal_8h=LD^ErefKo zxr?(Z%L|j_k)wF<30wE8C-3eNvis*1DX~jPHnF^UiFx2-;yQ&xBIW8VFW>rdPn-fF zp^9>`-Hz>;yw+jdzhvUHnmQ#rYdwA0Q|c$r@ik7B4*|e`Dgrpcq>u&)$_VW0ubd4g zkZ`}~O_%ig_6mU{S7)6iz+_8}HYu50W;UIzfA#yU{c>fjj49^q`RcYpt@#G@9_2k& z)Y{kgMn?+f@~0ySGhOb(%^AY>{U_iPVj4ev*~wMnupl{{ZaA87Y;Jzq6{qaE`R7yh z$ty;$0DF^wr6m&>DL+kjSUu$%7=e&OGT?q;?hbCH=%ZRq?!;H>=$uh!wMs<$kGjlI zXi2?X8Mn`DtTTvv$|ya-xBoBavj5<;9>>i9(AM0#g@Wxo6Oap#;zsjf-lDdCDKkmy z2dGcr?WE6VHXi3 zC#uFxv1Zf&<>MZFGVE-Y5)LU;ofPWt(qOkfTp<6V>2z5(DZiLnkeQTOJy;WEa?yUc zF;-f;UikHDzaT#&XrZ;`*Lv&Ruayq7?cI*^bIk|M35Qw1*5gZ`e*x`0BJ}75c>oDp zC7<0c{P5vJA%jbebvvDX+BZ~oaOtAk{UVU;mcwTQuJD=s%dS8Ocr`+0XtsL++Tyv{ zUmec2C3l-2G|5bSwK41*GG0-h`ySd>zM@Rev4mXV^IKmc8~(2ogwLC_?z8fOZ>0zMlr(@o2XP1VSd;`&PaI9*CBbB z$dqA+mrI#ew~OTIQ6AUW#`ZWJ8rb#BvJe@I6o|N>T zP4losQ-Y`(7?Y$l>$!8k>LU8_o&H<-$}rN*GK)~a9Io!0#%~@r3+{(uVtavnmoDYA zXLPEvkTTaA&h*&aTw0-u>Zt{{-a|ZE!c+eyr1@JevZyqvaMIaCTOKbBE_JuF;H4qA zCwKHtVIom763K(NWr-$#iBfqO%hde3t2JMFTf#NVcv(Z}#e2w^U8;CQj(EVyTsTwX z<qz4-yQf%~QK|rb^AT;(RI?%bI*Ykf0cTlez%hI5jf?DF*IIeY(313wqt0s45Ne2;#3 zl{vrh*rz?Jm{rBX<>&{L-j#tu9LIQ8;DrCjQDd&eK`GUPypc+3qpqYi^VQ(+83(mo zhmtFX($@;;+}!WF-#_i=J1KRz>DEvHmiN1tdo%uc+lO^x-`g(Xrk?ed;>&Q0u*QL} zO5e?V-5s4et|Miu{gnpHPYa-G)AUSAUH=NW8`cf!WxU6F`F>MdQ?76^M+}Zd_OM)F z=!uzEi1dR`KAl&L9*Qh%pIllqi#LraRaR~#-t(3=PF=TF{Hx6`_V>b)!P-}+dyIzF zhPKu67Oh^sl(iGN-}>GR)|O}dae6DLgiCm<-&Q?l+=~DE!kuNTT7HYqEq>{=s-Zl; z3TyPq$cq+)*yEXThwhoV^DNHPmPl7v>VG6Ixzy=ogt(05n!xXg|9v}1d_ev3V{4RB zQ05TGjIjU9{$~j#P+-l%SsEr_$Mk==-6aP>a2^eSOGF338TUSBp)TWxU@WndBr=Y| zNG46jvB4N)gDG@zjC&`+VQMc6DVPG^VqpoP!2Tcpz*$(x&nVz8xQcFzW#>1HZ-OZd zZy8~%Z-`rg6y(;_TQ=Bse{|IT!XOwsV-OO-$Ob`-!ALkG1U*B-Q4kb@1p5_3ZUY=7 z%2v=OJ(&VdHiK5^H>oG2M{Cd)jzayC^l1HGryEa}7`7-H3A@EWp^zbHVIyD> zS`DDkEkIBm7)l)kovd3R2U6(B3w5$#U;uRN#&(W@P7IEACPENo9PC7A0zr1*U+IBf3Gi}Yuf_z&i>ejAb&JmR0*S9AW{!?HtP zC3*$UU*5l;)9C5f?f``LSJC$BV zvaw9)@c5l;mw3xEt3|n_@kQG$r?3@4JK}{EEBg?(Unf+fYt%*xYRV4k9`VS$q+t-f za*=p;%P9Ozi5ho8+pVUtcV(PW8zp68n%o)t$_2XgVlIG&7y4eeX-=k>Nq3#kV$G7U zI9{f^w4oIr1wQAUa7oKO0m5B+=SQqlG zcq`#3IaEFtGuvT)0g12 z!04DjntyRcK*KqKl=DX1<&`2ko$Yv^{p_jJXoNW@60XgDpE$zS`jb+PiFUjb+AtPK z;?*u}9oAVFA8YJf)fd?#?Rnp!vq5mN^>m4WPWJHoY}eTz)s~l8beM(@+F%q#713n0 z7SD_fqip@-z@$*5P}3e5zx_|uqsd(1HDCWc6RJ~xBQq=@^-8_z>uz3~=DFc_)SA3^_dub^8-ZEzClkC`X7;YY( zI_@x!0Ij@EM@R5QJnB~qCaW{;Sx@x8`-5C7U2>$P5%uhyi1e(rsx?X=-uzoF7eWu`+&jj6luG!6xgMMb$6_R#zeCsQhc$mYv$e}{#wnsH$fj6 z5NvjMED7dgDy?nV_B#=O^N%RwgeJTDVIFP|t$Mr&ls56~)1k|lDRNF~X&bAPl0}96 z@KElnysZbz`!X~j+y;GNjTXT@egs#Wh#!m)zaTHX?^9n^hQmuJKdNY^CfR?SvLsx} z;w&u_%q6kBJBY@98*MdWJp9hq|y&N#g9_4}DL z#D}AuR?(guCaaXHtxeWwG?rgTWB&98KZOoD4zS%yzd}fm8@6oS0T!t%!M|v8wyButs6+_#rTE zkAuWleOm|k zZ#14QkX_xH z!TrS)4M?~=ym2n@1y-z&lk@AFbg@5inorysipyQx?iD!>qw?JO$#!;XU}2pKUl`F? zZ*EF6%Tih6G-(UKM=AHbJ#c|u@@c5_jZ6WU8`DOkMIptYY4fDlYJHaN*;Wl|G-7u} z=qK~Y#g8Wot-R)#uSC*gB;wLll;hku`iD15*hxN(#kRiD46q;T#eXoL!iOeKJH2{2O%<;@h;L}; zujHcMMS&8nyE(>pFv)Rgr%!fqo^bn6FZiiECm>-_K&ANLgKkM-eZP7m9cG{a5Il6x z&#bhHlw0$PZoO)l>BeXot6sZPvE2;;reduA?2Jx&>%DG*r_I=p<kcAcm;a0JSh4$%Qs;OUE_=_&C;-#g;VEu+8c}adXE26|iV__=3Ziu~o@( z%22M04m9QRkiA}eORbUzA5tf#K3(O>Z#)_6uB<=`4gW4d{eco9Kvs~&_aX5>kgsm% ztr&Rz?a%DlLPiCr7xn8!$JI8Ad>HsoE+zZ>+_t2L08EAA1NeMzwxP)`4HeM?WZHx@D=$lj}dS<bE9r31B1DlE{dyt-tP|Z!1$&P_X#DH>_0M>k{n6N_ z>^#NcQhmyVK;_aph5t!$@zp={Q}mz@bW%BdA)_*|ORr;Pq-rV!&Ci^@54SR-^u56C ziL&<}EB}FSSNBxrtKxO%^yihMQ>e3vm6L?0Xl^}L?=fGS-|x@!u1c<$?ENWnHHFpETV)SvyBGTaFra z3fN@0hX1dcTX?U+e6<9`X>Zw31?3PF*2dd(RL8H>B7vzY^9QPfW-17ZxUhuAm5S9L zip|bCa7p>oo<~CEPlKyX&sXBdswnO+m$n@EzTZ-&4Mc(doB8SFGGYMJhvjH!9C!N| z>Zd6@DV~p>QkBbADwF;6jHi_T5G_Z*4OlRgNlv8Ox)FJV zS)t;(eA8>Y%D$Qs;ytJDk|I!Ruy^{p>&$P#7rAW(VeiXnBXQb4K1uo7A|Oa_H`LI4 z*`1ReifR=RdhI`4y%BJ;(PSbi^#JWc`+dkj(%{TVXJymQ$k@wJ9|!ihEhUf z4tWz=y&fm!B`Q-KD(H=$0&gQ^u7pNbsM*RyMU zeM;d&+n%BT-OgV@VxE0zI(-5guT|)+8QeDJ0Jr8(sW#&793fDmY9E(8r$(%R1Htr4 zn|l+1g{#-1{jhv(tUuMyhaI0%AID6jMcUqAqV*`r z^oYNFHeS`Iu$Qra`Uo})g>JcVaz!QOGsqso+(<{meV8#u1=e>A94jua6R>J!Wx`|T3J?~vXSq)=&f-0vc^ z^bmB*Wm#yf9J)i`C-e&zrQ34EcJw3!HL3p zpTpN)LhZ5mXzxpp&2tu?{_uG#MbkpI2$>g+^rd?RC|MgEmAqz>cf4O9+AG(Z8@*K) zLK5}ZZAq_h_DU5OWQT~42Erz$`l=@c-p$kIHo+i#D98gso0KW_f%k(3jb~dC*D>}&;m(=u5Jcjq=@{QxEGt+;*z9*uv zu@@?>5{5@?vD`4(0~cvB8;yLVK^E;{eA^-(<+YD=;Cm2)pd@?|{_RY4uhfLovF+xB z#MovioaL<8ec0F9&3Rzx%HbQIe79U=RVNs7Fw~Y{tn?}PYcj{p>h6&tKW6i^)Pu=lg`&Ib9 zxLnhga^*bR{t|8IP2Oz>+63<*hLf>xpyvq>!txR%LM-&4!C0eLh*wM∨%eG)3lH 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

~)lOI+KAdvA(a=9n}D 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 aCQF&pL%}vzU?1#@Ysfq0Dt=!I_Wl1~>^%km literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_128x128.png b/packages/desktop/build/icon.iconset/icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcaa5fb87bd8ba0296f2d475c2b3d1e96aba19e GIT binary patch literal 2980 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 A9smFU literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_128x128@2x.png b/packages/desktop/build/icon.iconset/icon_128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..22780f9b3368816cb2eae7a360fee7f8ecf10e02 GIT binary patch literal 7570 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 JGEJwb{{>p_cq#w@ literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_16x16.png b/packages/desktop/build/icon.iconset/icon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..867a7da8054ed6e770915499a5cae339536ee025 GIT binary patch literal 503 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 u4EQ(sxFu3w~!zxN+kZz{L| literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_256x256@2x.png b/packages/desktop/build/icon.iconset/icon_256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c86355cc157f7723b594c2888eeae35aac709bae GIT binary patch literal 17279 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ΚSGG8)L}OD3xDQ*z=L>=X>C_I5}_ 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_32x32.png b/packages/desktop/build/icon.iconset/icon_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..66749c48667ff6b99ab14e3e593a0e6a2dcef6de GIT binary patch literal 853 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ΚSGG8)L}OD3xDQ*z=L>=X>C_I5}_ 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icon.iconset/icon_512x512@2x.png b/packages/desktop/build/icon.iconset/icon_512x512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..78d658665319af4ece5df49d77b87b2a06307b29 GIT binary patch literal 47812 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/build/installer.nsh b/packages/desktop/build/installer.nsh new file mode 100644 index 000000000..3cceceeaf --- /dev/null +++ b/packages/desktop/build/installer.nsh @@ -0,0 +1,7 @@ +!macro customInit + ; Delete any previous uninstall registry key to ensure the installer doesn't hang at 30% + ; https://github.com/electron-userland/electron-builder/issues/4057#issuecomment-557570476 + ; https://github.com/electron-userland/electron-builder/issues/4092 + DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{${UNINSTALL_APP_KEY}}" + DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" +!macroend \ No newline at end of file diff --git a/packages/desktop/commitlint.config.js b/packages/desktop/commitlint.config.js new file mode 100644 index 000000000..84dcb122a --- /dev/null +++ b/packages/desktop/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], +}; diff --git a/packages/desktop/desktop.webpack.common.js b/packages/desktop/desktop.webpack.common.js new file mode 100644 index 000000000..c82348c43 --- /dev/null +++ b/packages/desktop/desktop.webpack.common.js @@ -0,0 +1,143 @@ +const env = process.env.NODE_ENV ?? 'production' +require('dotenv').config({ + path: `.env.${env}`, +}) + +const path = require('path') +const CopyPlugin = require('copy-webpack-plugin') +const webpack = require('webpack') +const { DefinePlugin } = require('webpack') +const TerserPlugin = require('terser-webpack-plugin') + +module.exports = function ({ onlyTranspileTypescript = false, experimentalFeatures = false, snap = false } = {}) { + const moduleConfig = { + rules: [ + { + test: /\.ts$/, + use: [ + 'babel-loader', + { + loader: 'ts-loader', + options: { + transpileOnly: onlyTranspileTypescript, + }, + }, + ], + }, + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + }, + { + sideEffects: true, + test: /\.(png|html)$/i, + loader: 'file-loader', + options: { + name: '[name].[ext]', + }, + }, + ], + } + + const resolve = { + extensions: ['.ts', '.js'], + alias: { + '@web': path.resolve(__dirname, '../web/src/javascripts'), + }, + } + + const EXPERIMENTAL_FEATURES = JSON.stringify(experimentalFeatures) + const IS_SNAP = JSON.stringify(snap ? true : false) + + const electronMainConfig = { + entry: { + index: './app/index.ts', + }, + output: { + path: path.resolve(__dirname, 'app', 'dist'), + filename: 'index.js', + }, + devtool: 'inline-cheap-source-map', + target: 'electron-main', + node: { + __dirname: false, + }, + resolve, + module: moduleConfig, + externals: { + keytar: 'commonjs keytar', + }, + optimization: { + minimizer: [ + new TerserPlugin({ + exclude: ['web', 'node_modules'], + }), + ], + }, + plugins: [ + new DefinePlugin({ + EXPERIMENTAL_FEATURES, + IS_SNAP, + }), + new CopyPlugin({ + patterns: [ + { + from: '../web/dist', + to: 'web', + }, + { + from: '../../node_modules/@standardnotes/components/dist/', + to: 'web/components', + }, + { + from: 'app/node_modules', + to: 'node_modules', + }, + { + from: 'app/stylesheets/renderer.css', + to: 'stylesheets/renderer.css', + }, + { + from: 'app/icon', + to: 'icon', + }, + ], + }), + ], + } + + const electronRendererConfig = { + entry: { + preload: './app/javascripts/Renderer/Preload.ts', + renderer: './app/javascripts/Renderer/Renderer.ts', + grantLinuxPasswordsAccess: './app/javascripts/Renderer/grantLinuxPasswordsAccess.js', + }, + output: { + path: path.resolve(__dirname, 'app', 'dist', 'javascripts', 'renderer'), + publicPath: '/', + }, + target: 'electron-renderer', + devtool: 'inline-cheap-source-map', + node: { + __dirname: false, + }, + resolve, + module: moduleConfig, + externals: { + electron: 'commonjs electron', + }, + plugins: [ + new webpack.DefinePlugin({ + DEFAULT_SYNC_SERVER: JSON.stringify(process.env.DEFAULT_SYNC_SERVER || 'https://api.standardnotes.com'), + PURCHASE_URL: JSON.stringify(process.env.PURCHASE_URL), + PLANS_URL: JSON.stringify(process.env.PLANS_URL), + DASHBOARD_URL: JSON.stringify(process.env.DASHBOARD_URL), + EXPERIMENTAL_FEATURES, + WEBSOCKET_URL: JSON.stringify(process.env.WEBSOCKET_URL), + ENABLE_UNFINISHED_FEATURES: JSON.stringify(process.env.ENABLE_UNFINISHED_FEATURES), + }), + ], + } + return [electronMainConfig, electronRendererConfig] +} diff --git a/packages/desktop/desktop.webpack.dev.js b/packages/desktop/desktop.webpack.dev.js new file mode 100644 index 000000000..62b781a05 --- /dev/null +++ b/packages/desktop/desktop.webpack.dev.js @@ -0,0 +1,14 @@ +const { merge } = require('webpack-merge'); +const common = require('./desktop.webpack.common.js'); + +module.exports = (env) => + common({ + ...env, + onlyTranspileTypescript: true, + experimentalFeatures: true, + }).map((config) => + merge(config, { + mode: 'development', + devtool: 'inline-cheap-source-map', + }) + ); diff --git a/packages/desktop/desktop.webpack.prod.js b/packages/desktop/desktop.webpack.prod.js new file mode 100644 index 000000000..5ad0c7ffc --- /dev/null +++ b/packages/desktop/desktop.webpack.prod.js @@ -0,0 +1,10 @@ +const { merge } = require('webpack-merge'); +const common = require('./desktop.webpack.common.js'); + +module.exports = (env) => + common(env).map((config) => + merge(config, { + mode: 'production', + devtool: 'source-map', + }) + ); diff --git a/packages/desktop/dev-app-update.yml b/packages/desktop/dev-app-update.yml new file mode 100644 index 000000000..5a78fec15 --- /dev/null +++ b/packages/desktop/dev-app-update.yml @@ -0,0 +1,4 @@ +owner: standardnotes +repo: app +provider: github +updaterCacheDirName: standard-notes-updater diff --git a/packages/desktop/linter.tsconfig.json b/packages/desktop/linter.tsconfig.json new file mode 100644 index 000000000..ab3d8c031 --- /dev/null +++ b/packages/desktop/linter.tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../node_modules/@standardnotes/config/src/linter.tsconfig.json" +} diff --git a/packages/desktop/package.json b/packages/desktop/package.json new file mode 100644 index 000000000..6986858f1 --- /dev/null +++ b/packages/desktop/package.json @@ -0,0 +1,161 @@ +{ + "name": "@standardnotes/desktop", + "main": "./app/dist/index.js", + "version": "3.20.2", + "license": "AGPL-3.0-or-later", + "repository": { + "type": "git", + "url": "git://github.com/standardnotes/app" + }, + "scripts": { + "build:remove-unpacked": "rimraf dist/{linux-*,mac,win-*}", + "build": "yarn run webpack --config desktop.webpack.prod.js", + "change-version": "node ../../scripts/desktop/change-version.mjs", + "clean:build": "rimraf app/dist/", + "clean:tests": "rimraf test/data/tmp/", + "clean": "npm-run-all --parallel clean:*", + "dev": "NODE_ENV=development webpack --config desktop.webpack.dev.js --watch", + "format": "prettier --write .", + "lint:eslint": "eslint app/index.ts app/application.ts app/javascripts/**/*.ts", + "lint:formatting": "prettier --check .", + "lint:types": "tsc --noEmit", + "lint": "npm-run-all --parallel lint:*", + "postinstall": "electron-builder install-app-deps", + "release": "node ../../scripts/desktop/build.mjs mainstream", + "release:mac": "node ../../scripts/desktop/build.mjs mac", + "setup": "yarn --ignore-engines && yarn --ignore-engines --cwd ./app", + "start": "electron ./app --enable-logging --icon _icon/icon.png", + "ava": "rimraf test/data/tmp && ava --serial" + }, + "dependencies": { + "axios": "^0.27.2", + "compare-versions": "^4.1.3", + "decrypt": "github:standardnotes/decrypt#master", + "electron-log": "^4.4.6", + "electron-updater": "^5.0.1", + "fs-extra": "^10.1.0", + "mime-types": "^2.1.35", + "mobx": "^6.5.0", + "@standardnotes/web": "^3.20.4", + "@electron/remote": "^2.0.8", + "electron": "17.4.2", + "lodash": "^4.17.21", + "dotenv": "^16.0.0" + }, + "devDependencies": { + "@babel/core": "^7.17.10", + "@babel/preset-env": "^7.17.10", + "@commitlint/config-conventional": "^16.2.4", + "@standardnotes/electron-clear-data": "1.1.1", + "@types/lodash": "^4.14.182", + "@types/mime-types": "^2.1.1", + "@types/node": "^17.0.31", + "@types/proxyquire": "^1.3.28", + "@types/yauzl": "^2.10.0", + "@typescript-eslint/eslint-plugin": "^5.22.0", + "@typescript-eslint/parser": "^5.22.0", + "ava": "^4.2.0", + "babel-eslint": "^10.1.0", + "babel-loader": "^8.2.5", + "commitlint": "^16.2.4", + "copy-webpack-plugin": "^10.2.4", + "electron-builder": "23.0.3", + "electron-notarize": "^1.2.1", + "eslint": "^8.14.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.0.0", + "file-loader": "^6.2.0", + "husky": "^7.0.4", + "mime-types": "^2.1.35", + "npm-run-all": "^4.1.5", + "pre-push": "^0.1.2", + "prettier": "^2.6.2", + "proxyquire": "^2.1.3", + "rimraf": "^3.0.2", + "terser-webpack-plugin": "^5.3.1", + "ts-loader": "^9.3.0", + "ts-node": "^10.7.0", + "typescript": "^4.6.4", + "webpack": "^5.72.0", + "webpack-cli": "^4.9.2", + "webpack-merge": "^5.8.0" + }, + "build": { + "electronVersion": "17.4.2", + "appId": "org.standardnotes.standardnotes", + "artifactName": "${name}-${version}-${os}-${arch}.${ext}", + "afterSign": "../../scripts/desktop/afterSignHook.js", + "files": [ + "compiled/**/*", + "dist/**/*", + "stylesheets/**/*", + "assets/**/*", + "icon/**/*" + ], + "protocols": [ + { + "name": "Standard Notes", + "schemes": [ + "standardnotes" + ] + } + ], + "mac": { + "category": "public.app-category.productivity", + "hardenedRuntime": true, + "entitlements": "./build/entitlements.mac.inherit.plist", + "entitlementsInherit": "./build/entitlements.mac.inherit.plist", + "target": [ + "dmg", + "zip" + ] + }, + "win": { + "certificateSubjectName": "Standard Notes Ltd.", + "publisherName": "Standard Notes Ltd.", + "signDlls": true + }, + "nsis": { + "deleteAppDataOnUninstall": true + }, + "linux": { + "category": "Office", + "icon": "build/icon/", + "desktop": { + "StartupWMClass": "standard notes" + }, + "target": [ + "AppImage" + ] + }, + "snap": { + "plugs": [ + "default", + "password-manager-service" + ] + } + }, + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, + "ava": { + "concurrency": 0, + "extensions": [ + "ts" + ], + "files": [ + "test/*.spec.ts" + ], + "require": [ + "ts-node/register/transpile-only" + ], + "verbose": true + }, + "pre-push": [ + "lint" + ] +} diff --git a/packages/desktop/test/TestIpcMessage.ts b/packages/desktop/test/TestIpcMessage.ts new file mode 100644 index 000000000..97883737c --- /dev/null +++ b/packages/desktop/test/TestIpcMessage.ts @@ -0,0 +1,52 @@ +export interface TestIPCMessage { + id: number + type: MessageType + args: any[] +} + +export interface TestIPCMessageResult { + id: number + resolve?: any + reject?: any +} + +export interface AppTestMessage { + type: AppMessageType +} + +export enum AppMessageType { + Ready, + WindowLoaded, + SavedBackup, + Log, +} + +export enum MessageType { + WindowCount, + StoreData, + StoreSettingsLocation, + StoreSet, + SetLocalStorageValue, + AppMenuItems, + SpellCheckerManager, + SpellCheckerLanguages, + ClickLanguage, + BackupsAreEnabled, + ToggleBackupsEnabled, + BackupsLocation, + PerformBackup, + ChangeBackupsLocation, + CopyDecryptScript, + MenuReloaded, + UpdateState, + CheckForUpdate, + UpdateManagerNotifiedStateChange, + Relaunch, + DataArchive, + GetJSON, + DownloadFile, + AutoUpdateEnabled, + HasReloadedMenu, + AppStateCall, + SignOut, +} diff --git a/packages/desktop/test/backupsManager.spec.ts b/packages/desktop/test/backupsManager.spec.ts new file mode 100644 index 000000000..6c51a0385 --- /dev/null +++ b/packages/desktop/test/backupsManager.spec.ts @@ -0,0 +1,123 @@ +import { promises as fs } from 'fs' +import path from 'path' + +import anyTest, { TestFn } from 'ava' +import { Driver, createDriver } from './driver' + +const test = anyTest as TestFn + +const BackupsDirectoryName = 'Standard Notes Backups' + +test.beforeEach(async (t) => { + t.context = await createDriver() + const backupsLocation = await t.context.backups.location() + await fs.rmdir(backupsLocation, { recursive: true }) + await t.context.backups.copyDecryptScript(backupsLocation) +}) + +test.afterEach.always(async (t) => { + await t.context.stop() +}) + +/** + * Depending on the current system load, performing a backup + * might take a while + */ +const timeoutDuration = 20 * 1000 /** 20s */ + +function wait(duration = 1000) { + return new Promise((resolve) => setTimeout(resolve, duration)) +} + +test('saves incoming data to the backups folder', async (t) => { + const data = 'Sample Data' + const fileName = await t.context.backups.save(data) + const backupsLocation = await t.context.backups.location() + const files = await fs.readdir(backupsLocation) + t.true(files.includes(fileName)) + t.is(data, await fs.readFile(path.join(backupsLocation, fileName), 'utf8')) +}) + +test('saves the decrypt script to the backups folder', async (t) => { + const backupsLocation = await t.context.backups.location() + await wait(300) /** Disk might be busy */ + const files = await fs.readdir(backupsLocation) + t.true(files.includes('decrypt.html')) +}) + +test('performs a backup', async (t) => { + t.timeout(timeoutDuration) + + await wait() + await t.context.backups.perform() + const backupsLocation = await t.context.backups.location() + const files = await fs.readdir(backupsLocation) + + t.true(files.length >= 1) +}) + +test('changes backups folder location', async (t) => { + t.timeout(timeoutDuration) + await wait() + await t.context.backups.perform() + let newLocation = path.join(t.context.userDataPath, 'newLocation') + await fs.mkdir(newLocation) + const currentLocation = await t.context.backups.location() + const fileNames = await fs.readdir(currentLocation) + await t.context.backups.changeLocation(newLocation) + newLocation = path.join(newLocation, BackupsDirectoryName) + t.deepEqual(fileNames, await fs.readdir(newLocation)) + + /** Assert that the setting was saved */ + const data = await t.context.storage.dataOnDisk() + t.is(data.backupsLocation, newLocation) + + /** Perform backup and make sure there is one more file in the directory */ + await t.context.backups.perform() + const newFileNames = await fs.readdir(newLocation) + t.deepEqual(newFileNames.length, fileNames.length + 1) +}) + +test('changes backups location to a child directory', async (t) => { + t.timeout(timeoutDuration) + + await wait() + await t.context.backups.perform() + const currentLocation = await t.context.backups.location() + const backups = await fs.readdir(currentLocation) + + t.is(backups.length, 2) /** 1 + decrypt script */ + + const newLocation = path.join(currentLocation, 'child_dir') + await t.context.backups.changeLocation(newLocation) + + t.deepEqual(await fs.readdir(path.join(newLocation, BackupsDirectoryName)), backups) +}) + +test('changing backups location to the same directory should not do anything', async (t) => { + t.timeout(timeoutDuration) + await wait() + await t.context.backups.perform() + await t.context.backups.perform() + const currentLocation = await t.context.backups.location() + let totalFiles = (await fs.readdir(currentLocation)).length + t.is(totalFiles, 3) /** 2 + decrypt script */ + await t.context.backups.changeLocation(currentLocation) + totalFiles = (await fs.readdir(currentLocation)).length + t.is(totalFiles, 3) +}) + +test('backups are enabled by default', async (t) => { + t.is(await t.context.backups.enabled(), true) +}) + +test('does not save a backup when they are disabled', async (t) => { + await t.context.backups.toggleEnabled() + await t.context.windowLoaded + /** Do not wait on this one as the backup shouldn't be triggered */ + t.context.backups.perform() + await wait() + const backupsLocation = await t.context.backups.location() + const files = await fs.readdir(backupsLocation) + t.deepEqual(files, ['decrypt.html']) +}) diff --git a/packages/desktop/test/data/zip-file.zip b/packages/desktop/test/data/zip-file.zip new file mode 100644 index 0000000000000000000000000000000000000000..4ee8bb28aaab89271336a587e9945439d001e3a8 GIT binary patch literal 303 zcmWIWW@Zs#U|`^22u|n<_!aakN*l;C24YbluF5RXP0P$l)h|d)&Q45E)ypc*&s+WM zX;46b*16zKK`Yn{8|U0P;v*2gQf2E77js=>_0aW87P)Y$M4mp)>cS8JHJyQBX-roD z&_Fm41G3 void + reject: (...args: any) => void + } | null> = [] + + private awaitedOnMessages: Array<{ + type: AppMessageType + resolve: (...args: any) => void + }> = [] + + appReady: Promise + windowLoaded: Promise + + constructor(readonly userDataPath: string) { + this.appProcess = spawnAppprocess(userDataPath) + this.appProcess.on('message', this.receive) + this.appReady = this.waitOn(AppMessageType.Ready) + this.windowLoaded = this.waitOn(AppMessageType.WindowLoaded) + } + + private receive = (message: TestIPCMessageResult | AppTestMessage) => { + if ('type' in message) { + if (message.type === AppMessageType.Log) { + console.log(message) + } + + this.awaitedOnMessages = this.awaitedOnMessages.filter(({ type, resolve }) => { + if (type === message.type) { + resolve() + return false + } + return true + }) + } + + if ('id' in message) { + const call = this.calls[message.id]! + this.calls[message.id] = null + if (message.reject) { + call.reject(message.reject) + } else { + call.resolve(message.resolve) + } + } + } + + private waitOn = (messageType: AppMessageType) => { + return new Promise((resolve) => { + this.awaitedOnMessages.push({ + type: messageType, + resolve, + }) + }) + } + + private send = (type: MessageType, ...args: any): Promise => { + const id = this.calls.length + const message: TestIPCMessage = { + id, + type, + args, + } + + this.appProcess.send(message) + + return new Promise((resolve, reject) => { + this.calls.push({ resolve, reject }) + }) + } + + windowCount = (): Promise => this.send(MessageType.WindowCount) + + appStateCall = (methodName: string, ...args: any): Promise => + this.send(MessageType.AppStateCall, methodName, ...args) + + readonly window = { + signOut: (): Promise => this.send(MessageType.SignOut), + } + + readonly storage = { + dataOnDisk: async (): Promise<{ [key in StoreKeys]: any }> => { + const location = await this.send(MessageType.StoreSettingsLocation) + return readJSONFile(location) + }, + dataLocation: (): Promise => this.send(MessageType.StoreSettingsLocation), + setZoomFactor: (factor: number) => this.send(MessageType.StoreSet, 'zoomFactor', factor), + setLocalStorageValue: (key: string, value: string): Promise => + this.send(MessageType.SetLocalStorageValue, key, value), + } + + readonly appMenu = { + items: (): Promise => this.send(MessageType.AppMenuItems), + clickLanguage: (language: Language) => this.send(MessageType.ClickLanguage, language), + hasReloaded: () => this.send(MessageType.HasReloadedMenu), + } + + readonly spellchecker = { + manager: () => this.send(MessageType.SpellCheckerManager), + languages: () => this.send(MessageType.SpellCheckerLanguages), + } + + readonly backups = { + enabled: (): Promise => this.send(MessageType.BackupsAreEnabled), + toggleEnabled: (): Promise => this.send(MessageType.ToggleBackupsEnabled), + location: (): Promise => this.send(MessageType.BackupsLocation), + copyDecryptScript: async (location: string) => { + await this.send(MessageType.CopyDecryptScript, location) + }, + changeLocation: (location: string) => this.send(MessageType.ChangeBackupsLocation, location), + save: (data: any) => this.send(MessageType.DataArchive, data), + perform: async () => { + await this.windowLoaded + await this.send(MessageType.PerformBackup) + await this.waitOn(AppMessageType.SavedBackup) + }, + } + + readonly updates = { + state: (): Promise => this.send(MessageType.UpdateState), + autoUpdateEnabled: (): Promise => this.send(MessageType.AutoUpdateEnabled), + check: () => this.send(MessageType.CheckForUpdate), + } + + readonly net = { + getJSON: (url: string) => this.send(MessageType.GetJSON, url), + downloadFile: (url: string, filePath: string) => this.send(MessageType.DownloadFile, url, filePath), + } + + stop = async () => { + this.appProcess.kill() + + /** Give the process a little time before cleaning up */ + await new Promise((resolve) => setTimeout(resolve, 150)) + + /** + * Windows can throw EPERM or EBUSY errors when we try to delete the + * user data directory too quickly. + */ + const maxTries = 5 + for (let i = 0; i < maxTries; i++) { + try { + await deleteDir(this.userDataPath) + return + } catch (error: any) { + if (error.code === 'EPERM' || error.code === 'EBUSY') { + await new Promise((resolve) => setTimeout(resolve, 300)) + } else { + throw error + } + } + } + throw new Error(`Couldn't delete user data directory after ${maxTries} tries`) + } + + restart = async () => { + this.appProcess.kill() + this.appProcess = spawnAppprocess(this.userDataPath) + this.appProcess.on('message', this.receive) + this.appReady = this.waitOn(AppMessageType.Ready) + this.windowLoaded = this.waitOn(AppMessageType.WindowLoaded) + await this.appReady + } +} + +export type { Driver } + +export async function createDriver() { + const userDataPath = path.join( + __dirname, + 'data', + 'tmp', + `userData-${Date.now()}-${Math.round(Math.random() * 10000)}`, + ) + await ensureDirectoryExists(userDataPath) + const driver = new Driver(userDataPath) + await driver.appReady + return driver +} diff --git a/packages/desktop/test/extServer.spec.ts b/packages/desktop/test/extServer.spec.ts new file mode 100644 index 000000000..9445fcb89 --- /dev/null +++ b/packages/desktop/test/extServer.spec.ts @@ -0,0 +1,130 @@ +import anyTest, { TestFn } from 'ava' +import { promises as fs } from 'fs' +import http from 'http' +import { AddressInfo } from 'net' +import path from 'path' +import proxyquire from 'proxyquire' +import { ensureDirectoryExists } from '../app/javascripts/Main/Utils/FileUtils' +import { initializeStrings } from '../app/javascripts/Main/strings' +import { createTmpDir } from './testUtils' +import makeFakePaths from './fakePaths' + +const test = anyTest as TestFn<{ + server: http.Server + host: string +}> + +const tmpDir = createTmpDir(__filename) +const FakePaths = makeFakePaths(tmpDir.path) + +let server: http.Server + +const { createExtensionsServer, normalizeFilePath } = proxyquire('../app/javascripts/Main/ExtensionsServer', { + './paths': { + Paths: FakePaths, + '@noCallThru': true, + }, + electron: { + app: { + getPath() { + return tmpDir.path + }, + }, + }, + http: { + createServer(...args: any) { + server = http.createServer(...args) + return server + }, + }, +}) + +const extensionsDir = path.join(tmpDir.path, 'Extensions') + +initializeStrings('en') + +const log = console.log +const error = console.error + +test.before(async (t) => { + /** Prevent the extensions server from outputting anything */ + // eslint-disable-next-line @typescript-eslint/no-empty-function + // console.log = () => {} + + // eslint-disable-next-line @typescript-eslint/no-empty-function + // console.error = () => {} + + await ensureDirectoryExists(extensionsDir) + await new Promise((resolve) => { + createExtensionsServer(resolve) + t.context.server = server + server.once('listening', () => { + const { address, port } = server.address() as AddressInfo + t.context.host = `http://${address}:${port}/` + resolve(null) + }) + }) +}) + +test.after((t): Promise => { + /** Restore the console's functionality */ + console.log = log + console.error = error + + return Promise.all([tmpDir.clean(), new Promise((resolve) => t.context.server.close(resolve))]) +}) + +test('serves the files in the Extensions directory over HTTP', (t) => { + const data = { + name: 'Boxes', + meter: { + 4: 4, + }, + syncopation: true, + instruments: ['Drums', 'Bass', 'Vocals', { name: 'Piano', type: 'Electric' }], + } + + return fs.writeFile(path.join(extensionsDir, 'file.json'), JSON.stringify(data)).then( + () => + new Promise((resolve) => { + let serverData = '' + http.get(t.context.host + 'Extensions/file.json').on('response', (response) => { + response + .setEncoding('utf-8') + .on('data', (chunk) => { + serverData += chunk + }) + .on('end', () => { + t.deepEqual(data, JSON.parse(serverData)) + resolve() + }) + }) + }), + ) +}) + +test('does not serve files outside the Extensions directory', async (t) => { + await new Promise((resolve) => { + http.get(t.context.host + 'Extensions/../../../package.json').on('response', (response) => { + t.is(response.statusCode, 500) + resolve(true) + }) + }) +}) + +test('returns a 404 for files that are not present', async (t) => { + await new Promise((resolve) => { + http.get(t.context.host + 'Extensions/nothing').on('response', (response) => { + t.is(response.statusCode, 404) + resolve(true) + }) + }) +}) + +test('normalizes file paths to always point somewhere in the Extensions directory', (t) => { + t.is(normalizeFilePath('/Extensions/test/yes', '127.0.0.1'), path.join(tmpDir.path, 'Extensions', 'test', 'yes')) + t.is( + normalizeFilePath('/Extensions/../../data/outside/the/extensions/directory'), + path.join(tmpDir.path, 'Extensions', 'data', 'outside', 'the', 'extensions', 'directory'), + ) +}) diff --git a/packages/desktop/test/fakePaths.ts b/packages/desktop/test/fakePaths.ts new file mode 100644 index 000000000..98e0159e9 --- /dev/null +++ b/packages/desktop/test/fakePaths.ts @@ -0,0 +1,29 @@ +import path from 'path' + +export default function makeFakePaths(tmpDir: string) { + const Paths = { + get userDataDir(): string { + return tmpDir + }, + get documentsDir(): string { + return tmpDir + }, + get tempDir(): string { + return tmpDir + }, + get extensionsDirRelative(): string { + return 'Extensions' + }, + get extensionsDir(): string { + return path.join(Paths.userDataDir, 'Extensions') + }, + get extensionsMappingJson(): string { + return path.join(Paths.extensionsDir, 'mapping.json') + }, + get windowPositionJson(): string { + return path.join(Paths.userDataDir, 'window-position.json') + }, + } + + return Paths +} diff --git a/packages/desktop/test/fileUtils.spec.ts b/packages/desktop/test/fileUtils.spec.ts new file mode 100644 index 000000000..a50f0d518 --- /dev/null +++ b/packages/desktop/test/fileUtils.spec.ts @@ -0,0 +1,111 @@ +import test, { TestFn } from 'ava' +import { promises as fs } from 'fs' +import path from 'path' +import { + deleteDir, + ensureDirectoryExists, + extractNestedZip, + FileDoesNotExist, + moveDirContents, + readJSONFile, + writeJSONFile, +} from '../app/javascripts/Main/Utils/FileUtils' + +const dataPath = path.join(__dirname, 'data') +const tmpPath = path.join(dataPath, 'tmp', path.basename(__filename)) +const zipFileDestination = path.join(tmpPath, 'zip-file-output') +const root = path.join(tmpPath, 'tmp1') + +test.beforeEach(async () => { + await ensureDirectoryExists(root) +}) + +test.afterEach(async () => { + await deleteDir(tmpPath) +}) + +test('extracts a zip and unnests the folders by one level', async (t) => { + await extractNestedZip(path.join(dataPath, 'zip-file.zip'), zipFileDestination) + t.deepEqual(await fs.readdir(zipFileDestination), ['package.json', 'test-file.txt']) +}) + +test('creates a directory even when parent directories are non-existent', async (t) => { + await ensureDirectoryExists(path.join(root, 'tmp2', 'tmp3')) + t.deepEqual(await fs.readdir(root), ['tmp2']) + t.deepEqual(await fs.readdir(path.join(root, 'tmp2')), ['tmp3']) +}) + +test('deletes a deeply-nesting directory', async (t) => { + await ensureDirectoryExists(path.join(root, 'tmp2', 'tmp3')) + await deleteDir(root) + try { + await fs.readdir(path.join(tmpPath, 'tmp1')) + t.fail('Should not have been able to read') + } catch (error: any) { + if (error.code === FileDoesNotExist) { + t.pass() + } else { + t.fail(error) + } + } +}) + +test('moves the contents of one directory to the other', async (t) => { + const fileNames = ['1.txt', '2.txt', '3.txt', 'nested/4.txt', 'nested/5.txt', 'nested/6.txt'] + + /** Create a temp directory and fill it with files */ + const dir = path.join(tmpPath, 'move_contents_src') + await ensureDirectoryExists(dir) + await ensureDirectoryExists(path.join(dir, 'nested')) + await Promise.all(fileNames.map((fileName) => fs.writeFile(path.join(dir, fileName), fileName))) + + /** Now move its contents */ + const dest = path.join(tmpPath, 'move_contents_dest') + await moveDirContents(dir, dest) + await Promise.all( + fileNames.map(async (fileName) => { + const contents = await fs.readFile(path.join(dest, fileName), 'utf8') + t.is(contents, fileName) + }), + ) +}) + +test('moves the contents of one directory to a child directory', async (t) => { + const srcFileNames = ['1.txt', '2.txt', '3.txt', 'nested/4.txt', 'nested/5.txt', 'nested/6.txt'] + const destFileNames = ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt'] + + /** Create a temp directory and fill it with files */ + const dir = path.join(tmpPath, 'move_contents_src') + await ensureDirectoryExists(dir) + await ensureDirectoryExists(path.join(dir, 'nested')) + await Promise.all(srcFileNames.map((fileName) => fs.writeFile(path.join(dir, fileName), fileName))) + + /** Now move its contents */ + const dest = path.join(dir, 'nested') + await moveDirContents(dir, dest) + + /** Ensure everything is there */ + t.deepEqual((await fs.readdir(dest)).sort(), destFileNames.sort()) + await Promise.all( + destFileNames.map(async (fileName, index) => { + const contents = await fs.readFile(path.join(dest, fileName), 'utf8') + t.is(contents, srcFileNames[index]) + }), + ) +}) + +test('serializes and deserializes an object to the same values', async (t) => { + const data = { + meter: { + 4: 4, + }, + chorus: { + passengers: 2, + destination: 'moon', + activities: [{ type: 'play', environment: 'stars' }], + }, + } + const filePath = path.join(tmpPath, 'data.json') + await writeJSONFile(filePath, data) + t.deepEqual(data, await readJSONFile(filePath)) +}) diff --git a/packages/desktop/test/menus.spec.ts b/packages/desktop/test/menus.spec.ts new file mode 100644 index 000000000..9c5084237 --- /dev/null +++ b/packages/desktop/test/menus.spec.ts @@ -0,0 +1,49 @@ +import anyTest, { TestFn } from 'ava' +import { MenuItem } from 'electron' +import { AppName } from '../app/javascripts/Main/strings' +import { createDriver, Driver } from './driver' + +const test = anyTest as TestFn<{ + driver: Driver + menuItems: MenuItem[] +}> + +test.before(async (t) => { + t.context.driver = await createDriver() +}) + +test.after.always(async (t) => { + await t.context.driver.stop() +}) + +test.beforeEach(async (t) => { + t.context.menuItems = await t.context.driver.appMenu.items() +}) + +function findSpellCheckerLanguagesMenu(menuItems: MenuItem[]) { + return menuItems.find((item) => { + if (item.role?.toLowerCase() === 'editmenu') { + return item?.submenu?.items?.find((item) => item.id === 'SpellcheckerLanguages') + } + }) +} +if (process.platform === 'darwin') { + test('shows the App menu on Mac', (t) => { + t.is(t.context.menuItems[0].role.toLowerCase(), 'appmenu') + t.is(t.context.menuItems[0].label, AppName) + }) + + test('hides the spellchecking submenu on Mac', (t) => { + t.falsy(findSpellCheckerLanguagesMenu(t.context.menuItems)) + }) +} else { + test('hides the App menu on Windows/Linux', (t) => { + t.is(t.context.menuItems[0].role.toLowerCase(), 'editmenu') + }) + + test('shows the spellchecking submenu on Windows/Linux', (t) => { + const menu = findSpellCheckerLanguagesMenu(t.context.menuItems) + t.truthy(menu) + t.true(menu!.submenu!.items!.length > 0) + }) +} diff --git a/packages/desktop/test/networking.spec.ts b/packages/desktop/test/networking.spec.ts new file mode 100644 index 000000000..ad7a6b44c --- /dev/null +++ b/packages/desktop/test/networking.spec.ts @@ -0,0 +1,58 @@ +import anyTest, { TestFn } from 'ava' +import { promises as fs } from 'fs' +import http from 'http' +import { AddressInfo } from 'net' +import path from 'path' +import { createDriver, Driver } from './driver' +import { createTmpDir } from './testUtils' + +const test = anyTest as TestFn + +const tmpDir = createTmpDir(__filename) + +const sampleData = { + title: 'Diamond Dove', + meter: { + 4: 4, + }, + instruments: ['Piano', 'Chiptune'], +} + +let server: http.Server +let serverAddress: string + +test.before( + (): Promise => + Promise.all([ + tmpDir.make(), + new Promise((resolve) => { + server = http.createServer((_req, res) => { + res.write(JSON.stringify(sampleData)) + res.end() + }) + server.listen(0, '127.0.0.1', () => { + const { address, port } = server.address() as AddressInfo + serverAddress = `http://${address}:${port}` + resolve(null) + }) + }), + ]), +) + +test.after((): Promise => Promise.all([tmpDir.clean(), new Promise((resolve) => server.close(resolve))])) + +test.beforeEach(async (t) => { + t.context = await createDriver() +}) +test.afterEach((t) => t.context.stop()) + +test('downloads a JSON file', async (t) => { + t.deepEqual(await t.context.net.getJSON(serverAddress), sampleData) +}) + +test('downloads a folder to the specified location', async (t) => { + const filePath = path.join(tmpDir.path, 'fileName.json') + await t.context.net.downloadFile(serverAddress + '/file', filePath) + const fileContents = await fs.readFile(filePath, 'utf8') + t.is(JSON.stringify(sampleData), fileContents) +}) diff --git a/packages/desktop/test/packageManager.spec.ts b/packages/desktop/test/packageManager.spec.ts new file mode 100644 index 000000000..deae40080 --- /dev/null +++ b/packages/desktop/test/packageManager.spec.ts @@ -0,0 +1,158 @@ +import test from 'ava' +import { promises as fs } from 'fs' +import path from 'path' +import proxyquire from 'proxyquire' +import { ensureDirectoryExists, readJSONFile } from '../app/javascripts/Main/Utils/FileUtils' +import { createTmpDir } from './testUtils' +import { AppName } from '../app/javascripts/Main/strings' +import makeFakePaths from './fakePaths' +import { PackageManagerInterface } from '../app/javascripts/Main/Packages/PackageManagerInterface' + +const tmpDir = createTmpDir(__filename) +const FakePaths = makeFakePaths(tmpDir.path) + +const contentDir = path.join(tmpDir.path, 'Extensions') +let downloadFileCallCount = 0 + +const { initializePackageManager } = proxyquire('../app/javascripts/Main/Packages/PackageManager', { + './paths': { + Paths: FakePaths, + '@noCallThru': true, + }, + './networking': { + /** Download a fake component file */ + async downloadFile(_src: string, dest: string) { + downloadFileCallCount += 1 + if (!path.normalize(dest).startsWith(tmpDir.path)) { + throw new Error(`Bad download destination: ${dest}`) + } + await ensureDirectoryExists(path.dirname(dest)) + await fs.copyFile(path.join(__dirname, 'data', 'zip-file.zip'), path.join(dest)) + }, + }, +}) + +const fakeWebContents = { + send(_eventName: string, { error }) { + if (error) throw error + }, +} + +const name = 'Fake Component' +const identifier = 'fake.component' +const uuid = 'fake-component' +const version = '1.0.0' +const modifiers = Array(20) + .fill(0) + .map((_, i) => String(i).padStart(2, '0')) + +function fakeComponent({ deleted = false, modifier = '' } = {}) { + return { + uuid: uuid + modifier, + deleted, + content: { + name: name + modifier, + autoupdateDisabled: false, + package_info: { + version, + identifier: identifier + modifier, + download_url: 'https://standardnotes.com', + url: 'https://standardnotes.com', + latest_url: 'https://standardnotes.com', + }, + }, + } +} + +let packageManager: PackageManagerInterface + +const log = console.log +const error = console.error + +test.before(async function () { + /** Silence the package manager's output. */ + // eslint-disable-next-line @typescript-eslint/no-empty-function + console.log = () => {} + // eslint-disable-next-line @typescript-eslint/no-empty-function + console.error = () => {} + await ensureDirectoryExists(contentDir) + packageManager = await initializePackageManager(fakeWebContents) +}) + +test.after.always(async function () { + console.log = log + console.error = error + await tmpDir.clean() +}) + +test.beforeEach(function () { + downloadFileCallCount = 0 +}) + +test('installs multiple components', async (t) => { + await packageManager.syncComponents(modifiers.map((modifier) => fakeComponent({ modifier }))) + await new Promise((resolve) => setTimeout(resolve, 200)) + + const files = await fs.readdir(contentDir) + t.is(files.length, 1 + modifiers.length) + for (const modifier of modifiers) { + t.true(files.includes(identifier + modifier)) + } + t.true(files.includes('mapping.json')) + const mappingContents = await fs.readFile(path.join(contentDir, 'mapping.json'), 'utf8') + + t.deepEqual( + JSON.parse(mappingContents), + modifiers.reduce((acc, modifier) => { + acc[uuid + modifier] = { + location: path.join('Extensions', identifier + modifier), + version, + } + return acc + }, {}), + ) + + const downloads = await fs.readdir(path.join(tmpDir.path, AppName, 'downloads')) + t.is(downloads.length, modifiers.length) + for (const modifier of modifiers) { + t.true(downloads.includes(`${name + modifier}.zip`)) + } + + for (const modifier of modifiers) { + const componentFiles = await fs.readdir(path.join(contentDir, identifier + modifier)) + t.is(componentFiles.length, 2) + } +}) + +test('uninstalls multiple components', async (t) => { + await packageManager.syncComponents(modifiers.map((modifier) => fakeComponent({ deleted: true, modifier }))) + await new Promise((resolve) => setTimeout(resolve, 200)) + + const files = await fs.readdir(contentDir) + t.deepEqual(files, ['mapping.json']) + + t.deepEqual(await readJSONFile(path.join(contentDir, 'mapping.json')), {}) +}) + +test("doesn't download anything when two install/uninstall tasks are queued", async (t) => { + await Promise.all([ + packageManager.syncComponents([fakeComponent({ deleted: false })]), + packageManager.syncComponents([fakeComponent({ deleted: false })]), + packageManager.syncComponents([fakeComponent({ deleted: true })]), + ]) + t.is(downloadFileCallCount, 1) +}) + +test("Relies on download_url's version field to store the version number", async (t) => { + await packageManager.syncComponents([fakeComponent()]) + await new Promise((resolve) => setTimeout(resolve, 200)) + + const mappingFileVersion = JSON.parse(await fs.readFile(path.join(contentDir, 'mapping.json'), 'utf8'))[uuid].version + + const packageJsonVersion = JSON.parse( + await fs.readFile(path.join(contentDir, identifier, 'package.json'), 'utf-8'), + ).version + + t.not(mappingFileVersion, packageJsonVersion) + t.is(mappingFileVersion, version) +}) diff --git a/packages/desktop/test/spellcheckerManager.spec.ts b/packages/desktop/test/spellcheckerManager.spec.ts new file mode 100644 index 000000000..2038dd1a7 --- /dev/null +++ b/packages/desktop/test/spellcheckerManager.spec.ts @@ -0,0 +1,38 @@ +import anyTest, { TestFn } from 'ava' +import { Driver, createDriver } from './driver' + +const StoreKeys = { + SelectedSpellCheckerLanguageCodes: 'selectedSpellCheckerLanguageCodes', +} + +const test = anyTest as TestFn + +test.before(async (t) => { + t.context = await createDriver() +}) + +test.after.always(async (t) => { + await t.context.stop() +}) + +if (process.platform === 'darwin') { + test('does not create a manager on Mac', async (t) => { + t.falsy(await t.context.spellchecker.manager()) + }) +} else { + const language = 'cs' + + test("adds a clicked language menu item to the store and session's languages", async (t) => { + await t.context.appMenu.clickLanguage(language as any) + const data = await t.context.storage.dataOnDisk() + t.true(data[StoreKeys.SelectedSpellCheckerLanguageCodes].includes(language)) + t.true((await t.context.spellchecker.languages()).includes(language)) + }) + + test("removes a clicked language menu item to the store's and session's languages", async (t) => { + await t.context.appMenu.clickLanguage(language as any) + const data = await t.context.storage.dataOnDisk() + t.false(data[StoreKeys.SelectedSpellCheckerLanguageCodes].includes(language)) + t.false((await t.context.spellchecker.languages()).includes(language)) + }) +} diff --git a/packages/desktop/test/storage.spec.ts b/packages/desktop/test/storage.spec.ts new file mode 100644 index 000000000..7c1f20342 --- /dev/null +++ b/packages/desktop/test/storage.spec.ts @@ -0,0 +1,130 @@ +import anyTest, { TestFn, ExecutionContext } from 'ava' +import fs from 'fs' +import path from 'path' +import proxyquire from 'proxyquire' +import { timeout } from '../app/javascripts/Main/Utils/Utils' +import { createDriver, Driver } from './driver' + +const { serializeStoreData } = proxyquire('../app/javascripts/Main/Store', { + './backupsManager': { + '@noCallThru': true, + }, + '@electron': { + '@noCallThru': true, + }, + '@electron/remote': { + '@noCallThru': true, + }, +}) + +async function validateData(t: ExecutionContext) { + const data = await t.context.storage.dataOnDisk() + + /** + * There should always be 8 values in the store. + * If one was added/removed intentionally, update this number + */ + const numberOfStoreKeys = 10 + t.is(Object.keys(data).length, numberOfStoreKeys) + + t.is(typeof data.isMenuBarVisible, 'boolean') + + t.is(typeof data.useSystemMenuBar, 'boolean') + + t.is(typeof data.backupsDisabled, 'boolean') + + t.is(typeof data.minimizeToTray, 'boolean') + + t.is(typeof data.enableAutoUpdates, 'boolean') + + t.is(typeof data.zoomFactor, 'number') + t.true(data.zoomFactor > 0) + + t.is(typeof data.extServerHost, 'string') + /** Must not throw */ + const extServerHost = new URL(data.extServerHost) + t.is(extServerHost.hostname, '127.0.0.1') + t.is(extServerHost.protocol, 'http:') + t.is(extServerHost.port, '45653') + + t.is(typeof data.backupsLocation, 'string') + + t.is(data.useNativeKeychain, null) + + if (process.platform === 'darwin') { + t.is(data.selectedSpellCheckerLanguageCodes, null) + } else { + t.true(Array.isArray(data.selectedSpellCheckerLanguageCodes)) + for (const language of data.selectedSpellCheckerLanguageCodes) { + t.is(typeof language, 'string') + } + } +} + +const test = anyTest as TestFn + +test.beforeEach(async (t) => { + t.context = await createDriver() +}) +test.afterEach.always((t) => { + return t.context.stop() +}) + +test('has valid data', async (t) => { + await validateData(t) +}) + +test('recreates a missing data file', async (t) => { + const location = await t.context.storage.dataLocation() + /** Delete the store's backing file */ + await fs.promises.unlink(location) + await t.context.restart() + await validateData(t) +}) + +test('recovers from corrupted data', async (t) => { + const location = await t.context.storage.dataLocation() + /** Write bad data in the store's file */ + await fs.promises.writeFile(location, '\uFFFF'.repeat(300)) + await t.context.restart() + await validateData(t) +}) + +test('persists changes to disk after setting a value', async (t) => { + const factor = 4.8 + await t.context.storage.setZoomFactor(factor) + const diskData = await t.context.storage.dataOnDisk() + t.is(diskData.zoomFactor, factor) +}) + +test('serializes string sets to an array', (t) => { + t.deepEqual( + serializeStoreData({ + set: new Set(['value']), + } as any), + JSON.stringify({ + set: ['value'], + }), + ) +}) + +test('deletes local storage data after signing out', async (t) => { + function readLocalStorageContents() { + return fs.promises.readFile(path.join(t.context.userDataPath, 'Local Storage', 'leveldb', '000003.log'), { + encoding: 'utf8', + }) + } + await t.context.windowLoaded + await t.context.storage.setLocalStorageValue('foo', 'bar') + let localStorageContents = await readLocalStorageContents() + + t.is(localStorageContents.includes('foo'), true) + t.is(localStorageContents.includes('bar'), true) + + await timeout(1_000) + await t.context.window.signOut() + await timeout(1_000) + localStorageContents = await readLocalStorageContents() + t.is(localStorageContents.includes('foo'), false) + t.is(localStorageContents.includes('bar'), false) +}) diff --git a/packages/desktop/test/testUtils.ts b/packages/desktop/test/testUtils.ts new file mode 100644 index 000000000..3421a9184 --- /dev/null +++ b/packages/desktop/test/testUtils.ts @@ -0,0 +1,21 @@ +import path from 'path' +import { deleteDir, ensureDirectoryExists } from '../app/javascripts/Main/Utils/FileUtils' + +export function createTmpDir(name: string): { + path: string + make(): Promise + clean(): Promise +} { + const tmpDirPath = path.join(__dirname, 'data', 'tmp', path.basename(name)) + + return { + path: tmpDirPath, + async make() { + await ensureDirectoryExists(tmpDirPath) + return tmpDirPath + }, + async clean() { + await deleteDir(tmpDirPath) + }, + } +} diff --git a/packages/desktop/test/updates.spec.ts b/packages/desktop/test/updates.spec.ts new file mode 100644 index 000000000..3d9f52729 --- /dev/null +++ b/packages/desktop/test/updates.spec.ts @@ -0,0 +1,21 @@ +import anyTest, { TestFn } from 'ava' +import { createDriver, Driver } from './driver' + +const test = anyTest as TestFn + +test.beforeEach(async (t) => { + t.context = await createDriver() +}) + +test.afterEach.always(async (t) => { + await t.context.stop() +}) + +test('has auto-updates enabled by default', async (t) => { + t.true(await t.context.updates.autoUpdateEnabled()) +}) + +test('reloads the menu after checking for an update', async (t) => { + await t.context.updates.check() + t.true(await t.context.appMenu.hasReloaded()) +}) diff --git a/packages/desktop/test/utils.spec.ts b/packages/desktop/test/utils.spec.ts new file mode 100644 index 000000000..afdc1e61a --- /dev/null +++ b/packages/desktop/test/utils.spec.ts @@ -0,0 +1,14 @@ +import test from 'ava' +import { lowercaseDriveLetter } from '../app/javascripts/Main/Utils/Utils' + +test("lowerCaseDriverLetter converts the drive letter of a given file's path to lower case", (t) => { + t.is(lowercaseDriveLetter('/C:/Lansing'), '/c:/Lansing') + t.is(lowercaseDriveLetter('/c:/Bone Rage'), '/c:/Bone Rage') + t.is(lowercaseDriveLetter('/C:/Give/Us/the/Gold'), '/c:/Give/Us/the/Gold') +}) + +test('lowerCaseDriverLetter only changes a single drive letter', (t) => { + t.is(lowercaseDriveLetter('C:/Hold Me In'), 'C:/Hold Me In') + t.is(lowercaseDriveLetter('/Cd:/Egg Replacer'), '/Cd:/Egg Replacer') + t.is(lowercaseDriveLetter('/C:radle of Rocks'), '/C:radle of Rocks') +}) diff --git a/packages/desktop/test/window.spec.ts b/packages/desktop/test/window.spec.ts new file mode 100644 index 000000000..3f63e1649 --- /dev/null +++ b/packages/desktop/test/window.spec.ts @@ -0,0 +1,16 @@ +import anyTest, { TestFn } from 'ava' +import { createDriver, Driver } from './driver' + +const test = anyTest as TestFn + +test.before(async (t) => { + t.context = await createDriver() +}) + +test.after.always((t) => { + return t.context.stop() +}) + +test('Only has one window', async (t) => { + t.is(await t.context.windowCount(), 1) +}) diff --git a/packages/desktop/tsconfig.json b/packages/desktop/tsconfig.json new file mode 100644 index 000000000..651578325 --- /dev/null +++ b/packages/desktop/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2019", + "moduleResolution": "node", + "types": ["node"], + "allowJs": true, + "noEmit": false, + "sourceMap": true, + "skipLibCheck": true, + "strict": true, + "esModuleInterop": true, + "typeRoots": ["./app/@types", "./node_modules/@types"], + "baseUrl": ".", + "paths": { + "@web/*": ["../web/src/javascripts/*"] + } + }, + "include": ["app/**/*"], + "exclude": ["node_modules", "app/dist"], + "files": ["app/index.ts", "app/javascripts/Renderer/Renderer.ts"] +} diff --git a/packages/desktop/yarn.lock b/packages/desktop/yarn.lock new file mode 100644 index 000000000..74c668894 --- /dev/null +++ b/packages/desktop/yarn.lock @@ -0,0 +1,7412 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/code-frame@^7.14.5": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" + integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== + +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.12.13": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== + dependencies: + "@babel/types" "^7.12.13" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.15.4": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + +"@babel/generator@^7.17.3": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" + integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.16.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" + integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz" + integrity sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@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.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + +"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5": + 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-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@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-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@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-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" + +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.13", "@babel/parser@^7.7.0": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + +"@babel/parser@^7.15.4": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.3": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240" + integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ== + +"@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@babel/parser@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" + integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.17.6": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.6" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== + dependencies: + "@babel/compat-data" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.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.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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.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.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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + 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.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" + integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" + integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== + dependencies: + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" + integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.0" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" + integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== + dependencies: + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.17.10" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.8.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz" + integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.13.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" + integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.9" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.9" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.7.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.12.13", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.15.4", "@babel/types@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.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.15.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@commitlint/cli@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-16.2.4.tgz#f22707918d08c27a19779798788a7c793f1d38e6" + integrity sha512-rbvqvz9JI+uiKxV2nH65BtSU01fsADd3bxe9fWtO3rM0c+CI/H9FfzKkDLvSRmXjvk1G2/wXlCGeqO9IBT4X9g== + dependencies: + "@commitlint/format" "^16.2.1" + "@commitlint/lint" "^16.2.4" + "@commitlint/load" "^16.2.4" + "@commitlint/read" "^16.2.1" + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz#56647108c89ed06fc5271242787550331988c0fb" + integrity sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA== + dependencies: + conventional-changelog-conventionalcommits "^4.3.1" + +"@commitlint/config-validator@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d" + integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw== + dependencies: + "@commitlint/types" "^16.2.1" + ajv "^6.12.6" + +"@commitlint/ensure@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-16.2.1.tgz#0fc538173f95c1eb2694eeedb79cab478347f16f" + integrity sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A== + dependencies: + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + +"@commitlint/execute-rule@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8" + integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g== + +"@commitlint/format@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-16.2.1.tgz#6e673f710c799be78e68b2682323e04f75080d07" + integrity sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q== + dependencies: + "@commitlint/types" "^16.2.1" + chalk "^4.0.0" + +"@commitlint/is-ignored@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz#369e40a240ad5451bf2b57a80829253129d7f19b" + integrity sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ== + dependencies: + "@commitlint/types" "^16.2.1" + semver "7.3.7" + +"@commitlint/lint@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-16.2.4.tgz#575f5a9d227dddfca8386253d9aff27be5b94788" + integrity sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ== + dependencies: + "@commitlint/is-ignored" "^16.2.4" + "@commitlint/parse" "^16.2.1" + "@commitlint/rules" "^16.2.4" + "@commitlint/types" "^16.2.1" + +"@commitlint/load@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-16.2.4.tgz#32c9f4c6538b21cf48cf40266312bb1adb65f435" + integrity sha512-HjANm3/29ROV+zt4yfaY/K6gpr9Dbzgtlp0kSwZGW0poDXlD/yqVYgPQ6JolJzZii5FUz5R4yVLC15hVL/w60w== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/execute-rule" "^16.2.1" + "@commitlint/resolve-extends" "^16.2.1" + "@commitlint/types" "^16.2.1" + "@types/node" ">=12" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "^1.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + typescript "^4.4.3" + +"@commitlint/message@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-16.2.1.tgz#bc6a0fa446a746ac2ca78cf372e4cec48daf620d" + integrity sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw== + +"@commitlint/parse@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-16.2.1.tgz#50b359cb711ec566d2ee236a8e4c6baca07b77c0" + integrity sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g== + dependencies: + "@commitlint/types" "^16.2.1" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.2.2" + +"@commitlint/read@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-16.2.1.tgz#e0539205d77cdb6879b560f95e5fb251e0c6f562" + integrity sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw== + dependencies: + "@commitlint/top-level" "^16.2.1" + "@commitlint/types" "^16.2.1" + fs-extra "^10.0.0" + git-raw-commits "^2.0.0" + +"@commitlint/resolve-extends@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360" + integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/types" "^16.2.1" + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-16.2.4.tgz#c2fbbf20d9d0e8fcf25690c88a27750d4a3e867b" + integrity sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg== + dependencies: + "@commitlint/ensure" "^16.2.1" + "@commitlint/message" "^16.2.1" + "@commitlint/to-lines" "^16.2.1" + "@commitlint/types" "^16.2.1" + execa "^5.0.0" + +"@commitlint/to-lines@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-16.2.1.tgz#42d000f34dc0406f514991e86237fdab5e8affd0" + integrity sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ== + +"@commitlint/top-level@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-16.2.1.tgz#bdaa53ab3d8970e0288879f1a342a8c2dfe01583" + integrity sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd" + integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA== + dependencies: + chalk "^4.0.0" + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + +"@electron/get@^1.13.0": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/remote@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3" + integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw== + +"@electron/universal@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.0.tgz#518cac72bccd79c00bf41345119e6fdbabdb871d" + integrity sha512-eu20BwNsrMPKoe2bZ3/l9c78LclDvxg3PlVXrQf3L50NaUuW5M59gbPytI+V4z7/QMrohUHetQaU0ou+p1UG9Q== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@eslint/eslintrc@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae" + integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@standardnotes/auth@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-2.3.0.tgz#b8ef5d896619ba4eebcaa8bbe829649038fd505e" + integrity sha512-D1tlxQFXZ4kW8X90YcOmAiozYZb2IJtJa6tPnbu+vXOFvipbW2z2grN2zcYEdUpW6m819+/yczzICEd63xYAAQ== + +"@standardnotes/electron-clear-data@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@standardnotes/electron-clear-data/-/electron-clear-data-1.1.1.tgz#45eab118ed5d1ee9369b540d7e62a9ca96778335" + integrity sha512-R0YivtSwSQpNt5nPOi7YRTGlk6kpcz6/2/sAQZf6ZCU8vIGm1cBMo++6kkGQcDEumkwbmagxmLWinL9d1W5g3Q== + +"@standardnotes/sncrypto-common@^1.2.9", "@standardnotes/sncrypto-common@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.3.0.tgz#ba0a66a634c7aa21ab9cf34548b249a96533a584" + integrity sha512-cdcusXk4VGbvLirTrd91BSPO7C5zOZNaEoHLWUS2EJpxU21aY1E7nfEbJ3B2DdBRdVwYMfn6YuRXk1fS5V44Gg== + +"@standardnotes/sncrypto-web@^1.2.9": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.3.0.tgz#b7ffbf5face58871fde1110e9149fc37b31f59ab" + integrity sha512-lhV3llM/GZVeu8nri/Z9V50QsDkcswOD5aqb63RoeQKN+blkNuobumitMNx7cJnhGWwmQuWGmRpVvqmAGqK2Ew== + dependencies: + "@standardnotes/sncrypto-common" "^1.3.0" + libsodium-wrappers "^0.7.8" + +"@standardnotes/snjs@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.3.0.tgz#52f6b5458e348e77642f922dd4302ad8c6d28914" + integrity sha512-4xlLcVKJznhqCTKWy4IhYPbnxc3k66fzBeTdWJqZZ/n0vOT2l1/ybCRrPP0os/7NFCtK3CqInApbzZP6xXUhuA== + dependencies: + "@standardnotes/auth" "^2.0.0" + "@standardnotes/sncrypto-common" "^1.2.9" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.2.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" + integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@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" "*" + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + 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" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/lodash@^4.14.182": + version "4.14.182" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + +"@types/mime-types@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.1.tgz#d9ba43490fa3a3df958759adf69396c3532cf2c1" + integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== + +"@types/minimatch@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "14.14.28" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.28.tgz#cade4b64f8438f588951a6b35843ce536853f25b" + integrity sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g== + +"@types/node@>=12": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.22.tgz#38b6c4b9b2f3ed9f2e376cce42a298fb2375251e" + integrity sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw== + +"@types/node@^14.6.2": + version "14.18.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.16.tgz#878f670ba3f00482bf859b6550b6010610fc54b5" + integrity sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q== + +"@types/node@^17.0.31": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/proxyquire@^1.3.28": + version "1.3.28" + resolved "https://registry.yarnpkg.com/@types/proxyquire/-/proxyquire-1.3.28.tgz" + integrity sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q== + +"@types/semver@^7.3.6": + version "7.3.9" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + +"@types/verror@^1.10.3": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.4.tgz#805c0612b3a0c124cf99f517364142946b74ba3b" + integrity sha512-OjJdqx6QlbyZw9LShPwRW+Kmiegeg3eWNI41MQQKaG3vjdU2L9SRElntM51HmHBY1cu7izxQJ1lMYioQh3XMBg== + +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + +"@types/yargs@^17.0.1": + version "17.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.4.tgz#d7ad5c311aaca3d7daebba169e1ecf35be97ceee" + integrity sha512-D/wihO9WFYqwsmJI0e0qS+U09wIQtYRSBJlXWjTFGjouEuOCy0BU4N/ZK5utb00S5lW/9LO7vOpvGDd8M06NvQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a" + integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/type-utils" "5.22.0" + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178" + integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24" + integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + +"@typescript-eslint/type-utils@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19" + integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA== + dependencies: + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0" + integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw== + +"@typescript-eslint/typescript-estree@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97" + integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8" + integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c" + integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg== + dependencies: + "@typescript-eslint/types" "5.22.0" + eslint-visitor-keys "^3.0.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +aggregate-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.0.tgz#83dbdb53a0d500721281d22e19eee9bc352a89cd" + integrity sha512-8DGp7zUt1E9k0NE2q4jlXHk+V3ORErmwolEdRz9iV+LKJ40WhMHh92cxAvhqV2I+zEn/gotIoqoMs0NjF3xofg== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz" + 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" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +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-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + +anymatch@~3.1.2: + 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@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.0.3.tgz#44c90237abdc4ad9b34a24658bee022828ad6205" + integrity sha512-1qrtXYHXJfXhzJnMtVGjIva3067F1qYQubl2oBjI61gCBoCHvhghdYJ57XxXTQQ0VxnUhg1/Iaez87uXp8mD8w== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.0" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chromium-pickle-js "^0.2.0" + debug "^4.3.2" + ejs "^3.1.6" + electron-osx-sign "^0.6.0" + electron-publish "23.0.2" + form-data "^4.0.0" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" + is-ci "^3.0.0" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.0.4" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.5" + temp-file "^3.4.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +array.prototype.flat@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +arrgv@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz" + integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== + +asar@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +ava@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-4.2.0.tgz#50c954cb32fd433b01d1e8245ea2f5cfb6e4412d" + integrity sha512-96N/rH2ZlBjoh18CsjH3zfo/rzukkRoqNK7R/Z3MLRrqu6cRRf+i4Zwna7ZRYEIl55yF1BKh/nSPCZWqoXfPJA== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + ansi-styles "^6.1.0" + arrgv "^1.0.2" + arrify "^3.0.0" + callsites "^4.0.0" + cbor "^8.1.0" + chalk "^5.0.0" + chokidar "^3.5.3" + chunkd "^2.0.1" + ci-info "^3.3.0" + ci-parallel-vars "^1.0.1" + clean-yaml-object "^0.1.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" + common-path-prefix "^3.0.0" + concordance "^5.0.4" + currently-unhandled "^0.4.1" + debug "^4.3.3" + del "^6.0.0" + emittery "^0.10.1" + figures "^4.0.0" + globby "^13.1.1" + ignore-by-default "^2.0.0" + indent-string "^5.0.0" + is-error "^2.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + matcher "^5.0.0" + mem "^9.0.2" + ms "^2.1.3" + p-event "^5.0.1" + p-map "^5.3.0" + picomatch "^2.3.1" + pkg-conf "^4.0.0" + plur "^5.1.0" + pretty-ms "^7.0.1" + resolve-cwd "^3.0.0" + slash "^3.0.0" + stack-utils "^2.0.5" + strip-ansi "^7.0.1" + supertap "^3.0.1" + temp-dir "^2.0.0" + write-file-atomic "^4.0.1" + yargs "^17.3.1" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-loader@^8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +blueimp-md5@^2.10.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.18.0.tgz" + integrity sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q== + +boolean@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz" + integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== + +boxen@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.0.tgz" + integrity sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.0" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +browserslist@^4.16.6: + version "4.17.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" + integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== + dependencies: + caniuse-lite "^1.0.30001265" + electron-to-chromium "^1.3.867" + escalade "^3.1.1" + node-releases "^2.0.0" + picocolors "^1.0.0" + +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.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +browserslist@^4.19.1: + version "4.20.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" + integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== + dependencies: + caniuse-lite "^1.0.30001317" + electron-to-chromium "^1.4.84" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + +browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz#3a40ba7382712ccdb24471567f91d7c167e00830" + integrity sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.0.2.tgz#da84a971076397e3a671726f4bb96f0c2214fea7" + integrity sha512-HaNHL3axNW/Ms8O1mDx3I07G+ZnZ/TKSWWvorOAPau128cdt9S+lNx5ocbx8deSaHHX4WFXSZVHh3mxlaKJNgg== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.2" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +callsites@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.0.0.tgz#8014cea4fedfe681a30e2f7d2d557dd95808a92a" + integrity sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001181: + version "1.0.30001187" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz" + integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== + +caniuse-lite@^1.0.30001265: + version "1.0.30001271" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz#0dda0c9bcae2cf5407cd34cac304186616cc83e8" + integrity sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA== + +caniuse-lite@^1.0.30001280: + version "1.0.30001286" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" + integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== + +caniuse-lite@^1.0.30001317: + version "1.0.30001319" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz#eb4da4eb3ecdd409f7ba1907820061d56096e88f" + integrity sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw== + +caniuse-lite@^1.0.30001332: + version "1.0.30001335" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" + integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + 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" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.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" + +chalk@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +chunkd@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz" + integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + +ci-info@^3.3.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== + +ci-parallel-vars@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz" + integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.1.0.tgz#5ce5a2fd19a12aecdce8570daefddb7ac94b6b4e" + integrity sha512-dxXQYI7mfQVcaF12s6sjNFoZ6ZPDQuBBLp3QJ5156k9EvUFClUoZ11fo8HnLQO241DDVntHEug8MOuFO5PSfRg== + dependencies: + escape-string-regexp "5.0.0" + +clean-yaml-object@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz" + integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-truncate@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" + integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== + dependencies: + slice-ansi "^1.0.0" + string-width "^2.0.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" + integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== + +commitlint@^16.2.4: + version "16.2.4" + resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-16.2.4.tgz#36063a40ec5f51b3e65458e737cf6ca8aa9d9756" + integrity sha512-MLTmC68lgtVIG4RD6bAfaqygWRMU8HM50DOZGFsefIsPFwnSNeY6aA0l5oo8PWhQktgx4NH5E9JEehnuShN9hg== + dependencies: + "@commitlint/cli" "^16.2.4" + "@commitlint/types" "^16.2.1" + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +compare-versions@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.3.tgz#8f7b8966aef7dc4282b45dfa6be98434fc18a1a4" + integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.4.7, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== + dependencies: + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" + js-string-escape "^1.0.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" + well-known-symbols "^2.0.0" + +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +conventional-changelog-angular@^5.0.11: + version "5.0.13" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-conventionalcommits@^4.3.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz#f4c0921937050674e578dc7875f908351ccf4014" + integrity sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + +conventional-commits-parser@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.2.tgz#190fb9900c6e02be0c0bca9b03d57e24982639fd" + integrity sha512-Jr9KAKgqAkwXMRHjxDwO/zOCDKod1XdAESHAGuJX38iZ7ZzVti/tvVoysO0suMsdAObp9NQ2rHSsSbnAqZ5f5g== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +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" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.21.0: + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" + integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-js-compat@^3.22.1: + version "3.22.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579" + integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig-typescript-loader@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.6.tgz#6d879cece8063b15ec8a3258f55a8e94893c7cca" + integrity sha512-2nEotziYJWtNtoTjKbchj9QrdTT6DBxCvqjNKoDKARw+e2yZmTQCa07uRrykLIZuvSgp69YXLH89UHc0WhdMfQ== + dependencies: + cosmiconfig "^7" + ts-node "^10.6.0" + +cosmiconfig@^7: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== + dependencies: + time-zone "^1.0.0" + +debug@4, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +"decrypt@github:standardnotes/decrypt#master": + version "1.1.0" + resolved "https://codeload.github.com/standardnotes/decrypt/tar.gz/2a4c13c3305f4d3b9f0714e17bf39921b172bc27" + dependencies: + "@standardnotes/sncrypto-web" "^1.2.9" + "@standardnotes/snjs" "^2.3.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz" + 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" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dmg-builder@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.0.3.tgz#ea94bc76fcd94612641580f3c6ae42c3f07f3fee" + integrity sha512-mBYrHHnSM5PC656TDE+xTGmXIuWHAGmmRfyM+dV0kP+AxtwPof4pAXNQ8COd0/exZQ4dqf72FiPS3B9G9aB5IA== + dependencies: + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.9" + +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.6" + plist "^3.0.1" + smart-buffer "^4.0.2" + verror "^1.10.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^5.1.0, dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411" + integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q== + +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" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-builder@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.0.3.tgz#16264a0d8e3d40da1467bcc8ef7917538b54a3bc" + integrity sha512-0lnTsljAgcOMuIiOjPcoFf+WxOOe/O04hZPgIvvUBXIbz3kolbNu0Xdch1f5WuQ40NdeZI7oqs8Eo395PcuGHQ== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + dmg-builder "23.0.3" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" + +electron-log@^4.4.6: + version "4.4.6" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.6.tgz#e7824fc725370384f6edaaac0480c423e570dc69" + integrity sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA== + +electron-notarize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.1.tgz#347c18eca8e29dddadadee511b870c13d4008baf" + integrity sha512-u/ECWhIrhkSQpZM4cJzVZ5TsmkaqrRo5LDC/KMbGF0sPkm53Ng59+M0zp8QVaql0obfJy9vlVT+4iOkAi2UDlA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.0.2.tgz#aa11419ae57b847df4beb63b95e2b2a43161957c" + integrity sha512-8gMYgWqv96lc83FCm85wd+tEyxNTJQK7WKyPkNkO8GxModZqt1GO8S+/vAnFGxilS/7vsrVRXFfqiCDUCSuxEg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-to-chromium@^1.3.649: + version "1.3.665" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.665.tgz" + integrity sha512-LIjx1JheOz7LM8DMEQ2tPnbBzJ4nVG1MKutsbEMLnJfwfVdPIsyagqfLp56bOWhdBrYGXWHaTayYkllIU2TauA== + +electron-to-chromium@^1.3.867: + version "1.3.877" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.877.tgz#956870eea7c9d8cf43cc54ea40687fee4dc0c12a" + integrity sha512-fT5mW5Giw5iyVukeHb2XvB4joBKvzHtl8Vs3QzE7APATpFMt/T7RWyUcIKSZzYkKQgpMbu+vDBTCHfQZvh8klA== + +electron-to-chromium@^1.3.896: + version "1.4.15" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.15.tgz#4bd144d9d13f8b375c65e1a593e7f4a90bd01b90" + integrity sha512-WDw2IUL3k4QpbzInV3JZK+Zd1NjWJPDZ28oUSchWb/kf6AVj7/niaAlgcJlvojFa1d7pJSyQ/KSZsEtq5W7aGQ== + +electron-to-chromium@^1.4.118: + version "1.4.131" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz#ca42d22eac0fe545860fbc636a6f4a7190ba70a9" + integrity sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw== + +electron-to-chromium@^1.4.84: + version "1.4.89" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz#33c06592812a17a7131873f4596579084ce33ff8" + integrity sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw== + +electron-updater@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-5.0.1.tgz#327915f1b2e573daf1ce1d8102bcab93f4880c1a" + integrity sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg== + dependencies: + "@types/semver" "^7.3.6" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + lodash.escaperegexp "^4.1.2" + lodash.isequal "^4.5.0" + semver "^7.3.5" + +electron@17.4.2: + version "17.4.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-17.4.2.tgz#fb5226100fc3f5d6e319ccad7fa462bf15ee0d94" + integrity sha512-SEf0Tsc1GjCccdsmrEtT51DeaF48ZUa711ekVCmVczn40WvKaqQu7M0SB3c/qRLRQyek/Qyi56zpcoOkjJ8L0Q== + dependencies: + "@electron/get" "^1.13.0" + "@types/node" "^14.6.2" + extract-zip "^1.0.3" + +emittery@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.1.tgz#3d01ab87e2b6542681f8fd6cbd6597a66daa1869" + integrity sha512-OBSS9uVXbpgqEGq2V5VnpfCu9vSnfiR9eYVJmxFYToNIcWRHkM4BAFbJe/PWjf/pQdEL7OPxd2jOW/bJiyX7gg== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.0.0: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enhanced-resolve@^5.9.2: + version "5.9.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" + integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +envinfo@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" + integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + 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" + 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" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + 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: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint-visitor-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" + integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239" + integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw== + dependencies: + "@eslint/eslintrc" "^1.2.2" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2, esutils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + 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" + +extract-zip@^1.0.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-glob@^3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-4.0.0.tgz#116f140b9d45d1e7a736e7fe80473f1e93f6e4d6" + integrity sha512-VnYcWq6H6F0qDN0QnorznBr0abEovifzUokmnezpKZBUbDmbLAt7LMryOp1TKFVxLxyNYkxEkCEADZR58U9oSw== + dependencies: + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.0.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz" + integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +follow-redirects@^1.14.9: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +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@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + 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" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.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" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +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" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +git-raw-commits@^2.0.0: + version "2.0.10" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz" + integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "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.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.4: + 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" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.0.2.tgz#53788b2adf235602ed4cabfea5c70a1139e1ab11" + integrity sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.8" + merge2 "^1.4.1" + slash "^4.0.0" + +globby@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.1.tgz#7c44a93869b0b7612e38f22ed532bfe37b25ea6f" + integrity sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.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== + dependencies: + lru-cache "^6.0.0" + +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" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +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@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +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" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz" + integrity sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA== + +ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +irregular-plurals@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" + integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-error@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz" + integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^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" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.1.0.tgz#9127b71f9fa82f52ca5c20e982e7bec0ee31ee1e" + integrity sha512-lDcxivp8TJpLG75/DpatAqNzOpDPSpED8XNtrpBHTdQ2InQ1PbW78jhwSxyxhhu+xbVSast2X38bwj8atwoUQA== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +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" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +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" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-worker@^27.0.6: + 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-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^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== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + 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" + integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== + +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== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libsodium-wrappers@^0.7.8: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-json-file@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.0.tgz#241d62af60739f6097c055efe10329c88b798425" + integrity sha512-HNx5uOnYeK4SxEoid5qnhRfprlJeGMzFRKPLCf/15N3/B4AiofNwC/yq7VBKdVk9dx7m+PiYCJOGg55JYTAqoQ== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== + dependencies: + escape-string-regexp "^5.0.0" + +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== + dependencies: + blueimp-md5 "^2.10.0" + +mem@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^4.0.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +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.2.3" + +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime-types@^2.1.27: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +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== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mobx@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.5.0.tgz#dc2d028b1882737f6e813fc92454381e438b7ad3" + integrity sha512-pHZ/cySF00FVENDWIDzJyoObFahK6Eg4d0papqm6d7yMkxWTZ/S/csqJX1A3PsYy4t5k3z2QnlwuCfMW5lSEwA== + +module-not-found-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz" + integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + +node-releases@^2.0.0, 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-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + dependencies: + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.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== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.3.0.tgz#2204823bc9f37f17ddc9e7f446293c4530b8a4cf" + integrity sha512-SRbIQFoLYNezHkqZslqeg963HYUtqOrfMCxjNrFOpJ19WTYuq26rQoOXeX8QQiMLUlLqdYV/7PuDsdYJ7hLE1w== + dependencies: + aggregate-error "^4.0.0" + +p-timeout@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.0.2.tgz#d12964c4b2f988e15f72b455c2c428d82a0ec0a0" + integrity sha512-sEmji9Yaq+Tw+STwsGAE56hf7gMy9p0tQfJojIAamB7WHJYJKf1qlsg9jqBWG8q9VCxKPhZaP/AcXwEoBcYQhQ== + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +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.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +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== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pkg-conf@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== + dependencies: + find-up "^6.0.0" + load-json-file "^7.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +plist@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.2.tgz#74bbf011124b90421c22d15779cee60060ba95bc" + integrity sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + xmldom "^0.5.0" + +plist@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" + integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +plur@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== + dependencies: + irregular-plurals "^3.3.0" + +pre-push@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/pre-push/-/pre-push-0.1.2.tgz#185bbde6e8dfe2ab6dff937b674f0cbfc5a98295" + integrity sha512-WymiU20I3W1yGV4VEqa+xOqaqGHYUz49R4ARvEdmYPgL07E/Gn7NLewI9k5g6KUc2EOaWE42rBb7nfVKYtkpCA== + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + +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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxyquire@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz" + integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.1" + resolve "^1.11.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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 "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0, regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpp@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.6.4: + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, 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.2.0" + path-parse "^1.0.6" + +resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +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== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +smart-buffer@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + +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" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stack-utils@^2.0.5: + 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" + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.padend@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz" + integrity sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supertap@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== + dependencies: + indent-string "^5.0.0" + js-yaml "^3.14.1" + serialize-error "^7.0.1" + strip-ansi "^7.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + 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-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +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 "^10.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.2.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" + integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== + dependencies: + jest-worker "^27.0.6" + p-limit "^3.1.0" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser-webpack-plugin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + dependencies: + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.7.2: + version "5.9.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= + +tmp-promise@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a" + integrity sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +ts-loader@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f" + integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.6.0, ts-node@^10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.0" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +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" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^4.4.3: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + +typescript@^4.6.4: + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache-lib@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" + integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +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" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-cli@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.72.0: + version "5.72.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28" + integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.2" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@1.2.x: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= + dependencies: + isexe "^2.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xmlbuilder@>=11.0.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" + integrity sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.5" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz" + integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== + +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs@^17.0.0, 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" + +yargs@^17.3.1: + version "17.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.0.tgz#9fc9efc96bd3aa2c1240446af28499f0e7593d00" + integrity sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== diff --git a/packages/web/.eslintrc b/packages/web/.eslintrc index 55677837b..7344f0a1b 100644 --- a/packages/web/.eslintrc +++ b/packages/web/.eslintrc @@ -6,12 +6,9 @@ "plugin:@typescript-eslint/recommended", "prettier", "plugin:react-hooks/recommended", - "./../../node_modules/@standardnotes/config/src/.eslintrc" + "../../node_modules/@standardnotes/config/src/.eslintrc" ], "plugins": ["@typescript-eslint", "react", "react-hooks"], - "parserOptions": { - "project": "./tsconfig.json" - }, "ignorePatterns": [".eslintrc.js", "webpack.*.js", "webpack-defaults.js", "jest.config.js", "__mocks__"], "rules": { "standard/no-callback-literal": 0, // Disable this as we have too many callbacks relying on literals @@ -32,8 +29,6 @@ "browser": true }, "globals": { - "SFJS": true, - "__VERSION__": true, - "zip": true + "__WEB_VERSION__": true } } diff --git a/packages/web/jest.config.js b/packages/web/jest.config.js index 9125ac632..53a2735e4 100644 --- a/packages/web/jest.config.js +++ b/packages/web/jest.config.js @@ -14,7 +14,7 @@ module.exports = { '\\.(css|less|scss|sass)$': 'identity-obj-proxy', }, globals: { - __VERSION__: '1.0.0', + __WEB_VERSION__: '1.0.0', __DESKTOP__: false, __WEB__: true, self: {}, // fixes error happening on `import { SKAlert } from 'sn-stylekit'` diff --git a/packages/web/linter.tsconfig.json b/packages/web/linter.tsconfig.json new file mode 100644 index 000000000..ab3d8c031 --- /dev/null +++ b/packages/web/linter.tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../node_modules/@standardnotes/config/src/linter.tsconfig.json" +} diff --git a/packages/web/package.json b/packages/web/package.json index ec1a6b143..c67de3677 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -8,14 +8,11 @@ "dist" ], "scripts": { - "start": "webpack-dev-server --config webpack.dev.js", - "watch": "webpack -w --config webpack.dev.js", - "watch:desktop": "webpack -w --config webpack.dev.js --env platform='desktop'", + "start": "webpack-dev-server --config web.webpack.dev.js", + "watch": "webpack -w --config web.webpack.dev.js", "clean": "rm -fr dist", "prebuild": "yarn clean", - "build": "webpack --config webpack.prod.js && yarn tsc", - "build:desktop": "webpack --config webpack.prod.js --env platform='desktop'", - "build:desktop:beta": "webpack --config webpack.prod.js --env platform='desktop' --env public_beta='true'", + "build": "webpack --config web.webpack.prod.js && yarn tsc", "lint": "eslint src/javascripts", "tsc": "tsc --project tsconfig.json", "test": "jest --config jest.config.js --coverage", diff --git a/packages/web/src/javascripts/App.tsx b/packages/web/src/javascripts/App.tsx index d78da57eb..1236c464e 100644 --- a/packages/web/src/javascripts/App.tsx +++ b/packages/web/src/javascripts/App.tsx @@ -14,6 +14,7 @@ declare global { websocketUrl: string electronAppVersion?: string webClient?: DesktopManagerInterface + electronRemoteBridge?: unknown application?: WebApplication mainApplicationGroup?: ApplicationGroup diff --git a/packages/web/src/javascripts/Constants/Version.ts b/packages/web/src/javascripts/Constants/Version.ts index be49915d5..c82b2df61 100644 --- a/packages/web/src/javascripts/Constants/Version.ts +++ b/packages/web/src/javascripts/Constants/Version.ts @@ -1,8 +1,6 @@ /** Declared in webpack config */ -declare const __VERSION__: string -declare const __DESKTOP__: boolean -declare const __WEB__: boolean +declare const __WEB_VERSION__: string -export const WebAppVersion = __VERSION__ -export const IsDesktopPlatform = __DESKTOP__ -export const IsWebPlatform = __WEB__ +export const WebAppVersion = __WEB_VERSION__ +export const IsDesktopPlatform = window.electronRemoteBridge != undefined +export const IsWebPlatform = window.electronRemoteBridge == undefined diff --git a/packages/web/webpack-defaults.js b/packages/web/web.webpack-defaults.js similarity index 100% rename from packages/web/webpack-defaults.js rename to packages/web/web.webpack-defaults.js diff --git a/packages/web/webpack.config.js b/packages/web/web.webpack.config.js similarity index 90% rename from packages/web/webpack.config.js rename to packages/web/web.webpack.config.js index c2b0c3cb3..035d59ebc 100644 --- a/packages/web/webpack.config.js +++ b/packages/web/web.webpack.config.js @@ -2,7 +2,7 @@ const path = require('path') const webpack = require('webpack') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const CircularDependencyPlugin = require('circular-dependency-plugin') -const mergeWithEnvDefaults = require('./webpack-defaults') +const mergeWithEnvDefaults = require('./web.webpack-defaults') require('dotenv').config() module.exports = (env) => { @@ -27,9 +27,7 @@ module.exports = (env) => { cwd: process.cwd(), }), new webpack.DefinePlugin({ - __VERSION__: JSON.stringify(require('./package.json').version), - __WEB__: JSON.stringify(env.platform === 'web'), - __DESKTOP__: JSON.stringify(env.platform === 'desktop'), + __WEB_VERSION__: JSON.stringify(require('./package.json').version), }), new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output diff --git a/packages/web/webpack.dev.js b/packages/web/web.webpack.dev.js similarity index 85% rename from packages/web/webpack.dev.js rename to packages/web/web.webpack.dev.js index c0e232917..7e967390e 100644 --- a/packages/web/webpack.dev.js +++ b/packages/web/web.webpack.dev.js @@ -1,7 +1,7 @@ const { merge } = require('webpack-merge'); -const config = require('./webpack.config.js'); +const config = require('./web.webpack.config.js'); const HtmlWebpackPlugin = require('html-webpack-plugin'); -const mergeWithEnvDefaults = require('./webpack-defaults.js'); +const mergeWithEnvDefaults = require('./web.webpack-defaults.js'); module.exports = (env, argv) => { const port = argv.port || 3001; diff --git a/packages/web/webpack.prod.js b/packages/web/web.webpack.prod.js similarity index 63% rename from packages/web/webpack.prod.js rename to packages/web/web.webpack.prod.js index ce1a62907..ce26d090e 100644 --- a/packages/web/webpack.prod.js +++ b/packages/web/web.webpack.prod.js @@ -1,6 +1,6 @@ const { merge } = require('webpack-merge') -const mergeWithEnvDefaults = require('./webpack-defaults.js') -const config = require('./webpack.config.js') +const mergeWithEnvDefaults = require('./web.webpack-defaults.js') +const config = require('./web.webpack.config.js') module.exports = (env, argv) => { mergeWithEnvDefaults(env) diff --git a/scripts/desktop/afterSignHook.js b/scripts/desktop/afterSignHook.js new file mode 100644 index 000000000..42c0199bb --- /dev/null +++ b/scripts/desktop/afterSignHook.js @@ -0,0 +1,37 @@ +/** @see: https://medium.com/@TwitterArchiveEraser/notarize-electron-apps-7a5f988406db */ + +const fs = require('fs'); +const path = require('path'); +const electronNotarize = require('electron-notarize'); + +module.exports = async function (params) { + const platformName = params.electronPlatformName; + // Only notarize the app on macOS. + if (platformName !== 'darwin') { + return; + } + console.log('afterSign hook triggered'); + + const { appId } = JSON.parse(await fs.promises.readFile('../../packages/desktop/package.json')).build; + + const appPath = path.join(params.appOutDir, `${params.packager.appInfo.productFilename}.app`); + await fs.promises.access(appPath); + + console.log(`Notarizing ${appId} found at ${appPath}`); + + try { + electronNotarize + .notarize({ + appBundleId: appId, + appPath: appPath, + appleId: process.env.notarizeAppleId, + appleIdPassword: process.env.notarizeAppleIdPassword, + }) + .then(() => { + console.log(`Done notarizing ${appId}`); + }); + } catch (error) { + console.error(error); + throw error; + } +}; diff --git a/scripts/desktop/build.mjs b/scripts/desktop/build.mjs new file mode 100644 index 000000000..f151afb90 --- /dev/null +++ b/scripts/desktop/build.mjs @@ -0,0 +1,224 @@ +import { spawn } from 'child_process' +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const RootDir = path.join(__dirname, '../..') +const DesktopDir = path.join(__dirname, '../../packages/desktop') +const ScriptsDir = path.join(__dirname) + +async function buildTargets(targets) { + console.log('Building targets: ', targets) + + await runCommand(Command('yarn run lint', DesktopDir)) + await runCommand(Command('yarn clean:build', DesktopDir)) + await runCommand(Command('yarn run build:web', RootDir)) + + for (const group of CompileGroups) { + let didCompileGroup = false + for (const target of targets) { + if (group.targets.includes(target)) { + if (!didCompileGroup) { + await runCommand(group.compileCommand) + didCompileGroup = true + } + const buildCommands = BuildCommands[target] + for (const buildCommand of buildCommands) { + await runCommand(buildCommand) + } + } + } + } +} + +function runCommand(commandObj) { + return new Promise((resolve, reject) => { + const { prompt, extraEnv } = commandObj + + console.log(prompt, Object.keys(extraEnv).length > 0 ? extraEnv : '') + + const [command, ...args] = prompt.split(' ') + const options = { cwd: commandObj.dir, env: Object.assign({}, process.env, extraEnv) } + const child = spawn(command, args, options) + + child.stdout.pipe(process.stdout) + child.stderr.pipe(process.stderr) + + child.on('error', reject) + child.on('close', (code) => { + if (code > 0) { + reject(code) + } else { + resolve(code) + } + }) + }) +} + +const Targets = { + Appimage: 'appimage', + AppimageArm64: 'appimage-arm64', + AppimageX64: 'appimage-x64', + AppimageAll: 'appimage-all', + Deb: 'deb', + DebArm64: 'deb-arm64', + Dir: 'dir', + DirArm64: 'dir-arm64', + Mac: 'mac', + MacAll: 'mac-all', + MacArm64: 'mac-arm64', + Snap: 'snap', + SnapArm64: 'snap-arm64', + Windows: 'windows', +} + +const MainstreamTargetGroup = 'mainstream' + +const TargetGroups = { + all: [ + Targets.AppimageAll, + Targets.Deb, + Targets.DebArm64, + Targets.Dir, + Targets.DirArm64, + Targets.MacAll, + Targets.Snap, + Targets.SnapArm64, + Targets.Windows, + ], + [MainstreamTargetGroup]: [ + Targets.Windows, + Targets.AppimageAll, + Targets.Deb, + Targets.Snap, + Targets.DebArm64, + Targets.MacAll, + ], + mac: [Targets.MacArm64], +} + +const arm64Env = { npm_config_target_arch: 'arm64' } + +const Command = function (prompt, dir, extraEnv = {}) { + return { + prompt, + dir, + extraEnv, + } +} + +const CompileGroups = [ + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js', DesktopDir), + targets: [ + Targets.Appimage, + Targets.AppimageX64, + Targets.AppimageArm64, + Targets.AppimageAll, + Targets.Mac, + Targets.MacArm64, + Targets.MacAll, + Targets.Dir, + Targets.Windows, + ], + }, + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js --env deb', DesktopDir), + targets: [Targets.Deb], + }, + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js --env deb', DesktopDir, arm64Env), + targets: [Targets.DebArm64], + }, + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js', DesktopDir, arm64Env), + targets: [Targets.DirArm64], + }, + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js --env snap', DesktopDir), + targets: [Targets.Snap], + }, + { + compileCommand: Command('yarn run webpack --config desktop.webpack.prod.js --env snap', DesktopDir, arm64Env), + targets: [Targets.SnapArm64], + }, +] + +const BuildCommands = { + [Targets.Appimage]: [ + Command('yarn run electron-builder --linux --x64 --ia32 -c.linux.target=AppImage --publish=never', DesktopDir), + ], + [Targets.AppimageX64]: [ + Command('yarn run electron-builder --linux --x64 -c.linux.target=AppImage --publish=never', DesktopDir), + ], + [Targets.AppimageArm64]: [ + Command('yarn run electron-builder --linux --arm64 -c.linux.target=AppImage --publish=never', DesktopDir), + ], + [Targets.AppimageAll]: [ + Command( + 'yarn run electron-builder --linux --arm64 --x64 --ia32 -c.linux.target=AppImage --publish=never', + DesktopDir, + ), + ], + [Targets.Deb]: [ + Command('yarn run electron-builder --linux --x64 --ia32 -c.linux.target=deb --publish=never', DesktopDir), + ], + [Targets.DebArm64]: [ + Command('yarn run electron-builder --linux --arm64 -c.linux.target=deb --publish=never', DesktopDir, { + npm_config_target_arch: 'arm64', + USE_SYSTEM_FPM: 'true', + }), + ], + [Targets.Mac]: [ + Command('yarn run electron-builder --mac --x64 --publish=never', DesktopDir), + Command('node scripts/fix-mac-zip', ScriptsDir), + ], + [Targets.MacArm64]: [Command('yarn run electron-builder --mac --arm64 --publish=never', DesktopDir)], + [Targets.MacAll]: [Command('yarn run electron-builder --macos --arm64 --x64 --publish=never', DesktopDir)], + [Targets.Dir]: [Command('yarn run electron-builder --linux --x64 -c.linux.target=dir --publish=never', DesktopDir)], + [Targets.DirArm64]: [ + Command('yarn run electron-builder --linux --arm64 -c.linux.target=dir --publish=never', DesktopDir, arm64Env), + ], + [Targets.Snap]: [Command('yarn run electron-builder --linux --x64 -c.linux.target=snap --publish=never', DesktopDir)], + [Targets.SnapArm64]: [ + Command('yarn run electron-builder --linux --arm64 -c.linux.target=snap --publish=never', DesktopDir, { + npm_config_target_arch: 'arm64', + SNAPCRAFT_BUILD_ENVIRONMENT: 'host', + }), + ], + [Targets.Windows]: [Command('yarn run electron-builder --windows --x64 --ia32 --publish=never', DesktopDir)], +} + +async function publishSnap() { + const packageJson = await fs.promises.readFile(path.join(DesktopDir, 'package.json')) + const version = JSON.parse(packageJson).version + await runCommand(Command(`snapcraft upload dist/standard-notes-${version}-linux-amd64.snap`, DesktopDir)) +} + +;(async () => { + try { + const input = process.argv[2] + let targets = input.split(',') + + console.log('Input targets:', targets) + + if (targets.length === 1) { + if (TargetGroups[targets[0]]) { + targets = TargetGroups[targets[0]] + } + } + await buildTargets(targets) + + if (input === MainstreamTargetGroup) { + await runCommand(Command('node sums.mjs', ScriptsDir)) + await runCommand(Command('node create-draft-release.mjs', ScriptsDir)) + await publishSnap() + } + } catch (e) { + console.error(e) + process.exitCode = 1 + } +})() diff --git a/scripts/desktop/change-version.mjs b/scripts/desktop/change-version.mjs new file mode 100644 index 000000000..3ebf6525e --- /dev/null +++ b/scripts/desktop/change-version.mjs @@ -0,0 +1,15 @@ +import { execSync } from 'child_process' +;(async () => { + const version = process.argv[2] + if (!version) { + console.error('Must specify a version number.') + process.exitCode = 1 + return + } + execSync(`yarn version --no-git-tag-version --new-version ${version}`) + process.chdir('app') + execSync(`yarn version --no-git-tag-version --new-version ${version}`) + process.chdir('..') + execSync('git add package.json app/package.json') + execSync(`git commit -m "chore(version): ${version}"`) +})() diff --git a/scripts/desktop/create-draft-release.mjs b/scripts/desktop/create-draft-release.mjs new file mode 100644 index 000000000..a87f00bd3 --- /dev/null +++ b/scripts/desktop/create-draft-release.mjs @@ -0,0 +1,25 @@ +import { spawn } from 'child_process' +import fs from 'fs' +import path from 'path' +import { getLatestBuiltFilesList } from './utils.mjs' +;(async () => { + const files = await getLatestBuiltFilesList() + files.push('SHA256SUMS') + + const versionNumber = JSON.parse(fs.readFileSync('./package.json')).version + console.log('Creating draft release...') + const child = spawn('gh', [ + 'release', + 'create', + `v${versionNumber}`, + ...files.map((name) => path.join('dist', name)), + '--target', + 'main', + '--draft', + '--prerelease', + '--title', + versionNumber, + ]) + child.stdout.pipe(process.stdout) + child.stderr.pipe(process.stderr) +})() diff --git a/scripts/desktop/fix-mac-zip.js b/scripts/desktop/fix-mac-zip.js new file mode 100644 index 000000000..caba7d685 --- /dev/null +++ b/scripts/desktop/fix-mac-zip.js @@ -0,0 +1,79 @@ +/* + * There is an issue with electron-builder generating invalid zip files for Catalina. + * This is a script implementation of the following workaround: + * https://snippets.cacher.io/snippet/354a3eb7b0dcbe711383 + */ + +if (process.platform !== 'darwin') { + console.error(`this script (${__filename}) can only be run from a darwin platform.`); + process.exitCode = 1; + return; +} + +const fs = require('fs'); +const childProcess = require('child_process'); +const yaml = require('js-yaml'); +const assert = require('assert').strict; +const os = require('os'); + +function exec(command) { + console.log(command); + return new Promise((resolve, reject) => { + childProcess.exec(command, (err, stdout, stderr) => { + if (err) reject(err); + else if (stderr) reject(Error(stderr)); + else resolve(stdout); + }); + }); +} + +async function getBlockMapInfo(fileName) { + return JSON.parse( + await exec( + './node_modules/app-builder-bin/mac/app-builder_amd64 blockmap' + + ` -i ${fileName}` + + ` -o ${os.tmpdir()}/a.zip` + ) + ); +} + +(async () => { + try { + const { version } = JSON.parse(await fs.promises.readFile('app/package.json')); + const zipName = `standard-notes-${version}-mac-x64.zip`; + const zipPath = `dist/${zipName}`; + console.log(`Removing ${zipPath}`); + await fs.promises.unlink(zipPath); + + process.chdir('dist/mac'); + const appName = process.argv.includes('--beta') + ? 'Standard\\ Notes\\ \\(Beta\\).app' + : 'Standard\\ Notes.app'; + /** @see https://superuser.com/questions/574032/what-is-the-equivalent-unix-command-to-a-mac-osx-compress-menu-action */ + await exec(`ditto -c -k --sequesterRsrc --keepParent ${appName} ../${zipName}`); + process.chdir('../..'); + + const [blockMapInfo, latestVersionInfo] = await Promise.all([ + getBlockMapInfo(zipPath), + fs.promises.readFile('dist/latest-mac.yml').then(yaml.load), + ]); + const index = latestVersionInfo.files.findIndex((file) => file.url === zipName); + assert(index >= 0); + latestVersionInfo.files[index] = { + ...latestVersionInfo.files[index], + ...blockMapInfo, + }; + latestVersionInfo.sha512 = blockMapInfo.sha512; + console.log('Writing new size, hash and blockMap size to dist/latest-mac.yml'); + await fs.promises.writeFile( + 'dist/latest-mac.yml', + yaml.dump(latestVersionInfo, { + lineWidth: Infinity, + }), + 'utf8' + ); + } catch (err) { + console.error(err); + process.exitCode = 1; + } +})(); diff --git a/scripts/desktop/sums.mjs b/scripts/desktop/sums.mjs new file mode 100644 index 000000000..a083c3de8 --- /dev/null +++ b/scripts/desktop/sums.mjs @@ -0,0 +1,37 @@ +import crypto from 'crypto' +import fs from 'fs' +import { getLatestBuiltFilesList } from './utils.mjs' + +function sha256(filePath) { + return new Promise((resolve, reject) => { + fs.createReadStream(filePath) + .pipe(crypto.createHash('sha256').setEncoding('hex')) + .on('finish', function () { + resolve(this.read()) + }) + .on('error', reject) + }) +} + +;(async () => { + console.log('Writing SHA256 sums to dist/SHA256SUMS') + + try { + const files = await getLatestBuiltFilesList() + + process.chdir('dist') + + let hashes = await Promise.all( + files.map(async (fileName) => { + const hash = await sha256(fileName) + return `${hash} ${fileName}` + }), + ) + hashes = hashes.join('\n') + await fs.promises.writeFile('SHA256SUMS', hashes) + console.log(`Successfully wrote SHA256SUMS:\n${hashes}`) + } catch (err) { + console.error(err) + process.exitCode = 1 + } +})() diff --git a/scripts/desktop/utils.mjs b/scripts/desktop/utils.mjs new file mode 100644 index 000000000..6ae9f6afc --- /dev/null +++ b/scripts/desktop/utils.mjs @@ -0,0 +1,44 @@ +import fs from 'fs' + +export async function getLatestBuiltFilesList() { + const packageJson = await fs.promises.readFile('./package.json') + const version = JSON.parse(packageJson).version + return [ + `standard-notes-${version}-mac-x64.zip`, + `standard-notes-${version}-mac-x64.dmg`, + `standard-notes-${version}-mac-x64.dmg.blockmap`, + + `standard-notes-${version}-mac-arm64.zip`, + `standard-notes-${version}-mac-arm64.dmg`, + `standard-notes-${version}-mac-arm64.dmg.blockmap`, + + `standard-notes-${version}-linux-i386.AppImage`, + `standard-notes-${version}-linux-x86_64.AppImage`, + `standard-notes-${version}-linux-amd64.snap`, + + `standard-notes-${version}-linux-arm64.deb`, + `standard-notes-${version}-linux-arm64.AppImage`, + + `standard-notes-${version}-win-x64.exe`, + `standard-notes-${version}-win-x64.exe.blockmap`, + + `standard-notes-${version}-win.exe`, + `standard-notes-${version}-win.exe.blockmap`, + + `standard-notes-${version}-win-ia32.exe`, + `standard-notes-${version}-win-ia32.exe.blockmap`, + + 'latest-linux-ia32.yml', + 'latest-linux.yml', + 'latest-linux-arm64.yml', + 'latest-mac.yml', + 'latest.yml', + 'builder-effective-config.yaml', + ] +} + +export async function getBuiltx64SnapFilename() { + const packageJson = await fs.promises.readFile('./package.json') + const version = JSON.parse(packageJson).version + return `standard-notes-${version}-linux-amd64.snap` +} diff --git a/yarn.lock b/yarn.lock index 4e11c17a9..9c1da3563 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -22,7 +27,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.9", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.10", "@babel/core@^7.17.9", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== @@ -258,7 +263,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0", "@babel/parser@^7.7.0": version "7.18.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== @@ -812,7 +817,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.16.11": +"@babel/preset-env@^7.16.11", "@babel/preset-env@^7.17.10": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== @@ -929,7 +934,7 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": version "7.18.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== @@ -945,7 +950,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.18.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== @@ -958,11 +963,212 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@commitlint/cli@^16.3.0": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-16.3.0.tgz#5689f5c2abbb7880d5ff13329251e5648a784b16" + integrity sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA== + dependencies: + "@commitlint/format" "^16.2.1" + "@commitlint/lint" "^16.2.4" + "@commitlint/load" "^16.3.0" + "@commitlint/read" "^16.2.1" + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz#56647108c89ed06fc5271242787550331988c0fb" + integrity sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA== + dependencies: + conventional-changelog-conventionalcommits "^4.3.1" + +"@commitlint/config-validator@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d" + integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw== + dependencies: + "@commitlint/types" "^16.2.1" + ajv "^6.12.6" + +"@commitlint/ensure@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-16.2.1.tgz#0fc538173f95c1eb2694eeedb79cab478347f16f" + integrity sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A== + dependencies: + "@commitlint/types" "^16.2.1" + lodash "^4.17.19" + +"@commitlint/execute-rule@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8" + integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g== + +"@commitlint/format@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-16.2.1.tgz#6e673f710c799be78e68b2682323e04f75080d07" + integrity sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q== + dependencies: + "@commitlint/types" "^16.2.1" + chalk "^4.0.0" + +"@commitlint/is-ignored@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz#369e40a240ad5451bf2b57a80829253129d7f19b" + integrity sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ== + dependencies: + "@commitlint/types" "^16.2.1" + semver "7.3.7" + +"@commitlint/lint@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-16.2.4.tgz#575f5a9d227dddfca8386253d9aff27be5b94788" + integrity sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ== + dependencies: + "@commitlint/is-ignored" "^16.2.4" + "@commitlint/parse" "^16.2.1" + "@commitlint/rules" "^16.2.4" + "@commitlint/types" "^16.2.1" + +"@commitlint/load@^16.3.0": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-16.3.0.tgz#e674ccc9edefd64a2d8b82d175de81ec3bb70eca" + integrity sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/execute-rule" "^16.2.1" + "@commitlint/resolve-extends" "^16.2.1" + "@commitlint/types" "^16.2.1" + "@types/node" ">=12" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "^2.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + typescript "^4.4.3" + +"@commitlint/message@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-16.2.1.tgz#bc6a0fa446a746ac2ca78cf372e4cec48daf620d" + integrity sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw== + +"@commitlint/parse@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-16.2.1.tgz#50b359cb711ec566d2ee236a8e4c6baca07b77c0" + integrity sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g== + dependencies: + "@commitlint/types" "^16.2.1" + conventional-changelog-angular "^5.0.11" + conventional-commits-parser "^3.2.2" + +"@commitlint/read@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-16.2.1.tgz#e0539205d77cdb6879b560f95e5fb251e0c6f562" + integrity sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw== + dependencies: + "@commitlint/top-level" "^16.2.1" + "@commitlint/types" "^16.2.1" + fs-extra "^10.0.0" + git-raw-commits "^2.0.0" + +"@commitlint/resolve-extends@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360" + integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/types" "^16.2.1" + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^16.2.4": + version "16.2.4" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-16.2.4.tgz#c2fbbf20d9d0e8fcf25690c88a27750d4a3e867b" + integrity sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg== + dependencies: + "@commitlint/ensure" "^16.2.1" + "@commitlint/message" "^16.2.1" + "@commitlint/to-lines" "^16.2.1" + "@commitlint/types" "^16.2.1" + execa "^5.0.0" + +"@commitlint/to-lines@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-16.2.1.tgz#42d000f34dc0406f514991e86237fdab5e8affd0" + integrity sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ== + +"@commitlint/top-level@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-16.2.1.tgz#bdaa53ab3d8970e0288879f1a342a8c2dfe01583" + integrity sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd" + integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA== + dependencies: + chalk "^4.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@electron/get@^1.13.0": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/remote@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3" + integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw== + +"@electron/universal@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.0.tgz#518cac72bccd79c00bf41345119e6fdbabdb871d" + integrity sha512-eu20BwNsrMPKoe2bZ3/l9c78LclDvxg3PlVXrQf3L50NaUuW5M59gbPytI+V4z7/QMrohUHetQaU0ou+p1UG9Q== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -1296,6 +1502,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" @@ -1994,6 +2208,23 @@ npmlog "^4.1.2" write-file-atomic "^2.3.0" +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2563,6 +2794,11 @@ "@standardnotes/auth" "^3.19.2" "@standardnotes/features" "^1.44.7" +"@standardnotes/electron-clear-data@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@standardnotes/electron-clear-data/-/electron-clear-data-1.1.1.tgz#45eab118ed5d1ee9369b540d7e62a9ca96778335" + integrity sha512-R0YivtSwSQpNt5nPOi7YRTGlk6kpcz6/2/sAQZf6ZCU8vIGm1cBMo++6kkGQcDEumkwbmagxmLWinL9d1W5g3Q== + "@standardnotes/encryption@^1.8.11": version "1.8.11" resolved "https://registry.yarnpkg.com/@standardnotes/encryption/-/encryption-1.8.11.tgz#06e908370e3db3ec40c689c2e46b3c2a455a1ab4" @@ -2645,7 +2881,7 @@ resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.9.0.tgz#7c7387357fbd95f6121c35c88c53d5c72203fe22" integrity sha512-EoPwt0gU0kDU1feyumXU3neSaNQivC2+LVQp8C5kDYi6OrrLPzq3dGPc21GFLKinAdcZvjfLc/RkFo6b/CEnAA== -"@standardnotes/sncrypto-web@1.10.1": +"@standardnotes/sncrypto-web@1.10.1", "@standardnotes/sncrypto-web@^1.6.1": version "1.10.1" resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-web/-/sncrypto-web-1.10.1.tgz#c3467a074bb76b7ebc7858a479a15486ebf7b3be" integrity sha512-/drPoz2bg5G6QiC48yqp2kkUVsoDKyJHyAb5x0X5rdnCAHaYv+b4NdkSihsj+enWvpocQ0sr2n/gewqmUIPivQ== @@ -2654,7 +2890,7 @@ buffer "^6.0.3" libsodium-wrappers "^0.7.9" -"@standardnotes/snjs@^2.115.6": +"@standardnotes/snjs@^2.115.6", "@standardnotes/snjs@^2.41.1": version "2.115.6" resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.115.6.tgz#c9cd5ea432d3cbdbd7c70242de1dd8c3ab5e673d" integrity sha512-r63idXBZUdlQnEzFPSjVT22BrIZ3Vaa1eyWqFA8MUz5NOAv80hC7BTSiEqTRQEudnVauqpM9NB31A1xOZTAZeg== @@ -2713,6 +2949,26 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -2776,6 +3032,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + "@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" @@ -2816,6 +3079,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@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" "*" + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -2875,6 +3145,21 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash@^4.14.182": + version "4.14.182" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + +"@types/mime-types@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.1.tgz#d9ba43490fa3a3df958759adf69396c3532cf2c1" + integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -2890,16 +3175,39 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/node@*", "@types/node@>= 8", "@types/node@^17.0.21": +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*", "@types/node@>= 8", "@types/node@>=12", "@types/node@^17.0.21", "@types/node@^17.0.31": version "17.0.40" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.40.tgz#76ee88ae03650de8064a6cf75b8d95f9f4a16090" integrity sha512-UXdBxNGqTMtm7hCwh9HtncFVLrXoqA3oJW30j6XWp5BH/wu3mVeaxo7cq5benFdBw34HB3XDT2TRPI7rXZ+mDg== +"@types/node@^14.6.2": + version "14.18.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.20.tgz#268f028b36eaf51181c3300252f605488c4f0650" + integrity sha512-Q8KKwm9YqEmUBRsqJ2GWJDtXltBDxTdC4m5vTdXBolu2PeQh8LX+f6BTwU+OuXPu37fLxoN6gidqBmnky36FXA== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + "@types/prettier@^2.1.5": version "2.6.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" @@ -2910,6 +3218,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/proxyquire@^1.3.28": + version "1.3.28" + resolved "https://registry.yarnpkg.com/@types/proxyquire/-/proxyquire-1.3.28.tgz#05a647bb0d8fe48fc8edcc193e43cc79310faa7d" + integrity sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q== + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -2955,6 +3268,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/semver@^7.3.6": + version "7.3.9" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + "@types/serve-index@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" @@ -2982,6 +3300,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/verror@^1.10.3": + version "1.10.5" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" + integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== + "@types/wicg-file-system-access@^2020.9.5": version "2020.9.5" resolved "https://registry.yarnpkg.com/@types/wicg-file-system-access/-/wicg-file-system-access-2020.9.5.tgz#4a0c8f3d1ed101525f329e86c978f7735404474f" @@ -3006,7 +3329,21 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.12.1", "@typescript-eslint/eslint-plugin@^5.20.0": +"@types/yargs@^17.0.1": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.12.1", "@typescript-eslint/eslint-plugin@^5.20.0", "@typescript-eslint/eslint-plugin@^5.22.0": version "5.27.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== @@ -3021,7 +3358,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.12.1", "@typescript-eslint/parser@^5.20.0": +"@typescript-eslint/parser@^5.12.1", "@typescript-eslint/parser@^5.20.0", "@typescript-eslint/parser@^5.22.0": version "5.27.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== @@ -3302,6 +3639,11 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" @@ -3357,6 +3699,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -3364,7 +3714,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -3376,7 +3726,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3464,7 +3814,7 @@ 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== -ansi-styles@^6.0.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== @@ -3482,6 +3832,42 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.0.3.tgz#44c90237abdc4ad9b34a24658bee022828ad6205" + integrity sha512-1qrtXYHXJfXhzJnMtVGjIva3067F1qYQubl2oBjI61gCBoCHvhghdYJ57XxXTQQ0VxnUhg1/Iaez87uXp8mD8w== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.0" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chromium-pickle-js "^0.2.0" + debug "^4.3.2" + ejs "^3.1.6" + electron-osx-sign "^0.6.0" + electron-publish "23.0.2" + form-data "^4.0.0" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" + is-ci "^3.0.0" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.0.4" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.5" + temp-file "^3.4.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -3516,6 +3902,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3591,6 +3982,11 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -3601,6 +3997,16 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + array.prototype.flatmap@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" @@ -3622,16 +4028,38 @@ array.prototype.reduce@^1.0.4: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arrgv@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" + integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asar@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -3654,16 +4082,31 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob-lite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" @@ -3674,6 +4117,57 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +ava@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-4.3.0.tgz#e9466990caba63789eac3a0013714ea76dd82463" + integrity sha512-Ap0u8rp8wOBN6CxshgxrPSe191e8g52RWGoXeDB57ubo4fyZyStfI6OxQi/bl0yxIDEOYHhCiGwihbzlMNJw3Q== + dependencies: + acorn "^8.7.1" + acorn-walk "^8.2.0" + ansi-styles "^6.1.0" + arrgv "^1.0.2" + arrify "^3.0.0" + callsites "^4.0.0" + cbor "^8.1.0" + chalk "^5.0.1" + chokidar "^3.5.3" + chunkd "^2.0.1" + ci-info "^3.3.1" + ci-parallel-vars "^1.0.1" + clean-yaml-object "^0.1.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" + common-path-prefix "^3.0.0" + concordance "^5.0.4" + currently-unhandled "^0.4.1" + debug "^4.3.4" + del "^6.1.1" + emittery "^0.11.0" + figures "^4.0.1" + globby "^13.1.1" + ignore-by-default "^2.1.0" + indent-string "^5.0.0" + is-error "^2.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + matcher "^5.0.0" + mem "^9.0.2" + ms "^2.1.3" + p-event "^5.0.1" + p-map "^5.4.0" + picomatch "^2.3.1" + pkg-conf "^4.0.0" + plur "^5.1.0" + pretty-ms "^7.0.1" + resolve-cwd "^3.0.0" + slash "^3.0.0" + stack-utils "^2.0.5" + strip-ansi "^7.0.1" + supertap "^3.0.1" + temp-dir "^2.0.0" + write-file-atomic "^4.0.1" + yargs "^17.5.1" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3684,6 +4178,26 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -3791,7 +4305,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3836,11 +4350,23 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" @@ -3874,6 +4400,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + boxen@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" @@ -3961,16 +4492,52 @@ btoa-lite@^1.0.0: resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -3979,6 +4546,37 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +builder-util-runtime@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz#3a40ba7382712ccdb24471567f91d7c167e00830" + integrity sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.0.2.tgz#da84a971076397e3a671726f4bb96f0c2214fea7" + integrity sha512-HaNHL3axNW/Ms8O1mDx3I07G+ZnZ/TKSWWvorOAPau128cdt9S+lNx5ocbx8deSaHHX4WFXSZVHh3mxlaKJNgg== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.2" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -4145,6 +4743,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +callsites@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.0.0.tgz#8014cea4fedfe681a30e2f7d2d557dd95808a92a" + integrity sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ== + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -4209,7 +4812,14 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.2: +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4218,7 +4828,7 @@ chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4226,6 +4836,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -4266,16 +4881,31 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +chunkd@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" + integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== + ci-info@^2.0.0: version "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.2.0: +ci-info@^3.2.0, ci-info@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== +ci-parallel-vars@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz#e87ff0625ccf9d286985b29b4ada8485ca9ffbc2" + integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== + cint@^8.2.1: version "8.2.1" resolved "https://registry.yarnpkg.com/cint/-/cint-8.2.1.tgz#70386b1b48e2773d0d63166a55aff94ef4456a12" @@ -4313,6 +4943,18 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +clean-yaml-object@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" + integrity sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw== + cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" @@ -4404,6 +5046,13 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + 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" @@ -4476,11 +5125,23 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4496,6 +5157,19 @@ commander@^9.1.0, commander@^9.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== +commitlint@^16.2.4: + version "16.3.0" + resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-16.3.0.tgz#646c7f9385647e2f7b3bca0738a0a2a7c1275cd8" + integrity sha512-W6T/632YL4pXiKtk81lHdQ6CQzWyt2rwaYjeqsUPm0lyIWNhx9NiNI55GbZuPOnpaike7IZn56J+hnItY4pnBQ== + dependencies: + "@commitlint/cli" "^16.3.0" + "@commitlint/types" "^16.2.1" + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -4509,6 +5183,16 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +compare-versions@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.3.tgz#8f7b8966aef7dc4282b45dfa6be98434fc18a1a4" + integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -4539,7 +5223,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0: +concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4559,6 +5243,20 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== + dependencies: + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" + js-string-escape "^1.0.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" + well-known-symbols "^2.0.0" + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -4601,7 +5299,7 @@ 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== -conventional-changelog-angular@^5.0.3: +conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.3: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== @@ -4609,6 +5307,15 @@ conventional-changelog-angular@^5.0.3: compare-func "^2.0.0" q "^1.5.1" +conventional-changelog-conventionalcommits@^4.3.1: + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + conventional-changelog-core@^3.1.6: version "3.2.3" resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" @@ -4657,7 +5364,7 @@ conventional-commits-filter@^2.0.2, conventional-commits-filter@^2.0.7: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.3: +conventional-commits-parser@^3.0.3, conventional-commits-parser@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== @@ -4690,6 +5397,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4717,6 +5429,18 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + core-js-compat@^3.21.0, core-js-compat@^3.22.1: version "3.22.8" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.8.tgz#46fa34ce1ddf742acd7f95f575f66bbb21e05d62" @@ -4735,6 +5459,14 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig-typescript-loader@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.1.tgz#5622bb1eb87d293570bcc3a57f406940e0960113" + integrity sha512-B9s6sX/omXq7I6gC6+YgLmrBFMJhPWew7ty/X5Tuwtd2zOSgWaUdXjkuVwbe3qqcdETo60+1nSVMekq//LIXVA== + dependencies: + cosmiconfig "^7" + ts-node "^10.8.0" + cosmiconfig@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -4745,7 +5477,39 @@ cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cross-spawn@^6.0.0: +cosmiconfig@^7, cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -4756,7 +5520,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4846,6 +5610,11 @@ dargs@^4.0.1: dependencies: number-is-nan "^1.0.0" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4862,12 +5631,19 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== + dependencies: + time-zone "^1.0.0" + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4881,14 +5657,14 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.0: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4930,6 +5706,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +"decrypt@github:standardnotes/decrypt#master": + version "1.1.4" + resolved "https://codeload.github.com/standardnotes/decrypt/tar.gz/83e11f45c1461a7a1bde5a8bbc1ada4c4c712797" + dependencies: + "@standardnotes/sncrypto-web" "^1.6.1" + "@standardnotes/snjs" "^2.41.1" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5004,6 +5787,20 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5067,6 +5864,21 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -5081,6 +5893,34 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dmg-builder@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.0.3.tgz#ea94bc76fcd94612641580f3c6ae42c3f07f3fee" + integrity sha512-mBYrHHnSM5PC656TDE+xTGmXIuWHAGmmRfyM+dV0kP+AxtwPof4pAXNQ8COd0/exZQ4dqf72FiPS3B9G9aB5IA== + dependencies: + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.9" + +dmg-license@^1.0.9: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + dnd-core@^16.0.1: version "16.0.1" resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-16.0.1.tgz#a1c213ed08961f6bd1959a28bb76f1a868360d19" @@ -5187,11 +6027,21 @@ dot-prop@^5.1.0, dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + dotenv@^16.0.0: version "16.0.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== +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" @@ -5237,11 +6087,102 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-builder@23.0.3: + version "23.0.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.0.3.tgz#16264a0d8e3d40da1467bcc8ef7917538b54a3bc" + integrity sha512-0lnTsljAgcOMuIiOjPcoFf+WxOOe/O04hZPgIvvUBXIbz3kolbNu0Xdch1f5WuQ40NdeZI7oqs8Eo395PcuGHQ== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + dmg-builder "23.0.3" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" + +electron-log@^4.4.6: + version "4.4.7" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.7.tgz#d55b7232c019521694c3503d2109e5a49cb49dd0" + integrity sha512-uFZQdgevOp9Fn5lDOrJMU/bmmYxDLZitbIHJM7VXN+cpB59ZnPt1FQL4bOf/Dl2gaIMPYJEfXx38GvJma5iV6A== + +electron-notarize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.1.tgz#347c18eca8e29dddadadee511b870c13d4008baf" + integrity sha512-u/ECWhIrhkSQpZM4cJzVZ5TsmkaqrRo5LDC/KMbGF0sPkm53Ng59+M0zp8QVaql0obfJy9vlVT+4iOkAi2UDlA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.0.2: + version "23.0.2" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.0.2.tgz#aa11419ae57b847df4beb63b95e2b2a43161957c" + integrity sha512-8gMYgWqv96lc83FCm85wd+tEyxNTJQK7WKyPkNkO8GxModZqt1GO8S+/vAnFGxilS/7vsrVRXFfqiCDUCSuxEg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + electron-to-chromium@^1.4.118: version "1.4.146" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz#fd20970c3def2f9e6b32ac13a2e7a6b64e1b0c48" integrity sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg== +electron-updater@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-5.0.1.tgz#327915f1b2e573daf1ce1d8102bcab93f4880c1a" + integrity sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg== + dependencies: + "@types/semver" "^7.3.6" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + lodash.escaperegexp "^4.1.2" + lodash.isequal "^4.5.0" + semver "^7.3.5" + +electron@17.4.2: + version "17.4.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-17.4.2.tgz#fb5226100fc3f5d6e319ccad7fa462bf15ee0d94" + integrity sha512-SEf0Tsc1GjCccdsmrEtT51DeaF48ZUa711ekVCmVczn40WvKaqQu7M0SB3c/qRLRQyek/Qyi56zpcoOkjJ8L0Q== + dependencies: + "@electron/get" "^1.13.0" + "@types/node" "^14.6.2" + extract-zip "^1.0.3" + +emittery@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.11.0.tgz#eb5f756a200d3431de2c6e850cb2d8afd97a03b9" + integrity sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -5267,7 +6208,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.2: +encodeurl@^1.0.2, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -5381,6 +6322,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5408,6 +6354,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -5440,6 +6391,61 @@ eslint-config-prettier@^8.5.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + eslint-plugin-prettier@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" @@ -5447,6 +6453,11 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" +eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== + eslint-plugin-react-hooks@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" @@ -5488,6 +6499,13 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -5495,6 +6513,11 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -5505,7 +6528,7 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.13.0: +eslint@^8.13.0, eslint@^8.14.0: version "8.17.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== @@ -5584,7 +6607,7 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -esutils@^2.0.2: +esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -5760,6 +6783,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.0.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5775,7 +6808,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: +fast-diff@^1.1.2, fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== @@ -5792,7 +6825,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -5844,6 +6877,13 @@ fb-watchman@^2.0.0: 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" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -5856,6 +6896,14 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/figures/-/figures-4.0.1.tgz#27b26609907bc888b3e3b0ef5403643f80aa2518" + integrity sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w== + dependencies: + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5863,6 +6911,29 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + integrity sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA== + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -5907,7 +6978,7 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -5923,7 +6994,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== @@ -5945,6 +7016,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -5973,7 +7052,7 @@ focus-lock@^0.11.2: dependencies: tslib "^2.0.3" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9: version "1.15.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== @@ -5997,6 +7076,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + 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" @@ -6036,6 +7124,15 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + 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" @@ -6045,6 +7142,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.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== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -6269,6 +7376,17 @@ git-raw-commits@2.0.0: split2 "^2.0.0" through2 "^2.0.0" +git-raw-commits@^2.0.0: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" @@ -6339,7 +7457,7 @@ 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.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +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.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6374,6 +7492,25 @@ glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + global-dirs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" @@ -6381,6 +7518,16 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6393,7 +7540,14 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" -globby@^11.0.4, globby@^11.1.0: +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6405,6 +7559,29 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + +globby@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.1.tgz#7c44a93869b0b7612e38f22ed532bfe37b25ea6f" + integrity sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + globby@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -6450,6 +7627,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -6589,7 +7771,7 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: +hosted-git-info@^4.0.1, hosted-git-info@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== @@ -6798,6 +7980,14 @@ husky@^7.0.4: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6824,7 +8014,7 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6834,6 +8024,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== +ignore-by-default@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.1.0.tgz#c0e0de1a99b6065bdc93315a6f728867981464db" + integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== + ignore-walk@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -6853,7 +8048,7 @@ ignore@^4.0.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: +ignore@^5.1.1, ignore@^5.1.9, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -6917,6 +8112,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -7024,6 +8224,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +irregular-plurals@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" + integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -7082,6 +8287,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -7138,6 +8350,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-error@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" + integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -7253,6 +8470,16 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-object@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -7285,6 +8512,11 @@ is-potential-custom-element-name@^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-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -7348,6 +8580,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unicode-supported@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz#f4f54f34d8ebc84a46b93559a036763b6d3e1014" + integrity sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -7382,6 +8619,18 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7446,6 +8695,16 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jest-changed-files@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" @@ -7861,12 +9120,17 @@ js-base64@^2.4.3: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@^3.13.1, js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -7976,11 +9240,18 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.2, json5@^2.2.1: +json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7988,6 +9259,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonlines@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/jsonlines/-/jsonlines-0.1.1.tgz#4fcd246dc5d0e38691907c44ab002f782d1d94cc" @@ -8097,6 +9377,11 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" +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== + lerna@^3.22.1: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -8238,6 +9523,11 @@ load-json-file@^5.3.0: strip-bom "^3.0.0" type-fest "^0.3.0" +load-json-file@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -8282,6 +9572,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.1.tgz#8e1e5a75c7343770cef02ff93c4bf1f0aa666374" + integrity sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg== + dependencies: + p-locate "^6.0.0" + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -8297,6 +9594,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -8312,6 +9614,11 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -8382,7 +9689,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.1, lodash@^4.7.0, lodash@~4.17.10: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.1, 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== @@ -8429,6 +9736,14 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -8475,7 +9790,7 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -8548,6 +9863,13 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -8575,11 +9897,40 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== + dependencies: + escape-string-regexp "^5.0.0" + +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== + dependencies: + blueimp-md5 "^2.10.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +mem@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^4.0.0" + memfs@^3.4.3: version "3.4.4" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.4.tgz#e8973cd8060548916adcca58a248e7805c715e89" @@ -8587,6 +9938,11 @@ memfs@^3.4.3: dependencies: fs-monkey "1.0.3" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -8653,7 +10009,7 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: +merge-descriptors@1.0.1, merge-descriptors@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== @@ -8705,7 +10061,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -8717,6 +10073,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -8754,6 +10115,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -8921,7 +10289,7 @@ mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.1, mkdirp@^0.5.5: +mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -8943,6 +10311,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +module-not-found-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + integrity sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -8965,7 +10338,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -9067,6 +10440,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + node-fetch-npm@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" @@ -9152,6 +10530,11 @@ node-sass@^7.0.1: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -9254,6 +10637,14 @@ npm-check-updates@^12.5.9: update-notifier "^5.1.0" yaml "^1.10.2" +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + npm-install-checks@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" @@ -9350,6 +10741,21 @@ npm-registry-fetch@^13.0.1: npm-package-arg "^9.0.1" proc-log "^2.0.0" +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -9612,6 +11018,11 @@ os-name@^3.1.0: macos-release "^2.2.0" windows-release "^3.1.0" +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== + os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -9630,6 +11041,18 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -9656,6 +11079,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -9684,6 +11114,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" @@ -9703,6 +11140,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.4.0.tgz#59b1b931b8c832b5ee5a5cf7274d031e8f4f1624" + integrity sha512-obHraaWkwl4y1NHR4vW5D5k+33+S5QrkFqsNrrvK0R7lilXdzo/DZgnloDvYUaRT+Sk6vVK47JUQMQY6cjPMXg== + dependencies: + aggregate-error "^4.0.0" + p-pipe@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" @@ -9728,6 +11172,11 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -9841,6 +11290,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + parse-path@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" @@ -9906,6 +11360,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -9957,6 +11416,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -9972,6 +11436,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + pidtree@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" @@ -10009,6 +11478,14 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pkg-conf@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== + dependencies: + find-up "^6.0.0" + load-json-file "^7.0.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -10023,6 +11500,21 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +plist@^3.0.1, plist@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" + integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +plur@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== + dependencies: + irregular-plurals "^3.3.0" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -10078,6 +11570,15 @@ postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" +pre-push@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/pre-push/-/pre-push-0.1.2.tgz#185bbde6e8dfe2ab6dff937b674f0cbfc5a98295" + integrity sha512-WymiU20I3W1yGV4VEqa+xOqaqGHYUz49R4ARvEdmYPgL07E/Gn7NLewI9k5g6KUc2EOaWE42rBb7nfVKYtkpCA== + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10122,6 +11623,13 @@ pretty-format@^27.0.0, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + proc-log@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" @@ -10207,6 +11715,20 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxyquire@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" + integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.1" + resolve "^1.11.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -10443,6 +11965,17 @@ read-cmd-shim@^1.0.1: dependencies: graceful-fs "^4.1.2" +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 "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + read-package-json-fast@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" @@ -10658,7 +12191,7 @@ regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: +regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -10799,6 +12332,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -10809,10 +12347,12 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" resolve-url@^0.2.1: version "0.2.1" @@ -10824,7 +12364,7 @@ resolve.exports@^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.14.2, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -10908,6 +12448,18 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -10963,6 +12515,13 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sass-graph@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-4.0.0.tgz#fff8359efc77b31213056dfd251d05dadc74c613" @@ -10981,6 +12540,11 @@ sass-loader@^12.6.0: klona "^2.0.4" neo-async "^2.6.2" +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -11004,7 +12568,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -11043,6 +12607,11 @@ selfsigned@^2.0.1: dependencies: node-forge "^1" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -11065,14 +12634,14 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@7.3.7, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -11096,6 +12665,13 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -11182,6 +12758,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -11211,6 +12792,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -11242,7 +12828,7 @@ slide@^1.1.6: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.1.0, smart-buffer@^4.2.0: +smart-buffer@^4.0.2, smart-buffer@^4.1.0, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -11351,7 +12937,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.19, source-map-support@^0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20: 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== @@ -11384,6 +12970,14 @@ spawn-please@^1.0.0: resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-1.0.0.tgz#51cf5831ba2bf418aa3ec2102d40b75cfd48b6f2" integrity sha512-Kz33ip6NRNKuyTRo3aDWyWxeGeM0ORDO552Fs6E1nj4pLWPkl37SrRtTnq+MEopVaqgmaO6bAvVS+v64BJ5M/A== +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -11466,6 +13060,11 @@ split@^1.0.0: dependencies: through "2" +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11507,13 +13106,18 @@ ssri@^9.0.0: dependencies: minipass "^3.1.1" -stack-utils@^2.0.3: +stack-utils@^2.0.3, stack-utils@^2.0.5: 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" +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -11628,6 +13232,15 @@ string.prototype.matchall@^4.0.7: regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -11765,6 +13378,23 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supertap@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== + dependencies: + indent-string "^5.0.0" + js-yaml "^3.14.1" + serialize-error "^7.0.1" + strip-ansi "^7.0.1" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11849,6 +13479,19 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +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 "^10.0.0" + temp-write@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" @@ -11869,7 +13512,7 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: version "5.3.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== @@ -11961,11 +13604,23 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= + tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -11973,6 +13628,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + 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" @@ -12083,6 +13745,13 @@ trim-newlines@^3.0.0: dependencies: glob "^7.1.2" +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + ts-jest@^27.1.4: version "27.1.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" @@ -12097,7 +13766,7 @@ ts-jest@^27.1.4: semver "7.x" yargs-parser "20.x" -ts-loader@^9.2.8: +ts-loader@^9.2.8, ts-loader@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f" integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== @@ -12107,6 +13776,35 @@ ts-loader@^9.2.8: micromatch "^4.0.0" semver "^7.3.4" +ts-node@^10.7.0, ts-node@^10.8.0: + version "10.8.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -12131,6 +13829,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -12155,6 +13858,11 @@ type-detect@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" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -12215,6 +13923,11 @@ typescript@4.6.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== +typescript@^4.4.3, typescript@^4.6.4: + version "4.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== + uglify-js@^3.1.4: version "3.16.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.0.tgz#b778ba0831ca102c1d8ecbdec2d2bdfcc7353190" @@ -12311,6 +14024,11 @@ universalify@^0.1.0, universalify@^0.1.2: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -12388,6 +14106,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -12420,6 +14143,11 @@ uuid@^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-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -12470,6 +14198,15 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + 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" @@ -12654,6 +14391,11 @@ 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== +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== + whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -12708,6 +14450,13 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which@1.2.x: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= + dependencies: + isexe "^2.0.0" + which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -12809,6 +14558,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" @@ -12861,6 +14618,16 @@ xml-name-validator@^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" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "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" @@ -12881,6 +14648,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -12891,7 +14663,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== @@ -12949,7 +14721,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.2.1: +yargs@^17.0.0, yargs@^17.0.1, yargs@^17.2.1, yargs@^17.5.1: version "17.5.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== @@ -12962,7 +14734,25 @@ yargs@^17.2.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==