diff --git a/.erb/configs/.eslintrc b/.erb/configs/.eslintrc index 12060680..778b71dc 100644 --- a/.erb/configs/.eslintrc +++ b/.erb/configs/.eslintrc @@ -4,6 +4,7 @@ "global-require": "off", "import/no-dynamic-require": "off", "prettier/prettier": 0, + "no-await-in-loop": "off", "import/prefer-default-export": "off", "no-empty-function": "off", "@typescript-eslint/no-empty-function": "off", diff --git a/.erb/configs/webpack.config.renderer.dev.ts b/.erb/configs/webpack.config.renderer.dev.ts index a8d91ee8..8bcbcc73 100644 --- a/.erb/configs/webpack.config.renderer.dev.ts +++ b/.erb/configs/webpack.config.renderer.dev.ts @@ -10,6 +10,7 @@ import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; import baseConfig from './webpack.config.base'; import webpackPaths from './webpack.paths'; import checkNodeEnv from '../scripts/check-node-env'; +import { AppWindow } from "../../src/shared/models/window-manager/app-window.model" // When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's // at the dev webpack config is not accidentally run in a production environment @@ -39,6 +40,22 @@ if ( execSync('npm run postinstall'); } +const getHtmlPageOptions = (page: AppWindow): HtmlWebpackPlugin.Options => { + return { + filename: path.join(page), + template: path.join(webpackPaths.srcRendererPath, page.replace(".html", ".ejs")), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + env: process.env.NODE_ENV, + isDevelopment: process.env.NODE_ENV !== 'production', + nodeModules: webpackPaths.appNodeModulesPath, + } +} + const configuration: webpack.Configuration = { devtool: 'inline-source-map', @@ -76,14 +93,6 @@ const configuration: webpack.Configuration = { }, }, 'sass-loader', - { - loader: 'postcss-loader', - options: { - postcssOptions: { - plugins: [require('tailwindcss'), require('autoprefixer')], - }, - }, - }, ], include: /\.module\.s?(c|a)ss$/, }, @@ -96,8 +105,12 @@ const configuration: webpack.Configuration = { { loader: 'postcss-loader', options: { - postcssOptions: { - plugins: [require('tailwindcss'), require('autoprefixer')], + postcssOptions: { + plugins: + [ + require('tailwindcss'), + require('autoprefixer'), + ] }, }, }, @@ -151,33 +164,12 @@ const configuration: webpack.Configuration = { new ReactRefreshWebpackPlugin(), - new HtmlWebpackPlugin({ - filename: path.join('index.html'), - template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true, - }, - isBrowser: false, - env: process.env.NODE_ENV, - isDevelopment: process.env.NODE_ENV !== 'production', - nodeModules: webpackPaths.appNodeModulesPath, - }), + new HtmlWebpackPlugin(getHtmlPageOptions("index.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("launcher.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-map.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-playlist.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-model.html")), - new HtmlWebpackPlugin({ - filename: path.join('launcher.html'), - template: path.join(webpackPaths.srcRendererPath, 'launcher.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true, - }, - isBrowser: false, - env: process.env.NODE_ENV, - isDevelopment: process.env.NODE_ENV !== 'production', - nodeModules: webpackPaths.appNodeModulesPath, - }) ], node: { diff --git a/.erb/configs/webpack.config.renderer.prod.ts b/.erb/configs/webpack.config.renderer.prod.ts index 5e80effd..54b67a5e 100644 --- a/.erb/configs/webpack.config.renderer.prod.ts +++ b/.erb/configs/webpack.config.renderer.prod.ts @@ -14,6 +14,7 @@ import baseConfig from './webpack.config.base'; import webpackPaths from './webpack.paths'; import checkNodeEnv from '../scripts/check-node-env'; import deleteSourceMaps from '../scripts/delete-source-maps'; +import { AppWindow } from "../../src/shared/models/window-manager/app-window.model" checkNodeEnv('production'); deleteSourceMaps(); @@ -25,6 +26,23 @@ const devtoolsConfig = } : {}; + +const getHtmlPageOptions = (page: AppWindow): HtmlWebpackPlugin.Options => { + return { + filename: path.join(page), + template: path.join(webpackPaths.srcRendererPath, page.replace(".html", ".ejs")), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + env: process.env.NODE_ENV, + isDevelopment: process.env.NODE_ENV !== 'production', + nodeModules: webpackPaths.appNodeModulesPath, + } +} + const configuration: webpack.Configuration = { ...devtoolsConfig, @@ -58,14 +76,6 @@ const configuration: webpack.Configuration = { }, }, 'sass-loader', - { - loader: 'postcss-loader', - options: { - postcssOptions: { - plugins: [require('tailwindcss'), require('autoprefixer')], - }, - }, - }, ], include: /\.module\.s?(c|a)ss$/, }, @@ -78,8 +88,12 @@ const configuration: webpack.Configuration = { { loader: 'postcss-loader', options: { - postcssOptions: { - plugins: [require('tailwindcss'), require('autoprefixer')], + postcssOptions: { + plugins: + [ + require('tailwindcss'), + require('autoprefixer'), + ] }, }, }, @@ -132,29 +146,12 @@ const configuration: webpack.Configuration = { analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', }), - new HtmlWebpackPlugin({ - filename: 'index.html', - template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true, - }, - isBrowser: false, - isDevelopment: process.env.NODE_ENV !== 'production', - }), + new HtmlWebpackPlugin(getHtmlPageOptions("index.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("launcher.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-map.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-playlist.html")), + new HtmlWebpackPlugin(getHtmlPageOptions("oneclick-download-model.html")), - new HtmlWebpackPlugin({ - filename: 'launcher.html', - template: path.join(webpackPaths.srcRendererPath, 'launcher.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true, - }, - isBrowser: false, - isDevelopment: process.env.NODE_ENV !== 'production', - }) ], }; diff --git a/.eslintrc.js b/.eslintrc.js index 714be484..97c4632c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,6 +10,8 @@ module.exports = { "global-require": 0, "import/prefer-default-export": "off", "no-empty-function": "off", + "no-await-in-loop": "off", + "no-continue": "off", "@typescript-eslint/no-empty-function": "off", '@typescript-eslint/lines-between-class-members': "off", "class-methods-use-this": "off", @@ -30,7 +32,10 @@ module.exports = { "@typescript-eslint/no-throw-literal": "off", "@typescript-eslint/no-unused-expressions": "off", "no-param-reassign": "off", - "no-useless-escape": "off" + "no-useless-escape": "off", + "jsx-a11y/no-noninteractive-element-interactions": "off", + "no-async-promise-executor": "off", + "new-cap": "off" }, parserOptions: { ecmaVersion: 2020, diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/-bug--bug-report.md similarity index 93% rename from .github/ISSUE_TEMPLATE/bug_report.md rename to .github/ISSUE_TEMPLATE/-bug--bug-report.md index 430630f8..e5f00799 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/-bug--bug-report.md @@ -1,7 +1,7 @@ --- -name: Bug report +name: "[BUG] Bug report" about: Create a report to help us improve -title: "[BUG]" +title: "[BUG] : " labels: bug assignees: Zagrios diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/-feat---feature-request.md similarity index 91% rename from .github/ISSUE_TEMPLATE/feature_request.md rename to .github/ISSUE_TEMPLATE/-feat---feature-request.md index 42dd4a2f..11b2a633 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/-feat---feature-request.md @@ -1,7 +1,7 @@ --- -name: Feature request +name: "[FEAT.] Feature request" about: Suggest an idea for this project -title: "[AME]" +title: "[FEAT.] : " labels: enhancement assignees: Zagrios diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..5660f81a --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a529216..ca12ddd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [0.2.0](https://github.com/Zagrios/bs-manager/releases/tag/v0.2.0) (October 23, 2022) +### Features +- Mods management fully implementd [5c47897](https://github.com/Zagrios/bs-manager/commit/5c478979e96b14dd54a3889e551c163ece701b4a) +- Add close button in settings page #5 +- Add GitHub and contribution actions in settings page #3 +### Fixes +- Lunch Beat Saber multiple times #1 +- Placeholders and some texts not with light theme #6 +- Wrong background color when version is downloading #7 +- Add missing translations [5817260](https://github.com/Zagrios/bs-manager/commit/58172606f3f4731c90c9aa838fb89ac95458e032) +- Error when loading downloaded versions when Steam is not installed [6e07adb](https://github.com/Zagrios/bs-manager/commit/6e07adb990f78073dd68c2b9cf6209562bb4bf2b) + + ## [0.1.0](https://github.com/Zagrios/bs-manager/releases/tag/v0.1.0) (September 19, 2022) -* Initial public release \ No newline at end of file +- Initial public release \ No newline at end of file diff --git a/assets/images/gifs/yuruyuri-dance.gif b/assets/images/gifs/yuruyuri-dance.gif new file mode 100644 index 00000000..03524548 Binary files /dev/null and b/assets/images/gifs/yuruyuri-dance.gif differ diff --git a/assets/images/third-party-icons/beast-saber.png b/assets/images/third-party-icons/beast-saber.png new file mode 100644 index 00000000..07e7a144 Binary files /dev/null and b/assets/images/third-party-icons/beast-saber.png differ diff --git a/assets/images/third-party-icons/beat-saver.png b/assets/images/third-party-icons/beat-saver.png new file mode 100644 index 00000000..0b48bdd8 Binary files /dev/null and b/assets/images/third-party-icons/beat-saver.png differ diff --git a/assets/images/third-party-icons/model-saber.svg b/assets/images/third-party-icons/model-saber.svg new file mode 100644 index 00000000..55d4a34f --- /dev/null +++ b/assets/images/third-party-icons/model-saber.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/third-party-icons/score-saber.png b/assets/images/third-party-icons/score-saber.png new file mode 100644 index 00000000..55dec558 Binary files /dev/null and b/assets/images/third-party-icons/score-saber.png differ diff --git a/assets/jsons/bs-versions.json b/assets/jsons/bs-versions.json index e998bc2c..4a469a76 100644 --- a/assets/jsons/bs-versions.json +++ b/assets/jsons/bs-versions.json @@ -477,5 +477,37 @@ "ReleaseImg": "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/clans//32055887/82c29d674bc57596102a6b815f66e956f217e658.png", "ReleaseDate": "1661864214", "year": "2022" + }, + { + "BSVersion": "1.25.0", + "BSManifest": "4529582051007915041", + "ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/3312985013538143172", + "ReleaseImg": "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/clans//32055887/54ac649877eca25a2a6449662337e2c63c51bbcf.png", + "ReleaseDate": "1665068529", + "year": "2022" + }, + { + "BSVersion": "1.25.1", + "BSManifest": "7372469314660649150", + "ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/5346361068670142187", + "ReleaseImg": "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/clans//32055887/52cbd15b5e226f509e051565f6e4935eb0e44e2c.png", + "ReleaseDate": "1665673269", + "year": "2022" + }, + { + "BSVersion": "1.26.0", + "BSManifest": "3634450655207470002", + "ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/3414318646334948892", + "ReleaseImg": "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/clans//32055887/d18ad9d7f45a5cc2a467d75f0bdf9d32b9141b14.png", + "ReleaseDate": "1667923560", + "year": "2022" + }, + { + "BSVersion": "1.27.0", + "BSManifest": "3485516174915301618", + "ReleaseURL": "https://steamcommunity.com/games/620980/announcements/detail/3629368753553708497", + "ReleaseImg": "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/clans//32055887/d9ed8771498be7fc83721aaaaa5b15a08fbeadb1.png", + "ReleaseDate": "1670943003", + "year": "2022" } ] \ No newline at end of file diff --git a/assets/jsons/patreons.json b/assets/jsons/patreons.json index 0637a088..33f993f2 100644 --- a/assets/jsons/patreons.json +++ b/assets/jsons/patreons.json @@ -1 +1,3 @@ -[] \ No newline at end of file +[ + {"username": "Shidorien"} +] \ No newline at end of file diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 3f573cf1..fa86f981 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -1,279 +1,625 @@ { - "misc":{ - "download": "Download", - "verify": "Verify", - "launch": "Launch", - "mods": "Mods", - "maps": "Maps", - "cancel": "Cancel" - }, - "pages":{ - "version-viewer":{ - "launch-mods":{ - "oculus": "Oculus Mod", - "desktop": "Desktop Mod", - "debug": "Debug Mod" - }, - "dropdown":{ - "open-folder": "Open folder", - "verify-files": "Verify files", - "clone": "Clone", - "edit": "Edit", - "uninstall": "Uninstall" - } - }, - "available-versions":{ - "title": "Select a version", - "steam-release":"Release page" - }, - "settings":{ - "steam":{ - "title":"Steam", - "description":"If you log out of Steam, you will have to log back in to download a new version of Beat Saber.", - "logout":"Log out" - }, - "appearance":{ - "title":"Appearance", - "description":"Choose the two main colours of BSManager.", - "reset":"Reset", - "sub-title":"Theme", - "themes":{ - "dark":"Dark", - "light": "Light", - "os": "Sync with computer" - } - }, - "installation-folder":{ - "title":"Installation folder", - "description":"Change the default folder for Beat Saber versions and other upcoming features.", - "choose-folder":"Choose folder" - }, - "language":{ - "title":"Language", - "description":"Select a language.", - "languages":{ - "en-EN": "English, UK", - "en-US": "English, US", - "fr-FR": "Français", - "es-ES": "Español", - "translated":{ - "en-EN": "English, United Kingdom", - "en-US": "English, USA", - "fr-FR": "French", - "es-ES": "Spanish" - } - } - }, - "patreon":{ - "title":"Support BSManager 💖", - "description": "Support the project and help us to provide continuous improvements to BSManager.", - "buttons":{ - "support": "Support BSManager", - "supporters":"Supporters 👀" - } - - } - } - }, - "notifications":{ - "types":{ - "error": "🚨 Error", - "warning": "⚠️ Warning", - "success": "🎉 Success" - }, - "shared":{ - "errors":{ - "titles":{ - "operation-running": "Operation running" + "misc": { + "download": "Download", + "verify": "Verify", + "launch": "Launch", + "mods": "Mods", + "maps": "Maps", + "playlists": "Playlists", + "models": "Models", + "cancel": "Cancel", + "delete": "Delete" + }, + "pages": { + "version-viewer": { + "launch-mods": { + "oculus": "Oculus Mod", + "desktop": "Desktop Mod", + "debug": "Debug Mod" }, - "msg":{ - "operation-running": "Wait for the end of the current operation then start again." + "maps": { + "search-bar": { + "search-placeholder": "Search a map", + "filters-btn": "Filters", + "dropdown": { + "export-maps": "Export maps", + "delete-maps": "Delete maps" + } + }, + "tabs": { + "maps": { + "actions": { + "add-maps": { + "text": "Add" + }, + "link-maps": { + "tooltips": { + "link": "Link maps", + "unlink": "Unling maps" + } + } + }, + "empty-maps":{ + "text":"No maps", + "button":"Download maps" + } + } + } + }, + "mods": { + "loading-mods": "Loading mods...", + "buttons": { + "more-infos": "More info", + "install-or-update": "Install or update" + }, + "mods-grid": { + "header-bar": { + "name": "Name", + "installed": "Installed", + "latest": "Latest", + "description": "Description", + "dropdown": { + "uninstall-all": "Uninstall all" + } + } + } + }, + "dropdown": { + "open-folder": "Open folder", + "verify-files": "Verify files", + "clone": "Clone", + "edit": "Edit", + "uninstall": "Uninstall" + } + }, + "available-versions": { + "title": "Select a version", + "steam-release": "Release page" + }, + "settings": { + "steam": { + "title": "Steam", + "description": "If you log out of Steam, you will have to log back in to download a new version of Beat Saber.", + "logout": "Log out" + }, + "appearance": { + "title": "Appearance", + "description": "Choose the two main colours of BSManager.", + "reset": "Reset", + "sub-title": "Theme", + "themes": { + "dark": "Dark", + "light": "Light", + "os": "Sync with computer" + } + }, + "installation-folder": { + "title": "Installation folder", + "description": "Change the default folder for Beat Saber versions and other upcoming features.", + "choose-folder": "Choose folder" + }, + "additional-content": { + "title": "Additional content", + "description": "Additional content allows you to customize BeatSaber!", + "deep-links": { + "sub-title": "OneClick installations" + } + }, + "language": { + "title": "Language", + "description": "Select a language.", + "languages": { + "en-EN": "English, UK", + "en-US": "English, US", + "fr-FR": "Français", + "es-ES": "Español", + "translated": { + "en-EN": "English, United Kingdom", + "en-US": "English, USA", + "fr-FR": "French", + "es-ES": "Spanish" + } + } + }, + "patreon": { + "title": "Support BSManager 💖", + "description": "Support the project and help us to provide continuous improvements to BSManager.", + "buttons": { + "support": "Support BSManager", + "supporters": "Supporters 👀" + }, + "view": { + "no-supporters": "No supporter yet", + "sponsors": "Sponsors", + "supporters": "Supporters" + } + }, + "contribution": { + "description": "Suggest new features or report a bug to help improve BSManager!", + "buttons": { + "request-features": "Request a feature", + "report-bug": "Report a bug", + "open-logs": "Open logs" + } } } - }, - "bs-download":{ - "success":{ - "titles":{ - "download-success": "Download complete", - "verification-finished":"Verification complete" + }, + "notifications": { + "types": { + "error": "🚨 Error", + "warning": "⚠️ Warning", + "success": "🎉 Success" + }, + "common": { + "msg": { + "error-occurred": "An error has occurred" } - }, - "warnings":{ - "msg":{ - "ManifestChecksum": "The previously downloaded manifest does not match the new 🤔", - "ConnectionTimeout": "Your internet connection seems unstable 🥶", - "ConnectionLost": "The connection has been lost, try again...", - "ConnectionError": "Unable to connect to Steam, retry...", - "Unknown": "Something strange has happened 🤔 Your connection is probably unstable." + }, + "shared": { + "errors": { + "titles": { + "operation-running": "Operation running" + }, + "msg": { + "operation-running": "Wait for the end of the current operation then start again." + } } - }, - "errors":{ - "msg":{ - "Password": "Password is invalid.", - "InvalidCredentials": "Your e-mail or password is invalid 😴", - "InvalidPassword": "Your password is invalid 😕", - "NoManifest": "No manifest was found", - "DirectoryCreate": "Unable to install the necessary folders.", - "NotAvailableApp": "Are you trying to download BeatSaber when you don't have it ? 🤣", - "DepotNotFound": "Unable to download BeatSaber 😥 try again later 😕", - "NotCompleted": "The download could not complete ¯\\_(ツ)_/¯", - "InvalidManifest": "Unable to download BeatSaber 😥 try again later 😕", - "NoValidKey": "Unable to download BeatSaber 😥 try again later 😕", - "NoManifestCode": "Unable to download BeatSaber 😥 try again later 😕", - "401": "Steam doesn't seem to want to let us download BeatSaber 😢", - "404": "Unable to contact Steam servers.", - "Unknown": "An unknown error occurred ¯\\_(ツ)_/¯", - "NoServer": "Unable to contact Steam servers.", - "NotAllowed": "Apparently you are not allowed to download BeatSaber 🥱", - "ConnectionTimeout": "Cannot connect to Steam 😕", - "SteamLib": "If you have this error, report the bug on GitHub with the logs pls.", - "ConnectionError": "Unable to connect to Steam after 10 tries 🤯", - "LicenceError": "Unable to get the list of licenses.", - "verification-failed": "Verification failed, try again later.", - "RateLimitExceeded": "You've tried too many times, wait a while and try again later.", - "AlreadyDownloading": "A download is already in progress", - "no-internet": "No internet connection." - } - } - }, - "settings":{ - "move-folder":{ - "success":{ - "titles":{ - "transfer-finished":"Transfer complete" - } + }, + "bs-download": { + "success": { + "titles": { + "download-success": "Download complete", + "verification-finished": "Verification complete" + } }, - "errors":{ - "titles":{ - "transfer-failed":"Transfer failed 😕" - } - } - }, - "steam":{ - "success":{ - "titles":{ - "logout": "Disconnected from Steam." - } - } - } - }, - "bs-launch":{ - "success":{ - "titles":{ - "launching": "Launching...🚀" - } - }, - "errors":{ - "titles":{ - "UNABLE_TO_LAUNCH": "Unable to launch", - "STEAM_NOT_RUNNING": "Steam is not running", - "BS_ALREADY_RUNNING": "BeatSaber already running", - "EXE_NOT_FINDED": "Missing files", - "EXIT": "Abrupt stop" + "warnings": { + "msg": { + "ManifestChecksum": "The previously downloaded manifest does not match the new 🤔", + "ConnectionTimeout": "Your internet connection seems unstable 🥶", + "ConnectionLost": "The connection has been lost, try again...", + "ConnectionError": "Unable to connect to Steam, retry...", + "Unknown": "Something strange has happened 🤔 Your connection is probably unstable." + } }, - "msg":{ - "STEAM_NOT_RUNNING": "Steam must be running to launch BeatSaber.", - "BS_ALREADY_RUNNING": "Close BeatSaber before launching it again.", - "EXE_NOT_FINDED": "Some files seem to be missing, try to verify the files.", - "EXIT": "BeatSaber stopped abruptly, tries to check the files." + "errors": { + "msg": { + "401": "Steam doesn't seem to want to let us download BeatSaber 😢", + "404": "Unable to contact Steam servers.", + "Password": "Password is invalid.", + "InvalidCredentials": "Your e-mail or password is invalid 😴", + "InvalidPassword": "Your password is invalid 😕", + "NoManifest": "No manifest was found", + "DirectoryCreate": "Unable to install the necessary folders.", + "NotAvailableApp": "Are you trying to download BeatSaber when you don't have it ? 🤣", + "DepotNotFound": "Unable to download BeatSaber 😥 try again later 😕", + "NotCompleted": "The download could not complete ¯\\_(ツ)_/¯", + "InvalidManifest": "Unable to download BeatSaber 😥 try again later 😕", + "NoValidKey": "Unable to download BeatSaber 😥 try again later 😕", + "NoManifestCode": "Unable to download BeatSaber 😥 try again later 😕", + "Unknown": "An unknown error occurred ¯\\_(ツ)_/¯", + "NoServer": "Unable to contact Steam servers.", + "NotAllowed": "Apparently you are not allowed to download BeatSaber 🥱", + "ConnectionTimeout": "Cannot connect to Steam 😕", + "SteamLib": "If you have this error, report the bug on GitHub with the logs pls.", + "ConnectionError": "Unable to connect to Steam after 10 tries 🤯", + "LicenceError": "Unable to get the list of licenses.", + "verification-failed": "Verification failed, try again later.", + "RateLimitExceeded": "You've tried too many times, wait a while and try again later.", + "AlreadyDownloading": "A download is already in progress", + "no-internet": "No internet connection." + } } - } - }, - "custom-version":{ - "errors":{ - "titles":{ - "CantEditSteam": "Unable to edit", - "CantRename": "Renaming impossible", - "VersionAlreadExist": "This version already exists", - "CantClone": "Cloning impossible" + }, + "settings": { + "move-folder": { + "success": { + "titles": { + "transfer-finished": "Transfer complete" + } + }, + "errors": { + "titles": { + "transfer-failed": "Transfer failed 😕" + } + } }, - "msg":{ - "CantEditSteam": "You can't edit the Steam version. You can clone it though." - } - }, - "success":{ - "titles":{ - "CloningFinished": "Cloning complete 🎉" - } - } - } - }, - "modals":{ - "guard":{ - "title": "Steam Guard", - "inputs":{ - "guard-code":{ - "label": "Guard Code", - "placeholder": "Enter your Guard code" - } - }, - "buttons":{ - "submit": "Login" - } - }, - "steam-login":{ - "title": "Steam Login", - "inputs":{ - "username":{ - "label": "Username", - "placeholder": "Enter your username" + "steam": { + "success": { + "titles": { + "logout": "Disconnected from Steam." + } + } }, - "password":{ - "label": "Password", - "placeholder": "Enter your password" - }, - "stay":{ - "label": "Stay connected" + "additional-content":{ + "deep-link": { + "activation":{ + "success":{ + "title":"OneClick activated!", + "description":"OneClick installations have been activated." + }, + "error":{ + "description":"Unable to activate OneClick installations." + } + }, + "deactivation":{ + "success":{ + "title":"OneClick deactivated!", + "description":"OneClick installations have been deactivated." + }, + "error":{ + "description":"An unknown error occurred." + } + } + } } - }, - "buttons":{ - "submit": "Login" - } - }, - "bs-uninstall":{ - "title": "Uninstall", - "description": "Are you sure you want to uninstall BeatSaber {version} ? You will have to download it again to play it.", - "buttons":{ - "submit": "Uninstall" - } - }, - "install-folder":{ - "title": "Installation folder", - "description": "Changing the default installation folder will result in moving all installed data to the new folder.", - "buttons":{ - "submit": "Choose folder" - } - }, - "edit-version":{ - "title": "Edit the version", - "buttons":{ - "submit": "Edit" - } - }, - "clone-version":{ - "title": "Clone version", - "description": "Cloning the version allows you to separate additional BeatSaber content between two versions.", - "buttons":{ - "submit": "Clone" - } - } - }, - "auto-update":{ - "checking": "Checking for updates", - "downloading": "Downloading updates" - }, - "dateformat":{ + }, + "bs-launch": { + "success": { + "titles": { + "launching": "Launching...🚀" + } + }, + "errors": { + "titles": { + "UNABLE_TO_LAUNCH": "Unable to launch", + "STEAM_NOT_RUNNING": "Steam is not running", + "OCULUS_NOT_RUNNING": "Oculus is not running", + "BS_ALREADY_RUNNING": "BeatSaber already running", + "EXE_NOT_FINDED": "Missing files", + "EXIT": "Abrupt stop" + }, + "msg": { + "STEAM_NOT_RUNNING": "Steam must be running to launch BeatSaber.", + "OCULUS_NOT_RUNNING": "Oculus must be running to launch BeatSaber.", + "BS_ALREADY_RUNNING": "Close BeatSaber before launching it again.", + "EXE_NOT_FINDED": "Some files seem to be missing, try to verify the files.", + "EXIT": "BeatSaber stopped abruptly, tries to check the files." + }, + "actions":{ + "STEAM_NOT_RUNNING": "Launch Steam" + } + } + }, + "steam":{ + "steam-launching":{ + "title": "Steam is launching!", + "description": "Steam may take some time to launch depending on your configuration." + } + }, + "custom-version": { + "errors": { + "titles": { + "CantEditSteam": "Unable to edit", + "CantRename": "Renaming impossible", + "VersionAlreadExist": "This version already exists", + "CantClone": "Cloning impossible" + }, + "msg": { + "CantEditSteam": "You can't edit the Steam version. You can clone it though." + } + }, + "success": { + "titles": { + "CloningFinished": "Cloning complete 🎉" + } + } + }, + "mods": { + "install-mods": { + "titles": { + "success": "Mods installed 🎉", + "warning": "Mods installed 🤔" + }, + "msg": { + "success": "All mods have been installed.", + "warning": "One or more mods could not be installed.", + "errors": { + "no-mods": "No mods to install.", + "cannot-install-bsipa": "BSIPA installation failed 😨" + } + } + }, + "uninstall-mod": { + "titles": { + "success": "Mod uninstalled 🎉" + }, + "msg": { + "errors": { + "no-mods": "This mod isn't installed 😑" + } + } + }, + "uninstall-all-mods": { + "titles": { + "success": "Mods uninstalled 🎉" + }, + "msg": { + "success": "All mods have been uninstalled.", + "errors": { + "no-mods": "No mod is installed in this version 😑" + } + } + } + }, + "maps":{ + "one-click-install":{ + "success":"Map installation complete", + "error":"An error occurred while installing the map" + } + }, + "playlists":{ + "one-click-install":{ + "success":"Playlist installation complete", + "error":"An error occurred while installing the playlist" + } + }, + "models":{ + "one-click-install":{ + "success":"Model installation complete", + "error":"An error occurred while installing the model" + } + } + }, + "modals": { + "guard": { + "title": "Steam Guard", + "inputs": { + "guard-code": { + "label": "Guard Code", + "placeholder": "Enter your Guard code" + } + }, + "buttons": { + "submit": "Login" + } + }, + "steam-login": { + "title": "Steam Login", + "inputs": { + "username": { + "label": "Username", + "placeholder": "Enter your username" + }, + "password": { + "label": "Password", + "placeholder": "Enter your password" + }, + "stay": { + "label": "Stay connected" + } + }, + "buttons": { + "submit": "Login" + } + }, + "bs-uninstall": { + "title": "Uninstall", + "description": "Are you sure you want to uninstall BeatSaber {version} ? You will have to download it again to play it.", + "buttons": { + "submit": "Uninstall" + } + }, + "install-folder": { + "title": "Installation folder", + "description": "Changing the default installation folder will result in moving all installed data to the new folder.", + "buttons": { + "submit": "Choose folder" + } + }, + "edit-version": { + "title": "Edit the version", + "buttons": { + "submit": "Edit" + } + }, + "clone-version": { + "title": "Clone version", + "description": "Cloning the version allows you to separate additional BeatSaber content between two versions.", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Version name" + }, + "color": { + "label": "Color" + } + }, + "buttons": { + "submit": "Clone" + } + }, + "uninstall-mod": { + "title": "Uninstall", + "description": "Are you sure you want to uninstall {mod}? It could cause other installed mods to malfunction.", + "description-bsipa": "Are you sure you want to uninstall BSIPA? After that all installed mods will not work anymore." + }, + "uninstall-all-mods": { + "title": "Uninstalling mods", + "description": "Are you sure you want to uninstall all the mods from version {version}? This operation cannot be undone." + }, + "maps-actions": { + "delete-maps": { + "title": { + "single": "Delete the map?", + "multiple": "Delete maps ?" + }, + "desc": { + "single": "Are you sure you want to delete the map {name}?", + "multiple": "Are you sure you want to delete all {nb} maps?" + }, + "info": { + "desc": { + "single": "This map is part of the shared maps", + "multiple": "These maps are part of the shared maps" + }, + "title": { + "single": "This map will also be removed from versions using shared maps", + "multiple": "These maps will also be removed from versions using shared maps" + } + } + }, + "link-maps": { + "title": "Link maps", + "desc": "Linking maps allows to share maps between all versions. Once linked, this version will benefit from the shared maps", + "info": "Adding and deleting maps will also be shared", + "keep-maps": { + "label": "Keep maps", + "title": "Keep maps will move the maps of the current version to the shared maps folder. Otherwise they will be lost" + }, + "valid-btn": "Link maps" + }, + "unlink-maps": { + "title": "Unlink maps", + "desc": "Please note that unlinking maps will not allow the use of shared maps for this version.", + "keep-maps": { + "label": "Keep maps", + "title": "Keeping the maps will create a copy of the shared maps for the current version. Otherwise, no map will be kept for this version." + }, + "valid-btn": "Unlink maps" + } + }, + "download-maps": { + "search-btn": "Search", + "loading-maps": "Loading maps..." + } + }, + "maps": { + "map-filter-panel": { + "duration": "Duration", + "tags": "tags", + "specificities": "general", + "requirements": "requirements" + }, + "map-types": { + "accuracy": "accuracy", + "balanced": "balanced", + "challenge": "challenge", + "dancestyle": "dance", + "fitness": "fitness", + "speed": "speed", + "tech": "tech" + }, + "map-styles": { + "dance": "dance", + "swing": "swing", + "nightcore": "nightcore", + "folk": "folk", + "family": "family", + "ambient": "ambient", + "funk": "funk", + "jazz": "jazz", + "soul": "soul", + "speedcore": "speedcore", + "punk": "punk", + "rb": "r&b", + "holiday": "holiday", + "vocaloid": "vocaloid", + "jrock": "j-rock", + "trance": "trance", + "drumbass": "drum & bass", + "comedy": "comedy", + "instrumental": "instrumental", + "hardcore": "hardcore", + "kpop": "k-pop", + "indie": "indie", + "techno": "techno", + "house": "house", + "game": "video game", + "film": "film", + "alt": "alternative", + "dubstep": "dubstep", + "metal": "metal", + "anime": "anime", + "hiphop": "hiphop", + "jpop": "j-pop", + "rock": "rock", + "pop": "pop", + "electronic": "electronic", + "classical-orchestral": "Classical & Orchestral" + }, + "map-specificities": { + "automapper": "AI", + "ranked": "ranked", + "curated": "curated", + "verified": "verified", + "fullSpread": "full spread" + }, + "difficulties": { + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert", + "ExpertPlus": "expert+" + }, + "map-item": { + "by": "By {songAutor}", + "mapped-by": "mapped by" + } + }, + "beat-saver": { + "maps-sorts": { + "Latest": "Latest", + "Relevance": "Relevance", + "Rating": "Rating", + "Curated": "Curated" + } + }, + "auto-update": { + "checking": "Checking for updates", + "downloading": "Downloading updates" + }, + "dateformat": { "dayNames": [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" ], "monthNames": [ - "Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec", - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "June", + "Jul", + "Aug", + "Sept", + "Oct", + "Nov", + "Dec", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" ], "timeNames": [ - "a", "p", "am", "pm", "A", "P", "AM", "PM" + "a", + "p", + "am", + "pm", + "A", + "P", + "AM", + "PM" ] - } + } } \ No newline at end of file diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 5ee28177..579b8f1f 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -1,279 +1,625 @@ { - "misc":{ - "download": "Descargar", - "verify": "Verificar", - "launch": "Lanzar", - "mods": "Mods", - "maps": "Maps", - "cancel": "Cancelar" - }, - "pages":{ - "version-viewer":{ - "launch-mods":{ - "oculus": "Oculus Mod", - "desktop": "Desktop Mod", - "debug": "Debug Mod" - }, - "dropdown":{ - "open-folder": "Abrir la carpeta", - "verify-files": "Verificar los archivos", - "clone": "Clonar", - "edit": "Editar", - "uninstall": "Desinstalar" - } - }, - "available-versions":{ - "title": "Seleccione una versión", - "steam-release":"Publicación Página" - }, - "settings":{ - "steam":{ - "title":"Steam", - "description":"Si sales de Steam, tendrás que volver a entrar para descargar una nueva versión de Beat Saber.", - "logout":"Desconectar" - }, - "appearance":{ - "title":"Apariencia", - "description":"Elija los dos colores principales de BSManager.", - "reset":"Reiniciar", - "sub-title":"Tema", - "themes":{ - "dark":"Oscuro", - "light": "Claro", - "os": "Sincronizar con ordenador" + "misc": { + "download": "Descargar", + "verify": "Verificar", + "launch": "Lanzar", + "mods": "Mods", + "maps": "Mapas", + "playlists": "Playlists", + "models": "Modelos", + "cancel": "Cancelar", + "delete": "Borrar" + }, + "pages": { + "version-viewer": { + "launch-mods": { + "oculus": "Oculus Mod", + "desktop": "Desktop Mod", + "debug": "Debug Mod" + }, + "maps": { + "search-bar": { + "search-placeholder": "Buscar en un mapa", + "filters-btn": "Filtros", + "dropdown": { + "export-maps": "Exportar mapas", + "delete-maps": "Borrar mapas" + } + }, + "tabs": { + "maps": { + "actions": { + "add-maps": { + "text": "Añadir" + }, + "link-maps": { + "tooltips": { + "link": "Vincular los mapas", + "unlink": "Desatar los mapas" + } + } + }, + "empty-maps":{ + "text":"No hay mapas", + "button":"Descargar mapas" + } + } + } + }, + "mods": { + "loading-mods": "Cargando mods...", + "buttons": { + "more-infos": "Más información", + "install-or-update": "Instalar o actualizar" + }, + "mods-grid": { + "header-bar": { + "name": "Nombre", + "installed": "Instalado", + "latest": "Último", + "description": "Descripción", + "dropdown": { + "uninstall-all": "Desinstalar todos" + } + } + } + }, + "dropdown": { + "open-folder": "Abrir la carpeta", + "verify-files": "Verificar los archivos", + "clone": "Clonar", + "edit": "Editar", + "uninstall": "Desinstalar" } - }, - "installation-folder":{ - "title":"Carpeta de instalación", - "description":"Cambia la carpeta por defecto para las versiones de Beat Saber y otras características próximas.", - "choose-folder":"Elija la carpeta" - }, - "language":{ - "title":"Idioma", - "description":"Selecciona un idioma.", - "languages":{ - "en-EN": "English, UK", - "en-US": "English, US", - "fr-FR": "Français", - "es-ES": "Español", - "translated":{ - "en-EN": "Inglés, Reino Unido", - "en-US": "Inglés, Estados Unidos", - "fr-FR": "Francés", - "es-ES": "Español" - } - } - }, - "patreon":{ - "title":"Apoyo BSManager 💖", - "description": "Apoye el proyecto y ayúdenos a proporcionar mejoras continuas a BSManager.", - "buttons":{ - "support": "Apoyo BSManager", - "supporters":"Apoyos 👀" + }, + "available-versions": { + "title": "Seleccione una versión", + "steam-release": "Publicación Página" + }, + "settings": { + "steam": { + "title": "Steam", + "description": "Si sales de Steam, tendrás que volver a entrar para descargar una nueva versión de Beat Saber.", + "logout": "Desconectar" + }, + "appearance": { + "title": "Apariencia", + "description": "Elija los dos colores principales de BSManager.", + "reset": "Reiniciar", + "sub-title": "Tema", + "themes": { + "dark": "Oscuro", + "light": "Claro", + "os": "Sincronizar con ordenador" + } + }, + "installation-folder": { + "title": "Carpeta de instalación", + "description": "Cambia la carpeta por defecto para las versiones de Beat Saber y otras características próximas.", + "choose-folder": "Elija la carpeta" + }, + "additional-content": { + "title": "Contenido adicional", + "description": "¡El contenido adicional te permite personalizar BeatSaber!", + "deep-links": { + "sub-title": "Instalaciones OneClick" + } + }, + "language": { + "title": "Idioma", + "description": "Selecciona un idioma.", + "languages": { + "en-EN": "English, UK", + "en-US": "English, US", + "fr-FR": "Français", + "es-ES": "Español", + "translated": { + "en-EN": "Inglés, Reino Unido", + "en-US": "Inglés, Estados Unidos", + "fr-FR": "Francés", + "es-ES": "Español" + } + } + }, + "patreon": { + "title": "Apoyo BSManager 💖", + "description": "Apoye el proyecto y ayúdenos a proporcionar mejoras continuas a BSManager.", + "buttons": { + "support": "Apoyo BSManager", + "supporters": "Apoyos 👀" + }, + "view": { + "no-supporters": "Todavía no hay apoyos", + "sponsors": "Patrocinadores", + "supporters": "Apoyos" + } + }, + "contribution": { + "description": "¡Sugiera nuevas características o reporte un error para ayudar a mejorar BSManager!", + "buttons": { + "request-features": "Proponer una funcionalidad", + "report-bug": "Informar de un error", + "open-logs": "Abrir los registros" + } } } - } - }, - - "notifications":{ - "types":{ - "error": "🚨 Error", - "warning": "⚠️ Advertencia", - "success": "🎉 Éxito" - }, - "shared":{ - "errors":{ - "titles":{ - "operation-running": "Operación en curso" + }, + "notifications": { + "types": { + "error": "🚨 Error", + "warning": "⚠️ Advertencia", + "success": "🎉 Éxito" + }, + "common": { + "msg": { + "error-occurred": "Se ha producido un error" + } + }, + "shared": { + "errors": { + "titles": { + "operation-running": "Operación en curso" + }, + "msg": { + "operation-running": "Espere a que termine la operación actual y vuelva a empezar." + } + } + }, + "bs-download": { + "success": { + "titles": { + "download-success": "Descargar completo", + "verification-finished": "Verificación completa" + } }, - "msg":{ - "operation-running": "Espere a que termine la operación actual y vuelva a empezar." + "warnings": { + "msg": { + "ManifestChecksum": "El manifiesto descargado anteriormente no coincide con el nuevo 🤔", + "ConnectionTimeout": "Su conexión a Internet parece inestable 🥶", + "ConnectionLost": "Se ha perdido la conexión, inténtelo de nuevo...", + "ConnectionError": "No se puede conectar a Steam, reintentar...", + "Unknown": "Algo extraño ha ocurrido 🤔 Tu conexión es probablemente inestable." + } + }, + "errors": { + "msg": { + "401": "Parece que Steam no quiere dejarnos descargar BeatSaber 😢", + "404": "No se puede contactar con los servidores de Steam", + "Password": "La contraseña es inválida.", + "InvalidCredentials": "Su correo electrónico o contraseña no son válidos 😴", + "InvalidPassword": "Su contraseña no es válida 😕", + "NoManifest": "No se ha encontrado el manifiesto", + "DirectoryCreate": "No se pueden instalar las carpetas necesarias.", + "NotAvailableApp": "¿Intentas descargar BeatSaber cuando no lo tienes? 🤣", + "DepotNotFound": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", + "NotCompleted": "La descarga no pudo completarse ¯\\_(ツ)_/¯", + "InvalidManifest": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", + "NoValidKey": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", + "NoManifestCode": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", + "Unknown": "Se ha producido un error desconocido ¯\\_(ツ)_/¯", + "NoServer": "No se puede contactar con los servidores de Steam.", + "NotAllowed": "Aparentemente no tienes permiso para descargar BeatSaber 🥱", + "ConnectionTimeout": "No se puede conectar a Steam 😕", + "SteamLib": "Si tienes este error, reporta el bug en GitHub con los logs por favor.", + "ConnectionError": "No se puede conectar a Steam después de 10 intentos 🤯", + "LicenceError": "No se puede obtener la lista de licencias.", + "verification-failed": "Verificación fallida, inténtelo más tarde.", + "RateLimitExceeded": "Lo has intentado demasiadas veces, espera un poco y vuelve a intentarlo más tarde.", + "AlreadyDownloading": "La descarga ya está en curso", + "no-internet": "Sin conexión a Internet." + } + } + }, + "settings": { + "move-folder": { + "success": { + "titles": { + "transfer-finished": "Transferencia completa" + } + }, + "errors": { + "titles": { + "transfer-failed": "Transferencia fallida 😕" + } + } + }, + "steam": { + "success": { + "titles": { + "logout": "Desconectado de Steam." + } + } + }, + "additional-content":{ + "deep-link": { + "activation":{ + "success":{ + "title":"¡OneClick activado!", + "description":"Las instalaciones OneClick han sido activadas." + }, + "error":{ + "description":"No se pueden activar las instalaciones OneClick." + } + }, + "deactivation":{ + "success":{ + "title":"¡OneClick desactivado!", + "description":"Las instalaciones OneClick han sido desactivadas." + }, + "error":{ + "description":"Ocurrió un error desconocido." + } + } + } + } + }, + "bs-launch": { + "success": { + "titles": { + "launching": "Lanzamiento...🚀" + } + }, + "errors": { + "titles": { + "UNABLE_TO_LAUNCH": "No se puede lanzar", + "STEAM_NOT_RUNNING": "Steam no funciona", + "OCULUS_NOT_RUNNING": "Oculus no funciona", + "BS_ALREADY_RUNNING": "BeatSaber ya está en marcha", + "EXE_NOT_FINDED": "Archivos perdidos", + "EXIT": "Parada abrupta" + }, + "msg": { + "STEAM_NOT_RUNNING": "Para iniciar BeatSaber es necesario que Steam esté en funcionamiento.", + "OCULUS_NOT_RUNNING": "Oculus debe estar funcionando para lanzar BeatSaber.", + "BS_ALREADY_RUNNING": "Cierra BeatSaber antes de volver a lanzarlo.", + "EXE_NOT_FINDED": "Parece que faltan algunos archivos, intente verificar los archivos.", + "EXIT": "BeatSaber se detuvo abruptamente, trata de revisar los archivos." + }, + "actions":{ + "STEAM_NOT_RUNNING": "Iniciar Steam" + } + } + }, + "steam":{ + "steam-launching":{ + "title": "¡Steam se está iniciando!", + "description": "Steam puede tardar un poco en iniciarse dependiendo de tu configuración." + } + }, + "custom-version": { + "errors": { + "titles": { + "CantEditSteam": "Imposible editar", + "CantRename": "El renombramiento es imposible", + "VersionAlreadExist": "Esta versión ya existe", + "CantClone": "Clonación imposible" + }, + "msg": { + "CantEditSteam": "No puedes editar la versión de Steam. Sin embargo, puedes clonarla." + } + }, + "success": { + "titles": { + "CloningFinished": "Clonación completa 🎉" + } + } + }, + "mods": { + "install-mods": { + "titles": { + "success": "Mods instalados 🎉", + "warning": "Mods instalados 🤔" + }, + "msg": { + "success": "Todos los mods han sido instalados.", + "warning": "No se han podido instalar uno o más mods.", + "errors": { + "no-mods": "No hay que instalar mods.", + "cannot-install-bsipa": "La instalación de BSIPA falló 😨" + } + } + }, + "uninstall-mod": { + "titles": { + "success": "Mod desinstalado 🎉" + }, + "msg": { + "errors": { + "no-mods": "Este mod no está instalado 😑" + } + } + }, + "uninstall-all-mods": { + "titles": { + "success": "Mods desinstalados 🎉" + }, + "msg": { + "success": "Todos los mods han sido desinstalados.", + "errors": { + "no-mods": "No se instala ningún mod en esta versión 😑" + } + } + } + }, + "maps":{ + "one-click-install":{ + "success":"Instalación del mapa completada", + "error":"Se produjo un error durante la instalación del mapa" + } + }, + "playlists":{ + "one-click-install":{ + "success":"Instalación de la lista de reproducción completada", + "error":"Se produjo un error durante la instalación de la lista de reproducción" + } + }, + "models":{ + "one-click-install":{ + "success":"Instalación del modelo completada", + "error":"Se produjo un error durante la instalación del modelo" } } - }, - "bs-download":{ - "success":{ - "titles":{ - "download-success": "Descargar completo", - "verification-finished":"Verificación completa" - } - }, - "warnings":{ - "msg":{ - "ManifestChecksum": "El manifiesto descargado anteriormente no coincide con el nuevo 🤔", - "ConnectionTimeout": "Su conexión a Internet parece inestable 🥶", - "ConnectionLost": "Se ha perdido la conexión, inténtelo de nuevo...", - "ConnectionError": "No se puede conectar a Steam, reintentar...", - "Unknown": "Algo extraño ha ocurrido 🤔 Tu conexión es probablemente inestable." - } - }, - "errors":{ - "msg":{ - "Password": "La contraseña es inválida.", - "InvalidCredentials": "Su correo electrónico o contraseña no son válidos 😴", - "InvalidPassword": "Su contraseña no es válida 😕", - "NoManifest": "No se ha encontrado el manifiesto", - "DirectoryCreate": "No se pueden instalar las carpetas necesarias.", - "NotAvailableApp": "¿Intentas descargar BeatSaber cuando no lo tienes? 🤣", - "DepotNotFound": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", - "NotCompleted": "La descarga no pudo completarse ¯\\_(ツ)_/¯", - "InvalidManifest": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", - "NoValidKey": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", - "NoManifestCode": "No se puede descargar BeatSaber 😥 inténtalo más tarde 😕", - "401": "Parece que Steam no quiere dejarnos descargar BeatSaber 😢", - "404": "No se puede contactar con los servidores de Steam", - "Unknown": "Se ha producido un error desconocido ¯\\_(ツ)_/¯", - "NoServer": "No se puede contactar con los servidores de Steam.", - "NotAllowed": "Aparentemente no tienes permiso para descargar BeatSaber 🥱", - "ConnectionTimeout": "No se puede conectar a Steam 😕", - "SteamLib": "Si tienes este error, reporta el bug en GitHub con los logs por favor.", - "ConnectionError": "No se puede conectar a Steam después de 10 intentos 🤯", - "LicenceError": "No se puede obtener la lista de licencias.", - "verification-failed": "Verificación fallida, inténtelo más tarde.", - "RateLimitExceeded": "Lo has intentado demasiadas veces, espera un poco y vuelve a intentarlo más tarde.", - "AlreadyDownloading": "La descarga ya está en curso", - "no-internet": "Sin conexión a Internet." - } - } - }, - "settings":{ - "move-folder":{ - "success":{ - "titles":{ - "transfer-finished":"Transferencia completa" - } + }, + "modals": { + "guard": { + "title": "Steam Guard", + "inputs": { + "guard-code": { + "label": "Guard Código", + "placeholder": "Introduzca su código Guard" + } }, - "errors":{ - "titles":{ - "transfer-failed":"Transferencia fallida 😕" - } + "buttons": { + "submit": "Conéctate" } - }, - "steam":{ - "success":{ - "titles":{ - "logout": "Desconectado de Steam." - } - } - } - }, - "bs-launch":{ - "success":{ - "titles":{ - "launching": "Lanzamiento...🚀" - } - }, - "errors":{ - "titles":{ - "UNABLE_TO_LAUNCH": "No se puede lanzar", - "STEAM_NOT_RUNNING": "Steam no funciona", - "BS_ALREADY_RUNNING": "BeatSaber ya está en marcha", - "EXE_NOT_FINDED": "Archivos perdidos", - "EXIT": "Parada abrupta" + }, + "steam-login": { + "title": "Steam Conectar", + "inputs": { + "username": { + "label": "Nombre de usuario", + "placeholder": "Introduzca su nombre de usuario" + }, + "password": { + "label": "Contraseña", + "placeholder": "Introduzca su contraseña" + }, + "stay": { + "label": "Manténgase conectado" + } }, - "msg":{ - "STEAM_NOT_RUNNING": "Para iniciar BeatSaber es necesario que Steam esté en funcionamiento.", - "BS_ALREADY_RUNNING": "Cierra BeatSaber antes de volver a lanzarlo.", - "EXE_NOT_FINDED": "Parece que faltan algunos archivos, intente verificar los archivos.", - "EXIT": "BeatSaber se detuvo abruptamente, trata de revisar los archivos." + "buttons": { + "submit": "Inicio de sesión" } - } - }, - "custom-version":{ - "errors":{ - "titles":{ - "CantEditSteam": "Imposible editar", - "CantRename": "El renombramiento es imposible", - "VersionAlreadExist": "Esta versión ya existe", - "CantClone": "Clonación imposible" + }, + "bs-uninstall": { + "title": "Desinstalar", + "description": "¿Estás seguro de que quieres desinstalar BeatSaber {version}? Tendrás que descargarlo de nuevo para poder jugar.", + "buttons": { + "submit": "Desinstalar" + } + }, + "install-folder": { + "title": "Instalación Carpeta", + "description": "Al cambiar la carpeta de instalación por defecto, se moverán todos los datos instalados a la nueva carpeta.", + "buttons": { + "submit": "Elija la carpeta" + } + }, + "edit-version": { + "title": "Editar la versión", + "buttons": { + "submit": "Editar" + } + }, + "clone-version": { + "title": "Versión clonada", + "description": "La clonación de la versión le permite separar el contenido adicional de BeatSaber entre dos versiones.", + "inputs": { + "name": { + "label": "Nombre", + "placeholder": "Nombre de la versión" + }, + "color": { + "label": "Color" + } }, - "msg":{ - "CantEditSteam": "No puedes editar la versión de Steam. Sin embargo, puedes clonarla." + "buttons": { + "submit": "Clonar" } - }, - "success":{ - "titles":{ - "CloningFinished": "Clonación completa 🎉" - } - } - } - }, - "modals":{ - "guard":{ - "title": "Steam Guard", - "inputs":{ - "guard-code":{ - "label": "Guard Código", - "placeholder": "Introduzca su código Guard" - } - }, - "buttons":{ - "submit": "Conéctate" - } - }, - "steam-login":{ - "title": "Steam Conectar", - "inputs":{ - "username":{ - "label": "Nombre de usuario", - "placeholder": "Introduzca su nombre de usuario" + }, + "uninstall-mod": { + "title": "Desinstalar", + "description": "¿Estás seguro de que quieres desinstalar {mod}? Podría provocar el mal funcionamiento de otros mods instalados.", + "description-bsipa": "¿Estás seguro de que quieres desinstalar BSIPA? Después de eso, todos los mods instalados dejarán de funcionar." + }, + "uninstall-all-mods": { + "title": "Desinstalación de mods", + "description": "¿Estás seguro de que quieres desinstalar todos los mods de la versión {version}? Esta operación no se puede deshacer." + }, + "maps-actions": { + "delete-maps": { + "title": { + "single": "¿Borrar el mapa?", + "multiple": "¿Eliminar mapas?" + }, + "desc": { + "single": "¿Estás seguro de que quieres eliminar el mapa {name}?", + "multiple": "¿Seguro que quieres eliminar los {nb} mapas?" + }, + "info": { + "desc": { + "single": "Este mapa es parte de los mapas compartidos", + "multiple": "Estos mapas son parte de los mapas compartidos" + }, + "title": { + "single": "Este mapa también se eliminará de las versiones que usan mapas compartidos.", + "multiple": "Estos mapas también se eliminarán de las versiones que usan mapas compartidos." + } + } }, - "password":{ - "label": "Contraseña", - "placeholder": "Introduzca su contraseña" + "link-maps": { + "title": "Vincular mapas", + "desc": "La vinculación de mapas permite compartir mapas entre todas las versiones. Una vez vinculada, esta versión se beneficiará de los mapas compartidos", + "info": "También se compartirá la adición y eliminación de mapas.", + "keep-maps": { + "label": "Mantener mapas", + "title": "Mantener mapas moverá los mapas de la versión actual a la carpeta de mapas compartidos. De lo contrario, se perderán" + }, + "valid-btn": "Vincular mapas" }, - "stay":{ - "label": "Manténgase conectado" + "unlink-maps": { + "title": "Desvincular mapas", + "desc": "Tenga en cuenta que desvincular mapas no permitirá el uso de mapas compartidos para esta versión.", + "keep-maps": { + "label": "Mantener mapas", + "title": "Mantener los mapas creará una copia de los mapas compartidos para la versión actual. De lo contrario, no se mantendrá ningún mapa para esta versión." + }, + "valid-btn": "Desvincular mapas" } - }, - "buttons":{ - "submit": "Inicio de sesión" - } - }, - "bs-uninstall":{ - "title": "Desinstalar", - "description": "¿Estás seguro de que quieres desinstalar BeatSaber {version}? Tendrás que descargarlo de nuevo para poder jugar.", - "buttons":{ - "submit": "Desinstalar" - } - }, - "install-folder":{ - "title": "Instalación Carpeta", - "description": "Al cambiar la carpeta de instalación por defecto, se moverán todos los datos instalados a la nueva carpeta.", - "buttons":{ - "submit": "Elija la carpeta" - } - }, - "edit-version":{ - "title": "Editar la versión", - "buttons":{ - "submit": "Editar" - } - }, - "clone-version":{ - "title": "Versión clonada", - "description": "La clonación de la versión le permite separar el contenido adicional de BeatSaber entre dos versiones.", - "buttons":{ - "submit": "Clonar" - } - } - }, - "auto-update":{ - "checking": "Comprobar las actualizaciones", - "downloading": "Descargar actualizaciones" - }, - "dateformat":{ + }, + "download-maps": { + "search-btn": "buscar", + "loading-maps": "Cargando mapas..." + } + }, + "maps": { + "map-filter-panel": { + "duration": "Duración", + "tags": "tags", + "specificities": "general", + "requirements": "requisitos" + }, + "map-types": { + "accuracy": "precisión", + "balanced": "equilibrado", + "challenge": "desafío", + "dancestyle": "baile", + "fitness": "fitness", + "speed": "speed", + "tech": "tec" + }, + "map-styles": { + "dance": "baile", + "swing": "swing", + "nightcore": "nightcore", + "folk": "folk", + "family": "familia", + "ambient": "ambiente", + "funk": "funk", + "jazz": "jazz", + "soul": "soul", + "speedcore": "speedcore", + "punk": "punk", + "rb": "r&b", + "holiday": "vacaciones", + "vocaloid": "vocaloid", + "jrock": "j-rock", + "trance": "trance", + "drumbass": "drum & bass", + "comedy": "comedia", + "instrumental": "instrumental", + "hardcore": "hardcore", + "kpop": "k-pop", + "indie": "indie", + "techno": "tecno", + "house": "house", + "game": "videojuego", + "film": "film", + "alt": "alternativa", + "dubstep": "dubstep", + "metal": "metal", + "anime": "anime", + "hiphop": "hiphop", + "jpop": "j-pop", + "rock": "rock", + "pop": "pop", + "electronic": "electrónico", + "classical-orchestral": "Clásico y orquestal" + }, + "map-specificities": { + "automapper": "IA", + "ranked": "rankado", + "curated": "recomendado", + "verified": "verificado", + "fullSpread": "panel completo" + }, + "difficulties": { + "Easy": "fácil", + "Normal": "normal", + "Hard": "difícil", + "Expert": "experto", + "ExpertPlus": "experto+" + }, + "map-item": { + "by": "Por {songAutor}", + "mapped-by": "mapeado por" + } + }, + "beat-saver": { + "maps-sorts": { + "Latest": "Última", + "Relevance": "Relevancia", + "Rating": "Notas", + "Curated": "Recomendado" + } + }, + "auto-update": { + "checking": "Comprobar las actualizaciones", + "downloading": "Descargar actualizaciones" + }, + "dateformat": { "dayNames": [ - "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", - "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" + "Dom", + "Lun", + "Mar", + "Mié", + "Jue", + "Vie", + "Sáb", + "Domingo", + "Lunes", + "Martes", + "Miércoles", + "Jueves", + "Viernes", + "Sábado" ], "monthNames": [ - "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic", - "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", - "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" + "Ene", + "Feb", + "Mar", + "Abr", + "May", + "Jun", + "Jul", + "Ago", + "Sep", + "Oct", + "Nov", + "Dic", + "Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre" ], "timeNames": [ - "a", "p", "am", "pm", "A", "P", "AM", "PM" + "a", + "p", + "am", + "pm", + "A", + "P", + "AM", + "PM" ] } -} +} \ No newline at end of file diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 34377231..74cd70dc 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -1,279 +1,625 @@ { - "misc":{ - "download": "Télécharger", - "verify": "Vérifier", - "launch": "Lancer", - "mods": "Modes", - "maps": "Maps", - "cancel": "Annuler" - }, - "pages":{ - "version-viewer":{ - "launch-mods":{ - "oculus": "Mode Oculus", - "desktop": "Mode Bureau", - "debug": "Mode Debug" - }, - "dropdown":{ - "open-folder": "Ouvrir le dossier", - "verify-files": "Vérifier les fichiers", - "clone": "Cloner", - "edit": "Editer", - "uninstall": "Désinstaller" - } - }, - "available-versions":{ - "title": "Choisi une version", - "steam-release":"Notes de version" - }, - "settings":{ - "steam":{ - "title":"Steam", - "description":"Si tu te déconnectes de Steam, tu devras te reconnecter pour télécharger une nouvelle version de Beat Saber.", - "logout":"Déconnexion" - }, - "appearance":{ - "title":"Apparence", - "description":"Choisi les deux couleurs principales de BSManager.", - "reset":"Réinitialiser", - "sub-title":"Thème", - "themes":{ - "dark":"Sombre", - "light": "Clair", - "os": "Synchroniser avec l'ordinateur" - } - }, - "installation-folder":{ - "title":"Dossier d'installation", - "description":"Change le dossier par défaut pour les versions de Beat Saber et d'autres fonctionnalités à venir.", - "choose-folder":"Choisir un dossier" - }, - "language":{ - "title":"Langage", - "description":"Sélectionne un langage.", - "languages":{ - "en-EN": "English, UK", - "en-US": "English, US", - "fr-FR": "Français", - "es-ES": "Español", - "translated":{ - "en-EN": "Anglais, Royaume-Uni", - "en-US": "Anglais, États-Unis", - "fr-FR": "Français", - "es-ES": "Espagnol" - } - } - }, - "patreon":{ - "title":"Soutenir BSManager 💖", - "description": "Soutien le projet et aide-nous à fournir des améliorations continues à BSManager.", - "buttons":{ - "support": "Soutenir BSManager", - "supporters":"Supporteurs 👀" - } - - } - } - }, - "notifications":{ - "types":{ - "error": "🚨 Erreur", - "warning": "⚠️ Attention", - "success": "🎉 Succès" - }, - "shared":{ - "errors":{ - "titles":{ - "operation-running": "Opération en cours" + "misc": { + "download": "Télécharger", + "verify": "Vérifier", + "launch": "Lancer", + "mods": "Mods", + "maps": "Maps", + "playlists": "Playlists", + "models": "Modèles", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "pages": { + "version-viewer": { + "launch-mods": { + "oculus": "Mode Oculus", + "desktop": "Mode Bureau", + "debug": "Mode Debug" }, - "msg":{ - "operation-running": "Attend la fin de l'opération en cours puis recommences." + "maps": { + "search-bar": { + "search-placeholder": "Rechercher une map", + "filters-btn": "Filtres", + "dropdown": { + "export-maps": "Exporter les maps", + "delete-maps": "Supprimer les maps" + } + }, + "tabs": { + "maps": { + "actions": { + "add-maps": { + "text": "Ajouter" + }, + "link-maps": { + "tooltips": { + "link": "Lier les maps", + "unlink": "Délier les maps" + } + } + }, + "empty-maps":{ + "text":"Aucune map", + "button":"Télécharger des maps" + } + } + } + }, + "mods": { + "loading-mods": "Chargement des mods...", + "buttons": { + "more-infos": "Plus d'infos", + "install-or-update": "Installer ou mettre à jour" + }, + "mods-grid": { + "header-bar": { + "name": "Nom", + "installed": "Installé", + "latest": "Récent", + "description": "Description", + "dropdown": { + "uninstall-all": "Tout désinstaller" + } + } + } + }, + "dropdown": { + "open-folder": "Ouvrir le dossier", + "verify-files": "Vérifier les fichiers", + "clone": "Cloner", + "edit": "Editer", + "uninstall": "Désinstaller" + } + }, + "available-versions": { + "title": "Choisi une version", + "steam-release": "Notes de version" + }, + "settings": { + "steam": { + "title": "Steam", + "description": "Si tu te déconnectes de Steam, tu devras te reconnecter pour télécharger une nouvelle version de Beat Saber.", + "logout": "Déconnexion" + }, + "appearance": { + "title": "Apparence", + "description": "Choisi les deux couleurs principales de BSManager.", + "reset": "Réinitialiser", + "sub-title": "Thème", + "themes": { + "dark": "Sombre", + "light": "Clair", + "os": "Synchroniser avec l'ordinateur" + } + }, + "installation-folder": { + "title": "Dossier d'installation", + "description": "Change le dossier par défaut pour les versions de Beat Saber et d'autres fonctionnalités à venir.", + "choose-folder": "Choisir un dossier" + }, + "additional-content": { + "title": "Contenus additionnels", + "description": "Les contenus additionnels te permet de personaliser BeatSaber !", + "deep-links": { + "sub-title": "Installations OneClick" + } + }, + "language": { + "title": "Langage", + "description": "Sélectionne un langage.", + "languages": { + "en-EN": "English, UK", + "en-US": "English, US", + "fr-FR": "Français", + "es-ES": "Español", + "translated": { + "en-EN": "Anglais, Royaume-Uni", + "en-US": "Anglais, États-Unis", + "fr-FR": "Français", + "es-ES": "Espagnol" + } + } + }, + "patreon": { + "title": "Soutenir BSManager 💖", + "description": "Soutien le projet et aide-nous à fournir des améliorations continues à BSManager.", + "buttons": { + "support": "Soutenir BSManager", + "supporters": "Supporteurs 👀" + }, + "view": { + "no-supporters": "Pas encore de supporteurs", + "sponsors": "Sponsors", + "supporters": "Supporteurs" + } + }, + "contribution": { + "description": "Propose de nouvelles fonctionnalités ou signale un bug pour contribuer à l'amélioration de BSManager !", + "buttons": { + "request-features": "Proposer une fonctionnalité", + "report-bug": "Signaler un bug", + "open-logs": "Ouvrir les logs" + } } } - }, - "bs-download":{ - "success":{ - "titles":{ - "download-success": "Téléchargement terminé", - "verification-finished":"Vérification terminée" + }, + "notifications": { + "types": { + "error": "🚨 Erreur", + "warning": "⚠️ Attention", + "success": "🎉 Succès" + }, + "common": { + "msg": { + "error-occurred": "Une erreur c'est produite" } - }, - "warnings":{ - "msg":{ - "ManifestChecksum": "Le manifest télécharger précédemment ne correspond pas au nouveau 🤔", - "ConnectionTimeout": "Ta connexion internet semble instable 🥶", - "ConnectionLost": "La connexion a été perdue, retentative...", - "ConnectionError": "Impossible de se connecter à Steam, retentative...", - "Unknown": "Quelque chose d'étrange c'est produit 🤔 Votre connexion est surement instable." + }, + "shared": { + "errors": { + "titles": { + "operation-running": "Opération en cours" + }, + "msg": { + "operation-running": "Attend la fin de l'opération en cours puis recommences." + } } - }, - "errors":{ - "msg":{ - "Password": "Le mot de passe est invalide.", - "InvalidCredentials": "Ton e-mail ou mot de passe est invalide 😴", - "InvalidPassword": "Ton mot de passe est invalide 😕", - "NoManifest": "Aucun manifest n'a été trouvé.", - "DirectoryCreate": "Impossible d'installer les dossiers nécessaires.", - "NotAvailableApp": "Tu essayes de télécharger BeatSaber alors que tu ne l'as pas ? 🤣", - "DepotNotFound": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", - "NotCompleted": "Le téléchargement n'a pas pu se terminer ¯\\_(ツ)_/¯", - "InvalidManifest": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", - "NoValidKey": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", - "NoManifestCode": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", - "401": "Steam semble pas vouloir nous laisser télécharger BeatSaber 😢", - "404": "Impossible de contacter les serveurs de Steam.", - "Unknown": "Une erreur inconnue c'est produite ¯\\_(ツ)_/¯", - "NoServer": "Impossible de contacter les serveurs de Steam.", - "NotAllowed": "Apparemment tu n'es pas autorisé à télécharger BeatSaber 🥱", - "ConnectionTimeout": "Impossible de se connecter à Steam 😕", - "SteamLib": "Si tu à cette erreur, report le bug sur GitHub avec les logs stp.", - "ConnectionError": "Impossible de se connecter à Steam après 10 essais 🤯", - "LicenceError": "Impossible d'obtenir la liste des licences.", - "verification-failed": "La vérification a échoué, réessaye plus tard.", - "RateLimitExceeded": "Tu as essayé trop de fois attend un peu et recommence plus tard.", - "AlreadyDownloading": "Un téléchargement est déjà en cours", - "no-internet": "Pas de connexion internet." - } - } - }, - "settings":{ - "move-folder":{ - "success":{ - "titles":{ - "transfer-finished":"Transfert terminé 👌" - } + }, + "bs-download": { + "success": { + "titles": { + "download-success": "Téléchargement terminé", + "verification-finished": "Vérification terminée" + } }, - "errors":{ - "titles":{ - "transfer-failed":"Le transfert a échoué 😕" - } - } - }, - "steam":{ - "success":{ - "titles":{ - "logout": "Déconnecté de Steam." - } - } - } - }, - "bs-launch":{ - "success":{ - "titles":{ - "launching": "Lancement...🚀" - } - }, - "errors":{ - "titles":{ - "UNABLE_TO_LAUNCH": "Lancement impossible", - "STEAM_NOT_RUNNING": "Steam n'est pas lancé", - "BS_ALREADY_RUNNING": "BeatSaber est déjà lancé", - "EXE_NOT_FINDED": "Fichiers manquants", - "EXIT": "Arrêt brutal" + "warnings": { + "msg": { + "ManifestChecksum": "Le manifest télécharger précédemment ne correspond pas au nouveau 🤔", + "ConnectionTimeout": "Ta connexion internet semble instable 🥶", + "ConnectionLost": "La connexion a été perdue, retentative...", + "ConnectionError": "Impossible de se connecter à Steam, retentative...", + "Unknown": "Quelque chose d'étrange c'est produit 🤔 Votre connexion est surement instable." + } }, - "msg":{ - "STEAM_NOT_RUNNING": "Steam doit être en cours d'exécution pour lancer BeatSaber.", - "BS_ALREADY_RUNNING": "Ferme BeatSaber avant de le lancer à nouveau.", - "EXE_NOT_FINDED": "Quelques fichiers semblent manquants. Essaye de vérifier les fichiers.", - "EXIT": "BeatSaber s'est arrêté brusquement, essaye de vérifier les fichiers." + "errors": { + "msg": { + "401": "Steam semble pas vouloir nous laisser télécharger BeatSaber 😢", + "404": "Impossible de contacter les serveurs de Steam.", + "Password": "Le mot de passe est invalide.", + "InvalidCredentials": "Ton e-mail ou mot de passe est invalide 😴", + "InvalidPassword": "Ton mot de passe est invalide 😕", + "NoManifest": "Aucun manifest n'a été trouvé.", + "DirectoryCreate": "Impossible d'installer les dossiers nécessaires.", + "NotAvailableApp": "Tu essayes de télécharger BeatSaber alors que tu ne l'as pas ? 🤣", + "DepotNotFound": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", + "NotCompleted": "Le téléchargement n'a pas pu se terminer ¯\\_(ツ)_/¯", + "InvalidManifest": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", + "NoValidKey": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", + "NoManifestCode": "Impossible de télécharger BeatSaber 😥 réessaye plus tard 😕", + "Unknown": "Une erreur inconnue c'est produite ¯\\_(ツ)_/¯", + "NoServer": "Impossible de contacter les serveurs de Steam.", + "NotAllowed": "Apparemment tu n'es pas autorisé à télécharger BeatSaber 🥱", + "ConnectionTimeout": "Impossible de se connecter à Steam 😕", + "SteamLib": "Si tu à cette erreur, report le bug sur GitHub avec les logs stp.", + "ConnectionError": "Impossible de se connecter à Steam après 10 essais 🤯", + "LicenceError": "Impossible d'obtenir la liste des licences.", + "verification-failed": "La vérification a échoué, réessaye plus tard.", + "RateLimitExceeded": "Tu as essayé trop de fois attend un peu et recommence plus tard.", + "AlreadyDownloading": "Un téléchargement est déjà en cours", + "no-internet": "Pas de connexion internet." + } } - } - }, - "custom-version":{ - "errors":{ - "titles":{ - "CantEditSteam": "Edition impossible", - "CantRename": "Renommage impossible", - "VersionAlreadExist": "Cette version existe déjà", - "CantClone": "Clonage impossible" + }, + "settings": { + "move-folder": { + "success": { + "titles": { + "transfer-finished": "Transfert terminé 👌" + } + }, + "errors": { + "titles": { + "transfer-failed": "Le transfert a échoué 😕" + } + } }, - "msg":{ - "CantEditSteam": "Tu ne peut pas éditer la version Steam. Tu peut la cloner par contre." - } - }, - "success":{ - "titles":{ - "CloningFinished": "Clonage terminer 🎉" - } - } - } - }, - "modals":{ - "guard":{ - "title": "Steam Guard", - "inputs":{ - "guard-code":{ - "label": "Code Guard", - "placeholder": "Entre ton code Guard" - } - }, - "buttons":{ - "submit": "Se connecter" - } - }, - "steam-login":{ - "title": "Connexion Steam", - "inputs":{ - "username":{ - "label": "Nom d'utilisateur", - "placeholder": "Entre ton nom d'utilisateur" + "steam": { + "success": { + "titles": { + "logout": "Déconnecté de Steam." + } + } }, - "password":{ - "label": "Mot de passe", - "placeholder": "Entre ton mot de passe" - }, - "stay":{ - "label": "Rester connecté" + "additional-content":{ + "deep-link": { + "activation":{ + "success":{ + "title":"OneClick activé !", + "description":"Les installations OneClick ont été activées." + }, + "error":{ + "description":"Impossible d'activer les installations OneClick." + } + }, + "deactivation":{ + "success":{ + "title":"OneClick désactivé !", + "description":"Les installations OneClick ont été désactivées." + }, + "error":{ + "description":"Une erreur inconnue s'est produite." + } + } + } } - }, - "buttons":{ - "submit": "Se connecter" - } - }, - "bs-uninstall":{ - "title": "Désinstaller", - "description": "Est tu sûr de vouloir désinstaller BeatSaber {version} ? Tu vas devoir la retélécharger pour y jouer.", - "buttons":{ - "submit": "Désinstaller" - } - }, - "install-folder":{ - "title": "Dossier d'installation", - "description": "Changer le dossier d'installation par défaut, va engendrer le déplacement de toutes les données installer vers le nouveau dossier.", - "buttons":{ - "submit": "Choisir un dossier" - } - }, - "edit-version":{ - "title": "Editer la version", - "buttons":{ - "submit": "Editer" - } - }, - "clone-version":{ - "title": "Cloner la version", - "description": "Cloner la version te permet de séparer les contenus additionnels de BeatSaber entre deux mêmes versions.", - "buttons":{ - "submit": "Cloner" - } - } - }, - "auto-update":{ - "checking": "Vérification des mises à jour", - "downloading": "Téléchargement des mises à jour" - }, - "dateformat":{ + }, + "bs-launch": { + "success": { + "titles": { + "launching": "Lancement...🚀" + } + }, + "errors": { + "titles": { + "UNABLE_TO_LAUNCH": "Lancement impossible", + "STEAM_NOT_RUNNING": "Steam n'est pas lancé", + "OCULUS_NOT_RUNNING": "Oculus n'est pas lancé", + "BS_ALREADY_RUNNING": "BeatSaber est déjà lancé", + "EXE_NOT_FINDED": "Fichiers manquants", + "EXIT": "Arrêt brutal" + }, + "msg": { + "STEAM_NOT_RUNNING": "Steam doit être en cours d'exécution pour lancer BeatSaber.", + "OCULUS_NOT_RUNNING": "Oculus doit être en cours d'exécution pour lancer BeatSaber.", + "BS_ALREADY_RUNNING": "Ferme BeatSaber avant de le lancer à nouveau.", + "EXE_NOT_FINDED": "Quelques fichiers semblent manquants. Essaye de vérifier les fichiers.", + "EXIT": "BeatSaber s'est arrêté brusquement, essaye de vérifier les fichiers." + }, + "actions":{ + "STEAM_NOT_RUNNING": "Lancer Steam" + } + } + }, + "steam":{ + "steam-launching":{ + "title": "Steam se lance !", + "description": "Steam peut mettre quelque temps à se lancer selon votre configuration." + } + }, + "custom-version": { + "errors": { + "titles": { + "CantEditSteam": "Edition impossible", + "CantRename": "Renommage impossible", + "VersionAlreadExist": "Cette version existe déjà", + "CantClone": "Clonage impossible" + }, + "msg": { + "CantEditSteam": "Tu ne peut pas éditer la version Steam. Tu peut la cloner par contre." + } + }, + "success": { + "titles": { + "CloningFinished": "Clonage terminer 🎉" + } + } + }, + "mods": { + "install-mods": { + "titles": { + "success": "Mods installés 🎉", + "warning": "Mods installés 🤔" + }, + "msg": { + "success": "Tous les mods on été installés.", + "warning": "Un ou plusieurs mods n'ont pas pu être installés.", + "errors": { + "no-mods": "Aucun mods à installer.", + "cannot-install-bsipa": "L'installation de BSIPA à échoué 😨" + } + } + }, + "uninstall-mod": { + "titles": { + "success": "Mod désintallé 🎉" + }, + "msg": { + "errors": { + "no-mods": "Ce mod n'est pas installé 😑" + } + } + }, + "uninstall-all-mods": { + "titles": { + "success": "Mods désintallés 🎉" + }, + "msg": { + "success": "Tous les mods on été désintallés.", + "errors": { + "no-mods": "Aucun mod n'est installé dans dans cette version 😑" + } + } + } + }, + "maps":{ + "one-click-install":{ + "success":"Installation de la map terminée", + "error":"Une erreur s'est produite lors de l'installation de la map" + } + }, + "playlists":{ + "one-click-install":{ + "success":"Installation de la playlist terminée", + "error":"Une erreur s'est produite lors de l'installation de la playlist" + } + }, + "models":{ + "one-click-install":{ + "success":"Installation du modèle terminée", + "error":"Une erreur s'est produite lors de l'installation du modèle" + } + } + }, + "modals": { + "guard": { + "title": "Steam Guard", + "inputs": { + "guard-code": { + "label": "Code Guard", + "placeholder": "Entre ton code Guard" + } + }, + "buttons": { + "submit": "Se connecter" + } + }, + "steam-login": { + "title": "Connexion Steam", + "inputs": { + "username": { + "label": "Nom d'utilisateur", + "placeholder": "Entre ton nom d'utilisateur" + }, + "password": { + "label": "Mot de passe", + "placeholder": "Entre ton mot de passe" + }, + "stay": { + "label": "Rester connecté" + } + }, + "buttons": { + "submit": "Se connecter" + } + }, + "bs-uninstall": { + "title": "Désinstaller", + "description": "Est-tu sûr de vouloir désinstaller BeatSaber {version} ? Tu vas devoir la retélécharger pour y jouer.", + "buttons": { + "submit": "Désinstaller" + } + }, + "install-folder": { + "title": "Dossier d'installation", + "description": "Changer le dossier d'installation par défaut, va engendrer le déplacement de toutes les données installer vers le nouveau dossier.", + "buttons": { + "submit": "Choisir un dossier" + } + }, + "edit-version": { + "title": "Editer la version", + "buttons": { + "submit": "Editer" + } + }, + "clone-version": { + "title": "Cloner la version", + "description": "Cloner la version te permet de séparer les contenus additionnels de BeatSaber entre deux mêmes versions.", + "inputs": { + "name": { + "label": "Nom", + "placeholder": "Nom de la version" + }, + "color": { + "label": "Couleur" + } + }, + "buttons": { + "submit": "Cloner" + } + }, + "uninstall-mod": { + "title": "Désinstaller", + "description": "Es-tu sûr de vouloir désinstaller {mod} ? Cela pourrait faire dysfonctionner d'autres mods installés.", + "description-bsipa": "Es-tu sûr de vouloir désinstaller BSIPA ? Après cela, tous les mods installés ne fonctionneront plus." + }, + "uninstall-all-mods": { + "title": "Désinstaller les mods", + "description": "Es-tu sûr de vouloir désinstaller tous les mods de la version {version} ? Cette opération ne pourra pas être annulée." + }, + "maps-actions": { + "delete-maps": { + "title": { + "single": "Supprimer la map ?", + "multiple": "Supprimer les maps ?" + }, + "desc": { + "single": "Est-tu sur de vouloir supprimer la map {name} ?", + "multiple": "Est-tu sur de vouloir supprimer les {nb} maps ?" + }, + "info": { + "desc": { + "single": "Cette map fait partie des maps paratagées", + "multiple": "Ces maps font parties des maps partagées" + }, + "title": { + "single": "Cette map sera également supprimée des versions utilisant les maps partagées", + "multiple": "Ces maps seront égalements supprimées des versions utilisant les maps partagées" + } + } + }, + "link-maps": { + "title": "Lier les maps", + "desc": "La liaison des maps permet de partager les maps entre toute les version. Une fois liée, cette version profitera des maps partagées", + "info": "L'ajout et la suppression de maps sera également partagé", + "keep-maps": { + "label": "Conserver les maps", + "title": "Conserver les maps déplacera les maps de la version actuelle dans le dossier des maps partagées. Dans le cas contraire elles seront perdues" + }, + "valid-btn": "Lier les maps" + }, + "unlink-maps": { + "title": "Délier les maps", + "desc": "Attention, délier les maps ne permettra plus l'utilisation des maps paratagées pour cette version.", + "keep-maps": { + "label": "Conserver les maps", + "title": "Conserver les maps créera une copie des maps partagées pour la version actuelle. Dans le cas contraire, aucune map ne sera conservée pour cette version." + }, + "valid-btn": "Délier les maps" + } + }, + "download-maps": { + "search-btn": "Rechercher", + "loading-maps": "Chargement des maps..." + } + }, + "maps": { + "map-filter-panel": { + "duration": "Durée", + "tags": "tags", + "specificities": "général", + "requirements": "requis" + }, + "map-types": { + "accuracy": "précision", + "balanced": "équilibrée", + "challenge": "challenge", + "dancestyle": "dance", + "fitness": "fitness", + "speed": "vitesse", + "tech": "tech" + }, + "map-styles": { + "dance": "dance", + "swing": "swing", + "nightcore": "nightcore", + "folk": "folk", + "family": "famille", + "ambient": "ambiante", + "funk": "funk", + "jazz": "jazz", + "soul": "soul", + "speedcore": "speedcore", + "punk": "punk", + "rb": "r&b", + "holiday": "vacance", + "vocaloid": "vocaloid", + "jrock": "j-rock", + "trance": "trance", + "drumbass": "drum & bass", + "comedy": "comédie", + "instrumental": "instrumental", + "hardcore": "hardcore", + "kpop": "k-pop", + "indie": "indé", + "techno": "techno", + "house": "house", + "game": "jeu vidéo", + "film": "film", + "alt": "alternative", + "dubstep": "dubstep", + "metal": "metal", + "anime": "anime", + "hiphop": "hiphop", + "jpop": "j-pop", + "rock": "rock", + "pop": "pop", + "electronic": "éléctronique", + "classical-orchestral": "Classique & Orchestral" + }, + "map-specificities": { + "automapper": "IA", + "ranked": "classée", + "curated": "recommandée", + "verified": "vérifiée", + "fullSpread": "panel complet" + }, + "difficulties": { + "Easy": "facile", + "Normal": "normal", + "Hard": "difficile", + "Expert": "expert", + "ExpertPlus": "expert+" + }, + "map-item": { + "by": "Par {songAutor}", + "mapped-by": "mappée par" + } + }, + "beat-saver": { + "maps-sorts": { + "Latest": "Dernière", + "Relevance": "Pertinence", + "Rating": "Notes", + "Curated": "Recommandée" + } + }, + "auto-update": { + "checking": "Vérification des mises à jour", + "downloading": "Téléchargement des mises à jour" + }, + "dateformat": { "dayNames": [ - "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", - "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" + "Dim", + "Lun", + "Mar", + "Mer", + "Jeu", + "Ven", + "Sam", + "Dimanche", + "Lundi", + "Mardi", + "Mercredi", + "Jeudi", + "Vendredi", + "Samedi" ], "monthNames": [ - "Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Juil", "Aou", "Sept", "Oct", "Nov", "Déc", - "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", - "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" + "Jan", + "Fév", + "Mar", + "Avr", + "Mai", + "Jun", + "Juil", + "Aou", + "Sept", + "Oct", + "Nov", + "Déc", + "Janvier", + "Février", + "Mars", + "Avril", + "Mai", + "Juin", + "Juillet", + "Août", + "Septembre", + "Octobre", + "Novembre", + "Décembre" ], "timeNames": [ - "a", "p", "am", "pm", "A", "P", "AM", "PM" + "a", + "p", + "am", + "pm", + "A", + "P", + "AM", + "PM" ] - } -} + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 99017021..c3ec072d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,18 @@ "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@babel/code-frame": { @@ -35,27 +47,27 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", "dev": true }, "@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -72,38 +84,25 @@ } }, "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", "dev": true, "requires": { - "@babel/types": "^7.18.9", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "dependencies": { @@ -122,13 +121,13 @@ "dev": true }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { @@ -150,34 +149,34 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.2" } }, "@babel/helper-split-export-declaration": { @@ -189,10 +188,16 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -202,14 +207,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" } }, "@babel/highlight": { @@ -258,12 +263,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -282,9 +281,9 @@ } }, "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -396,57 +395,57 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" } }, "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", + "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", "dev": true, "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.10" } }, "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", + "@babel/generator": "^7.20.1", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -460,12 +459,13 @@ } }, "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -504,6 +504,26 @@ "requires": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "@discoveryjs/json-ext": { @@ -529,11 +549,169 @@ "sumchecker": "^3.0.1" }, "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@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" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, @@ -563,22 +741,6 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -598,20 +760,40 @@ "optional": true }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "@gar/promisify": { @@ -621,20 +803,20 @@ "dev": true }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { @@ -694,15 +876,6 @@ "p-locate": "^4.1.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -712,10 +885,10 @@ "p-limit": "^2.2.0" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "sprintf-js": { @@ -744,6 +917,44 @@ "jest-message-util": "^27.5.1", "jest-util": "^27.5.1", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "@jest/core": { @@ -780,6 +991,44 @@ "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "@jest/environment": { @@ -792,6 +1041,30 @@ "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "@jest/fake-timers": { @@ -806,6 +1079,44 @@ "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "@jest/globals": { @@ -817,6 +1128,30 @@ "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "@jest/reporters": { @@ -852,6 +1187,42 @@ "v8-to-istanbul": "^8.1.0" }, "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -860,6 +1231,15 @@ } } }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, "@jest/source-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", @@ -889,6 +1269,30 @@ "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "@jest/test-sequencer": { @@ -926,6 +1330,42 @@ "write-file-atomic": "^3.0.0" }, "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -935,37 +1375,28 @@ } }, "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "dev": true, "requires": { + "@jest/schemas": "^29.0.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - } } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { @@ -988,19 +1419,6 @@ "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@jridgewell/sourcemap-codec": { @@ -1010,13 +1428,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@leichtgewicht/ip-codec": { @@ -1056,85 +1474,69 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, "@mdn/browser-compat-data": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", - "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==", + "version": "3.3.14", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz", + "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", "dev": true }, "@motionone/animation": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz", - "integrity": "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", "requires": { - "@motionone/easing": "^10.14.0", - "@motionone/types": "^10.14.0", - "@motionone/utils": "^10.14.0", + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/dom": { - "version": "10.13.1", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.13.1.tgz", - "integrity": "sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ==", + "version": "10.15.3", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.15.3.tgz", + "integrity": "sha512-FQ7a2zMBXc1UeU8CG9G3yDpst55fbb0+C9A0VGfwOITitBCzigKZnXRgsRSWWR+FW57GSc13eGQxtYB0lKG0Ng==", "requires": { - "@motionone/animation": "^10.13.1", - "@motionone/generators": "^10.13.1", - "@motionone/types": "^10.13.0", - "@motionone/utils": "^10.13.1", + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "@motionone/easing": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz", - "integrity": "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", "requires": { - "@motionone/utils": "^10.14.0", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/generators": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz", - "integrity": "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", "requires": { - "@motionone/types": "^10.14.0", - "@motionone/utils": "^10.14.0", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/types": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz", - "integrity": "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" }, "@motionone/utils": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz", - "integrity": "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", "requires": { - "@motionone/types": "^10.14.0", + "@motionone/types": "^10.15.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } @@ -1188,14 +1590,6 @@ "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "@pmmmwh/react-refresh-webpack-plugin": { @@ -1213,6 +1607,51 @@ "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", "source-map": "^0.7.3" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } } }, "@polka/url": { @@ -1221,15 +1660,31 @@ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, + "@remix-run/router": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz", + "integrity": "sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -1245,11 +1700,11 @@ } }, "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "requires": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" } }, "@teamsupercell/typings-for-css-modules-loader": { @@ -1264,12 +1719,30 @@ "schema-utils": "^2.0.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -1304,9 +1777,9 @@ } }, "@testing-library/dom": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", - "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", + "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", @@ -1349,9 +1822,9 @@ } }, "@testing-library/react": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.3.0.tgz", - "integrity": "sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -1360,9 +1833,9 @@ }, "dependencies": { "@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", "dev": true, "requires": { "@types/react": "*" @@ -1370,6 +1843,14 @@ } } }, + "@tippyjs/react": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", + "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", + "requires": { + "tippy.js": "^6.3.1" + } + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -1408,7 +1889,7 @@ }, "@types/archiver": { "version": "5.3.1", - "resolved": "https://npm.zone51.tf/@types%2farchiver/-/archiver-5.3.1.tgz", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.1.tgz", "integrity": "sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw==", "dev": true, "requires": { @@ -1422,9 +1903,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1454,9 +1935,9 @@ } }, "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1482,14 +1963,21 @@ } }, "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "requires": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" + }, + "dependencies": { + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + } } }, "@types/connect": { @@ -1527,9 +2015,9 @@ } }, "@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "requires": { "@types/estree": "*", @@ -1553,9 +2041,9 @@ "dev": true }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "requires": { "@types/body-parser": "*", @@ -1565,9 +2053,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "requires": { "@types/node": "*", @@ -1585,9 +2073,9 @@ } }, "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", + "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -1657,11 +2145,6 @@ "pretty-format": "^27.0.0" } }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" - }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -1680,6 +2163,13 @@ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + } } }, "@types/mime": { @@ -1689,9 +2179,9 @@ "dev": true }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/ms": { @@ -1703,7 +2193,8 @@ "@types/node": { "version": "17.0.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", + "dev": true }, "@types/parse-json": { "version": "4.0.0", @@ -1723,9 +2214,9 @@ } }, "@types/prettier": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", - "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "@types/prop-types": { @@ -1747,9 +2238,9 @@ "dev": true }, "@types/react": { - "version": "17.0.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.48.tgz", - "integrity": "sha512-zJ6IYlJ8cYYxiJfUaZOQee4lh99mFihBoqkOSEGV+dFi9leROW6+PgstzQ+w3gWTnUfskALtQPGHK6dYmPj+2A==", + "version": "17.0.52", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.52.tgz", + "integrity": "sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A==", "dev": true, "requires": { "@types/prop-types": "*", @@ -1758,12 +2249,12 @@ } }, "@types/react-dom": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", - "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", + "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", "dev": true, "requires": { - "@types/react": "^17" + "@types/react": "*" } }, "@types/react-outside-click-handler": { @@ -1790,6 +2281,13 @@ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "requires": { "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + } } }, "@types/retry": { @@ -1805,9 +2303,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==" + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" }, "@types/serve-index": { "version": "1.9.1", @@ -1861,11 +2359,14 @@ "@types/jest": "*" } }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true + "@types/use-double-click": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/use-double-click/-/use-double-click-1.0.1.tgz", + "integrity": "sha512-mkoH+XW24GIPZO/0FO7ms6SiLxwvPPl8KxYxemoigSkPS9cQxI6CH6lw5gwQ5bLeProgzMGlULUANOnUCJ8GJg==", + "dev": true, + "requires": { + "@types/react": "*" + } }, "@types/verror": { "version": "1.10.6", @@ -1875,9 +2376,9 @@ "optional": true }, "@types/webpack-bundle-analyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", - "integrity": "sha512-uSIQ1SwF+xPlWt7Fcv3bKOKDYoARUI2InoYaluQ1QhM6O7hTwalXG1xrdZ7YHVjYCTInhviTxA5KwajKEE6yWQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.0.tgz", + "integrity": "sha512-XeQmQCCXdZdap+A/60UKmxW5Mz31Vp9uieGlHB3T4z/o2OLVLtTI3bvTuS6A2OWd/rbAAQiGGWIEFQACu16szA==", "dev": true, "requires": { "@types/node": "*", @@ -1901,9 +2402,9 @@ } }, "@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -1926,17 +2427,17 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz", - "integrity": "sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.34.0", - "@typescript-eslint/type-utils": "5.34.0", - "@typescript-eslint/utils": "5.34.0", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -2006,52 +2507,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.34.0.tgz", - "integrity": "sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.34.0", - "@typescript-eslint/types": "5.34.0", - "@typescript-eslint/typescript-estree": "5.34.0", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.34.0.tgz", - "integrity": "sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.34.0", - "@typescript-eslint/visitor-keys": "5.34.0" + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" } }, "@typescript-eslint/type-utils": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.34.0.tgz", - "integrity": "sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.34.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.34.0.tgz", - "integrity": "sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.34.0.tgz", - "integrity": "sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.34.0", - "@typescript-eslint/visitor-keys": "5.34.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2060,26 +2562,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.34.0.tgz", - "integrity": "sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.34.0", - "@typescript-eslint/types": "5.34.0", - "@typescript-eslint/typescript-estree": "5.34.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.34.0.tgz", - "integrity": "sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/types": "5.43.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -2285,9 +2789,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-globals": { @@ -2346,9 +2850,9 @@ "dev": true }, "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true }, "agent-base": { @@ -2381,14 +2885,13 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -2398,24 +2901,6 @@ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } } }, "ajv-keywords": { @@ -2424,15 +2909,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2488,9 +2964,9 @@ "dev": true }, "app-builder-lib": { - "version": "23.3.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.3.3.tgz", - "integrity": "sha512-m0+M53+HYMzqKxwNQZT143K7WwXEGUy9LY31l8dJphXx2P/FQod615mVbxHyqbDCG4J5bHdWm21qZ0e2DVY6CQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.6.0.tgz", + "integrity": "sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==", "dev": true, "requires": { "7zip-bin": "~5.1.1", @@ -2499,13 +2975,13 @@ "@malept/flatpak-bundler": "^0.4.0", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "23.3.3", - "builder-util-runtime": "9.0.3", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.7", "electron-osx-sign": "^0.6.0", - "electron-publish": "23.3.3", + "electron-publish": "23.6.0", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -2519,35 +2995,6 @@ "semver": "^7.3.7", "tar": "^6.1.11", "temp-file": "^3.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "aproba": { @@ -2558,7 +3005,7 @@ }, "archiver": { "version": "5.3.1", - "resolved": "https://npm.zone51.tf/archiver/-/archiver-5.3.1.tgz", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "requires": { "archiver-utils": "^2.1.0", @@ -2568,23 +3015,11 @@ "readdir-glob": "^1.0.0", "tar-stream": "^2.2.0", "zip-stream": "^4.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "archiver-utils": { "version": "2.1.0", - "resolved": "https://npm.zone51.tf/archiver-utils/-/archiver-utils-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "requires": { "glob": "^7.1.4", @@ -2597,6 +3032,22 @@ "lodash.union": "^4.6.0", "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + } } }, "are-we-there-yet": { @@ -2607,19 +3058,6 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "arg": { @@ -2634,10 +3072,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } }, "array-find": { "version": "1.0.0", @@ -2652,15 +3093,15 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -2670,41 +3111,43 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array.prototype.find": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.0.tgz", - "integrity": "sha512-sn40qmUiLYAcRb/1HsIQjTTZ1kCy8II8VtZJpMn2Aoen9twULhbWXisfh3HimGqMlHGUul0/TfKCnXg42LuPpQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.4", - "es-shim-unscopables": "^1.0.0" - } - }, "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asar": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", @@ -2716,6 +3159,25 @@ "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" + }, + "dependencies": { + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "optional": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } } }, "assert-plus": { @@ -2732,14 +3194,6 @@ "dev": true, "requires": { "@mdn/browser-compat-data": "^3.3.14" - }, - "dependencies": { - "@mdn/browser-compat-data": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz", - "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", - "dev": true - } } }, "ast-types-flow": { @@ -2783,49 +3237,29 @@ "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==" }, "autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "dev": true, "requires": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "caniuse-lite": { - "version": "1.0.30001382", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001382.tgz", - "integrity": "sha512-2rtJwDmSZ716Pxm1wCtbPvHtbDWAreTPxXbkc5RkKglow3Ig/4GNGazDI9/BVnXbG/wnv6r3B5FEbkfg9OcTGg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.227", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.227.tgz", - "integrity": "sha512-I9VVajA3oswIJOUFg2PSBqrHLF5Y+ahIfjOV9+v6uYyBqFZutmPxA6fxocDUUmgwYevRWFu1VjLyVG3w45qa/g==", - "dev": true - } } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", + "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", "dev": true }, "axobject-query": { @@ -2848,6 +3282,30 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "babel-plugin-istanbul": { @@ -2941,18 +3399,6 @@ "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "bluebird": { @@ -2971,9 +3417,9 @@ } }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", @@ -2984,18 +3430,12 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3029,9 +3469,9 @@ } }, "bonjour-service": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "requires": { "array-flatten": "^2.1.2", @@ -3053,36 +3493,6 @@ "dev": true, "optional": true }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3108,15 +3518,15 @@ "dev": true }, "browserslist": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", - "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001366", - "electron-to-chromium": "^1.4.188", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.4" + "update-browserslist-db": "^1.0.9" } }, "browserslist-config-erb": { @@ -3192,9 +3602,9 @@ "dev": true }, "builder-util": { - "version": "23.3.3", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-23.3.3.tgz", - "integrity": "sha512-MJZlUiq2PY5hjYv9+XNaoYdsITqvLgRDoHSFg/4nzpInbNxNjLQOolL04Zsyp+hgfcbFvMC4h0KkR1CMPHLWbA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-23.6.0.tgz", + "integrity": "sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==", "dev": true, "requires": { "7zip-bin": "~5.1.1", @@ -3202,7 +3612,7 @@ "@types/fs-extra": "^9.0.11", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.0.3", + "builder-util-runtime": "9.1.1", "chalk": "^4.1.1", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -3214,57 +3624,27 @@ "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "builder-util-runtime": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.3.tgz", - "integrity": "sha512-SfG2wnyjpUbbdtpnqDpWwklujofC6GarGpvdWrEkg9p5AD/xJmTF2buTNaqs3qtsNBEVQDDjZz9xc2GGpVyMfA==", - "dev": true, + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz", + "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==", "requires": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "requires": { "@npmcli/fs": "^2.1.0", @@ -3284,7 +3664,7 @@ "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^2.0.0" }, "dependencies": { "brace-expansion": { @@ -3310,9 +3690,9 @@ } }, "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true }, "minimatch": { @@ -3323,12 +3703,6 @@ "requires": { "brace-expansion": "^2.0.1" } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true } } }, @@ -3338,38 +3712,24 @@ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3416,9 +3776,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001367", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz", - "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==", + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", "dev": true }, "chalk": { @@ -3451,17 +3811,6 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "chownr": { @@ -3483,9 +3832,9 @@ "dev": true }, "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", "dev": true }, "cjs-module-lexer": { @@ -3516,12 +3865,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3538,23 +3881,57 @@ "dev": true }, "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -3595,6 +3972,16 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3610,6 +3997,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -3644,9 +4041,9 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "common-path-prefix": { @@ -3661,43 +4058,15 @@ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - } - } - }, "compress-commons": { "version": "4.1.1", - "resolved": "https://npm.zone51.tf/compress-commons/-/compress-commons-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "requires": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "compressible": { @@ -3724,6 +4093,12 @@ "vary": "~1.1.2" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3747,13 +4122,13 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concurrently": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz", - "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.5.0.tgz", + "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==", "dev": true, "requires": { "chalk": "^4.1.0", - "date-fns": "^2.16.1", + "date-fns": "^2.29.1", "lodash": "^4.17.21", "rxjs": "^7.0.0", "shell-quote": "^1.7.3", @@ -3791,17 +4166,6 @@ "semver": "^7.3.5" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -3809,11 +4173,6 @@ "requires": { "is-obj": "^2.0.0" } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, @@ -3828,31 +4187,6 @@ "proto-list": "~1.2.1" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - } - } - }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -3871,11 +4205,6 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, - "consolidated-events": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz", - "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ==" - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3900,13 +4229,10 @@ "dev": true }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cookie": { "version": "0.5.0", @@ -3921,15 +4247,15 @@ "dev": true }, "core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", + "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==", "dev": true }, "core-js-pure": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.5.tgz", - "integrity": "sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", "dev": true }, "core-util-is": { @@ -3938,9 +4264,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -3962,28 +4288,16 @@ }, "crc-32": { "version": "1.2.2", - "resolved": "https://npm.zone51.tf/crc-32/-/crc-32-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "crc32-stream": { "version": "4.0.2", - "resolved": "https://npm.zone51.tf/crc32-stream/-/crc32-stream-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "requires": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "create-require": { @@ -4012,10 +4326,10 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", "dev": true }, "css-declaration-sorter": { @@ -4025,47 +4339,35 @@ "dev": true }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", + "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.18", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" } }, "css-minimizer-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dev": true, "requires": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -4075,11 +4377,17 @@ "fast-deep-equal": "^3.1.3" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } }, "schema-utils": { "version": "4.0.0", @@ -4098,6 +4406,15 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -4132,6 +4449,12 @@ } } }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, "css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -4151,36 +4474,36 @@ "dev": true }, "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.12", + "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "dev": true, "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -4188,11 +4511,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -4237,9 +4560,9 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, "damerau-levenshtein": { @@ -4248,6 +4571,11 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -4260,9 +4588,9 @@ } }, "date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "dev": true }, "dateformat": { @@ -4287,17 +4615,24 @@ } }, "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } } }, "dedent": { @@ -4306,11 +4641,36 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "deep-equal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", + "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } }, "deep-is": { "version": "0.1.4", @@ -4334,18 +4694,18 @@ } }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" } }, "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "define-lazy-prop": { "version": "2.0.0", @@ -4357,15 +4717,16 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", "dev": true }, "delayed-stream": { @@ -4411,30 +4772,13 @@ "dev": true }, "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "requires": { "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "debug": "4" } }, "detective": { @@ -4514,47 +4858,18 @@ "dev": true }, "dmg-builder": { - "version": "23.3.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.3.3.tgz", - "integrity": "sha512-ECwAjt+ZWyOvddrkDx1xRD6IVUCZb5SV6vSMHZd+Va3G2sUXHrnglR1cGDKRF4oYRQm8SYVrpLZKbi8npyDcAQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.6.0.tgz", + "integrity": "sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==", "dev": true, "requires": { - "app-builder-lib": "23.3.3", - "builder-util": "23.3.3", - "builder-util-runtime": "9.0.3", + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", "dmg-license": "^1.0.11", "fs-extra": "^10.0.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "dmg-license": { @@ -4572,6 +4887,28 @@ "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "optional": true + } } }, "dns-equal": { @@ -4605,14 +4942,6 @@ "esutils": "^2.0.2" } }, - "document.contains": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/document.contains/-/document.contains-1.0.2.tgz", - "integrity": "sha512-YcvYFs15mX8m3AO1QNQy3BlIpSMfNRj3Ujk2BEJxsZG+HZf7/hZ6jr7mDpXrF8q+ff95Vef5yjhiZxm8CGJr6Q==", - "requires": { - "define-properties": "^1.1.3" - } - }, "dom-accessibility-api": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", @@ -4745,9 +5074,9 @@ } }, "electron": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-20.0.3.tgz", - "integrity": "sha512-Yx0a/SGgus/XqDAoMMs165JUikgE5vBmQpNJ+0XMDG/IYFj6TNNzfY2ATI+t171JjhKKO+MYPO8xqyZdFRoIDw==", + "version": "20.3.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-20.3.5.tgz", + "integrity": "sha512-xTBjdgAZXf6txxfIhv9mZ3yloJZ+KTht7D2X10uHlFnQu4ZmvzqwhGuQPnldVKhRUDvZehIjulmmrFO6Mz6SzQ==", "dev": true, "requires": { "@electron/get": "^1.14.1", @@ -4756,60 +5085,31 @@ }, "dependencies": { "@types/node": { - "version": "16.11.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.54.tgz", - "integrity": "sha512-ryOpwe15+BtTUxKFfzABjaI/EtXLPBSBEW4B6D5ygWNcORLVKG/1/FC3WwAr5d7t6lCnlVPRsCY0NH680QT+Pg==", + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", "dev": true } } }, "electron-builder": { - "version": "23.3.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.3.3.tgz", - "integrity": "sha512-mFYYdhoFPKevP6y5uaaF3dusmB2OtQ/HnwwpyOePeU7QDS0SEIAUokQsHUanAiJAZcBqtY7iyLBgX18QybdFFw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.6.0.tgz", + "integrity": "sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==", "dev": true, "requires": { "@types/yargs": "^17.0.1", - "app-builder-lib": "23.3.3", - "builder-util": "23.3.3", - "builder-util-runtime": "9.0.3", + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", "chalk": "^4.1.1", - "dmg-builder": "23.3.3", + "dmg-builder": "23.6.0", "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" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } + "simple-update-notifier": "^1.0.7", + "yargs": "^17.5.1" } }, "electron-debug": { @@ -4860,9 +5160,9 @@ "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==" }, "electron-notarize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.1.tgz", - "integrity": "sha512-u/ECWhIrhkSQpZM4cJzVZ5TsmkaqrRo5LDC/KMbGF0sPkm53Ng59+M0zp8QVaql0obfJy9vlVT+4iOkAi2UDlA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.2.tgz", + "integrity": "sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -4880,22 +5180,6 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -4940,47 +5224,18 @@ } }, "electron-publish": { - "version": "23.3.3", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-23.3.3.tgz", - "integrity": "sha512-1dX17eE5xVXedTxjC+gjsP74oC0+sIHgqysp0ryTlF9+yfQUyXjBk6kcK+zhtBA2SsHMSglDtM+JPxDD/WpPTQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-23.6.0.tgz", + "integrity": "sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==", "dev": true, "requires": { "@types/fs-extra": "^9.0.11", - "builder-util": "23.3.3", - "builder-util-runtime": "9.0.3", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", "chalk": "^4.1.1", "fs-extra": "^10.0.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "electron-rebuild": { @@ -5013,155 +5268,6 @@ "requires": { "cross-spawn": "^7.0.1" } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", - "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", - "dev": true, - "requires": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -5175,15 +5281,15 @@ } }, "electron-to-chromium": { - "version": "1.4.195", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz", - "integrity": "sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "electron-updater": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.2.4.tgz", - "integrity": "sha512-AE+I4cEagOJvHvtkBvJCp+hu1mrpinCt7PMmEOsDcpfayrPvWLuxeFVR9BzRvZVbz0eAqpRQjcEuR8gK80K7lQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.3.0.tgz", + "integrity": "sha512-iKEr7yQBcvnQUPnSDYGSWC9t0eF2YbZWeYYYZzYxdl+HiRejXFENjYMnYjoOm2zxyD6Cr2JTHZhp9pqxiXuCOw==", "requires": { "@types/semver": "^7.3.6", "builder-util-runtime": "9.1.1", @@ -5194,41 +5300,6 @@ "lodash.isequal": "^4.5.0", "semver": "^7.3.5", "typed-emitter": "^2.1.0" - }, - "dependencies": { - "builder-util-runtime": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz", - "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==", - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } } }, "electronmon": { @@ -5262,9 +5333,9 @@ "dev": true }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "emojis-list": { @@ -5298,22 +5369,13 @@ } }, "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - }, - "dependencies": { - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", - "dev": true - } + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { @@ -5358,35 +5420,61 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" } }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -5397,6 +5485,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -5405,6 +5494,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5424,12 +5514,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5437,9 +5521,9 @@ "dev": true }, "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "escodegen": { @@ -5455,6 +5539,12 @@ "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -5504,14 +5594,15 @@ } }, "eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", + "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -5521,21 +5612,21 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -5546,10 +5637,27 @@ "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" + "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -5559,6 +5667,94 @@ "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "dependencies": { + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } } } }, @@ -5582,6 +5778,12 @@ } } }, + "eslint-config-airbnb-typescript": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-13.0.1.tgz", + "integrity": "sha512-n7fGBDNV3xSKbWDUES2FfsNAJhuqADcwzshX6ci6qoszUnH6p4dzrLnSFqYkw5Sn7M+aarp2BTf7JDOK88M+bg==", + "dev": true + }, "eslint-config-erb": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-config-erb/-/eslint-config-erb-4.0.3.tgz", @@ -5604,12 +5806,6 @@ "eslint-plugin-react-hooks": "^4.2.0" }, "dependencies": { - "@mdn/browser-compat-data": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz", - "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", - "dev": true - }, "@typescript-eslint/eslint-plugin": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", @@ -5689,34 +5885,10 @@ "@babel/runtime-corejs3": "^7.10.2" } }, - "eslint-config-airbnb": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", - "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^14.2.1", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "dependencies": { - "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - } - } - } - }, - "eslint-config-airbnb-typescript": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-13.0.1.tgz", - "integrity": "sha512-n7fGBDNV3xSKbWDUES2FfsNAJhuqADcwzshX6ci6qoszUnH6p4dzrLnSFqYkw5Sn7M+aarp2BTf7JDOK88M+bg==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "eslint-plugin-compat": { @@ -5733,6 +5905,17 @@ "find-up": "^5.0.0", "lodash.memoize": "4.1.2", "semver": "7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "eslint-plugin-jest": { @@ -5775,14 +5958,48 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true } } }, @@ -5854,22 +6071,38 @@ "ms": "^2.1.1" } }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true } } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -5880,55 +6113,6 @@ "requires": { "ms": "^2.1.1" } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true } } }, @@ -5948,6 +6132,55 @@ "semver": "7.3.5" }, "dependencies": { + "@mdn/browser-compat-data": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", + "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6007,9 +6240,9 @@ } }, "eslint-plugin-jest": { - "version": "26.8.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.8.7.tgz", - "integrity": "sha512-nJJVv3VY6ZZvJGDMC8h1jN/TIGT4We1JkNn1lvstPURicr/eZPVnlFULQ4W2qL9ByCuCr1hPmlBOc2aZ1ktw4Q==", + "version": "26.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz", + "integrity": "sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" @@ -6046,6 +6279,12 @@ "@babel/runtime-corejs3": "^7.10.2" } }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6064,31 +6303,32 @@ } }, "eslint-plugin-promise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", - "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true }, "eslint-plugin-react": { - "version": "7.30.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", - "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", + "version": "7.31.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", + "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { @@ -6100,6 +6340,12 @@ "esutils": "^2.0.2" } }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "resolve": { "version": "2.0.0-next.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", @@ -6133,14 +6379,6 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } } }, "eslint-utils": { @@ -6167,22 +6405,14 @@ "dev": true }, "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - } } }, "esprima": { @@ -6198,6 +6428,14 @@ "dev": true, "requires": { "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -6207,12 +6445,20 @@ "dev": true, "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { @@ -6280,17 +6526,41 @@ "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -6309,7 +6579,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -6366,17 +6636,6 @@ "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } } }, "extsprintf": { @@ -6398,9 +6657,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6408,17 +6667,6 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "fast-json-stable-stringify": { @@ -6434,9 +6682,9 @@ "dev": true }, "fastest-levenshtein": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", - "integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { @@ -6458,9 +6706,9 @@ } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -6475,6 +6723,15 @@ "pend": "~1.2.0" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -6571,20 +6828,13 @@ "dev": true }, "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "locate-path": "^3.0.0" } }, - "fitty": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/fitty/-/fitty-2.3.6.tgz", - "integrity": "sha512-ENp/+MqqYmXBGHC0dlltCX75+5zL5m0uiIGCgYdoThao99BrJpNYzEh3xrvhiy4b7O5X82CQT7dPTiB53H6stw==" - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -6602,11 +6852,20 @@ "dev": true }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6618,6 +6877,14 @@ "mime-types": "^2.1.12" } }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6631,25 +6898,21 @@ "dev": true }, "framer-motion": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.2.1.tgz", - "integrity": "sha512-bt2ZqqGpPsW6UojYUa5poWQJu3sDr4Dp3IZsdVBYdKUJ8p+9PxOk1fYRAT8lTGGmaC5HFoKrbDXQeKWGAKZz9g==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.0.2.tgz", + "integrity": "sha512-xuIiQchVh/cLqUzzu5/8ok4o0nkwYPyIRtkDl8wDvrQUNRhSfRaZu1MMdzN0TjpBtG66oP03PSLO7Qtu1YqPrA==", "requires": { "@emotion/is-prop-valid": "^0.8.2", - "@motionone/dom": "10.13.1", - "framesync": "6.1.2", + "@motionone/dom": "^10.15.3", "hey-listen": "^1.0.8", - "popmotion": "11.0.5", - "style-value-types": "5.1.2", - "tslib": "2.4.0" - } - }, - "framesync": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", - "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", - "requires": { "tslib": "2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "fresh": { @@ -6660,18 +6923,17 @@ }, "fs-constants": { "version": "1.0.0", - "resolved": "https://npm.zone51.tf/fs-constants/-/fs-constants-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs-minipass": { @@ -6704,12 +6966,14 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -6726,7 +6990,8 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, "gauge": { "version": "4.0.4", @@ -6757,9 +7022,10 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6773,9 +7039,9 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } @@ -6784,6 +7050,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -6803,12 +7070,12 @@ } }, "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "glob-to-regexp": { @@ -6832,23 +7099,6 @@ "serialize-error": "^7.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, "global-tunnel-ng": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", @@ -6863,9 +7113,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -6903,22 +7153,31 @@ "slash": "^3.0.0" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "requires": { - "@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" + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, "graceful-fs": { @@ -6963,6 +7222,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -6970,7 +7230,8 @@ "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -6982,6 +7243,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -6989,12 +7251,14 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -7005,18 +7269,18 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, "hey-listen": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", @@ -7049,8 +7313,37 @@ "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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" + } + } } }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -7095,6 +7388,12 @@ } } }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "dev": true + }, "html-webpack-plugin": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", @@ -7232,10 +7531,7 @@ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, - "optional": true, - "requires": { - "cli-truncate": "^2.1.0" - } + "optional": true }, "iconv-lite": { "version": "0.6.3", @@ -7297,6 +7593,14 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "import-from": { @@ -7306,22 +7610,8 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -7367,12 +7657,14 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -7402,6 +7694,16 @@ "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7412,6 +7714,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -7429,15 +7732,17 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true }, "is-ci": { "version": "3.0.1", @@ -7448,10 +7753,24 @@ "ci-info": "^3.2.0" } }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -7461,6 +7780,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7498,16 +7818,6 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -7528,15 +7838,16 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -7549,6 +7860,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7567,116 +7879,6 @@ "p-any": "^3.0.0", "p-timeout": "^3.2.0", "public-ip": "^4.0.4" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "keyv": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz", - "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==", - "requires": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - } } }, "is-path-inside": { @@ -7710,15 +7912,23 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -7733,6 +7943,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7741,10 +7952,24 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7757,14 +7982,31 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "requires": { "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7774,12 +8016,6 @@ "is-docker": "^2.0.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7810,9 +8046,9 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { "@babel/core": "^7.12.3", @@ -7891,6 +8127,96 @@ "@jest/core": "^27.5.1", "import-local": "^3.0.2", "jest-cli": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } } }, "jest-changed-files": { @@ -7902,6 +8228,30 @@ "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "jest-circus": { @@ -7929,41 +8279,42 @@ "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" }, "dependencies": { - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, "requires": { - "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" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" } } } @@ -7998,6 +8349,44 @@ "pretty-format": "^27.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-diff": { @@ -8032,6 +8421,44 @@ "jest-get-type": "^27.5.1", "jest-util": "^27.5.1", "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-environment-jsdom": { @@ -8047,6 +8474,44 @@ "jest-mock": "^27.5.1", "jest-util": "^27.5.1", "jsdom": "^16.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-environment-node": { @@ -8061,6 +8526,44 @@ "@types/node": "*", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-get-type": { @@ -8088,6 +8591,44 @@ "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-jasmine2": { @@ -8113,6 +8654,44 @@ "jest-util": "^27.5.1", "pretty-format": "^27.5.1", "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-leak-detector": { @@ -8152,6 +8731,30 @@ "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "jest-mock": { @@ -8162,12 +8765,36 @@ "requires": { "@jest/types": "^27.5.1", "@types/node": "*" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true }, "jest-regex-util": { @@ -8192,6 +8819,44 @@ "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-resolve-dependencies": { @@ -8203,6 +8868,30 @@ "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-snapshot": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } } }, "jest-runner": { @@ -8232,6 +8921,44 @@ "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-runtime": { @@ -8262,6 +8989,50 @@ "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } } }, "jest-serializer": { @@ -8302,15 +9073,53 @@ "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.3.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -8332,6 +9141,28 @@ "pretty-format": "^27.5.1" }, "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -8353,6 +9184,44 @@ "chalk": "^4.0.0", "jest-util": "^27.5.1", "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + } } }, "jest-worker": { @@ -8377,6 +9246,12 @@ } } }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8462,9 +9337,9 @@ "dev": true }, "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -8473,10 +9348,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-schema-typed": { "version": "7.0.3", @@ -8503,34 +9377,51 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "object.assign": "^4.1.3" } }, "jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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" + } + } } }, "keyboardevent-from-electron-accelerator": { @@ -8544,11 +9435,11 @@ "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" }, "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "requires": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "kind-of": { @@ -8584,15 +9475,6 @@ "language-subtag-registry": "~0.3.2" } }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", @@ -8600,10 +9482,26 @@ }, "lazystream": { "version": "1.0.1", - "resolved": "https://npm.zone51.tf/lazystream/-/lazystream-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + } } }, "leven": { @@ -8665,38 +9563,10 @@ "yaml": "^1.10.2" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", - "dev": true - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", "dev": true }, "lilconfig": { @@ -8705,40 +9575,10 @@ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, "supports-color": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", - "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", + "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", "dev": true } } @@ -8757,6 +9597,29 @@ "rxjs": "^7.5.5", "through": "^2.3.8", "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } } }, "loader-runner": { @@ -8766,9 +9629,9 @@ "dev": true }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -8777,12 +9640,12 @@ } }, "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^5.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -8793,8 +9656,8 @@ }, "lodash.defaults": { "version": "4.2.0", - "resolved": "https://npm.zone51.tf/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "lodash.difference": { "version": "4.5.0", @@ -8808,8 +9671,8 @@ }, "lodash.flatten": { "version": "4.4.0", - "resolved": "https://npm.zone51.tf/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "lodash.isequal": { "version": "4.5.0", @@ -8818,8 +9681,8 @@ }, "lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://npm.zone51.tf/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "lodash.memoize": { "version": "4.1.2", @@ -8833,10 +9696,16 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", + "dev": true + }, "lodash.union": { "version": "4.6.0", - "resolved": "https://npm.zone51.tf/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, "lodash.uniq": { "version": "4.5.0", @@ -8908,9 +9777,9 @@ } }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "lru-cache": { "version": "6.0.0", @@ -8935,19 +9804,6 @@ "node-addon-api": "^3.1.0", "node-gyp-build": "^4.2.1", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "make-dir": { @@ -8998,9 +9854,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true } } @@ -9022,8 +9878,22 @@ "optional": true, "requires": { "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "optional": true + } } }, + "md5-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==" + }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -9037,9 +9907,9 @@ "dev": true }, "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.11.tgz", + "integrity": "sha512-GvsCITGAyDCxxsJ+X6prJexFQEhOCJaIlUbsAvjzSI5o5O7j2dle3jWvz5Z5aOdpOxW6ol3vI1+0ut+641F1+w==", "dev": true, "requires": { "fs-monkey": "^1.0.3" @@ -9123,26 +9993,14 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.0.tgz", + "integrity": "sha512-auqtVo8KhTScMsba7MbijqZTfibbXiBNlPAQbsVt7enQfcDYLdgG57eGxMqwVU3mfeWANY4F1wUg+rMF+ycZgw==", "dev": true, "requires": { "schema-utils": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -9152,12 +10010,6 @@ "fast-deep-equal": "^3.1.3" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -9187,9 +10039,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "minipass": { @@ -9260,13 +10112,16 @@ } }, "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true }, "mrmime": { "version": "1.0.1", @@ -9301,6 +10156,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -9324,9 +10185,9 @@ } }, "node-abi": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", - "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.28.0.tgz", + "integrity": "sha512-fRlDb4I0eLcQeUvGq7IY3xHrSb0c9ummdvDSYWfT9+LKP+3jCKw/tKoqaM7r1BAoiAC6GtwyjaGnOz6B3OtF+A==", "dev": true, "requires": { "semver": "^7.3.5" @@ -9347,6 +10208,30 @@ "semver": "^7.3.5" } }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -9354,16 +10239,16 @@ "dev": true }, "node-gyp": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -9389,13 +10274,18 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" + }, "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "requires": { - "abbrev": "1" + "abbrev": "^1.0.0" } }, "normalize-path": { @@ -9410,9 +10300,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "npm-conf": { "version": "1.1.3", @@ -9456,9 +10346,9 @@ } }, "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", "dev": true }, "object-assign": { @@ -9475,12 +10365,14 @@ "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -9489,58 +10381,62 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obuf": { @@ -9648,19 +10544,12 @@ "requires": { "p-cancelable": "^2.0.0", "p-some": "^5.0.0" - }, - "dependencies": { - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - } } }, "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, "p-finally": { "version": "1.0.0", @@ -9668,21 +10557,19 @@ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" }, "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^3.0.2" + "p-limit": "^2.0.0" } }, "p-map": { @@ -9719,13 +10606,6 @@ "requires": { "aggregate-error": "^3.0.0", "p-cancelable": "^2.0.0" - }, - "dependencies": { - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - } } }, "p-timeout": { @@ -9741,26 +10621,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -9821,10 +10681,9 @@ } }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" }, "path-is-absolute": { "version": "1.0.1", @@ -9920,15 +10779,6 @@ "p-locate": "^4.1.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -9937,6 +10787,12 @@ "requires": { "p-limit": "^2.2.0" } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true } } }, @@ -9946,46 +10802,6 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } } }, "plist": { @@ -9998,21 +10814,10 @@ "xmlbuilder": "^15.1.1" } }, - "popmotion": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz", - "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==", - "requires": { - "framesync": "6.1.2", - "hey-listen": "^1.0.8", - "style-value-types": "5.1.2", - "tslib": "2.4.0" - } - }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -10043,12 +10848,12 @@ } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -10118,22 +10923,22 @@ } }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -10160,12 +10965,12 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -10275,12 +11080,12 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -10292,14 +11097,6 @@ "requires": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - } } }, "postcss-normalize-whitespace": { @@ -10322,12 +11119,12 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -10427,9 +11224,21 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true } } }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10475,23 +11284,6 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" } }, "proto-list": { @@ -10519,6 +11311,109 @@ } } }, + "ps-scrollbar-tailwind": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ps-scrollbar-tailwind/-/ps-scrollbar-tailwind-0.0.1.tgz", + "integrity": "sha512-IPAAIXn0gNx4AzwHA9YY2+jZm18WTOzR+Xk+M3HfyEWWqRrGhBzQFUkgpQNe6mI2Bch1P4Bl62wh8rlR2W75jw==", + "dev": true, + "requires": { + "tailwindcss": "^2.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, + "postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + } + }, + "tailwindcss": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", + "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "dev": true, + "requires": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -10533,6 +11428,125 @@ "dns-socket": "^4.2.2", "got": "^9.6.0", "is-ip": "^3.1.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@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" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "requires": { + "lowercase-keys": "^1.0.0" + } + } } }, "pump": { @@ -10549,24 +11563,41 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "purgecss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz", + "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==", "dev": true, "requires": { - "escape-goat": "^2.0.0" + "commander": "^8.0.0", + "glob": "^7.1.7", + "postcss": "^8.3.5", + "postcss-selector-parser": "^6.0.6" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } } }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10605,12 +11636,6 @@ "unpipe": "1.0.0" }, "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10622,26 +11647,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -10664,54 +11669,15 @@ "scheduler": "^0.23.0" } }, - "react-fitty": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-fitty/-/react-fitty-1.0.1.tgz", - "integrity": "sha512-mO+Sbon+bO8Kazv38qu3uwi52vYDdty6P8fla91TkQEc2KwfZjNLT4j31cXix3ZTlBMWmavWAu5SfG6J9SpaFQ==", - "requires": { - "fitty": "2" - } - }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "react-outside-click-handler": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.3.0.tgz", - "integrity": "sha512-Te/7zFU0oHpAnctl//pP3hEAeobfeHMyygHB8MnjP6sX5OR8KHT1G3jmLsV3U9RnIYo+Yn+peJYWu+D5tUS8qQ==", - "requires": { - "airbnb-prop-types": "^2.15.0", - "consolidated-events": "^1.1.1 || ^2.0.0", - "document.contains": "^1.0.1", - "object.values": "^1.1.0", - "prop-types": "^15.7.2" - }, - "dependencies": { - "airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "requires": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } + "react-range": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/react-range/-/react-range-1.8.14.tgz", + "integrity": "sha512-v2nyD5106rHf9dwHzq+WRlhCes83h1wJRHIMFjbZsYYsO6LF4mG/mR3cH7Cf+dkeHq65DItuqIbLn/3jjYjsHg==" }, "react-refresh": { "version": "0.12.0", @@ -10726,20 +11692,20 @@ "dev": true }, "react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.3.tgz", + "integrity": "sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA==", "requires": { - "history": "^5.2.0" + "@remix-run/router": "1.0.3" } }, "react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.3.tgz", + "integrity": "sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==", "requires": { - "history": "^5.2.0", - "react-router": "6.3.0" + "@remix-run/router": "1.0.3", + "react-router": "6.4.3" } }, "react-shallow-renderer": { @@ -10771,6 +11737,14 @@ } } }, + "react-visibility-sensor": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-visibility-sensor/-/react-visibility-sensor-5.1.1.tgz", + "integrity": "sha512-cTUHqIK+zDYpeK19rzW6zF9YfT4486TIgizZW53wEZ+/GPBbK7cNS0EHyJVyHYacwFEvvHLEKfgJndbemWhB/w==", + "requires": { + "prop-types": "^15.7.2" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -10802,22 +11776,18 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdir-glob": { "version": "1.1.2", - "resolved": "https://npm.zone51.tf/readdir-glob/-/readdir-glob-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", "requires": { "minimatch": "^5.1.0" @@ -10825,7 +11795,7 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", - "resolved": "https://npm.zone51.tf/brace-expansion/-/brace-expansion-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { "balanced-match": "^1.0.0" @@ -10833,7 +11803,7 @@ }, "minimatch": { "version": "5.1.0", - "resolved": "https://npm.zone51.tf/minimatch/-/minimatch-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "requires": { "brace-expansion": "^2.0.1" @@ -10869,10 +11839,23 @@ "strip-indent": "^3.0.0" } }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==" + "reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } }, "regedit": { "version": "5.1.1", @@ -10886,14 +11869,15 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -10906,24 +11890,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -10966,6 +11932,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -10989,20 +11960,12 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } } }, "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve.exports": { @@ -11012,11 +11975,11 @@ "dev": true }, "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" } }, "restore-cursor": { @@ -11047,6 +12010,18 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11087,9 +12062,9 @@ "dev": true }, "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "requires": { "tslib": "^2.1.0" } @@ -11099,6 +12074,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11109,15 +12095,14 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, "requires": { "truncate-utf8-bytes": "^1.0.0" } }, "sass": { - "version": "1.54.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.5.tgz", - "integrity": "sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -11166,6 +12151,26 @@ "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "select-hose": { @@ -11175,18 +12180,18 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -11198,23 +12203,6 @@ "dev": true, "optional": true }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -11418,15 +12406,16 @@ "dev": true }, "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -11439,6 +12428,40 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "sirv": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", @@ -11463,14 +12486,27 @@ "dev": true }, "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + } } }, "smart-buffer": { @@ -11499,9 +12535,9 @@ } }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { "ip": "^2.0.0", @@ -11580,19 +12616,6 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "sprintf-js": { @@ -11618,9 +12641,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -11682,50 +12705,44 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string_decoder": { @@ -11746,9 +12763,9 @@ } }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-final-newline": { @@ -11778,22 +12795,13 @@ "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true }, - "style-value-types": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz", - "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==", - "requires": { - "hey-listen": "^1.0.8", - "tslib": "2.4.0" - } - }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -11816,9 +12824,9 @@ } }, "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -11872,9 +12880,9 @@ "integrity": "sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==" }, "tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", "dev": true, "requires": { "arg": "^5.0.2", @@ -11883,24 +12891,50 @@ "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.11", + "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.14", + "postcss": "^8.4.18", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", + "postcss-nested": "6.0.0", "postcss-selector-parser": "^6.0.10", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + } } }, + "tailwindcss-scoped-groups": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss-scoped-groups/-/tailwindcss-scoped-groups-2.0.0.tgz", + "integrity": "sha512-uE9PJzfjqzsKlZ0dUjG5yPwBmkEZ/qmrXMLjykRs0otolUHAIclbtV49JQGyeYLo8YA7WPMgzKOg2e4snVyHqw==" + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11908,9 +12942,9 @@ "dev": true }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -11919,19 +12953,11 @@ "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "tar-stream": { "version": "2.2.0", - "resolved": "https://npm.zone51.tf/tar-stream/-/tar-stream-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { "bl": "^4.0.3", @@ -11939,18 +12965,6 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "temp-file": { @@ -11961,35 +12975,6 @@ "requires": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "terminal-link": { @@ -12003,29 +12988,21 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } } }, "terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.14", @@ -12102,6 +13079,14 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "requires": { + "@popperjs/core": "^2.9.0" + } + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -12159,14 +13144,23 @@ "dev": true }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } } }, "tr46": { @@ -12188,7 +13182,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, "requires": { "utf8-byte-length": "^1.0.1" } @@ -12207,30 +13200,62 @@ "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } } }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - } } }, "ts-node": { @@ -12288,19 +13313,13 @@ "requires": { "minimist": "^1.2.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true } } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "tsutils": { "version": "3.21.0", @@ -12342,9 +13361,9 @@ "dev": true }, "type-fest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.17.0.tgz", - "integrity": "sha512-U+g3/JVXnOki1kLSc+xZGPRll3Ah9u2VIG6Sn9iH9YX6UkPERmt6O/0fIyTgsd2/whV0+gAaHAg8fz6sG1QzMA==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" }, "type-is": { "version": "1.6.18", @@ -12374,15 +13393,16 @@ } }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -12391,37 +13411,27 @@ } }, "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "^3.0.0" } }, "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unixify": { "version": "1.0.0", @@ -12458,57 +13468,29 @@ "jszip": "^3.1.0", "mkdirp": "^0.5.1", "yaku": "^0.16.6" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } } }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12528,6 +13510,16 @@ "schema-utils": "^3.0.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -12536,11 +13528,28 @@ "prepend-http": "^2.0.0" } }, + "use-delayed-state": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-delayed-state/-/use-delayed-state-1.2.0.tgz", + "integrity": "sha512-i/7nyyHZsJ+2qGwbb9XGTViBDs43j/57pxdbhbyhTD6XNTzqCvaZQSfIa/SLAGR7eFPK9+UV62Dfzia/aYdwPw==" + }, + "use-double-click": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", + "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==" + }, + "use-fit-text": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/use-fit-text/-/use-fit-text-2.4.0.tgz", + "integrity": "sha512-Iy4LMrXcdxWlyZ5phntMpJMgyXGB1p3tV73y2r0QrZ6f/thPh+/QU3ie6RCXmjF8tHMs20FKMPskXeDYIla/Ww==", + "requires": { + "resize-observer-polyfill": "^1.5.1" + } + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" }, "util-deprecate": { "version": "1.0.2", @@ -12559,17 +13568,6 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -12689,6 +13687,11 @@ "defaults": "^1.0.3" } }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -12696,9 +13699,9 @@ "dev": true }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -12725,24 +13728,12 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - } } }, "webpack-bundle-analyzer": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", - "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==", "dev": true, "requires": { "acorn": "^8.0.4", @@ -12817,18 +13808,6 @@ "schema-utils": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -12838,12 +13817,6 @@ "fast-deep-equal": "^3.1.3" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -12859,9 +13832,9 @@ } }, "webpack-dev-server": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz", - "integrity": "sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -12887,7 +13860,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -12895,18 +13868,6 @@ "ws": "^8.4.2" }, "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -12916,12 +13877,6 @@ "fast-deep-equal": "^3.1.3" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -12935,9 +13890,9 @@ } }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true } } @@ -13025,6 +13980,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -13033,6 +13989,32 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -13042,15 +14024,6 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -13097,12 +14070,6 @@ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -13150,32 +14117,24 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "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" - }, - "dependencies": { - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - } + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yauzl": { @@ -13202,24 +14161,12 @@ }, "zip-stream": { "version": "4.1.0", - "resolved": "https://npm.zone51.tf/zip-stream/-/zip-stream-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "requires": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } } } diff --git a/package.json b/package.json index 89b7865b..e4873efe 100644 --- a/package.json +++ b/package.json @@ -153,11 +153,11 @@ "@types/jest": "^27.5.2", "@types/node": "17.0.23", "@types/react": "^17.0.48", - "@types/react-dom": "^17.0.17", + "@types/react-dom": "^18.0.10", "@types/react-outside-click-handler": "^1.3.1", "@types/react-test-renderer": "^17.0.2", "@types/terser-webpack-plugin": "^5.0.4", - "@types/uuid": "^8.3.4", + "@types/use-double-click": "^1.0.1", "@types/webpack-bundle-analyzer": "^4.4.2", "@types/webpack-env": "^1.18.0", "@typescript-eslint/eslint-plugin": "^5.34.0", @@ -172,7 +172,7 @@ "css-minimizer-webpack-plugin": "^4.1.0", "detect-port": "^1.3.0", "electron": "^20.0.3", - "electron-builder": "^23.3.3", + "electron-builder": "^23.6.0", "electron-devtools-installer": "^3.2.0", "electron-notarize": "^1.2.1", "electron-rebuild": "^3.2.9", @@ -199,6 +199,7 @@ "postcss": "^8.4.16", "postcss-loader": "^6.2.1", "prettier": "^2.7.1", + "ps-scrollbar-tailwind": "0.0.1", "react-refresh": "^0.12.0", "react-refresh-typescript": "^2.0.7", "react-test-renderer": "^18.2.0", @@ -207,7 +208,7 @@ "sass-loader": "^12.6.0", "style-loader": "^3.3.1", "tailwind-scrollbar": "^2.0.1", - "tailwindcss": "^3.1.8", + "tailwindcss": "^3.2.4", "terser-webpack-plugin": "^5.3.5", "ts-jest": "^27.1.5", "ts-loader": "^9.3.0", @@ -222,6 +223,7 @@ }, "dependencies": { "@node-steam/vdf": "^2.2.0", + "@tippyjs/react": "^4.2.6", "archiver": "^5.3.1", "dateformat": "^5.0.3", "dot-prop": "^7.2.0", @@ -229,19 +231,29 @@ "electron-log": "^4.4.8", "electron-store": "^8.1.0", "electron-updater": "^5.2.4", - "framer-motion": "^7.2.1", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^8.0.2", + "fs-extra": "^10.1.0", "history": "^5.3.0", "is-online": "^9.0.1", + "md5-file": "^5.0.0", + "node-fetch": "^3.3.0", + "node-stream-zip": "^1.15.0", "react": "^18.2.0", "react-colorful": "^5.6.1", "react-dom": "^18.2.0", - "react-fitty": "^1.0.1", - "react-outside-click-handler": "^1.3.0", + "react-range": "^1.8.14", "react-router-dom": "^6.3.0", + "react-visibility-sensor": "^5.1.1", "regedit": "^5.1.1", "rxjs": "^7.5.6", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", "tailwind-scrollbar-hide": "^1.1.7", - "uuid": "^9.0.0" + "tailwindcss-scoped-groups": "^2.0.0", + "use-delayed-state": "^1.2.0", + "use-double-click": "^1.0.5", + "use-fit-text": "^2.4.0" }, "devEngines": { "node": ">=14.x", diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..ce32bac3 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); + +module.exports = { + plugins: [tailwindcss, autoprefixer], +}; diff --git a/release/app/package-lock.json b/release/app/package-lock.json index 7cddf680..305cf6b6 100644 --- a/release/app/package-lock.json +++ b/release/app/package-lock.json @@ -1,6 +1,6 @@ { - "name": "BSManager", - "version": "0.1.0", + "name": "bs-manager", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/release/app/package.json b/release/app/package.json index 06d9fdc1..46120272 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,6 +1,6 @@ { - "name": "BSManager", - "version": "0.1.0", + "name": "bs-manager", + "version": "0.2.0", "description": "A foundation for scalable desktop apps", "main": "./dist/main/main.js", "author": { diff --git a/resources/readme/icon.png b/resources/readme/icon.png new file mode 100644 index 00000000..09473801 Binary files /dev/null and b/resources/readme/icon.png differ diff --git a/src/__tests__/App.test.tsx b/src/__tests__/App.test.tsx index 6a1de2a6..0eeebd3e 100644 --- a/src/__tests__/App.test.tsx +++ b/src/__tests__/App.test.tsx @@ -1,6 +1,6 @@ import '@testing-library/jest-dom'; import { render } from '@testing-library/react'; -import App from '../renderer/App'; +import App from '../renderer/windows/App'; describe('App', () => { it('should render', () => { diff --git a/src/main/constants.ts b/src/main/constants.ts index dfe276d9..74ca8198 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -1,3 +1,5 @@ export const BS_EXECUTABLE = "Beat Saber.exe"; +export const OCULUS_BS_DIR = "hyperbolic-magnetism-beat-saber" export const BS_APP_ID = "620980"; export const BS_DEPOT = "620981"; +export const APP_NAME = "BSManager"; diff --git a/src/main/helpers/array-tools.ts b/src/main/helpers/array-tools.ts new file mode 100644 index 00000000..e7967792 --- /dev/null +++ b/src/main/helpers/array-tools.ts @@ -0,0 +1,7 @@ +export function splitIntoChunk(arr: T[], chunkSize: number): T[][] { + const resArr = []; + for(let i = 0; i < arr.length; i += chunkSize){ + resArr.push(arr.slice(i, i + chunkSize)); + } + return resArr; +} \ No newline at end of file diff --git a/src/main/helpers/url.helpers.ts b/src/main/helpers/url.helpers.ts new file mode 100644 index 00000000..ea1981b9 --- /dev/null +++ b/src/main/helpers/url.helpers.ts @@ -0,0 +1,9 @@ +export function isValidUrl(url: string): boolean{ + try{ + new URL(url); + return true; + } + catch(e){ + return false; + } +} \ No newline at end of file diff --git a/src/main/ipcs/beat-saver-ipcs.ts b/src/main/ipcs/beat-saver-ipcs.ts new file mode 100644 index 00000000..980666b1 --- /dev/null +++ b/src/main/ipcs/beat-saver-ipcs.ts @@ -0,0 +1,49 @@ +import { ipcMain } from "electron"; +import { UtilsService } from "../services/utils.service"; +import { IpcRequest } from "shared/models/ipc"; +import { SearchParams } from "shared/models/maps/beat-saver.model"; +import { BeatSaverService } from "../services/thrid-party/beat-saver/beat-saver.service"; + +ipcMain.on("bsv-search-map", async (event, request: IpcRequest) => { + const utlis = UtilsService.getInstance(); + const bsvService = BeatSaverService.getInstance(); + + bsvService.searchMaps(request.args).then(maps => { + utlis.ipcSend(request.responceChannel, {success: true, data: maps}); + }).catch(e => { + utlis.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); + +ipcMain.on("bsv-get-map-details-from-hashs", async (event, request: IpcRequest) => { + const utlis = UtilsService.getInstance(); + const bsvService = BeatSaverService.getInstance(); + + bsvService.getMapDetailsFromHashs(request.args).then(maps => { + utlis.ipcSend(request.responceChannel, {success: true, data: maps}); + }).catch(e => { + utlis.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); + +ipcMain.on("bsv-get-map-details-by-id", async (event, request: IpcRequest) => { + const utlis = UtilsService.getInstance(); + const bsvService = BeatSaverService.getInstance(); + + bsvService.getMapDetailsById(request.args).then(maps => { + utlis.ipcSend(request.responceChannel, {success: true, data: maps}); + }).catch(e => { + utlis.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); + +ipcMain.on("bsv-get-playlist-details-by-id", async (event, request: IpcRequest) => { + const utlis = UtilsService.getInstance(); + const bsvService = BeatSaverService.getInstance(); + + bsvService.getPlaylistPage(request.args).then(maps => { + utlis.ipcSend(request.responceChannel, {success: true, data: maps}); + }).catch(e => { + utlis.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); \ No newline at end of file diff --git a/src/main/ipcs/bs-launcher-ipcs.ts b/src/main/ipcs/bs-launcher-ipcs.ts index c269e603..53ff080a 100644 --- a/src/main/ipcs/bs-launcher-ipcs.ts +++ b/src/main/ipcs/bs-launcher-ipcs.ts @@ -10,7 +10,6 @@ ipcMain.on('bs-launch.launch', (event, request: IpcRequest) => { const utilsService = UtilsService.getInstance(); launcherService.launch(request.args).then(res => { - console.log("BEAT SABER LANCER"); utilsService.ipcSend(request.responceChannel, {success: true, data: res}); }).catch((err: BsmException) => { utilsService.ipcSend(request.responceChannel, {success: false, error: err}); diff --git a/src/main/ipcs/bs-maps-ipcs.ts b/src/main/ipcs/bs-maps-ipcs.ts new file mode 100644 index 00000000..4868df52 --- /dev/null +++ b/src/main/ipcs/bs-maps-ipcs.ts @@ -0,0 +1,140 @@ +import { ipcMain } from "electron"; +import { LocalMapsManagerService } from "../services/additional-content/local-maps-manager.service"; +import { UtilsService } from "../services/utils.service"; +import { BSVersion } from "shared/bs-version.interface"; +import { IpcRequest } from "shared/models/ipc"; +import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; +import { BsvMapDetail } from "shared/models/maps"; + +ipcMain.on('get-version-maps', (event, request: IpcRequest) => { + const utilsService = UtilsService.getInstance(); + const localMaps = LocalMapsManagerService.getInstance(); + + localMaps.getMaps(request.args).then(maps => { + utilsService.ipcSend(request.responceChannel, {success: true, data: maps}); + }).catch(() => { + utilsService.ipcSend(request.responceChannel, {success: false}); + }) + +}); + +ipcMain.on("verion-have-maps-linked", async (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + utils.ipcSend(request.responceChannel, {success: true, data: await maps.versionIsLinked(request.args)}); + + }); + +ipcMain.on("link-version-maps", async (event, request: IpcRequest<{version: BSVersion, keepMaps: boolean}>) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.linkVersionMaps(request.args.version, request.args.keepMaps).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: true, error: err}); + }); + +}); + +ipcMain.on("unlink-version-maps", async (event, request: IpcRequest<{version: BSVersion, keepMaps: boolean}>) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.unlinkVersionMaps(request.args.version, request.args.keepMaps).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: true, error: err}); + }); + +}); + +ipcMain.on("delete-maps", async (event, request: IpcRequest<{version: BSVersion, maps: BsmLocalMap[]}>) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.deleteMaps(request.args.maps, request.args.version).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + }); +}); + +ipcMain.on("export-maps", async (event, request: IpcRequest<{version: BSVersion, maps: BsmLocalMap[], outPath: string}>) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.exportMaps(request.args.version, request.args.maps, request.args.outPath).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + }); +}); + +ipcMain.on("download-map", async (event, request: IpcRequest<{map: BsvMapDetail, version: BSVersion}>) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.downloadMap(request.args.map, request.args.version).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + }); +}); + +ipcMain.on("one-click-install-map", async (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const maps = LocalMapsManagerService.getInstance(); + + maps.oneClickDownloadMap(request.args).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + }); +}); + +ipcMain.on("register-maps-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalMapsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.enableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("unregister-maps-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalMapsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.disableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("is-map-deep-links-enabled", async (event, request: IpcRequest) => { + + const maps = LocalMapsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.isDeepLinksEnabled(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); \ No newline at end of file diff --git a/src/main/ipcs/bs-model-ipcs.ts b/src/main/ipcs/bs-model-ipcs.ts new file mode 100644 index 00000000..a56c9a81 --- /dev/null +++ b/src/main/ipcs/bs-model-ipcs.ts @@ -0,0 +1,61 @@ +import { ipcMain } from "electron"; +import { UtilsService } from "../services/utils.service"; +import { IpcRequest } from "shared/models/ipc"; +import { MSModel } from "shared/models/model-saber/model-saber.model"; +import { LocalModelsManagerService } from "../services/additional-content/local-models-manager.service"; + +ipcMain.on("one-click-install-model", async (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const models = LocalModelsManagerService.getInstance(); + + models.oneClickDownloadModel(request.args).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(e => { + utils.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); + +ipcMain.on("register-models-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalModelsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.enableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("unregister-models-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalModelsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.disableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("is-models-deep-links-enabled", async (event, request: IpcRequest) => { + + const maps = LocalModelsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.isDeepLinksEnabled(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); \ No newline at end of file diff --git a/src/main/ipcs/bs-mods-ipcs.ts b/src/main/ipcs/bs-mods-ipcs.ts new file mode 100644 index 00000000..fe4590ee --- /dev/null +++ b/src/main/ipcs/bs-mods-ipcs.ts @@ -0,0 +1,68 @@ +import { ipcMain } from "electron"; +import { BsModsManagerService } from "../services/mods/bs-mods-manager.service"; +import { UtilsService } from "../services/utils.service"; +import { BSVersion } from "shared/bs-version.interface"; +import { IpcRequest } from "shared/models/ipc"; +import { Mod } from "shared/models/mods/mod.interface"; +import { InstallModsResult } from "shared/models/mods"; +import log from "electron-log"; + +ipcMain.on("get-available-mods", (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.getAvailableMods(request.args).then(mods => { + utils.ipcSend(request.responceChannel, {success: true, data: mods}); + }).catch(err =>{ + utils.ipcSend(request.responceChannel, {success: false}); + log.error("ipc", "get-available-mods", err, request); + }); +}); + +ipcMain.on("get-installed-mods", (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.getInstalledMods(request.args).then(mods => { + utils.ipcSend(request.responceChannel, {success: true, data: mods}); + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false}); + log.error("ipc", "get-installed-mods", err, request); + }); +}); + +ipcMain.on("install-mods", (event, request: IpcRequest<{mods: Mod[], version: BSVersion}>) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.installMods(request.args.mods, request.args.version).then(nbInstalled => { + utils.ipcSend(request.responceChannel, {success: true, data: nbInstalled}) + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + log.error("ipc", "install-mods", err, request); + }) +}); + +ipcMain.on("uninstall-mods", (event, request: IpcRequest<{mods: Mod[], version: BSVersion}>) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.uninstallMods(request.args.mods, request.args.version).then(nbInstalled => { + utils.ipcSend(request.responceChannel, {success: true, data: nbInstalled}) + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + log.error("ipc", "uninstall-mods", err, request); + }) +}); + +ipcMain.on("uninstall-all-mods", (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const modsManager = BsModsManagerService.getInstance(); + + modsManager.uninstallAllMods(request.args).then(nbInstalled => { + utils.ipcSend(request.responceChannel, {success: true, data: nbInstalled}) + }).catch(err => { + utils.ipcSend(request.responceChannel, {success: false, error: err}); + log.error("ipc", "uninstall-all-mods", err, request); + }) +}); \ No newline at end of file diff --git a/src/main/ipcs/bs-playlist-ipcs.ts b/src/main/ipcs/bs-playlist-ipcs.ts new file mode 100644 index 00000000..7ed970f3 --- /dev/null +++ b/src/main/ipcs/bs-playlist-ipcs.ts @@ -0,0 +1,61 @@ +import { ipcMain } from "electron"; +import { IpcRequest } from "shared/models/ipc"; +import { LocalPlaylistsManagerService } from "../services/additional-content/local-playlists-manager.service"; +import { UtilsService } from "../services/utils.service"; + +ipcMain.on("one-click-install-playlist", async (event, request: IpcRequest) => { + + const utils = UtilsService.getInstance(); + const playlists = LocalPlaylistsManagerService.getInstance(); + + playlists.oneClickInstallPlaylist(request.args).then(() => { + utils.ipcSend(request.responceChannel, {success: true}); + }).catch(e => { + utils.ipcSend(request.responceChannel, {success: false, error: e}); + }); +}); + +ipcMain.on("register-playlists-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalPlaylistsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.enableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("unregister-playlists-deep-link", async (event, request: IpcRequest) => { + + const maps = LocalPlaylistsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.disableDeepLinks(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); + +ipcMain.on("is-playlists-deep-links-enabled", async (event, request: IpcRequest) => { + + const maps = LocalPlaylistsManagerService.getInstance(); + const utils = UtilsService.getInstance(); + + try{ + const res = maps.isDeepLinksEnabled(); + utils.ipcSend(request.responceChannel, {success: true, data: res}); + } + catch(e){ + utils.ipcSend(request.responceChannel, {success: false}); + } + +}); \ No newline at end of file diff --git a/src/main/ipcs/bs-version-ipcs.ts b/src/main/ipcs/bs-version-ipcs.ts index de28bf17..1fb0cfd3 100644 --- a/src/main/ipcs/bs-version-ipcs.ts +++ b/src/main/ipcs/bs-version-ipcs.ts @@ -2,13 +2,9 @@ import { ipcMain } from 'electron'; import { UtilsService } from '../services/utils.service'; import { BSVersionLibService } from '../services/bs-version-lib.service' import { BSVersion } from 'shared/bs-version.interface'; -import path from 'path'; import { exec } from 'child_process'; -import { SteamService } from '../services/steam.service'; -import { BS_APP_ID } from '../constants'; import { IpcRequest } from 'shared/models/ipc'; import { BSLocalVersionService } from '../services/bs-local-version.service'; -import { InstallationLocationService } from '../services/installation-location.service'; import { BsmException } from 'shared/models/bsm-exception.model'; ipcMain.on('bs-version.get-version-dict', (event, req: IpcRequest) => { diff --git a/src/main/ipcs/index.ts b/src/main/ipcs/index.ts index 7d9b243f..0fc184bf 100644 --- a/src/main/ipcs/index.ts +++ b/src/main/ipcs/index.ts @@ -3,7 +3,12 @@ import './os-controls-ipcs'; import './bs-launcher-ipcs'; import './bs-version-ipcs'; import './bs-uninstall-ipcs'; -import './map-ipcs'; import './supporters-ipcs'; import './launcher-ipcs'; import './window-manager-ipcs'; +import './bs-mods-ipcs'; +import './bs-maps-ipcs'; +import './beat-saver-ipcs'; +import './bs-playlist-ipcs'; +import './model-saber.ipcs'; +import './bs-model-ipcs'; \ No newline at end of file diff --git a/src/main/ipcs/map-ipcs.ts b/src/main/ipcs/map-ipcs.ts deleted file mode 100644 index 19ea6ff8..00000000 --- a/src/main/ipcs/map-ipcs.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ipcMain} from 'electron'; -import { MapService } from '../services/map.service'; -import { UtilsService } from '../services/utils.service'; -import { IpcRequest } from 'shared/models/ipc'; -import { ExportVersionMapsOption } from 'shared/models/maps/export-version-maps.model'; - -ipcMain.on("map.export-version", (event, request: IpcRequest) => { - const utils = UtilsService.getInstance(); - const mapService = MapService.getInstance(); - mapService.exportVersionMaps(request.args.version, request.args.path).then(() => { - utils.ipcSend(request.responceChannel, {success: true}); - }).catch(() => utils.ipcSend(request.responceChannel, {success: false, error: {title: "", msg: ""}})); -}); \ No newline at end of file diff --git a/src/main/ipcs/model-saber.ipcs.ts b/src/main/ipcs/model-saber.ipcs.ts new file mode 100644 index 00000000..911d7542 --- /dev/null +++ b/src/main/ipcs/model-saber.ipcs.ts @@ -0,0 +1,15 @@ +import { ipcMain } from "electron"; +import { IpcRequest } from "shared/models/ipc"; +import { ModelSaberService } from "../services/thrid-party/model-saber/model-saber.service"; +import { UtilsService } from "../services/utils.service"; + +ipcMain.on("ms-get-model-by-id", async (event, request: IpcRequest) => { + const utils = UtilsService.getInstance(); + const ms = ModelSaberService.getInstance(); + + ms.getModelById(request.args).then(model => { + utils.ipcSend(request.responceChannel, {success: true, data: model}); + }).catch(e => { + utils.ipcSend(request.responceChannel, {success: false, error: e}); + }) +}); \ No newline at end of file diff --git a/src/main/ipcs/os-controls-ipcs.ts b/src/main/ipcs/os-controls-ipcs.ts index ceda3cc6..aaec73c8 100644 --- a/src/main/ipcs/os-controls-ipcs.ts +++ b/src/main/ipcs/os-controls-ipcs.ts @@ -1,25 +1,31 @@ import { ipcMain, shell, dialog, app } from 'electron'; import { UtilsService } from '../services/utils.service'; import { IpcRequest } from 'shared/models/ipc'; +import { SystemNotificationOptions } from 'shared/models/notification/system-notification.model'; +import { NotificationService } from '../services/notification.service'; +import { SteamService } from '../services/steam.service'; + + +// TODO IMPROVE WINDOW CONTROL BY USING WINDOW SERVICE ipcMain.on('window.close', async () => { const utils = UtilsService.getInstance(); - utils.getMainWindow()?.close(); + utils.getMainWindows("index.html")?.close(); }); ipcMain.on('window.maximize', async () => { const utils = UtilsService.getInstance(); - utils.getMainWindow()?.maximize(); + utils.getMainWindows("index.html")?.maximize(); }); ipcMain.on('window.minimize', async () => { const utils = UtilsService.getInstance(); - utils.getMainWindow()?.minimize(); + utils.getMainWindows("index.html")?.minimize(); }); ipcMain.on('window.reset', async () => { const utils = UtilsService.getInstance(); - utils.getMainWindow()?.restore(); + utils.getMainWindows("index.html")?.restore(); }); ipcMain.on('new-window', async (event, request: IpcRequest) => { @@ -34,7 +40,7 @@ ipcMain.on('choose-folder', async (event, request: IpcRequest) => { ipcMain.on("window.progression", async (event, request: IpcRequest) => { const utils = UtilsService.getInstance(); - utils.getMainWindow().setProgressBar(request.args / 100); + utils.getMainWindows("index.html")?.setProgressBar(request.args / 100); }); ipcMain.on('save-file', async (event, request: IpcRequest<{filename?: string, filters?: Electron.FileFilter[]}>) => { @@ -48,3 +54,21 @@ ipcMain.on('save-file', async (event, request: IpcRequest<{filename?: string, fi ipcMain.on("current-version", async (event, request: IpcRequest) => { UtilsService.getInstance().ipcSend(request.responceChannel, {success: true, data: app.getVersion()}); }); + +ipcMain.on("open-logs", async (event, request: IpcRequest) => { + shell.openPath(app.getPath("logs")); +}); + +ipcMain.on("notify-system", async (event, request: IpcRequest) => { + NotificationService.getInstance().notify(request.args) +}); + +ipcMain.on("open-steam", async (event, request: IpcRequest) => { + const steam = SteamService.getInstance(); + const utils = UtilsService.getInstance(); + steam.openSteam().then(res => { + utils.ipcSend(request.responceChannel, {success: true, data: res}); + }).catch((e) => { + utils.ipcSend(request.responceChannel, {success: false, error: e}); + }); +}); \ No newline at end of file diff --git a/src/main/ipcs/window-manager-ipcs.ts b/src/main/ipcs/window-manager-ipcs.ts index b0551ddc..e0393d68 100644 --- a/src/main/ipcs/window-manager-ipcs.ts +++ b/src/main/ipcs/window-manager-ipcs.ts @@ -9,4 +9,14 @@ ipcMain.on("open-window-then-close-all", async (event, request: IpcRequest { windowManager.closeAllWindows(request.args); }); +}); + +ipcMain.on("close-all-windows", async (event, request: IpcRequest) => { + const windowManager = WindowManagerService.getInstance(); + windowManager.closeAllWindows(request.args); +}); + +ipcMain.on("close-windows", async (event, request: IpcRequest) => { + const windowManager = WindowManagerService.getInstance(); + windowManager.close(...request.args); }); \ No newline at end of file diff --git a/src/main/main.ts b/src/main/main.ts index 8b66731a..10bd4c52 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -9,20 +9,24 @@ * `./src/main.js` using webpack. This gives us some performance wins. */ import path from 'path'; -import { app } from 'electron'; +import { app, protocol } from 'electron'; import log from 'electron-log'; import './ipcs'; import { UtilsService } from './services/utils.service'; import { WindowManagerService } from './services/window-manager.service'; - -export const PRELOAD_PATH = app.isPackaged ? path.join(__dirname, 'preload.js') : path.join(__dirname, '../../.erb/dll/preload.js') +import { DeepLinkService } from './services/deep-link.service'; +import { AppWindow } from 'shared/models/window-manager/app-window.model'; +import { LocalMapsManagerService } from './services/additional-content/local-maps-manager.service'; +import { LocalPlaylistsManagerService } from './services/additional-content/local-playlists-manager.service'; +import { LocalModelsManagerService } from './services/additional-content/local-models-manager.service'; +import { APP_NAME } from './constants'; const isDebug = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; log.transports.file.level = 'info'; log.transports.file.resolvePath = (() => { const now = new Date(); - return path.join(app.getPath("logs"), `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}.log`); + return path.join(app.getPath("logs"), `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}-v${app.getVersion()}.log`); }); log.catchErrors(); @@ -30,7 +34,6 @@ log.catchErrors(); const utilsService = UtilsService.getInstance(); utilsService.setAssetsPath(app.isPackaged ? path.join(process.resourcesPath, 'assets') : path.join(__dirname, '../../assets')); - if (process.env.NODE_ENV === 'production') { const sourceMapSupport = require('source-map-support'); sourceMapSupport.install(); @@ -48,11 +51,18 @@ const installExtensions = async () => { return installer.default(extensions.map((name) => installer[name]), forceDownload).catch(console.log); }; -const createWindow = async () => { +const createWindow = async (window: AppWindow = "launcher.html") => { if(isDebug){ await installExtensions(); } - WindowManagerService.getInstance().openWindow("launcher.html"); + WindowManagerService.getInstance().openWindow(window); }; +const initServicesMustBeInitialized = () => { + LocalMapsManagerService.getInstance(); + LocalPlaylistsManagerService.getInstance(); + LocalModelsManagerService.getInstance(); + // Model +} + app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed @@ -61,6 +71,42 @@ app.on('window-all-closed', () => { } }); -app.whenReady().then(() => { - createWindow(); -}).catch(console.log); \ No newline at end of file +const gotTheLock = app.requestSingleInstanceLock(); + +if(!gotTheLock){ + app.quit(); +} +else{ + + app.on('second-instance', (e, argv) => { + + const deepLink = argv.find(arg => DeepLinkService.getInstance().isDeepLink(arg)); + + if(!deepLink){ return; } + + DeepLinkService.getInstance().dispatchLinkOpened(deepLink); + + }); + + app.whenReady().then(() => { + + app.setAppUserModelId(APP_NAME); + + initServicesMustBeInitialized(); + + const deepLink = process.argv.find(arg => DeepLinkService.getInstance().isDeepLink(arg)); + + if(!deepLink){ + createWindow(); + } + else{ + DeepLinkService.getInstance().dispatchLinkOpened(deepLink); + } + + protocol.registerFileProtocol('file', (request, callback) => { + const pathname = decodeURI(request.url.replace('file:///', '')); + callback(pathname); + }); + + }).catch(log.error); +} \ No newline at end of file diff --git a/src/main/services/additional-content/local-maps-manager.service.ts b/src/main/services/additional-content/local-maps-manager.service.ts new file mode 100644 index 00000000..12580c40 --- /dev/null +++ b/src/main/services/additional-content/local-maps-manager.service.ts @@ -0,0 +1,306 @@ +import path from "path"; +import { BSVersion } from "shared/bs-version.interface"; +import { BsvMapDetail, RawMapInfoData } from "shared/models/maps"; +import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; +import { BSLocalVersionService } from "../bs-local-version.service"; +import { InstallationLocationService } from "../installation-location.service"; +import { UtilsService } from "../utils.service"; +import crypto from "crypto"; +import { lstatSync, symlinkSync, unlinkSync, readdirSync, createWriteStream } from "fs"; +import { copySync } from "fs-extra"; +import StreamZip from "node-stream-zip"; +import { RequestService } from "../request.service"; +import sanitize from "sanitize-filename"; +import archiver from "archiver"; +import { DeepLinkService } from "../deep-link.service"; +import log from 'electron-log'; +import { WindowManagerService } from "../window-manager.service"; +import { ipcMain } from "electron"; +import { IpcRequest } from 'shared/models/ipc'; + +export class LocalMapsManagerService { + + private static instance: LocalMapsManagerService; + + public static getInstance(): LocalMapsManagerService{ + if(!LocalMapsManagerService.instance){ LocalMapsManagerService.instance = new LocalMapsManagerService(); } + return LocalMapsManagerService.instance; + } + + private readonly LEVELS_ROOT_FOLDER = "Beat Saber_Data"; + private readonly CUSTOM_LEVELS_FOLDER = "CustomLevels"; + + private readonly DEEP_LINKS = { + BeatSaver: "beatsaver", + ScoreSaber: "web+bsmap" + }; + + private readonly localVersion: BSLocalVersionService; + private readonly installLocation: InstallationLocationService; + private readonly utils: UtilsService; + private readonly reqService: RequestService; + private readonly deepLink: DeepLinkService; + private readonly windows: WindowManagerService; + + private constructor(){ + this.localVersion = BSLocalVersionService.getInstance(); + this.installLocation = InstallationLocationService.getInstance(); + this.utils = UtilsService.getInstance(); + this.reqService = RequestService.getInstance(); + this.deepLink = DeepLinkService.getInstance(); + this.windows = WindowManagerService.getInstance(); + + this.deepLink.addLinkOpenedListener(this.DEEP_LINKS.BeatSaver, (link) => { + log.info("DEEP-LINK RECEIVED FROM", this.DEEP_LINKS.BeatSaver, link); + this.openOneClickDownloadMapWindow(new URL(link).host); + }); + + this.deepLink.addLinkOpenedListener(this.DEEP_LINKS.ScoreSaber, (link) => { + log.info("DEEP-LINK RECEIVED FROM", this.DEEP_LINKS.ScoreSaber, link); + this.openOneClickDownloadMapWindow(new URL(link).host, true); + }); + } + + public async getMapsFolderPath(version?: BSVersion): Promise{ + if(version){ return path.join(await this.localVersion.getVersionPath(version), this.LEVELS_ROOT_FOLDER, this.CUSTOM_LEVELS_FOLDER); } + const sharedMapsPath = path.join(this.installLocation.sharedMapsPath, this.CUSTOM_LEVELS_FOLDER); + if(!(await this.utils.pathExist(sharedMapsPath))){ + this.utils.createFolderIfNotExist(sharedMapsPath); + } + return sharedMapsPath; + } + + private async computeMapHash(mapPath: string, rawInfoString: string): Promise{ + const mapRawInfo = JSON.parse(rawInfoString); + let content = rawInfoString; + for(const set of mapRawInfo._difficultyBeatmapSets){ + for(const diff of set._difficultyBeatmaps){ + const diffFilePath = path.join(mapPath, diff._beatmapFilename); + if(!await this.utils.pathExist(diffFilePath)){ continue; } + const diffContent = (await this.utils.readFileAsync(diffFilePath)).toString(); + content += diffContent; + } + } + + const shasum = crypto.createHash("sha1"); + shasum.update(content); + return shasum.digest("hex"); + } + + private async loadMapInfoFromPath(mapPath: string): Promise{ + const infoFilePath = path.join(mapPath, "Info.dat"); + + if(!(await this.utils.pathExist(infoFilePath))){ return null; } + + const rawInfoString = await (await (this.utils.readFileAsync(infoFilePath))).toString(); + + const rawInfo: RawMapInfoData = JSON.parse(rawInfoString); + const coverUrl = new URL(`file:///${path.join(mapPath, rawInfo._coverImageFilename)}`).href; + const songUrl = new URL(`file:///${path.join(mapPath, rawInfo._songFilename)}`).href; + + const hash = await this.computeMapHash(mapPath, rawInfoString); + + return {rawInfo, coverUrl, songUrl, hash}; + } + + private async downloadMapZip(zipUrl: string): Promise<{zip: StreamZip.StreamZipAsync, zipPath: string}>{ + const fileName = path.basename(zipUrl); + const tempPath = this.utils.getTempPath(); + this.utils.createFolderIfNotExist(this.utils.getTempPath()); + const dest = path.join(tempPath, fileName); + + const zipPath = await this.reqService.downloadFile(zipUrl, dest); + const zip = new StreamZip.async({file : zipPath}); + + return {zip, zipPath}; + } + + private async getAbsoluteFolderOfMaps(maps: BsmLocalMap[], version: BSVersion): Promise{ + + const mapsFolder = await this.getMapsFolderPath(version); + + const res: string[] = []; + const mapHashs = maps.map(map => map.hash); + + const mapsFolders = readdirSync(mapsFolder, {withFileTypes: true}); + + for(const content of mapsFolders){ + if(!content.isDirectory()){ continue; } + const mapFolderPath = path.join(mapsFolder, content.name); + const { hash } = await this.loadMapInfoFromPath(mapFolderPath); + if(mapHashs.includes(hash)){ + res.push(mapFolderPath); + } + } + + return res; + + } + + private openOneClickDownloadMapWindow(mapId: string, isHash = false): void{ + + ipcMain.once("one-click-map-info", async (event, req: IpcRequest) => { + this.utils.ipcSend(req.responceChannel, {success: true, data: {id: mapId, isHash}}); + }); + + this.windows.openWindow("oneclick-download-map.html"); + + } + + public async getMaps(version?: BSVersion): Promise{ + const levelsFolder = await this.getMapsFolderPath(version); + + const levelsPath = (await this.utils.pathExist(levelsFolder)) ? this.utils.listDirsInDir(levelsFolder, true) : []; + + const mapsInfo = await Promise.all(levelsPath.map(levelPath => this.loadMapInfoFromPath(levelPath))); + + return mapsInfo.filter(info => !!info); + } + + public async versionIsLinked(version: BSVersion): Promise{ + + const levelsPath = await this.getMapsFolderPath(version); + + const isPathExist = await this.utils.pathExist(levelsPath); + + if(!isPathExist){ return false; } + + return lstatSync(levelsPath).isSymbolicLink() + } + + public async linkVersionMaps(version: BSVersion, keepMaps: boolean): Promise{ + + if(await this.versionIsLinked(version)){ return; } + + const sharedMapsPath = await this.getMapsFolderPath(); + const versionMapsPath = await this.getMapsFolderPath(version); + + if(keepMaps){ + await this.utils.moveDirContent(versionMapsPath, sharedMapsPath); + } + + await this.utils.deleteFolder(versionMapsPath); + + symlinkSync(sharedMapsPath, versionMapsPath, "junction"); + } + + public async unlinkVersionMaps(version: BSVersion, keepMaps: boolean): Promise{ + + const sharedMapsPath = await this.getMapsFolderPath(); + const versionMapsPath = await this.getMapsFolderPath(version); + + if(await this.versionIsLinked(version)){ + unlinkSync(versionMapsPath); + } + + this.utils.createFolderIfNotExist(versionMapsPath); + + if(keepMaps){ + copySync(sharedMapsPath, versionMapsPath); + } + + } + + public async deleteMaps(maps: BsmLocalMap[], verion?: BSVersion){ + + const mapsFolders = await this.getAbsoluteFolderOfMaps(maps, verion); + const mapsHashsToDelete = maps.map(map => map.hash); + + for(const folder of mapsFolders){ + const { hash } = await this.loadMapInfoFromPath(folder); + if(mapsHashsToDelete.includes(hash)){ + await this.utils.deleteFolder(folder); + } + } + + } + + public async downloadMap(map: BsvMapDetail, version?: BSVersion): Promise{ + + if(!map.versions.at(0).hash){ throw "Cannot download map, no hash found"; } + + const zipUrl = map.versions.at(0).downloadURL; + + const mapsFolder = await this.getMapsFolderPath(version); + + const {zip, zipPath} = await this.downloadMapZip(zipUrl); + + const mapFolderName = sanitize(`${map.id}-${map.name}`); + + const mapPath = path.join(mapsFolder, mapFolderName); + + if(!zip){ throw `Cannot download ${zipUrl}`; } + + this.utils.createFolderIfNotExist(mapPath); + + await zip.extract(null, mapPath); + await zip.close(); + + unlinkSync(zipPath); + + return mapPath; + } + + public async exportMaps(version: BSVersion, maps: BsmLocalMap[], outPath: string){ + + const output = createWriteStream(outPath); + const archive = archiver("zip", {zlib: {level: 9}}); + + archive.pipe(output); + archive.on("error", (e) => {throw e}); + + if(!maps || maps.length === 0){ + + const mapsFolder = await this.getMapsFolderPath(version); + archive.directory(mapsFolder, false); + + } + else{ + + const mapsFolders = await this.getAbsoluteFolderOfMaps(maps, version); + + for(const folder of mapsFolders){ + archive.directory(folder, path.basename(folder)); + } + + } + + await archive.finalize(); + + } + + public async oneClickDownloadMap(map: BsvMapDetail): Promise{ + + const downloadedMap = await this.downloadMap(map); + + const versions = await this.localVersion.getInstalledVersions(); + + for(const version of versions){ + + if(await this.versionIsLinked(version)){ continue; } + + const versionMapsPath = await this.getMapsFolderPath(version); + + this.utils.createFolderIfNotExist(versionMapsPath); + + copySync(downloadedMap, path.join(versionMapsPath, path.basename(downloadedMap)), {overwrite: true}); + + } + + } + + public enableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.registerDeepLink(link)); + } + + public disableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.unRegisterDeepLink(link)); + } + + public isDeepLinksEnabled(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.isDeepLinkRegistred(link)); + } + + + +} \ No newline at end of file diff --git a/src/main/services/additional-content/local-models-manager.service.ts b/src/main/services/additional-content/local-models-manager.service.ts new file mode 100644 index 00000000..f266d93a --- /dev/null +++ b/src/main/services/additional-content/local-models-manager.service.ts @@ -0,0 +1,126 @@ +import { DeepLinkService } from "../deep-link.service"; +import log from "electron-log" +import { ipcMain } from "electron"; +import { IpcRequest } from "shared/models/ipc"; +import { UtilsService } from "../utils.service"; +import { WindowManagerService } from "../window-manager.service"; +import { MSModel, MSModelType } from "shared/models/model-saber/model-saber.model"; +import { BSVersion } from "shared/bs-version.interface"; +import { BSLocalVersionService } from "../bs-local-version.service"; +import path from "path"; +import { RequestService } from "../request.service"; +import { copyFileSync } from "fs-extra"; +import sanitize from "sanitize-filename"; + +export class LocalModelsManagerService { + + private static instance: LocalModelsManagerService; + + public static getInstance(): LocalModelsManagerService{ + if(!LocalModelsManagerService.instance){ LocalModelsManagerService.instance = new LocalModelsManagerService(); } + return LocalModelsManagerService.instance; + } + + private readonly DEEP_LINKS = { + ModelSaber: "modelsaber", + }; + + private readonly MODEL_TYPE_FOLDER: Record, string> = { + avatar: "CustomAvatars", + bloq: "CustomNotes", + platform: "CustomPlatforms", + saber: "CustomSabers" + } + + private readonly deepLink: DeepLinkService; + private readonly utils: UtilsService; + private readonly windows: WindowManagerService; + private readonly localVersion: BSLocalVersionService; + private readonly request: RequestService; + + private constructor(){ + this.deepLink = DeepLinkService.getInstance(); + this.utils = UtilsService.getInstance(); + this.windows = WindowManagerService.getInstance(); + this.localVersion = BSLocalVersionService.getInstance(); + this.request = RequestService.getInstance(); + + this.deepLink.addLinkOpenedListener(this.DEEP_LINKS.ModelSaber, (link) => { + log.info("DEEP-LINK RECEIVED FROM", this.DEEP_LINKS.ModelSaber, link); + const url = new URL(link); + + const type = url.host + const id = url.pathname.replace("/", '').split("/").at(0); + + this.openOneClickDownloadModelWindow(id, type); + }); + } + + private openOneClickDownloadModelWindow(id: string, type: string){ + + ipcMain.once("one-click-model-info", async (event, req: IpcRequest) => { + this.utils.ipcSend(req.responceChannel, {success: true, data: {id, type}}); + }); + + this.windows.openWindow("oneclick-download-model.html"); + + } + + private async getModelFolderPath(type: MSModelType, version?: BSVersion): Promise{ + + if(!version){ throw "will be implemented whith models management" } + if(type === "misc"){ throw "model type not supported"; } + + const versionPath = await this.localVersion.getVersionPath(version); + const modelFolderPath = path.join(versionPath, this.MODEL_TYPE_FOLDER[type]); + + this.utils.createFolderIfNotExist(modelFolderPath); + + return modelFolderPath; + + } + + public async downloadModel(model: MSModel, version: BSVersion): Promise{ + + const modelFolder = await this.getModelFolderPath(model.type, version); + const modelDest = path.join(modelFolder, sanitize(path.basename(model.download))); + + return this.request.downloadFile(model.download, modelDest); + + } + + public async oneClickDownloadModel(model: MSModel): Promise{ + + if(!model){ return; } + + const versions = await this.localVersion.getInstalledVersions(); + + if(versions?.length === 0){ return; } + + const fisrtVersion = versions.shift(); + + const downloaded = await this.downloadModel(model, fisrtVersion); + + for(const version of versions){ + + const modelDest = path.join(await this.getModelFolderPath(model.type, version), path.basename(downloaded)); + + copyFileSync(downloaded, modelDest); + + } + + } + + public enableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.registerDeepLink(link)); + } + + public disableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.unRegisterDeepLink(link)); + } + + public isDeepLinksEnabled(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.isDeepLinkRegistred(link)); + } + +} \ No newline at end of file diff --git a/src/main/services/additional-content/local-playlists-manager.service.ts b/src/main/services/additional-content/local-playlists-manager.service.ts new file mode 100644 index 00000000..3955efb5 --- /dev/null +++ b/src/main/services/additional-content/local-playlists-manager.service.ts @@ -0,0 +1,226 @@ +import path from "path"; +import { BehaviorSubject, Observable } from "rxjs"; +import { BSVersion } from "shared/bs-version.interface"; +import { BSLocalVersionService } from "../bs-local-version.service"; +import { DeepLinkService } from "../deep-link.service"; +import { RequestService } from "../request.service"; +import { UtilsService } from "../utils.service"; +import { LocalMapsManagerService } from "./local-maps-manager.service"; +import log from "electron-log" +import { isValidUrl } from "../../helpers/url.helpers"; +import { ipcMain } from "electron"; +import { WindowManagerService } from "../window-manager.service"; +import { IpcRequest } from "shared/models/ipc"; +import { BPList, DownloadPlaylistProgression } from "shared/models/playlists/playlist.interface"; +import { copyFileSync, readFileSync } from "fs"; +import { BeatSaverService } from "../thrid-party/beat-saver/beat-saver.service"; +import { copySync } from "fs-extra"; + +export class LocalPlaylistsManagerService { + + private static instance: LocalPlaylistsManagerService + + public static getInstance(): LocalPlaylistsManagerService { + if (!LocalPlaylistsManagerService.instance) { LocalPlaylistsManagerService.instance = new LocalPlaylistsManagerService(); } + return LocalPlaylistsManagerService.instance; + } + + private readonly PLAYLISTS_FOLDER = "Playlists"; + private readonly DEEP_LINKS = { + BeatSaver: "bsplaylist", + }; + + + private readonly versions: BSLocalVersionService; + private readonly maps: LocalMapsManagerService; + private readonly utils: UtilsService; + private readonly request: RequestService; + private readonly deepLink: DeepLinkService; + private readonly windows: WindowManagerService; + private readonly bsaver: BeatSaverService; + + private constructor(){ + this.maps = LocalMapsManagerService.getInstance(); + this.versions = BSLocalVersionService.getInstance(); + this.utils = UtilsService.getInstance(); + this.request = RequestService.getInstance(); + this.deepLink = DeepLinkService.getInstance(); + this.windows = WindowManagerService.getInstance(); + this.bsaver = BeatSaverService.getInstance(); + + this.deepLink.addLinkOpenedListener(this.DEEP_LINKS.BeatSaver, link => { + + log.info("DEEP-LINK RECEIVED FROM", this.DEEP_LINKS.BeatSaver, link); + const url = new URL(link); + const bplistUrl = url.host === "playlist" ? url.pathname.replace("/", "") : ""; + + this.openOneClickDownloadPlaylistWindow(bplistUrl); + + }); + + } + + private getPlaylistIdFromDownloadUrl(url: string): string{ + + if(!isValidUrl(url)){ return ""; } + + const splited = url.split("/") + const idIndex = splited.indexOf("id"); + + if(idIndex < 0){ return ""; } + + return splited[idIndex + 1]; + } + + private async getPlaylistsFolder(version?: BSVersion){ + + if(!version){ throw "Playlists are not available to be linked yet" } + + const versionFolder = await this.versions.getVersionPath(version); + + const folder = path.join(versionFolder, this.PLAYLISTS_FOLDER); + + await this.utils.createFolderIfNotExist(folder) + + return folder; + + } + + private async installBPListFile(bpListUrlOrPath: string, version: BSVersion): Promise{ + + const playlistFolder = await this.getPlaylistsFolder(version); + + const bpListDest = path.join(playlistFolder, path.basename(bpListUrlOrPath)); + + if(this.utils.pathExist(bpListUrlOrPath)){ + copyFileSync(bpListUrlOrPath, bpListDest); + } + else{ + await this.request.downloadFile(bpListUrlOrPath, bpListDest); + } + + return bpListDest; + + } + + private async readPlaylistFile(path: string): Promise{ + + if(!this.utils.pathExist(path)){ throw `bplist file not exist at ${path}`; } + + const rawContent = readFileSync(path).toString(); + + return JSON.parse(rawContent); + + } + + private openOneClickDownloadPlaylistWindow(downloadUrl: string): void{ + + ipcMain.once("one-click-playlist-info", async (event, req: IpcRequest) => { + this.utils.ipcSend(req.responceChannel, {success: true, data: {bpListUrl: downloadUrl, id: this.getPlaylistIdFromDownloadUrl(downloadUrl)}}); + }); + + this.windows.openWindow("oneclick-download-playlist.html"); + + } + + public downloadPlaylist(bpListUrl: string, version: BSVersion): Observable{ + + const res = new BehaviorSubject({progression: 0, current: null, downloadedMaps: [], mapsPath: [], bpListPath: ""}); + + const sub = res.subscribe(process => { + this.utils.ipcSend("download-playlist-progress", {success: true, data: process}); + }, err => { + this.utils.ipcSend("download-playlist-progress", {success: false, error: err}); + }); + + const observer = async () => { + + try{ + + const bpListPath = await this.installBPListFile(bpListUrl, version); + + res.next({...res.value, bpListPath}); + + const bpList = await this.readPlaylistFile(bpListPath); + + for(const song of bpList.songs){ + + if(!song.key){ continue; } + + const map = await this.bsaver.getMapDetailsById(song.key); + + res.next({ + ...res.value, + current: map, + progression: ((res.value.downloadedMaps.length + .5) / bpList.songs.length) * 100 + }); + + const mapPath = await this.maps.downloadMap(map, version); + + const progression = ((res.value.downloadedMaps.length + 1) / bpList.songs.length) * 100; + + res.next({ + ...res.value, + current: null, + downloadedMaps: [...res.value.downloadedMaps, map], + mapsPath: [...res.value.mapsPath, mapPath], + progression + }); + + } + + } + catch(e){ + res.error(e); + } + + res.complete(); + + } + + observer().finally(() => sub.unsubscribe()); + return res.asObservable(); + + } + + public async oneClickInstallPlaylist(bpListUrl: string): Promise{ + + const versions = await this.versions.getInstalledVersions(); + + const firstVersion = versions.shift(); + const fistVersionLinked = await this.maps.versionIsLinked(firstVersion); + + const {bpListPath, mapsPath} = await this.downloadPlaylist(bpListUrl, firstVersion).toPromise(); + + for(const version of versions){ + + await this.installBPListFile(bpListPath, version); + + const versionIsLinked = await this.maps.versionIsLinked(version); + + if(fistVersionLinked && versionIsLinked){ continue; } + + for(const mapPath of mapsPath){ + const versionMapsFolder = await this.maps.getMapsFolderPath(version); + const mapDest = path.join(versionMapsFolder, path.basename(mapPath)); + + copySync(mapPath, mapDest, {overwrite: true}); + } + + } + + } + + public enableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.registerDeepLink(link)); + } + + public disableDeepLinks(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.unRegisterDeepLink(link)); + } + + public isDeepLinksEnabled(): boolean{ + return Array.from(Object.values(this.DEEP_LINKS)).every(link => this.deepLink.isDeepLinkRegistred(link)); + } + +} \ No newline at end of file diff --git a/src/main/services/auto-updater.service.ts b/src/main/services/auto-updater.service.ts index 0c48e227..21cbdb77 100644 --- a/src/main/services/auto-updater.service.ts +++ b/src/main/services/auto-updater.service.ts @@ -1,6 +1,7 @@ import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; import { UtilsService } from './utils.service'; +import { gt } from 'semver'; export class AutoUpdaterService { private static instance: AutoUpdaterService; @@ -24,8 +25,7 @@ export class AutoUpdaterService { autoUpdater.checkForUpdates().then(info => { const needUpdate = (() => { if(!info || !info.updateInfo){ return false; } - if(autoUpdater.currentVersion.version === info.updateInfo.version){ return false; } - return true; + return gt(info.updateInfo.version, autoUpdater.currentVersion.version); })(); resolve(needUpdate)} ).catch(() => resolve(false)); @@ -38,10 +38,6 @@ export class AutoUpdaterService { autoUpdater.addListener("download-progress", info => { this.utilsService.ipcSend("update-download-progress", {success: true, data: info.percent}); }); - // const promise = new Promise((resolve, reject) => { - // autoUpdater.addListener("update-downloaded", () => resolve(true)); - // autoUpdater.addListener("error", () => reject(false)) - // }); return autoUpdater.downloadUpdate().then(res => !!res && !!res.length); } diff --git a/src/main/services/bs-installer.service.ts b/src/main/services/bs-installer.service.ts index 06971716..6c412ac3 100644 --- a/src/main/services/bs-installer.service.ts +++ b/src/main/services/bs-installer.service.ts @@ -8,6 +8,7 @@ import { InstallationLocationService } from "./installation-location.service"; import { ctrlc } from "ctrlc-windows"; import { BSLocalVersionService } from "./bs-local-version.service"; import isOnline from 'is-online'; +import { WindowManagerService } from "./window-manager.service"; export class BSInstallerService{ @@ -16,6 +17,7 @@ export class BSInstallerService{ private readonly utils: UtilsService; private readonly installLocationService: InstallationLocationService; private readonly localVersionService: BSLocalVersionService; + private readonly windows: WindowManagerService; private downloadProcess: ChildProcessWithoutNullStreams; @@ -23,8 +25,9 @@ export class BSInstallerService{ this.utils = UtilsService.getInstance(); this.installLocationService = InstallationLocationService.getInstance(); this.localVersionService = BSLocalVersionService.getInstance(); + this.windows = WindowManagerService.getInstance(); - this.utils.getMainWindow().on("close", () => { + this.windows.getWindows("index.html").on("close", () => { this.killDownloadProcess(); }); } diff --git a/src/main/services/bs-launcher.service.ts b/src/main/services/bs-launcher.service.ts index 8cbd5058..e15811c4 100644 --- a/src/main/services/bs-launcher.service.ts +++ b/src/main/services/bs-launcher.service.ts @@ -5,6 +5,7 @@ import { BS_EXECUTABLE, BS_APP_ID } from "../constants"; import { ChildProcessWithoutNullStreams, spawn } from "child_process"; import { SteamService } from "./steam.service"; import { BSLocalVersionService } from "./bs-local-version.service"; +import { OculusService } from "./oculus.service"; export class BSLauncherService{ @@ -12,6 +13,7 @@ export class BSLauncherService{ private readonly utilsService: UtilsService; private readonly steamService: SteamService; + private readonly oculusService: OculusService; private readonly localVersionService: BSLocalVersionService; private bsProcess: ChildProcessWithoutNullStreams; @@ -24,6 +26,7 @@ export class BSLauncherService{ private constructor(){ this.utilsService = UtilsService.getInstance(); this.steamService = SteamService.getInstance(); + this.oculusService = OculusService.getInstance(); this.localVersionService = BSLocalVersionService.getInstance(); } @@ -32,19 +35,18 @@ export class BSLauncherService{ } public async launch(launchOptions: LauchOption): Promise{ - if(!this.steamService.steamRunning()){ return "STEAM_NOT_RUNNING" } + if(launchOptions.version.oculus && !this.oculusService.oculusRunning()){ return "OCULUS_NOT_RUNNING" } + if(!launchOptions.version.oculus && !this.steamService.steamRunning()){ return "STEAM_NOT_RUNNING" } if(this.isBsRunning()){ return "BS_ALREADY_RUNNING" } const cwd = await this.localVersionService.getVersionPath(launchOptions.version); const exePath = path.join(cwd, BS_EXECUTABLE); - console.log(exePath); - if(!this.utilsService.pathExist(exePath)){ return "EXE_NOT_FINDED"; } const launchMods = [launchOptions.oculus && "-vrmode oculus", launchOptions.desktop && "fpfc", launchOptions.debug && "--verbose"]; - this.bsProcess = spawn(`\"${exePath}\"`, launchMods, {shell: true, cwd: cwd, env: {...process.env, "SteamAppId": BS_APP_ID}}); + this.bsProcess = spawn(`\"${exePath}\"`, launchMods, {shell: true, cwd, env: {...process.env, "SteamAppId": BS_APP_ID}}); this.bsProcess.on('message', msg => { /** EMIT HERE **/ }); this.bsProcess.on('error', err => { /** EMIT HERE **/ }); diff --git a/src/main/services/bs-local-version.service.ts b/src/main/services/bs-local-version.service.ts index 73cb8b10..d908505b 100644 --- a/src/main/services/bs-local-version.service.ts +++ b/src/main/services/bs-local-version.service.ts @@ -3,7 +3,7 @@ import { BSVersion } from 'shared/bs-version.interface'; import { InstallationLocationService } from "./installation-location.service"; import { SteamService } from "./steam.service"; import { UtilsService } from "./utils.service"; -import { BS_APP_ID } from "../constants"; +import { BS_APP_ID, OCULUS_BS_DIR } from "../constants"; import path from "path"; import { createInterface } from "readline"; import { createReadStream } from "fs"; @@ -11,6 +11,9 @@ import fs from "fs-extra"; import { ConfigurationService } from "./configuration.service"; import { rename } from "fs/promises"; import { BsmException } from "shared/models/bsm-exception.model"; +import log from "electron-log"; +import { OculusService } from "./oculus.service"; +import { DownloadLinkType } from "shared/models/mods"; export class BSLocalVersionService{ @@ -21,6 +24,7 @@ export class BSLocalVersionService{ private readonly installLocationService: InstallationLocationService; private readonly utilsService: UtilsService; private readonly steamService: SteamService; + private readonly oculusService: OculusService; private readonly remoteVersionService: BSVersionLibService; private readonly configService: ConfigurationService; @@ -33,6 +37,7 @@ export class BSLocalVersionService{ this.installLocationService = InstallationLocationService.getInstance(); this.utilsService = UtilsService.getInstance(); this.steamService = SteamService.getInstance(); + this.oculusService = OculusService.getInstance(); this.remoteVersionService = BSVersionLibService.getInstance(); this.configService = ConfigurationService.getInstance(); } @@ -79,6 +84,7 @@ export class BSLocalVersionService{ public async getVersionPath(version: BSVersion): Promise{ if(version.steam){ return this.steamService.getGameFolder(BS_APP_ID, "Beat Saber") } + if(version.oculus){ return this.oculusService.getGameFolder(OCULUS_BS_DIR); } return path.join( this.installLocationService.versionsDirectory, this.getVersionFolder(version) @@ -86,29 +92,53 @@ export class BSLocalVersionService{ } private removeSpecialChar(seq: string): string{ - // eslint-disable-next-line no-useless-escape return seq.replace( /[<>:"\/\\|?*]+/g, '' ); } - public getVersionFolder(version: BSVersion){ - return version.name ? `${version.BSVersion}-${version.name}` : version.BSVersion; - } + public getVersionFolder(version: BSVersion){ + return version.name ? `${version.BSVersion}-${version.name}` : version.BSVersion; + } - public async getInstalledVersions(): Promise{ + public getVersionType(version: BSVersion): DownloadLinkType{ + if(version.steam){ return "steam"; } + if(version.oculus){ return "oculus"; } + return "universal" + } + + private async getSteamVersion(): Promise{ + const steamBsFolder = await this.steamService.getGameFolder(BS_APP_ID, "Beat Saber"); + if(!steamBsFolder || !this.utilsService.pathExist(steamBsFolder)){ return null; } + const steamBsVersion = await this.getVersionOfBSFolder(steamBsFolder); + if(!steamBsVersion){ return null; } + const version = await this.remoteVersionService.getVersionDetails(steamBsVersion); + if(!version){ return null; } + return {...version, steam: true}; + } + + private async getOculusVersion(): Promise{ + const oculusBsFolder = await this.oculusService.getGameFolder(OCULUS_BS_DIR); + if(!oculusBsFolder){ return null; } + const oculusBsVersion = await this.getVersionOfBSFolder(oculusBsFolder); + if(!oculusBsVersion){ return null; } + const version = await this.remoteVersionService.getVersionDetails(oculusBsVersion); + if(!version){ return null; } + return {...version, oculus: true}; + } + + public async getInstalledVersions(): Promise{ + const versions: BSVersion[] = []; - const steamBsFolder = await this.steamService.getGameFolder(BS_APP_ID, "Beat Saber") - if(steamBsFolder && this.utilsService.pathExist(steamBsFolder)){ - const steamBsVersion = await this.getVersionOfBSFolder(steamBsFolder); - if(steamBsVersion){ - const steamVersionDetails = this.remoteVersionService.getVersionDetails(steamBsVersion); - versions.push(steamVersionDetails ? {...steamVersionDetails, steam: true} : {BSVersion: steamBsVersion, steam: true}); - } - } + const steamVersion = await this.getSteamVersion(); + if(steamVersion){ versions.push(steamVersion); } + const oculusVersion = await this.getOculusVersion(); + if(oculusVersion){ versions.push(oculusVersion); } + if(!this.utilsService.pathExist(this.installLocationService.versionsDirectory)){ return versions } const folderInInstallation = this.utilsService.listDirsInDir(this.installLocationService.versionsDirectory); - folderInInstallation.forEach(f => { - let version = this.remoteVersionService.getVersionDetails(f); + for(const f of folderInInstallation){ + log.info("try get version from folder", f); + let version = await this.remoteVersionService.getVersionDetails(f); if(version){ version = this.getCustomVersions().find(v => v.BSVersion === version.BSVersion && v.name === version.name) ?? version; } else { version = this.getCustomVersions().find(v => { const [version, ...rest] = f.split("-"); @@ -118,13 +148,13 @@ export class BSLocalVersionService{ }) } version && versions.push(version); - }); + }; this.setCustomVersions(versions.filter(v => !!v.name || !!v.color)); return versions; } public async deleteVersion(version: BSVersion): Promise{ - if(version.steam){ return false; } + if(version.steam || version.oculus){ return false; } const versionFolder = await this.getVersionPath(version); if(!this.utilsService.pathExist(versionFolder)){ return true; } @@ -134,7 +164,7 @@ export class BSLocalVersionService{ } public async editVersion(version: BSVersion, name: string, color: string): Promise{ - if(version.steam){ throw {title: "CantEditSteam", msg: "CantEditSteam"} as BsmException; } + if(version.steam || version.oculus){ throw {title: "CantEditSteam", msg: "CantEditSteam"} as BsmException; } const oldPath = await this.getVersionPath(version); const editedVersion: BSVersion = version.BSVersion === name ? {...version, name: undefined, color} @@ -162,7 +192,7 @@ export class BSLocalVersionService{ const originPath = await this.getVersionPath(version); const cloneVersion: BSVersion = version.BSVersion === name ? {...version, name: undefined, color} - : {...version, name: this.removeSpecialChar(name), color, steam: false}; + : {...version, name: this.removeSpecialChar(name), color, steam: false, oculus: false}; const newPath = await this.getVersionPath(cloneVersion); if(originPath === newPath){ diff --git a/src/main/services/bs-version-lib.service.ts b/src/main/services/bs-version-lib.service.ts index 2a0599e4..1ffe437b 100644 --- a/src/main/services/bs-version-lib.service.ts +++ b/src/main/services/bs-version-lib.service.ts @@ -3,6 +3,7 @@ import { UtilsService } from './utils.service'; import path from 'path'; import { writeFileSync } from 'fs'; import { BSVersion } from 'shared/bs-version.interface'; +import { RequestService } from "./request.service" import isOnline from 'is-online'; export class BSVersionLibService{ @@ -13,11 +14,13 @@ export class BSVersionLibService{ private static instance: BSVersionLibService; private utilsService: UtilsService; + private requestService: RequestService - private bsVersions: BSVersion[] = []; + private bsVersions: BSVersion[]; private constructor(){ this.utilsService = UtilsService.getInstance(); + this.requestService = RequestService.getInstance(); } @@ -26,19 +29,9 @@ export class BSVersionLibService{ return BSVersionLibService.instance; } - private getRemoteVersions(): Promise{ - return new Promise((resolve, reject) => { - let body = '' - get(this.REMOTE_BS_VERSIONS_URL, (res) => { - res.on('data', chunk => body += chunk); - res.on('end', () => { - this.bsVersions = JSON.parse(body); - resolve(this.bsVersions); - }); - res.on('error', () => reject(null)) - }) - }) - } + private getRemoteVersions(): Promise{ + return this.requestService.get(this.REMOTE_BS_VERSIONS_URL); + } private async getLocalVersions(): Promise{ const localVersionsPath = path.join(this.utilsService.getAssestsJsonsPath(), this.VERSIONS_FILE); @@ -51,25 +44,26 @@ export class BSVersionLibService{ writeFileSync(localVersionsPath, JSON.stringify(versions, null, "\t"), {encoding: 'utf-8', flag: 'w'}); }; - private async loadBsVersions(): Promise{ - const [localVersions, remoteVersions] = await Promise.all([ - this.getLocalVersions(), (await isOnline({timeout: 1500}) && this.getRemoteVersions()) - ]); - let resVersions = localVersions; - if(remoteVersions && remoteVersions.length){ resVersions = remoteVersions; this.updateLocalVersions(resVersions); } - this.bsVersions = resVersions; - return this.bsVersions; + private async loadBsVersions(): Promise{ + if(this.bsVersions){ return this.bsVersions; } + const [localVersions, remoteVersions] = await Promise.all([ + this.getLocalVersions(), (await isOnline({timeout: 1500}) && this.getRemoteVersions()) + ]); + let resVersions = localVersions; + if(remoteVersions && remoteVersions.length){ resVersions = remoteVersions; this.updateLocalVersions(resVersions); } + this.bsVersions = resVersions; + return this.bsVersions; } public async getAvailableVersions(): Promise{ - if(this.bsVersions && this.bsVersions.length){ return this.bsVersions; } const bsVersions = await this.loadBsVersions(); if(!bsVersions || !bsVersions.length){ return []; } return bsVersions; } - public getVersionDetails(version: string): BSVersion{ - return this.bsVersions.find(v => v.BSVersion === version); - } + public async getVersionDetails(version: string): Promise{ + const versions = await this.getAvailableVersions(); + return versions.find(v => v.BSVersion === version); + } } \ No newline at end of file diff --git a/src/main/services/deep-link.service.ts b/src/main/services/deep-link.service.ts new file mode 100644 index 00000000..095f9e35 --- /dev/null +++ b/src/main/services/deep-link.service.ts @@ -0,0 +1,99 @@ +import { app } from "electron"; +import path from "path"; +import { URL } from "url"; +import log from "electron-log" + +export class DeepLinkService { + + // See docs : https://www.electronjs.org/docs/latest/tutorial/launch-app-from-url-in-another-app#main-process-mainjs + + private static instance: DeepLinkService; + + public static getInstance(): DeepLinkService{ + if(!DeepLinkService.instance){ DeepLinkService.instance = new DeepLinkService(); } + return DeepLinkService.instance; + } + + private readonly listeners = new Map() + + private constructor(){} + + public registerDeepLink(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2){ + return app.setAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.setAsDefaultProtocolClient(protocol); + } + + public unRegisterDeepLink(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2) { + return app.removeAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.removeAsDefaultProtocolClient(protocol); + } + + public isDeepLinkRegistred(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2) { + return app.isDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.isDefaultProtocolClient(protocol); + } + + public addLinkOpenedListener(protocol: string, fn: Listerner){ + + if(!this.listeners.has(protocol)){ + this.listeners.set(protocol, [] as Listerner[]); + } + + this.listeners.get(protocol).push(fn); + } + + public removeLinkOpenedListener(protocol: string, fn: Listerner){ + + if(!this.listeners.get(protocol)?.length){ return; } + + const listeners = this.listeners.get(protocol); + const fnIndex = listeners.findIndex(listener => listener === fn); + + if(fnIndex < 0){ return; } + + listeners.splice(fnIndex, 1); + + } + + public dispatchLinkOpened(link: string){ + + log.info("DEISPATCH", link); + + const url = new URL(link); + + const protocolListeners = this.listeners.get(url.protocol.replace(":", "")) ?? []; + + protocolListeners.forEach(listerner => { + listerner(link); + }); + + } + + public isDeepLink(link: string): boolean{ + + try{ + const url = new URL(link); + const protocol = url.protocol.replace(":", ""); + return Array.from(this.listeners.keys()).some(key => key === protocol); + } + catch(e){ + return false; + } + + } + +} + +type Listerner = (link: string) => void; \ No newline at end of file diff --git a/src/main/services/installation-location.service.ts b/src/main/services/installation-location.service.ts index 4503d552..a5cc14ae 100644 --- a/src/main/services/installation-location.service.ts +++ b/src/main/services/installation-location.service.ts @@ -12,6 +12,11 @@ export class InstallationLocationService { private readonly INSTALLATION_FOLDER = "BSManager"; private readonly VERSIONS_FOLDER = "BSInstances"; + + private readonly SHARED_CONTENT_FOLDER = "SharedContent"; + private readonly SHARED_MAPS_FOLDER = "SharedMaps"; + private readonly SHARED_PLAYLISTS_FOLDER = "SharedPlaylists"; + private readonly STORE_INSTALLATION_PATH_KEY = "installation-folder"; @@ -36,9 +41,6 @@ export class InstallationLocationService { this._installationDirectory = this.configService.get(this.STORE_INSTALLATION_PATH_KEY) || app.getPath("documents"); } - public get installationDirectory(): string{ return path.join(this._installationDirectory, this.INSTALLATION_FOLDER); } - public get versionsDirectory(): string { return path.join(this.installationDirectory, this.VERSIONS_FOLDER); } - public setInstallationDirectory(newDir: string): Promise{ const oldDir = this.installationDirectory; const newDest = path.join(newDir, this.INSTALLATION_FOLDER); @@ -53,7 +55,15 @@ export class InstallationLocationService { log.error(err); }) }) - } + public get installationDirectory(): string{ return path.join(this._installationDirectory, this.INSTALLATION_FOLDER); } + + public get versionsDirectory(): string { return path.join(this.installationDirectory, this.VERSIONS_FOLDER); } + + public get sharedContentPath(): string { return path.join(this.installationDirectory, this.SHARED_CONTENT_FOLDER); } + public get sharedMapsPath(): string { return path.join(this.sharedContentPath, this.SHARED_MAPS_FOLDER); } + public get sharedPlaylistsPath(): string { return path.join(this.sharedContentPath, this.SHARED_PLAYLISTS_FOLDER); } + + } \ No newline at end of file diff --git a/src/main/services/map.service.ts b/src/main/services/map.service.ts deleted file mode 100644 index 596321c8..00000000 --- a/src/main/services/map.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import path from "path"; -import { BSVersion } from "shared/bs-version.interface"; -import { BSLocalVersionService } from "./bs-local-version.service"; -import archiver from "archiver"; -import { createWriteStream } from "fs"; -import log from "electron-log"; - -export class MapService{ - - private readonly MAP_PATH = path.join("Beat Saber_Data", "CustomLevels"); - - private static instance: MapService; - - private readonly localVersionService: BSLocalVersionService; - - public static getInstance(): MapService{ - if(!MapService.instance){ MapService.instance = new MapService(); } - return MapService.instance; - } - - private constructor(){ - this.localVersionService = BSLocalVersionService.getInstance(); - } - - private getMapsPath(versionPath: string): string{ - return path.join(versionPath, this.MAP_PATH); - } - - public async exportVersionMaps(version: BSVersion, outputZip: string): Promise{ - const versionPath = await this.localVersionService.getVersionPath(version); - const mapsPath = this.getMapsPath(versionPath); - - const output = createWriteStream(outputZip); - const archive = archiver("zip", {zlib: {level: 9}}); - - const promise = new Promise((resolve, reject) => { - archive.pipe(output); - archive.directory(mapsPath, false); - archive.on("error", reject); - output.on("close", resolve); - archive.finalize() - }); - - return promise; - } - -} \ No newline at end of file diff --git a/src/main/services/mods/beat-mods-api.service.ts b/src/main/services/mods/beat-mods-api.service.ts new file mode 100644 index 00000000..f1b447b3 --- /dev/null +++ b/src/main/services/mods/beat-mods-api.service.ts @@ -0,0 +1,88 @@ +import { BSVersion } from "shared/bs-version.interface"; +import { Mod } from "shared/models/mods/mod.interface"; +import { RequestService } from "../request.service"; + +export class BeatModsApiService { + + private static instance: BeatModsApiService; + + private readonly requestService: RequestService; + + private readonly BEAT_MODS_VERSIONS = "https://versions.beatmods.com/versions.json"; + private readonly BEAT_MODS_ALIAS = "https://alias.beatmods.com/aliases.json"; + + private readonly BEAT_MODS_API_URL = "https://beatmods.com/api/v1/"; + public readonly BEAT_MODS_URL = "https://beatmods.com"; + + private readonly aliasesCache = new Map(); + private readonly versionModsCache = new Map(); + + private allModsCache: Mod[]; + + public static getInstance(): BeatModsApiService{ + if(!BeatModsApiService.instance){ BeatModsApiService.instance = new BeatModsApiService(); } + return BeatModsApiService.instance; + } + + private constructor(){ + this.requestService = RequestService.getInstance(); + } + + private getVersionModsUrl(version: BSVersion): string{ + return `${this.BEAT_MODS_API_URL}mod?status=approved&gameVersion=${version.BSVersion}&sort=&sortDirection=1`; + } + + private getAllModsUrl(): string{ + return `${this.BEAT_MODS_API_URL}mod`; + } + + private async getVersionAlias(): Promise>{ + if(this.aliasesCache.size){ return this.aliasesCache; } + return this.requestService.get>(this.BEAT_MODS_ALIAS).then(rawAliases => { + Object.entries(rawAliases).forEach(([key, value]) => { + this.aliasesCache.set(key, value.map(s => ({BSVersion: s} as BSVersion))); + }); + return this.aliasesCache; + }) + } + + private async getAliasOfVersion(version: BSVersion): Promise{ + return this.getVersionAlias().then(aliases => { + if(Array.from(aliases.keys()).some(k => k === version.BSVersion)){ return version; } + const alias = Array.from(aliases.entries()).find(([key, value]) => value.find(v => v.BSVersion === version.BSVersion))[0]; + return {BSVersion: alias} as BSVersion + }); + } + + private asignDependencies(mod: Mod, mods: Mod[]): Mod{ + mod.dependencies = mod.dependencies.map(dep => mods.find(mod => mod.name === dep.name)); + return mod; + } + + public async getVersionMods(version: BSVersion): Promise{ + if(this.versionModsCache.has(version.BSVersion)){ return this.versionModsCache.get(version.BSVersion); } + + const alias = await this.getAliasOfVersion(version); + + return this.requestService.get(this.getVersionModsUrl(alias)).then(mods => { + mods = mods.map(mod => this.asignDependencies(mod, mods)); + this.versionModsCache.set(version.BSVersion, mods); + return mods; + }); + } + + public async getAllMods(): Promise{ + if(!!this.allModsCache){ return this.allModsCache; } + return this.requestService.get(this.getAllModsUrl()).then(mods => { + this.allModsCache = mods; + return this.allModsCache; + }); + } + + public loadAllMods(){ return this.getAllMods(); } + + + + + +} \ No newline at end of file diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts new file mode 100644 index 00000000..339cc331 --- /dev/null +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -0,0 +1,330 @@ +import { BSVersion } from "shared/bs-version.interface"; +import { DownloadLink, InstallModsResult, Mod, ModInstallProgression, UninstallModsResult } from "shared/models/mods"; +import { BeatModsApiService } from "./beat-mods-api.service"; +import { BSLocalVersionService } from "../bs-local-version.service" +import path from "path"; +import { UtilsService } from "../utils.service"; +import md5File from "md5-file"; +import fs from "fs" +import StreamZip from "node-stream-zip"; +import { RequestService } from "../request.service"; +import { spawn } from "child_process"; +import { BS_EXECUTABLE } from "../../constants"; +import log from "electron-log"; + +export class BsModsManagerService { + + private static instance: BsModsManagerService; + + private readonly beatModsApi: BeatModsApiService; + private readonly bsLocalService: BSLocalVersionService; + private readonly utilsService: UtilsService; + private readonly requestService: RequestService + + private manifestMatches: Mod[]; + + private nbModsToInstall = 0; + private nbInstalledMods = 0; + + private nbModsToUninstall = 0; + private nbUninstalledMods = 0; + + public static getInstance(): BsModsManagerService{ + if(!BsModsManagerService.instance){ BsModsManagerService.instance = new BsModsManagerService(); } + return BsModsManagerService.instance; + } + + private constructor(){ + this.beatModsApi = BeatModsApiService.getInstance(); + this.bsLocalService = BSLocalVersionService.getInstance(); + this.utilsService = UtilsService.getInstance(); + this.requestService = RequestService.getInstance(); + } + + private async getModFromHash(hash: string): Promise{ + const allMods = await this.beatModsApi.getAllMods(); + return allMods.find(mod => { + if(mod.name.toLowerCase() === "bsipa" || mod.status === "declined"){ return false; } + return mod.downloads.some(download => download.hashMd5.some(md5 => md5.hash === hash)); + }) + } + + private async getIpaFromHash(hash: string): Promise{ + const allMods = await this.beatModsApi.getAllMods(); + return allMods.find(mod => { + if(mod.name.toLowerCase() !== "bsipa"){ return false; } + return mod.downloads.some(download => download.hashMd5.some(md5 => md5.hash === hash)); + }) + } + + private async getModsInDir(version: BSVersion, modsDir: ModsInstallFolder): Promise{ + const bsPath = await this.bsLocalService.getVersionPath(version); + const modsPath = path.join(bsPath, modsDir); + if(!this.utilsService.pathExist(modsPath)){ return []; } + const files = fs.readdirSync(modsPath); + const promises = files.map(f => { + return (async() => { + const filePath = path.join(modsPath, f) + const ext = path.extname(f); + if(ext !== ".dll" && ext !== ".exe" && ext !== ".manifest"){ return undefined; } + const hash = await md5File(filePath); + const mod = await this.getModFromHash(hash); + if(!mod){ return undefined; } + if(ext === ".manifest"){ + this.manifestMatches.push(mod); + return undefined; + } + if(filePath.includes("Libs")){ + if(!this.manifestMatches.some(m => m.name === mod.name)){ return undefined; } + const modIndex = this.manifestMatches.indexOf(mod); + if(modIndex > -1){ this.manifestMatches.splice(modIndex, 1); } + } + return mod; + })() + }); + const mods = await Promise.all(promises) + return mods.filter(m => !!m); + } + + private async getBsipaInstalled(version: BSVersion): Promise{ + const bsPath = await this.bsLocalService.getVersionPath(version); + const injectorPath = path.join(bsPath, "Beat Saber_Data", "Managed", "IPA.Injector.dll"); + if(!this.utilsService.pathExist(injectorPath)){ return undefined; } + const injectorMd5 = await md5File(injectorPath); + return this.getIpaFromHash(injectorMd5); + } + + private async downloadZip(zipUrl: string): Promise<{zip: StreamZip.StreamZipAsync, zipPath: string}>{ + zipUrl = path.join(this.beatModsApi.BEAT_MODS_URL, zipUrl); + const fileName = path.basename(zipUrl); + const tempPath = this.utilsService.getTempPath(); + this.utilsService.createFolderIfNotExist(this.utilsService.getTempPath()); + const dest = path.join(tempPath, fileName); + + const zipPath = await this.requestService.downloadFile(zipUrl, dest); + const zip = new StreamZip.async({file : zipPath}); + + return {zip, zipPath}; + } + + private async executeBSIPA(version: BSVersion, args: string[]): Promise{ + const versionPath = await this.bsLocalService.getVersionPath(version); + const ipaPath = path.join(versionPath, "IPA.exe"); + const bsExePath = path.join(versionPath, BS_EXECUTABLE); + if(!this.utilsService.pathExist(ipaPath) || !this.utilsService.pathExist(bsExePath)){ return false; } + + return new Promise(resolve => { + const processIPA = spawn(`start /wait /min "" "${ipaPath}" ${args.join(" ")}`, {cwd: versionPath, detached: true, shell: true}); + processIPA.once("exit", code => { + if(code === 0){ return resolve(true); } + log.error("IPA PROCESS", "exit code", code); + resolve(false); + }); + + setTimeout(() => resolve(false), (1 * 60) * 1000); //timeout 1min + }); + } + + private getModDownload(mod: Mod, version: BSVersion): DownloadLink{ + return mod.downloads.find(download => { + const type = download.type.toLowerCase() + return type === "universal" || type === this.bsLocalService.getVersionType(version); + }); + } + + private async installMod(mod: Mod, version: BSVersion): Promise{ + + this.utilsService.ipcSend("mod-installed", {success: true, data: {name: mod.name, progression: ((this.nbInstalledMods + 1) / this.nbModsToInstall) * 100}}) + + const download = this.getModDownload(mod, version); + + if(!download){ return false; } + + const {zip, zipPath} = await this.downloadZip(download.url); + + if(!zip){ return false; } + + const crypto = require('crypto'); + const entries = await zip.entries(); + + const checkedEntries = (await Promise.all(Object.values(entries).map(async (entry) => { + if(!entry.isFile){ return undefined; } + const data = await zip.entryData(entry); + const entryMd5 = crypto.createHash('md5').update(data).digest('hex') + return download.hashMd5.some(md5 => md5.hash === entryMd5) ? entry : undefined; + }))).filter(entry => !!entry); + + if(checkedEntries.length != download.hashMd5.length){ return false; } + + const verionPath = await this.bsLocalService.getVersionPath(version); + const isBSIPA = mod.name.toLowerCase() === "bsipa"; + const destDir = isBSIPA ? verionPath : path.join(verionPath, ModsInstallFolder.PENDING); + + const extracted = await zip.extract(null, destDir).then(() => true).catch(err => {log.error(err); return false}); + + await zip.close(); + await this.utilsService.unlinkIfExist(zipPath); + + const res = isBSIPA ? (extracted && (await this.executeBSIPA(version, ["-n"]))) : extracted; + + res && this.nbInstalledMods++; + + return res; + } + + private isDependency(mod: Mod, selectedMods: Mod[], availableMods: Mod[]){ + return selectedMods.some(m => { + const deps = m.dependencies.map(dep => Array.from(availableMods.values()).find(m => dep.name === m.name)); + if(deps.some(depMod => depMod.name === mod.name)){ return true; } + return deps.some(depMod => depMod.dependencies.some(depModDep => depModDep.name === mod.name)); + }); + } + + private async resolveDependencies(mods: Mod[], version: BSVersion): Promise{ + const availableMods = await this.beatModsApi.getVersionMods(version); + return Array.from(new Map(availableMods.reduce((res, mod) => { + if(this.isDependency(mod, mods, availableMods)){ + res.push([mod.name, mod]); + } + return res; + }, [])).values()); + } + + private async uninstallBSIPA(mod: Mod, version: BSVersion): Promise{ + const download = this.getModDownload(mod, version); + + const verionPath = await this.bsLocalService.getVersionPath(version); + const hasIPAExe = this.utilsService.pathExist(path.join(verionPath, "IPA.exe")); + const hasIPADir = this.utilsService.pathExist(path.join(verionPath, "IPA")); + + if(!hasIPADir || !hasIPAExe){ return; } + + await this.executeBSIPA(version, ["--revert", "-n"]); + + const promises = download.hashMd5.map(files => { + const file = files.file.replaceAll("IPA/", "").replaceAll("Data", "Beat Saber_Data"); + return this.utilsService.unlinkIfExist(path.join(verionPath, file)); + }) + + await Promise.all(promises); + } + + private async uninstallMod(mod: Mod, version: BSVersion): Promise{ + + this.nbUninstalledMods++; + this.utilsService.ipcSend("mod-uninstalled", {success: true, data: {name: mod.name, progression: (this.nbUninstalledMods / this.nbModsToUninstall) * 100}}) + + if(mod.name.toLowerCase() === "bsipa"){ return this.uninstallBSIPA(mod, version); } + + const download = this.getModDownload(mod, version); + const versionPath = await this.bsLocalService.getVersionPath(version); + + const promises = download.hashMd5.map(async files => { + this.utilsService.unlinkIfExist(path.join(versionPath, files.file)); + this.utilsService.unlinkIfExist(path.join(versionPath, "IPA", "Pending", files.file)); + }); + + await Promise.all(promises); + } + + public getAvailableMods(version: BSVersion): Promise{ + return this.beatModsApi.getVersionMods(version); + } + + public async getInstalledMods(version: BSVersion): Promise{ + this.manifestMatches = []; + await this.beatModsApi.loadAllMods(); + const bsipa = await this.getBsipaInstalled(version); + return Promise.all([ + this.getModsInDir(version, ModsInstallFolder.PLUGINS_PENDING), + this.getModsInDir(version, ModsInstallFolder.LIBS_PENDING), + this.getModsInDir(version, ModsInstallFolder.PLUGINS), + this.getModsInDir(version, ModsInstallFolder.LIBS) + ]).then(dirMods => { + const res = []; + if(!!bsipa){ res.push(bsipa); } + const installedMods = Array.from(new Map(dirMods.flat().map(m => [m.name, m])).values()); + res.push(...installedMods); + return res; + }); + } + + public async installMods(mods: Mod[], version: BSVersion): Promise{ + if(!mods || !mods.length){ throw "no-mods"; } + + const deps = await this.resolveDependencies(mods, version); + mods.push(...deps); + + const bsipa = mods.find(mod => mod.name.toLowerCase() === "bsipa"); + if(bsipa){ mods = mods.filter(mod => mod.name.toLowerCase() !== "bsipa"); } + + this.nbModsToInstall = mods.length + (bsipa && 1); + this.nbInstalledMods = 0; + + if(bsipa){ + const installed = await this.installMod(bsipa, version).catch(err => {log.error("INSTALL BSIPA", err); return false; }) + if(!installed){ throw "cannot-install-bsipa"; } + } + + for(const mod of mods){ + await this.installMod(mod, version);; + } + + return { + nbModsToInstall: this.nbModsToInstall, + nbInstalledMods: this.nbInstalledMods + }; + } + + public async uninstallMods(mods: Mod[], version: BSVersion): Promise{ + if(!mods || !mods.length){ throw "no-mods"; } + + this.nbModsToUninstall = mods.length; + this.nbUninstalledMods = 0; + + for(const mod of mods){ + await this.uninstallMod(mod, version); + } + + return { + nbModsToUninstall: this.nbModsToUninstall, + nbUninstalledMods: this.nbUninstalledMods + }; + } + + public async uninstallAllMods(version: BSVersion): Promise{ + const mods = await this.getInstalledMods(version); + + if(!mods || !mods.length){ throw "no-mods"; } + + this.nbModsToUninstall = mods.length; + this.nbUninstalledMods = 0; + + for(const mod of mods){ + await this.uninstallMod(mod, version); + } + + const versionPath = await this.bsLocalService.getVersionPath(version); + + this.utilsService.rmDirIfExist(path.join(versionPath, ModsInstallFolder.PLUGINS)); + this.utilsService.rmDirIfExist(path.join(versionPath, ModsInstallFolder.LIBS)); + this.utilsService.rmDirIfExist(path.join(versionPath, ModsInstallFolder.IPA)); + + path.resolve + + return { + nbModsToUninstall: this.nbModsToUninstall, + nbUninstalledMods: this.nbUninstalledMods + }; + } + +} + +const enum ModsInstallFolder { + PLUGINS = "Plugins", + LIBS = "Libs", + IPA = "IPA", + PENDING = "IPA/Pending", + PLUGINS_PENDING = "IPA/Pending/Plugins", + LIBS_PENDING = "IPA/Pending/Libs" +} \ No newline at end of file diff --git a/src/main/services/notification.service.ts b/src/main/services/notification.service.ts new file mode 100644 index 00000000..74277bad --- /dev/null +++ b/src/main/services/notification.service.ts @@ -0,0 +1,27 @@ +import { Notification } from "electron"; +import { SystemNotificationOptions } from "shared/models/notification/system-notification.model"; +import { UtilsService } from "./utils.service"; + +export class NotificationService { + + private static instance: NotificationService; + + public static getInstance(): NotificationService{ + if(!NotificationService.instance){ NotificationService.instance = new NotificationService(); } + return NotificationService.instance; + } + + private readonly APP_ICON: string; + + private readonly utils: UtilsService; + + private constructor(){ + this.utils = UtilsService.getInstance(); + this.APP_ICON = this.utils.getAssetsPath("favicon.ico"); + } + + public notify(options: SystemNotificationOptions){ + new Notification({...options, icon: this.APP_ICON}).show(); + } + +} \ No newline at end of file diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts new file mode 100644 index 00000000..da184b5f --- /dev/null +++ b/src/main/services/oculus.service.ts @@ -0,0 +1,63 @@ +import { UtilsService } from "./utils.service"; +import regedit from 'regedit' +import path from "path"; + +export class OculusService { + + private static instance: OculusService; + + private readonly utils: UtilsService; + + private oculusPaths: string[]; + + public static getInstance(): OculusService{ + if(!OculusService.instance){ OculusService.instance = new OculusService(); } + return OculusService.instance; + } + + private constructor(){ + this.utils = UtilsService.getInstance(); + } + + public oculusRunning(): boolean{ + return this.utils.taskRunning("OculusClient.exe"); + } + + public async getOculusLibsPath(): Promise{ + + if(this.oculusPaths){ return this.oculusPaths; } + + const oculusLibsRegKey = "HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries"; + + const libsRegData = (await regedit.promisified.list([oculusLibsRegKey]))["HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries"]; + + if(!libsRegData.exists || !libsRegData.keys){ return null; } + + const libsPath = (await Promise.all(libsRegData.keys.map(async key => { + const originalPath = (await regedit.promisified.list([`${oculusLibsRegKey}\\${key}`]))[`${oculusLibsRegKey}\\${key}`]; + if(!originalPath.exists || !libsRegData.values || !originalPath.values["OriginalPath"]){ return null; } + + return originalPath.values["OriginalPath"].value as string; + + }, []))).filter(path => !!path); + + this.oculusPaths = libsPath; + + return libsPath; + + } + + public async getGameFolder(gameFolder: string): Promise{ + + const libsFolders = await this.getOculusLibsPath(); + const rootLibDir = "Software" + + for(const lib of libsFolders){ + const gameFullPath = path.join(lib, rootLibDir, gameFolder); + if(this.utils.pathExist(gameFullPath)){ return gameFullPath; } + } + + return null; + } + +} \ No newline at end of file diff --git a/src/main/services/request.service.ts b/src/main/services/request.service.ts new file mode 100644 index 00000000..5c2c2237 --- /dev/null +++ b/src/main/services/request.service.ts @@ -0,0 +1,45 @@ +import { get } from "https"; +import { createWriteStream, unlink } from "fs"; + +export class RequestService { + + private static instance: RequestService; + + public static getInstance(): RequestService{ + if(!RequestService.instance){ RequestService.instance = new RequestService(); } + return RequestService.instance; + } + + private constructor(){} + + public get(url: string): Promise{ + return new Promise((resolve, reject) => { + let body = '' + get(url, (res) => { + res.on('data', chunk => body += chunk); + res.on('end', () => { + resolve(JSON.parse(body)); + }); + res.on('error', (err) => reject(err)) + }); + }); + } + + public downloadFile(url: string, dest: string): Promise{ + return new Promise((resolve, reject) => { + + const file = createWriteStream(dest); + get(url, res => { + res.pipe(file); + file.on("close", () => { + file.close(() => resolve(dest)) + }).on("error", err => { + unlink(dest, () => reject(err)); + }); + }).on("error", err => { + unlink(dest, () => reject(err)); + }); + }); + } + +} \ No newline at end of file diff --git a/src/main/services/steam.service.ts b/src/main/services/steam.service.ts index f678cd74..622d175d 100644 --- a/src/main/services/steam.service.ts +++ b/src/main/services/steam.service.ts @@ -3,6 +3,7 @@ import regedit from 'regedit' import path from "path"; import { parse } from "@node-steam/vdf"; import { readFile } from "fs/promises"; +import { spawn } from "child_process"; export class SteamService{ @@ -27,27 +28,31 @@ export class SteamService{ } public async getSteamPath(): Promise{ - if(this.steamPath !== ''){ return this.steamPath; } + + if(!!this.steamPath){ return this.steamPath; } + const [win32Res, win64Res] = await Promise.all([ regedit.promisified.list(['HKLM\\SOFTWARE\\Valve\\Steam']), regedit.promisified.list(['HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam']) ]); + const [win32, win64] = [win32Res["HKLM\\SOFTWARE\\Valve\\Steam"], win64Res["HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam"]]; - let res = '' - if(win64.values.InstallPath.value){ res = win64.values.InstallPath.value as string; } - else if(win32.values.InstallPath.value){ res = win32.values.InstallPath.value as string; } + + let res = ''; + if(win64.exists && win64?.values?.InstallPath?.value){ res = win64.values.InstallPath.value as string; } + else if(win32.exists && win32?.values?.InstallPath?.value){ res = win32.values.InstallPath.value as string; } this.steamPath = res; return this.steamPath; } public async getGameFolder(gameId: string, gameFolder?: string): Promise{ const steamPath = await this.getSteamPath(); + let libraryFolders: any = path.join(steamPath, 'steamapps', 'libraryfolders.vdf'); if(!this.utils.pathExist(libraryFolders)){ return null; } libraryFolders = parse(await readFile(libraryFolders, {encoding: 'utf-8'})); - if(!libraryFolders.libraryfolders){ return null; } libraryFolders = libraryFolders.libraryfolders @@ -58,4 +63,13 @@ export class SteamService{ return null; } + public openSteam(): Promise{ + const process = spawn("start", ["steam://open/games"], {shell: true}); + + return new Promise(resolve => { + process.on("exit", () => resolve(true)); + process.on("error", () => resolve(false)); + }); + } + } diff --git a/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts b/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts new file mode 100644 index 00000000..7f443857 --- /dev/null +++ b/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts @@ -0,0 +1,130 @@ +import { ApiResult } from "renderer/models/api/api.model"; +import { BsvMapDetail } from "shared/models/maps"; +import { BsvPlaylist, BsvPlaylistPage, MapFilter, SearchParams, SearchResponse } from "shared/models/maps/beat-saver.model"; +import fetch from "node-fetch" + +export class BeatSaverApiService { + + private static instance: BeatSaverApiService; + + public static getInstance(): BeatSaverApiService{ + if(!BeatSaverApiService.instance){ BeatSaverApiService.instance = new BeatSaverApiService(); } + return BeatSaverApiService.instance; + } + + private readonly bsaverApiUrl = "https://beatsaver.com/api" + + private constructor(){} + + private mapFilterToUrlParams(filter: MapFilter): URLSearchParams{ + + if(!filter){ return new URLSearchParams(); } + + const enbledTagsString = filter.enabledTags ? Array.from(filter.enabledTags) : null; + const excludedTagsString = filter.excludedTags ? Array.from(filter.excludedTags).map(tag => `!${tag}`) : null; + + const tags = (enbledTagsString || excludedTagsString) ? [...enbledTagsString, excludedTagsString].join("|") : null; + + const params = { + ...(filter.automapper && {automapper: String(filter.automapper)}), + ...(filter.chroma && {chroma: String(filter.chroma)}), + ...(filter.cinema && {cinema: String(filter.cinema)}), + ...(filter.me && {me: String(filter.me)}), + ...(filter.noodle && {noodle: String(filter.noodle)}), + ...(filter.ranked && {ranked: String(filter.ranked)}), + ...(filter.verified && {verified: String(filter.verified)}), + ...(filter.curated && {curated: String(filter.curated)}), + ...(filter.fullSpread && {fullSpread: String(filter.fullSpread)}), + ...(filter.from && {from: String(filter.from)}), + ...(filter.to && {to: String(filter.to)}), + ...(tags && {tags: String(tags)}), + ...(filter.minDuration && {minDuration: String(filter.minDuration)}), + ...(filter.maxDuration && {maxDuration: String(filter.maxDuration)}), + ...(filter.minNps && {minNps: String(filter.minNps)}), + ...(filter.maxNps && {maxNps: String(filter.maxNps)}) + }; + + return new URLSearchParams(params); + + } + + private searchParamsToUrlParams(search: SearchParams): URLSearchParams{ + + if(!search){ return new URLSearchParams(); } + + const searchParams = { + ...(search.includeEmpty && {includeEmpty: String(search.includeEmpty)}), + ...(search.sortOrder && {sortOrder: search.sortOrder}), + ...(search.q && {q: search.q}) + }; + + const filterUrlParms = this.mapFilterToUrlParams(search.filter); + + return new URLSearchParams({ + ...searchParams, + ...Object.fromEntries(filterUrlParms) + }); + + } + + public async getMapsDetailsByHashs(hashs: T[]): Promise, BsvMapDetail>>>{ + + if(hashs.length > 50){ throw "too musch map hashs"; } + + const paramsHashs = hashs.join(","); + const resp = await fetch(`${this.bsaverApiUrl}/maps/hash/${paramsHashs}`); + + const data = await resp.json() as Record, BsvMapDetail> | BsvMapDetail; + + if((data as BsvMapDetail).id){ + const key = (data as BsvMapDetail).versions.at(0).hash.toLowerCase(); + const parsedData = { + [key]: data as BsvMapDetail + } as Record, BsvMapDetail>; + + return {status: resp.status, data: parsedData} + } + + return {status: resp.status, data: (data as Record, BsvMapDetail>)}; + + } + + public async getMapDetailsById(id: string): Promise>{ + + const res = await fetch(`${this.bsaverApiUrl}/maps/id/${id}`); + + const data = await res.json() as BsvMapDetail; + + return {status: res.status, data}; + + } + + public async searchMaps(search: SearchParams): Promise>{ + + const url = new URL(`${this.bsaverApiUrl}/search/text/${search?.page ?? 0}`); + + url.search = this.searchParamsToUrlParams(search).toString(); + + const res = await fetch(url.toString()); + + if(!res.ok){ + return {status: res.status, data: null}; + } + + const data: any = await res.json(); + + return {status: res.status, data}; + + } + + public async getPlaylistDetails(id: string): Promise>{ + + const res = await fetch(`${this.bsaverApiUrl}/playlists/id/${id}/0`); + + const data = await res.json() as BsvPlaylistPage; + + return {status: res.status, data: data.playlist}; + + } + +} \ No newline at end of file diff --git a/src/main/services/thrid-party/beat-saver/beat-saver.service.ts b/src/main/services/thrid-party/beat-saver/beat-saver.service.ts new file mode 100644 index 00000000..660e98d1 --- /dev/null +++ b/src/main/services/thrid-party/beat-saver/beat-saver.service.ts @@ -0,0 +1,76 @@ +import { splitIntoChunk } from "../../../helpers/array-tools"; +import { BsvMapDetail } from "shared/models/maps"; +import { BsvPlaylist, SearchParams } from "shared/models/maps/beat-saver.model"; +import { BeatSaverApiService } from "./beat-saver-api.service"; + +export class BeatSaverService { + + private static instance: BeatSaverService; + + public static getInstance(): BeatSaverService{ + if(!BeatSaverService.instance){ BeatSaverService.instance = new BeatSaverService(); } + return BeatSaverService.instance; + } + + private readonly bsaverApi: BeatSaverApiService; + + private readonly cachedMapsDetails = new Map(); + + private constructor(){ + this.bsaverApi = BeatSaverApiService.getInstance(); + } + + public async getMapDetailsFromHashs(hashs: string[]): Promise{ + + const filtredHashs = hashs.map(h => h.toLowerCase()).filter(hash => !Array.from(this.cachedMapsDetails.keys()).includes(hash)); + const chunkHash = splitIntoChunk(filtredHashs, 50); + + const mapDetails = Array.from(this.cachedMapsDetails.entries()).reduce((res , [hash, details]) => { + if(hashs.includes(hash)){ + res.push(details); + } + return res; + }, [] as BsvMapDetail[]); + + for(const hashs of chunkHash){ + + const res = await this.bsaverApi.getMapsDetailsByHashs(hashs); + + if(res.status === 200){ + mapDetails.push(...Object.values(res.data).filter(detail => !!detail)); + mapDetails.forEach(detail => { + this.cachedMapsDetails.set(detail.versions.at(0).hash.toLowerCase(), detail); + }); + } + } + + return mapDetails; + } + + public async getMapDetailsById(id: string): Promise{ + + const res = await this.bsaverApi.getMapDetailsById(id); + return res.data; + + } + + public searchMaps(search: SearchParams): Promise{ + + return this.bsaverApi.searchMaps(search).then(res => { + return res.status === 200 ? res.data.docs : []; + }).catch(err => { + return []; + }); + + } + + public async getPlaylistPage(id: string): Promise{ + + const res = await this.bsaverApi.getPlaylistDetails(id); + return res.data; + + } + + + +} \ No newline at end of file diff --git a/src/main/services/thrid-party/model-saber/model-saber-api.service.ts b/src/main/services/thrid-party/model-saber/model-saber-api.service.ts new file mode 100644 index 00000000..f24ed97c --- /dev/null +++ b/src/main/services/thrid-party/model-saber/model-saber-api.service.ts @@ -0,0 +1,70 @@ +import fetch from "node-fetch"; +import { ApiResult } from "renderer/models/api/api.model"; +import { MSGetQuery, MSGetQueryFilter, MSGetResponse } from "shared/models/model-saber/model-saber.model"; + +export class ModelSaberApiService { + + private static instance: ModelSaberApiService; + + public static getInstance(): ModelSaberApiService{ + if(!ModelSaberApiService.instance){ ModelSaberApiService.instance = new ModelSaberApiService(); } + return ModelSaberApiService.instance; + } + + private readonly API_URL = "https://modelsaber.com/api/v2/"; + private readonly ENDPOINTS = {get: "get.php", types: "types.php"}; + + private constructor(){} + + private parseFilters(filters: MSGetQueryFilter[]): string{ + + if(!filters){ return null; } + + const parsed = filters.map(filter => { + const stringFilter = filter.type === "searchName" ? filter.value : `${filter.type}:${filter.value}`; + return filter.isNegative ? `-${stringFilter}` : stringFilter; + }); + + return parsed.join(","); + + } + + private buildUrlQuery(query: MSGetQuery): URLSearchParams{ + + if(!query){ return new URLSearchParams(); } + + const filterQuery = this.parseFilters(query.filter); + + const searchParams = { + ...(query.type && {type: query.type}), + ...(query.platform && {platform: query.platform}), + ...(query.start && {start: `${query.start}`}), + ...(query.end && {end: `${query.end}`}), + ...(query.sort && {sort: query.sort}), + ...(query.sortDirection && {sortDirection: query.sortDirection}), + ...(filterQuery && {filter: filterQuery}), + } + + return new URLSearchParams(searchParams); + + } + + public async searchModel(query: MSGetQuery): Promise>{ + + const url = new URL(this.ENDPOINTS.get, this.API_URL); + + url.search = this.buildUrlQuery(query).toString(); + + const res = await fetch(url.toString()); + + if(!res.ok){ + return {data: null, status: res.status}; + } + + const data = await res.json() as MSGetResponse; + + return {data, status: res.status}; + + } + +} \ No newline at end of file diff --git a/src/main/services/thrid-party/model-saber/model-saber.service.ts b/src/main/services/thrid-party/model-saber/model-saber.service.ts new file mode 100644 index 00000000..c694987e --- /dev/null +++ b/src/main/services/thrid-party/model-saber/model-saber.service.ts @@ -0,0 +1,45 @@ +import { MSGetQuery, MSGetQueryFilter, MSModel } from "shared/models/model-saber/model-saber.model"; +import { ModelSaberApiService } from "./model-saber-api.service"; + +export class ModelSaberService { + + private static instance: ModelSaberService; + + public static getInstance(): ModelSaberService{ + if(!ModelSaberService.instance){ ModelSaberService.instance = new ModelSaberService(); } + return ModelSaberService.instance; + } + + private readonly modelSaberApi: ModelSaberApiService; + + private constructor(){ + this.modelSaberApi = ModelSaberApiService.getInstance(); + } + + public async getModelById(id: number|string): Promise{ + + const query: MSGetQuery = { + start: 0, + end: 1, + platform: "pc", + filter: [{type: "id", value: id}] + } + + try{ + const res = await this.modelSaberApi.searchModel(query); + + if(res.status !== 200){ return null; } + + if(Object.keys(res.data).length === 0){ + return null; + } + + return res.data[`${id}`]; + } + catch(e){ + return null; + } + + } + +} \ No newline at end of file diff --git a/src/main/services/utils.service.ts b/src/main/services/utils.service.ts index dbbc3791..5735bc4c 100644 --- a/src/main/services/utils.service.ts +++ b/src/main/services/utils.service.ts @@ -1,11 +1,15 @@ -import { existsSync, mkdirSync, readdirSync, readFile } from "fs"; +import { existsSync, mkdirSync, readdirSync, readFile, rmSync } from "fs"; +import { moveSync } from "fs-extra" import { spawnSync } from "child_process"; import { homedir } from "os"; import path from "path"; -import { BrowserWindow } from "electron"; -import { rm } from "fs/promises"; +import { app, BrowserWindow } from "electron"; +import { rm, unlink } from "fs/promises"; import { IpcResponse } from "shared/models/ipc"; import log from "electron-log"; +import { AppWindow } from "shared/models/window-manager/app-window.model"; + +// TODO : REFACTOR export class UtilsService{ @@ -13,7 +17,7 @@ export class UtilsService{ private assetsPath: string = ''; - private mainWindow: BrowserWindow; + private windows: Map = new Map(); private constructor(){} @@ -27,9 +31,10 @@ export class UtilsService{ public getAssetsScriptsPath(): string { return this.getAssetsPath("scripts") } public getAssestsJsonsPath(): string { return this.getAssetsPath("jsons"); } + public getTempPath(): string{ return path.join(app.getPath("temp"), app.getName()) } - public setMainWindow(win: BrowserWindow){ this.mainWindow = win; } - public getMainWindow(){ return this.mainWindow; } + public setMainWindows(windows: Map){ this.windows = windows; } + public getMainWindows(win: AppWindow){ return this.windows.get(win); } public pathExist(path: string): boolean{ return existsSync(path); } @@ -37,6 +42,16 @@ export class UtilsService{ if(!this.pathExist(path)){ mkdirSync(path, {recursive: true}); } } + public async unlinkIfExist(pathToFile: string): Promise{ + if(!this.pathExist(pathToFile)){ return } + return unlink(pathToFile); + } + + public async rmDirIfExist(path: string): Promise{ + if(!this.pathExist(path)){ return; } + return rm(path, {recursive: true, force: true}); + } + public taskRunning(task: string): boolean{ const tasks = spawnSync('tasklist').stdout.toString(); return tasks.includes(task); @@ -57,22 +72,38 @@ export class UtilsService{ }); } - public listDirsInDir(dirPath: string): string[]{ + public listDirsInDir(dirPath: string, fullPath = false): string[]{ let files = readdirSync(dirPath, { withFileTypes:true}); files = files.filter(f => f.isDirectory()) - return files.map(f => f.name); + return files.map(f => fullPath ? path.join(dirPath, f.name) : f.name); } - public deleteFolder(folderPath: string): Promise{ - return rm(folderPath, {recursive: true}); + public async deleteFolder(folderPath: string): Promise{ + const folderExist = this.pathExist(folderPath); + if(!folderExist){ return; } + return rmSync(folderPath, {recursive: true}); } - public ipcSend(channel: string, response: IpcResponse): void{ + public async moveDirContent(src: string, dest: string, overwrite = false): Promise{ + const [srcExist, destExist] = await Promise.all([this.pathExist(src), this.pathExist(dest)]); + if(!srcExist){ return; } + if(!destExist){ await this.createFolderIfNotExist(dest); } + readdirSync(src, {encoding: "utf-8"}).forEach(file => { + const srcFullPath = path.join(src, file); + const destFullPath = path.join(dest, file); + if(!overwrite && this.pathExist(destFullPath)){ return; } + moveSync(srcFullPath, destFullPath, {overwrite}); + }); + } + + public ipcSend(channel: string, response: IpcResponse): void{ try { - this.mainWindow.webContents.send(channel, response); + Array.from(this.windows.values()).forEach(window => window.webContents.send(channel, response)); } catch (error) { log.error(error); } } + + } diff --git a/src/main/services/window-manager.service.ts b/src/main/services/window-manager.service.ts index d4d075f0..e81a3ec4 100644 --- a/src/main/services/window-manager.service.ts +++ b/src/main/services/window-manager.service.ts @@ -2,25 +2,32 @@ import { app, BrowserWindow, BrowserWindowConstructorOptions } from "electron"; import { resolveHtmlPath } from "../util"; import { UtilsService } from "./utils.service"; import { AppWindow } from "shared/models/window-manager/app-window.model"; -import { PRELOAD_PATH } from "../main"; +import path from "path"; +import { APP_NAME } from "../constants"; export class WindowManagerService{ private static instance: WindowManagerService; + private readonly PRELOAD_PATH = app.isPackaged ? path.join(__dirname, 'preload.js') : path.join(__dirname, '../../../.erb/dll/preload.js') + private readonly utilsService: UtilsService = UtilsService.getInstance(); private readonly appWindowsOptions: Record = { "launcher.html": {width: 380, height: 500, minWidth: 380, minHeight: 500, resizable: false}, - "index.html": {width: 1080, height: 720, minWidth: 900, minHeight: 500} + "index.html": {width: 1080, height: 720, minWidth: 900, minHeight: 500}, + "oneclick-download-map.html": {width: 350, height: 400, minWidth: 350, minHeight: 400, resizable: false}, + "oneclick-download-playlist.html": {width: 350, height: 400, minWidth: 350, minHeight: 400, resizable: false}, + "oneclick-download-model.html": {width: 350, height: 400, minWidth: 350, minHeight: 400, resizable: false}, } private readonly baseWindowOption: BrowserWindowConstructorOptions = { + title: APP_NAME, icon: this.utilsService.getAssetsPath("favicon.ico"), show: false, frame: false, titleBarOverlay: false, - webPreferences: { preload: PRELOAD_PATH } + webPreferences: { preload: this.PRELOAD_PATH, webSecurity: false } } private readonly windows: Map = new Map(); @@ -32,15 +39,16 @@ export class WindowManagerService{ private constructor(){} - public openWindow(windowType: AppWindow): Promise{ - const window = new BrowserWindow({...this.appWindowsOptions[windowType], ...this.baseWindowOption}); + public openWindow(windowType: AppWindow, options?: BrowserWindowConstructorOptions): Promise{ + const window = new BrowserWindow({...this.appWindowsOptions[windowType], ...this.baseWindowOption, ...options}); + const promise = window.loadURL(resolveHtmlPath(windowType)); window.removeMenu(); window.setMenu(null); window.once("ready-to-show", () => { if (!window) { throw new Error('"window" is not defined'); } - return window.show(); + window.show(); }); window.once("closed", () => { @@ -49,15 +57,11 @@ export class WindowManagerService{ }); this.windows.set(windowType, window); - this.utilsService.setMainWindow(window); + this.utilsService.setMainWindows(this.windows); return promise.then(() => window); } - public closeWindow(window: AppWindow){ - this.windows.get(window).close(); - } - public closeAllWindows(except?: AppWindow){ this.windows.forEach((window, key) => { if(key === except){ return; } @@ -65,4 +69,14 @@ export class WindowManagerService{ }) } + public close(...win: AppWindow[]){ + win.forEach(window => { + this.windows.get(window)?.close(); + }); + } + + public getWindows(window: AppWindow): BrowserWindow{ + return this.windows.get(window); + } + } \ No newline at end of file diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx deleted file mode 100644 index 28733c6e..00000000 --- a/src/renderer/App.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { NavBar } from "./components/nav-bar/nav-bar.component"; -import TitleBar from "./components/title-bar/title-bar.component"; -import { Routes, Route } from "react-router-dom"; -import { AvailableVersionsList } from "./pages/available-versions-list.components"; -import { VersionViewer } from "./pages/version-viewer.component"; -import { Modal } from "./components/modal/modal.component"; -import { SettingsPage } from "./pages/settings-page.component"; -import { BsmProgressBar } from "./components/progress-bar/bsm-progress-bar.component"; -import { useEffect } from "react"; -import { ThemeService } from "./services/theme.service"; -import { NotificationOverlay } from "./components/notification/notification-overlay.component"; - -export default function App() { - - const themeService = ThemeService.getInstance(); - - useEffect(() => { - themeService.theme$.subscribe(() => { - if(themeService.isDark || (themeService.isOS && window.matchMedia('(prefers-color-scheme: dark)').matches)){ document.documentElement.classList.add('dark'); } - else { document.documentElement.classList.remove('dark'); } - }); - }, []); - - - return ( -
- - - -
- -
- - }/> - }/> - }/> - - -
-
-
- ); -} diff --git a/src/renderer/components/available-versions/available-version-item.component.css b/src/renderer/components/available-versions/available-version-item.component.css deleted file mode 100644 index 16135455..00000000 --- a/src/renderer/components/available-versions/available-version-item.component.css +++ /dev/null @@ -1,22 +0,0 @@ -.glow-on-hover { - border-radius: 10px; - background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000); - position: absolute; - top: -4px; - left:-4px; - background-size: 400%; - z-index: -1; - filter: blur(3px); - width: calc(100% + 8px); - height: calc(100% + 8px); - animation: glowing 20s linear infinite; - opacity: 0; - transition: opacity .2s ease-in-out; - border-radius: 10px; -} - -@keyframes glowing { - 0% { background-position: 0 0; } - 50% { background-position: 400% 0; } - 100% { background-position: 0 0; } -} \ No newline at end of file diff --git a/src/renderer/components/available-versions/available-version-item.component.tsx b/src/renderer/components/available-versions/available-version-item.component.tsx index 15ef6173..30c200b3 100644 --- a/src/renderer/components/available-versions/available-version-item.component.tsx +++ b/src/renderer/components/available-versions/available-version-item.component.tsx @@ -1,19 +1,18 @@ import { BSVersion } from 'shared/bs-version.interface'; -import './available-version-item.component.css'; import { useEffect, useState, memo } from "react"; import { BsDownloaderService } from "renderer/services/bs-downloader.service"; import { distinctUntilChanged } from "rxjs/operators"; import defaultImage from '../../../../assets/images/default-version-img.jpg' import dateFormat from "dateformat"; import { BsmImage } from "../shared/bsm-image.component"; -import { IpcService } from "renderer/services/ipc.service"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { BsmIcon } from "../svgs/bsm-icon.component"; +import { LinkOpenerService } from 'renderer/services/link-opener.service'; export const AvailableVersionItem = memo(function AvailableVersionItem(props: {version: BSVersion}) { const bsDownloaderService = BsDownloaderService.getInstance(); - const ipcService = IpcService.getInstance(); + const linkOpener = LinkOpenerService.getInstance(); const [selected, setSelected] = useState(false); const t = useTranslation(); @@ -26,7 +25,7 @@ export const AvailableVersionItem = memo(function AvailableVersionItem(props: {v else{ bsDownloaderService.selectedBsVersion$.next(props.version); } } - const openReleasePage = () => { ipcService.sendLazy("new-window", {args: props.version.ReleaseURL}); } + const openReleasePage = () => { linkOpener.open(props.version.ReleaseURL) } useEffect(() => { const sub = bsDownloaderService.selectedBsVersion$.pipe(distinctUntilChanged()).subscribe((version) => { @@ -38,25 +37,25 @@ export const AvailableVersionItem = memo(function AvailableVersionItem(props: {v } }, []) - return ( - - ) + return ( +
  • + + +
  • + ) }) diff --git a/src/renderer/components/available-versions/available-versions-slide.component.tsx b/src/renderer/components/available-versions/available-versions-slide.component.tsx index 9aa98b2a..5cbb3484 100644 --- a/src/renderer/components/available-versions/available-versions-slide.component.tsx +++ b/src/renderer/components/available-versions/available-versions-slide.component.tsx @@ -16,14 +16,11 @@ export function AvailableVersionsSlide(props: {year: string}) { }); }, []) - - return ( -
    -
    - {availableVersions.map((version, index) => - - )} -
    -
    + return ( +
      + {availableVersions.map((version, index) => + + )} +
    ) } diff --git a/src/renderer/components/available-versions/available-versions-slider.component.tsx b/src/renderer/components/available-versions/available-versions-slider.component.tsx index 0a8f6ffe..01bf8fe7 100644 --- a/src/renderer/components/available-versions/available-versions-slider.component.tsx +++ b/src/renderer/components/available-versions/available-versions-slider.component.tsx @@ -21,14 +21,14 @@ export function AvailableVersionsSlider() { }); }, []) - return ( -
    - -
    - { availableYears.map((year, index) => - - )} -
    -
    - ) + return ( +
    + +
      + { availableYears.map(year => + + )} +
    +
    + ) } diff --git a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx new file mode 100644 index 00000000..647da87d --- /dev/null +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -0,0 +1,183 @@ +import { MapFilter, MapSpecificity, MapStyle, MapTag, MapType } from "shared/models/maps/beat-saver.model" +import {motion} from "framer-motion" +import { MutableRefObject} from "react" +import { MAP_TYPES } from "renderer/partials/maps/map-tags/map-types" +import { MAP_STYLES } from "renderer/partials/maps/map-tags/map-styles" +import { BsmCheckbox } from "../shared/bsm-checkbox.component" +import { min_to_s } from "renderer/helpers/time-utils" +import dateFormat from "dateformat" +import { BsmRange } from "../shared/bsm-range.component" +import { useTranslation } from "renderer/hooks/use-translation.hook" +import { MAP_SPECIFICITIES } from "renderer/partials/maps/map-general/map-specificity" +import { MAP_REQUIREMENTS } from "renderer/partials/maps/map-requirements/map-requirements" +import { MAP_DIFFICULTIES_COLORS } from "renderer/partials/maps/map-difficulties/map-difficulties-colors" + +export type Props = { + className?: string, + ref?: MutableRefObject + playlist?: boolean, + filter: MapFilter + onChange?: (filter: MapFilter) => void +} + +export function FilterPanel({className, ref, playlist = false, filter, onChange}: Props) { + + const t = useTranslation(); + + const MIN_NPS = 0; + const MAX_NPS = 17; + + const MIN_DURATION = 0; + const MAX_DURATION = min_to_s(30); + + const npss = [filter?.minNps || MIN_NPS, filter?.maxNps || MAX_NPS]; + const durations = [filter?.minDuration || MIN_DURATION, filter?.maxDuration || MAX_DURATION]; + + const isTagActivated = (tag: MapTag): boolean => filter?.enabledTags?.has(tag) || filter?.excludedTags?.has(tag); + const isTagExcluded = (tag: MapTag): boolean => filter?.excludedTags?.has(tag); + + const renderDurationLabel = (sec: number): JSX.Element => { + + const textValue = (() => { + if(sec === MIN_DURATION){ return t("maps.map-filter-panel.duration"); } + if(sec === MAX_DURATION){ return "∞"; } + const date = new Date(0); + date.setSeconds(sec); + return sec > 3600 ? dateFormat(date, "h:MM:ss") : dateFormat(date, "MM:ss"); + })(); + + return renderLabel(textValue, sec === MAX_DURATION); + } + + const renderNpsLabel = (nps: number): JSX.Element => { + + const textValue = (() => { + if(nps === MIN_NPS){ return "NPS"; } + if(nps === MAX_NPS){ return "∞"; } + return nps; + })(); + + return renderLabel(textValue, nps === MAX_NPS); + + } + + const renderLabel = (text: unknown, isMax: boolean): JSX.Element => { + return ( + + {text} + + ) + } + + const onNpssChange = ([min, max]: number[]) => { + const newFilter: MapFilter = {...filter, minNps: min, maxNps: max}; + if(max === MAX_NPS){ + delete newFilter["maxNps"]; + } + onChange(newFilter); + } + + const onDurationsChange = ([min, max]: number[]) => { + const newFilter: MapFilter = {...filter, minDuration: min, maxDuration: max}; + if(max === MAX_DURATION){ + delete newFilter["maxDuration"]; + } + onChange(newFilter); + } + + const handleTagClick = (tag: MapTag) => { + + const enabledTags = filter.enabledTags ?? new Set(); + const excludedTags = filter.excludedTags ?? new Set(); + + if(isTagExcluded(tag)){ + excludedTags.delete(tag); + } + else if(isTagActivated(tag)){ + excludedTags.add(tag); + enabledTags.delete(tag); + } + else{ + enabledTags.add(tag); + } + + onChange({ + ...filter, + enabledTags, + excludedTags + }); + + } + + const translateMapType = (type: MapType): string => { + return t(`maps.map-types.${type}`); + } + + const translateMapStyle = (style: MapStyle): string => { + return t(`maps.map-styles.${style}`) + } + + const translateMapSpecificity = (specificity: MapSpecificity): string => { + return t(`maps.map-specificities.${specificity}`); + } + + type BooleanKeys = { [k in keyof T]: T[k] extends boolean ? k : never }[keyof T]; + + const handleCheckbox = (key: BooleanKeys) => { + const newFilter = {...(filter ?? {})}; + if(newFilter[key] === true){ + delete newFilter[key]; + } + else{ + newFilter[key] = true; + } + onChange(newFilter); + } + + return !playlist ? ( + +
    + + +
    +
    +
    + +

    {t("maps.map-filter-panel.specificities")}

    + {MAP_SPECIFICITIES.map(specificity => ( +
    handleCheckbox(specificity)}> + handleCheckbox(specificity)}/> + {translateMapSpecificity(specificity)} +
    + ))} + +

    {t("maps.map-filter-panel.requirements")}

    + {MAP_REQUIREMENTS.map(requirement => ( +
    handleCheckbox(requirement)}> + handleCheckbox(requirement)}/> + {requirement} +
    + ))} + +
    +
    +

    {t("maps.map-filter-panel.tags")}

    +
    + {MAP_TYPES.map(tag => ( + handleTagClick(tag)} className={`text-[12.5px] text-black rounded-md px-1 font-bold cursor-pointer ${(!isTagActivated(tag)) && "opacity-40 hover:opacity-90"}`} style={{backgroundColor: isTagExcluded(tag) ? MAP_DIFFICULTIES_COLORS.Expert : MAP_DIFFICULTIES_COLORS.Normal}}>{translateMapType(tag)} + ))} +
    +
    + {MAP_STYLES.map(tag => ( + handleTagClick(tag)} className={`text-[12.5px] text-black rounded-md px-1 font-bold cursor-pointer ${(!isTagActivated(tag)) && "opacity-40 hover:opacity-90"}`} style={{backgroundColor: isTagExcluded(tag) ? MAP_DIFFICULTIES_COLORS.Expert : MAP_DIFFICULTIES_COLORS.Easy}}>{translateMapStyle(tag)} + ))} +
    + + +
    +
    +
    + ) : ( + <> + ) +} diff --git a/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx new file mode 100644 index 00000000..8528e642 --- /dev/null +++ b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx @@ -0,0 +1,260 @@ +import { MapsManagerService } from "renderer/services/maps-manager.service" +import { BSVersion } from "shared/bs-version.interface" +import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react" +import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface" +import { Subscription } from "rxjs" +import { MapItem, ParsedMapDiff } from "./map-item.component" +import { BsvMapCharacteristic, MapFilter } from "shared/models/maps/beat-saver.model" +import { useInView } from "framer-motion" +import { MapsDownloaderService } from "renderer/services/maps-downloader.service" +import { BsmImage } from "../shared/bsm-image.component" +import BeatConflict from "../../../../assets/images/apngs/beat-conflict.png" +import { BsmButton } from "../shared/bsm-button.component" +import { useTranslation } from "renderer/hooks/use-translation.hook" + +type Props = { + version: BSVersion, + className?: string, + filter?: MapFilter + search?: string, +} + +export const LocalMapsListPanel = forwardRef(({version, className, filter, search} : Props, forwardRef) => { + + const mapsManager = MapsManagerService.getInstance(); + const mapsDownloader = MapsDownloaderService.getInstance(); + + const ref = useRef(null) + const isVisible = useInView(ref, {once: true}); + const [maps, setMaps] = useState([]); + const [subs] = useState([]); + const [selectedMaps, setSelectedMaps] = useState([]); + const t = useTranslation(); + + useImperativeHandle(forwardRef ,()=>({ + deleteMaps(){ + const mapsToDelete = selectedMaps.length === 0 ? maps : selectedMaps + mapsManager.deleteMaps(mapsToDelete, version).finally(loadMaps); + }, + exportMaps(){ + mapsManager.exportMaps(version, selectedMaps) + } + }), [selectedMaps, maps, version]); + + useEffect(() => { + + if(isVisible){ + loadMaps(); + subs.push(mapsManager.versionLinked$.subscribe(loadMaps)); + subs.push(mapsManager.versionUnlinked$.subscribe(loadMaps)); + mapsDownloader.addOnMapDownloadedListener(loadMaps); + } + + return () => { + setMaps(() => []); + subs.forEach(s => s.unsubscribe()); + mapsDownloader.removeOnMapDownloadedListene(loadMaps); + } + }, [isVisible, version]); + + const loadMaps = () => { + subs.push(mapsManager.getMaps(version).subscribe(localMaps => setMaps(() => [...localMaps]))); + } + + const handleDelete = useCallback((map: BsmLocalMap) => { + mapsManager.deleteMaps([map], version).then(res => res && loadMaps()) + }, [version]); + + const extractMapDiffs = (map: BsmLocalMap): Map => { + const res = new Map(); + if(map.bsaverInfo?.versions[0]?.diffs){ + map.bsaverInfo.versions[0].diffs.forEach(diff => { + const arr = res.get(diff.characteristic) || []; + const diffName = map.rawInfo._difficultyBeatmapSets.find(set => set._beatmapCharacteristicName === diff.characteristic)._difficultyBeatmaps.find(rawDiff => rawDiff._difficulty === diff.difficulty)?._customData?._difficultyLabel || diff.difficulty + arr.push({name: diffName, type: diff.difficulty, stars: diff.stars}); + res.set(diff.characteristic, arr); + }); + return res; + } + + map.rawInfo._difficultyBeatmapSets.forEach(set => { + set._difficultyBeatmaps.forEach(diff => { + const arr = res.get(set._beatmapCharacteristicName) || []; + arr.push({name: diff._customData?._difficultyLabel || diff._difficulty, type: diff._difficulty, stars: null}); + res.set(set._beatmapCharacteristicName, arr); + }); + }); + + return res; + } + + const onMapSelected = useCallback((map: BsmLocalMap) => { + const maps = [...selectedMaps]; + if(maps.some(selectedMap => selectedMap.hash === map.hash)){ + const i = maps.findIndex(selectedMap => selectedMap.hash === map.hash); + maps.splice(i, 1); + } + else{ + maps.push(map); + } + setSelectedMaps(() => maps); + }, [selectedMaps]); + + const isMapFitFilter = (map: BsmLocalMap): boolean => { + + // Can be more clean and optimized i think + + const fitEnabledTags = (() => { + if(!filter?.enabledTags || filter.enabledTags.size === 0){ return true; } + if(!map?.bsaverInfo?.tags){ return false; } + return Array.from(filter.enabledTags.values()).every(tag => map.bsaverInfo.tags.some(mapTag => mapTag === tag)); + })(); + + if(!fitEnabledTags){ return false; } + + const fitExcluedTags = (() => { + if(!filter?.excludedTags || filter.excludedTags.size === 0){ return true; } + if(!map?.bsaverInfo?.tags){ return true; } + return !map.bsaverInfo.tags.some(tag => filter.excludedTags.has(tag)); + })(); + + if(!fitExcluedTags){ return false; } + + const fitMinNps = (() => { + if(!filter?.minNps){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return !map.bsaverInfo.versions.some(version => { + return version.diffs.some(diff => diff.nps < filter.minNps); + }); + })(); + + if(!fitMinNps){ return false; } + + const fitMaxNps = (() => { + if(!filter?.maxNps){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return !map.bsaverInfo.versions.some(version => { + return version.diffs.some(diff => diff.nps > filter.maxNps); + }); + })(); + + if(!fitMaxNps){ return false; } + + const fitMinDuration = (() => { + if(!filter?.minDuration){ return true; } + + if(!map?.bsaverInfo?.metadata?.duration){ return false; } + return map.bsaverInfo.metadata.duration >= filter.minDuration; + })(); + + if(!fitMinDuration){ return false; } + + const fitMaxDuration = (() => { + if(!filter?.maxDuration){ return true; } + if(!map?.bsaverInfo?.metadata?.duration){ return false; } + return map.bsaverInfo.metadata.duration <= filter.maxDuration; + })(); + + if(!fitMaxDuration){ return false; } + + const fitNoodle = (() => { + if(!filter?.noodle){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return map.bsaverInfo.versions.some(version => version.diffs.some(diff => !!diff.ne)); + })(); + + if(!fitNoodle){ return false; } + + const fitMe = (() => { + if(!filter?.me){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return map.bsaverInfo.versions.some(version => version.diffs.some(diff => !!diff.me)); + })(); + + if(!fitMe){ return false; } + + const fitCinema = (() => { + if(!filter?.cinema){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return map.bsaverInfo.versions.some(version => version.diffs.some(diff => !!diff.cinema)); + })(); + + if(!fitCinema){ return false; } + + const fitChroma =(() => { + if(!filter?.chroma){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return map.bsaverInfo.versions.some(version => version.diffs.some(diff => !!diff.chroma)); + })(); + + if(!fitChroma){ return false; } + + const fitFullSpread = (() => { + if(!filter?.fullSpread){ return true; } + if(!map?.bsaverInfo?.versions?.at(0)){ return false; } + return map.bsaverInfo.versions.some(version => version?.diffs?.length >= 5); + })(); + + if(!fitFullSpread){ return false; } + + if(!(filter?.automapper ? map.bsaverInfo?.automapper === filter.automapper : true)){ return false } + if(!(filter?.ranked ? map.bsaverInfo?.ranked === filter.ranked : true)){ return false } + if(!(filter?.curated ? !!map.bsaverInfo?.curatedAt : true)){ return false } + if(!(filter?.verified ? !!map.bsaverInfo?.uploader?.verifiedMapper : true)){ return false } + + const searchCheck = (() => { + return ( + ((map.rawInfo?._songName ?? map.bsaverInfo?.name) || "")?.toLowerCase().includes(search.toLowerCase()) || + ((map.rawInfo?._songAuthorName ?? map.bsaverInfo?.metadata?.songAuthorName) || "")?.toLowerCase().includes(search.toLowerCase()) || + ((map.rawInfo?._levelAuthorName ?? map.bsaverInfo?.metadata?.levelAuthorName) || "")?.toLowerCase().includes(search.toLowerCase())); + })(); + + if(!searchCheck){ return false }; + + return true; + + } + + const renderMaps = (): JSX.Element[] => { + return maps.reduce((acc, current) => { + if(isMapFitFilter(current)){ + acc.push(renderMapItem(current)); + } + return acc + }, []); + } + + const renderMapItem = (map: BsmLocalMap) => { + + return _map.hash === map.hash)} + diffs={extractMapDiffs(map)} mapId={map.bsaverInfo?.id} qualified={null} ranked={map.bsaverInfo?.ranked} autorId={map.bsaverInfo?.uploader?.id} likes={map.bsaverInfo?.stats?.upvotes} createdAt={map.bsaverInfo?.createdAt} + onDelete={handleDelete} + onSelected={onMapSelected} + callBackParam={map} + />; + } + + return ( +
    +
      + {maps?.length ? renderMaps() : ( +
      + + {t("pages.version-viewer.maps.tabs.maps.empty-maps.text")} + {e.preventDefault(); mapsDownloader.openDownloadMapModal(version)}}/> +
      + )} +
    +
    + ) +}) diff --git a/src/renderer/components/maps-mangement-components/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx new file mode 100644 index 00000000..23bb0116 --- /dev/null +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -0,0 +1,242 @@ +import { BsmImage } from "../shared/bsm-image.component"; +import { BsvMapCharacteristic, BsvMapDifficultyType } from "shared/models/maps/beat-saver.model" +import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; +import { BsmLink } from "../shared/bsm-link.component"; +import { BsmIcon } from "../svgs/bsm-icon.component"; +import { BsmButton } from "../shared/bsm-button.component"; +import { AnimatePresence, motion } from "framer-motion"; +import { useState, Fragment, memo, useRef } from "react"; +import { LinkOpenerService } from "renderer/services/link-opener.service"; +import dateFormat from "dateformat"; +import { AudioPlayerService } from "renderer/services/audio-player.service"; +import { useObservable } from "renderer/hooks/use-observable.hook"; +import { map } from "rxjs/operators"; +import useDelayedState from "use-delayed-state"; +import equal from "fast-deep-equal/es6"; +import { getMapZipUrlFromHash } from "renderer/helpers/maps-utils"; +import { BsmBasicSpinner } from "../shared/bsm-basic-spinner/bsm-basic-spinner.component"; +import defaultImage from '../../../../assets/images/default-version-img.jpg' +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { MAP_DIFFICULTIES } from "renderer/partials/maps/map-difficulties/map-difficulties"; +import { MAP_DIFFICULTIES_COLORS } from "renderer/partials/maps/map-difficulties/map-difficulties-colors" +import useDoubleClick from "use-double-click"; + +export type ParsedMapDiff = {type: BsvMapDifficultyType, name: string, stars: number} + +export type MapItemProps = { + hash: string, + title: string, + autor: string, + songAutor: string, + coverUrl: string, + songUrl: string, + autorId: number, + mapId: string, + diffs: Map, + qualified: boolean, + ranked: boolean, + bpm: number, + duration: number, + likes: number, + createdAt: string, + selected?: boolean, + downloading?: boolean, + callBackParam: T + onDelete?: (param: T) => void, + onDownload?: (param: T) => void, + onSelected?: (param: T) => void, + onCancelDownload?: (param: T) => void, + onDoubleClick?: (param: T) => void +} + +export const MapItem = memo(({hash, title, autor, songAutor, coverUrl, songUrl, autorId, mapId, diffs, qualified, ranked, bpm, duration, likes, createdAt, selected, downloading, callBackParam, onDelete, onDownload, onSelected, onCancelDownload, onDoubleClick}: MapItemProps) => { + + const linkOpener = LinkOpenerService.getInstance(); + const audioPlayer = AudioPlayerService.getInstance(); + + const color = useThemeColor("first-color"); + const t = useTranslation(); + + const ref = useRef(null); + const [hovered, setHovered] = useState(false); + const [bottomBarHovered, setBottomBarHovered, cancelBottomBarHovered] = useDelayedState(false); + const [diffsPanelHovered, setDiffsPanelHovered] = useState(false); + + useDoubleClick({ + ref, + latency: onDoubleClick ? 200 : 0, + onSingleClick: e => onSelected?.(callBackParam), + onDoubleClick: e => onDoubleClick?.(callBackParam) + }) + + const songPlaying = useObservable(audioPlayer.playing$.pipe(map(playing => playing && audioPlayer.src === songUrl))); + + const zipUrl = getMapZipUrlFromHash(hash); + const previewUrl = mapId ? `https://skystudioapps.com/bs-viewer/?url=${zipUrl}` : null; + const mapUrl = mapId ? `https://beatsaver.com/maps/${mapId}` : null; + const authorUrl = autorId ? `https://beatsaver.com/profile/${autorId}` : null; + const createdDate = createdAt ? dateFormat(createdAt, "d mmm yyyy") : null; + const likesText = likes ? Intl.NumberFormat(undefined, {notation: "compact"}).format(likes).split(" ").join("") : null; + + const durationText = (() => { + if(!duration){ return null; } + const date = new Date(0); + date.setSeconds(duration); + return duration > 3600 ? dateFormat(date, "h:MM:ss") : dateFormat(date, "MM:ss"); + })(); + + const parseDiffLabel = (diffLabel: string) => { + if(MAP_DIFFICULTIES.includes(diffLabel as BsvMapDifficultyType)){ + return t(`maps.difficulties.${diffLabel}`); + } + return diffLabel; + } + + const openPreview = () => linkOpener.open(previewUrl, true); + const copyBsr = () => navigator.clipboard.writeText(`!bsr ${mapId}`); + const toogleMusic = () => { + if(songPlaying){ + return audioPlayer.pause(); + } + if(!audioPlayer.playing && audioPlayer.src === songUrl){ + return audioPlayer.resume(); + } + audioPlayer.play(songUrl, bpm); + } + + const bottomBarHoverStart = () => { + cancelBottomBarHovered(); + setBottomBarHovered(true, (diffsPanelHovered || bottomBarHovered) ? 0 : 300); + } + + const bottomBarHoverEnd = () => { + cancelBottomBarHovered(); + setBottomBarHovered(false, 100); + } + + const diffsPanelHoverStart = () => setDiffsPanelHovered(true); + const diffsPanelHoverEnd = () => setDiffsPanelHovered(false); + + + const renderDiffPreview = () => { + + const diffSets = Array.from(diffs.entries()); + + if(diffSets.length === 1){ + const [diffType, diffSet] = diffSets[0]; + + return ( + <> + +
    + {diffSet.map(diff => ( + + ))} +
    + + ) + } + if(diffSets.length > 1){ + return diffSets.map(([diffType, diffSet]) => ( + + + {diffSet.length} + + )); + } + } + + return ( + setHovered(true)} onHoverEnd={() => setHovered(false)} style={{zIndex: hovered && 5, transform: "translateZ(0) scale(1.0, 1.0)", backfaceVisibility: "hidden"}}> + {(hovered || selected) && onSelected && } + + {(diffsPanelHovered || bottomBarHovered) && ( + + {Array.from(diffs.entries()).map(([charac, diffSet]) => ( +
      + {diffSet.map(({type, name, stars}) => ( +
    1. + + + { + stars ? ( + ★ {stars} + ) : ( + {parseDiffLabel(type)} + ) + } + + {parseDiffLabel(name)} +
    2. + ))} +
    + ))} +
    + )} +
    +
    +
    + + {e.stopPropagation(); e.preventDefault(); toogleMusic()}}> + + +
    +
    + +
    +

    {title}

    +

    {songAutor && t("maps.map-item.by", {songAutor})}

    +

    {autor && (<> {t("maps.map-item.mapped-by")} {autor})}

    +
    + {likesText && ( +
    + + {likesText} +
    + )} + {durationText && ( +
    + + {durationText} +
    + )} + {createdAt && ( +
    + + +
    + )} +
    + + {ranked && ( +
    + {t("maps.map-specificities.ranked")} +
    + )} +
    + {renderDiffPreview()} +
    +
    +
    +
    +
    + + + +
    + {onDelete && !downloading && {e.stopPropagation(); onDelete(callBackParam)}}/>} + {onDownload && !downloading && {e.stopPropagation(); onDownload(callBackParam)}}/>} + {onCancelDownload && !downloading && {e.stopPropagation(); onCancelDownload(callBackParam)}}/>} + {downloading && } + {previewUrl && {e.stopPropagation(); openPreview()}}/>} + {mapId && {e.stopPropagation(); copyBsr()}}/>} +
    +
    +
    +
    + ) +}, areEqual) + +function areEqual(prevProps: MapItemProps, nextProps: MapItemProps): boolean { + return equal(prevProps, nextProps); +} diff --git a/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx new file mode 100644 index 00000000..d0170256 --- /dev/null +++ b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx @@ -0,0 +1,142 @@ +import { DetailedHTMLProps, useEffect, useRef, useState } from "react" +import { BSVersion } from "shared/bs-version.interface" +import { TabNavBar } from "../shared/tab-nav-bar.component" +import { LocalMapsListPanel } from "./local-maps-list-panel.component" +import { BsmDropdownButton, DropDownItem } from "../shared/bsm-dropdown-button.component" +import { FilterPanel } from "./filter-panel.component" +import { MapFilter } from "shared/models/maps/beat-saver.model" +import { useThemeColor } from "renderer/hooks/use-theme-color.hook" +import { MapsManagerService } from "renderer/services/maps-manager.service" +import { motion, Variants } from "framer-motion"; +import { MapsDownloaderService } from "renderer/services/maps-downloader.service" +import { BsmImage } from "../shared/bsm-image.component" +import wipGif from "../../../../assets/images/gifs/wip.gif" +import { OsDiagnosticService } from "renderer/services/os-diagnostic.service" +import { useObservable } from "renderer/hooks/use-observable.hook" +import { BsmIcon } from "../svgs/bsm-icon.component" +import { useTranslation } from "renderer/hooks/use-translation.hook" + +type Props = { + version?: BSVersion +} + +export function MapsPlaylistsPanel({version}: Props) { + + const mapsService = MapsManagerService.getInstance(); + const mapsDownloader = MapsDownloaderService.getInstance(); + const osDiagnostic = OsDiagnosticService.getInstance(); + + const [tabIndex, setTabIndex] = useState(0); + const [mapFilter, setMapFilter] = useState({}); + const [mapSearch, setMapSearch] = useState(""); + const [playlistSearch, setPlaylistSearch] = useState(""); + const [mapsLinked, setMapsLinked] = useState(false); + const isOnline = useObservable(osDiagnostic.isOnline$); + const color = useThemeColor("first-color"); + const t = useTranslation(); + const mapsRef = useRef(); + + useEffect(() => { + loadMapIsLinked(); + }, [version]); + + const loadMapIsLinked = () => { + mapsService.versionHaveMapsLinked(version).then(setMapsLinked); + } + + const handleSearch = (value: string) => { + if(tabIndex === 0){ + return setMapSearch(() => value); + } + return setPlaylistSearch(() => value); + } + + const handleMapsLinkClick = () => { + if(!mapsLinked){ + return mapsService.linkVersion(version).then(loadMapIsLinked); + } + return mapsService.unlinkVersion(version).then(loadMapIsLinked); + } + + const handleMapsAddClick = () => { + mapsDownloader.openDownloadMapModal(version); + } + + const renderTab = (props: DetailedHTMLProps, HTMLLIElement>, text: string, index: number): JSX.Element => { + + const linkedColor = mapsLinked ? color : "red"; + + const onClickLink = (index: number) => { + if(index === 0){ handleMapsLinkClick(); } + } + + const onClickAdd = (index: number) => { + if(index === 0){ handleMapsAddClick(); } + } + + const variants: Variants = { hover: {rotate: 22.5}, tap: {rotate: 45} }; + + return ( +
  • + {text} + {index === 0 &&( +
    + {isOnline && ( + {e.stopPropagation(); onClickAdd(index)}}> + + + + + {t("pages.version-viewer.maps.tabs.maps.actions.add-maps.text")} + + )} + {(!!version) && ( + {e.stopPropagation(); onClickLink(index)}}> + + + + )} +
    + )} + +
  • + ) + } + + const dropDownItems = ((): DropDownItem[] => { + if(tabIndex === 1){ + return [ + + ] + } + return [ + {icon:"export", text: "pages.version-viewer.maps.search-bar.dropdown.export-maps", onClick: () => mapsRef.current.exportMaps?.()}, + {icon: "trash", text: "pages.version-viewer.maps.search-bar.dropdown.delete-maps", onClick: () => mapsRef.current.deleteMaps?.()} + ] + + })() + + return ( +
    + +
    + +
    + +
    + + Work in progress +
    +
    +
    +
    + ) +} diff --git a/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx b/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx new file mode 100644 index 00000000..b78c2b57 --- /dev/null +++ b/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx @@ -0,0 +1,11 @@ +type Props = { + className?: string +} + +export function MapsToolbar({className}: Props) { + return ( +
    + +
    + ) +} diff --git a/src/renderer/components/modal/modal-types/delete-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/delete-maps-modal.component.tsx new file mode 100644 index 00000000..601df8c3 --- /dev/null +++ b/src/renderer/components/modal/modal-types/delete-maps-modal.component.tsx @@ -0,0 +1,31 @@ +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; +import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; +import BeatConflict from '../../../../../assets/images/apngs/beat-conflict.png' + +export const DeleteMapsModal: ModalComponent = ({resolver, data:{linked, maps}}) => { + + const t = useTranslation(); + + const multiple = maps.length > 1; + + const titleText = multiple ? "modals.maps-actions.delete-maps.title.multiple" : "modals.maps-actions.delete-maps.title.single"; + const descText = multiple ? "modals.maps-actions.delete-maps.desc.multiple" : "modals.maps-actions.delete-maps.desc.single"; + const infoText = multiple ? "modals.maps-actions.delete-maps.info.desc.multiple" : "modals.maps-actions.delete-maps.info.desc.single"; + const infoTitleText = multiple ? "modals.maps-actions.delete-maps.info.title.multiple" : "modals.maps-actions.delete-maps.info.title.single"; + + return ( +
    +

    {t(titleText)}

    + +

    {t(descText, multiple ? {nb: maps.length.toString()} : {name: maps.at(0).rawInfo._songName})}

    + {linked &&

    {t(infoText)}

    } +
    + resolver({exitCode: ModalExitCode.CANCELED})} withBar={false} text="misc.cancel"/> + resolver({exitCode: ModalExitCode.COMPLETED})} withBar={false} text="misc.delete"/> +
    + + ) +} \ No newline at end of file diff --git a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx new file mode 100644 index 00000000..d63c7592 --- /dev/null +++ b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx @@ -0,0 +1,181 @@ +import { motion } from "framer-motion"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { FilterPanel } from "renderer/components/maps-mangement-components/filter-panel.component"; +import { MapItem, ParsedMapDiff } from "renderer/components/maps-mangement-components/map-item.component"; +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmDropdownButton } from "renderer/components/shared/bsm-dropdown-button.component"; +import { BsmSelect, BsmSelectOption } from "renderer/components/shared/bsm-select.component"; +import { useObservable } from "renderer/hooks/use-observable.hook"; +import { BSV_SORT_ORDER } from "renderer/partials/beat-saver/sort-order"; +import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service"; +import { MapsDownloaderService } from "renderer/services/maps-downloader.service"; +import { MapsManagerService } from "renderer/services/maps-manager.service"; +import { ModalComponent } from "renderer/services/modale.service"; +import { BSVersion } from "shared/bs-version.interface"; +import { BsvMapCharacteristic, BsvMapDetail, MapFilter, SearchOrder, SearchParams } from "shared/models/maps/beat-saver.model"; +import BeatWaitingImg from "../../../../../assets/images/apngs/beat-waiting.png"; +import equal from "fast-deep-equal/es6"; +import { ProgressBarService } from "renderer/services/progress-bar.service"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; + +export const DownloadMapsModal: ModalComponent = ({data}) => { + + const beatSaver = BeatSaverService.getInstance(); + const mapsManager = MapsManagerService.getInstance(); + const mapsDownloader = MapsDownloaderService.getInstance(); + const progressBar = ProgressBarService.getInstance(); + + const currentDownload = useObservable(mapsDownloader.currentMapDownload$); + const mapsInQueue = useObservable(mapsDownloader.mapsInQueue$); + const t = useTranslation(); + const [filter, setFilter] = useState({}); + const [query, setQuery] = useState(""); + const [maps, setMaps] = useState([]); + const [sortOrder, setSortOrder] = useState(BSV_SORT_ORDER.at(0)); + const [ownedMapHashs, setOwnedMapHashs] = useState([]); + const [searchParams, setSearchParams] = useState({ + sortOrder, + filter, + page: 0, + q: query + }); + + const loaderRef = useRef(null); + + const sortOptions: BsmSelectOption[] = (() => { + return BSV_SORT_ORDER.map(sort => ({text: `beat-saver.maps-sorts.${sort}`, value: sort})); + })(); + + useEffect(() => { + loadMaps(searchParams); + }, [searchParams]); + + + useEffect(() => { + mapsManager.getMaps(data, false).toPromise().then(maps => setOwnedMapHashs(maps.map(map => map.hash))); + + const onMapDownloaded = (map: BsvMapDetail, verion: BSVersion) => { + if(!equal(verion, data) || !map?.versions){ return; } + const downloadedHash = map.versions.at(0).hash; + setOwnedMapHashs((prev) => [...prev, downloadedHash]); + } + mapsDownloader.addOnMapDownloadedListener(onMapDownloaded); + + if(mapsDownloader.isDownloading){ + progressBar.setStyle(mapsDownloader.progressBarStyle); + } + + return () => { + mapsDownloader.removeOnMapDownloadedListene(onMapDownloaded); + progressBar.setStyle(null); + } + }, []) + + const loadMaps = (params: SearchParams) => { + beatSaver.searchMaps(params).then((maps => setMaps(prev => [...prev, ...maps]))); + } + + const extractMapDiffs = (map: BsvMapDetail): Map => { + const res = new Map(); + if(map.versions.at(0).diffs){ + map.versions.at(0).diffs.forEach(diff => { + const arr = res.get(diff.characteristic) || []; + arr.push({name: diff.difficulty, type: diff.difficulty, stars: diff.stars}); + res.set(diff.characteristic, arr); + }); + + } + return res; + } + + const renderMap = (map: BsvMapDetail) => { + + const isMapOwned = map.versions.some(version => ownedMapHashs.includes(version.hash)); + const isDownloading = map.id === currentDownload?.map?.id; + const inQueue = mapsInQueue.some(toDownload => equal(toDownload.version, data) && toDownload.map.id === map.id); + + return ( + + ) + } + + const handleDownloadMap = useCallback((map: BsvMapDetail) => { + mapsDownloader.addMapToDownload({map, version: data}) + }, []); + + const handleCancelDownload = useCallback((map: BsvMapDetail) => { + mapsDownloader.removeMapToDownload({map, version: data}); + }, []); + + const handleSortChange = (newSort: string) => { + setSortOrder(() => newSort as SearchOrder); + setMaps(() => []); + setSearchParams(() => ({...searchParams, sortOrder: (newSort as SearchOrder)})); + } + + const handleSearch = () => { + const searchParams: SearchParams = { + sortOrder, + filter, + q: query.trim(), + page: 0, + }; + + setMaps(() => []); + setSearchParams(() => searchParams); + } + + const handleLoadMore = () => { + setSearchParams((prev) => { + return {...prev, page: prev.page + 1} + }); + } + + return ( +
    {e.preventDefault(); handleSearch()}}> +
    + + + + setQuery(e.target.value)}/> + {e.preventDefault(); handleSearch()}}/> + +
    +
      + {maps.length === 0 ? ( +
      +  + {t("modals.download-maps.loading-maps")} +
      + ) : ( + <> + {maps.map(renderMap)} + + + )} +
    +
    + ) +} diff --git a/src/renderer/components/modal/modal-types/edit-version-modal.component.tsx b/src/renderer/components/modal/modal-types/edit-version-modal.component.tsx index 41f68313..f12048bf 100644 --- a/src/renderer/components/modal/modal-types/edit-version-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/edit-version-modal.component.tsx @@ -5,18 +5,17 @@ import { BsmIcon } from "renderer/components/svgs/bsm-icon.component"; import { DefaultConfigKey } from "renderer/config/default-configuration.config"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { ConfigurationService } from "renderer/services/configuration.service"; -import { ModalExitCode, ModalResponse, ModalService } from "renderer/services/modale.service"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; import { BSVersion } from "shared/bs-version.interface"; -export function EditVersionModal({resolver, clone = false}: {resolver: (x: ModalResponse<{name: string, color: string}>) => void, clone?: boolean}) { +export const EditVersionModal: ModalComponent<{name: string, color: string}, {version: BSVersion, clone?: boolean}> = ({resolver, data}) => { + + const {version, clone} = data; const configService = ConfigurationService.getInstance(); - const modalService = ModalService.getInsance(); - const modalData: BSVersion = modalService.getModalData(); - - const [name, setName] = useState(modalData.name || modalData.BSVersion); - const [color, setColor] = useState(modalData.color ?? configService.get("second-color" as DefaultConfigKey)); + const [name, setName] = useState(version.name || version.BSVersion); + const [color, setColor] = useState(version.color ?? configService.get("second-color" as DefaultConfigKey)); const t = useTranslation(); const rename = () => { @@ -31,16 +30,16 @@ export function EditVersionModal({resolver, clone = false}: {resolver: (x: Modal return (
    {e.preventDefault(); rename();}}>

    {t(!clone ? "modals.edit-version.title" : "modals.clone-version.title")}

    - + { clone && (

    {t("modals.clone-version.description")}

    )}
    - - setName(e.target.value)} value={name} type="text" name="name" id="name" minLength={2} maxLength={15} placeholder={t("Nom de la version")}/> + + setName(e.target.value)} value={name} type="text" name="name" id="name" minLength={2} maxLength={15} placeholder={t("modals.clone-version.inputs.name.placeholder")}/>
    - Couleur + {t("modals.clone-version.inputs.color.label")}
    diff --git a/src/renderer/components/modal/modal-types/guard-modal.component.tsx b/src/renderer/components/modal/modal-types/guard-modal.component.tsx index fcd49bb9..80ace020 100644 --- a/src/renderer/components/modal/modal-types/guard-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/guard-modal.component.tsx @@ -1,11 +1,11 @@ -import { ModalExitCode, ModalResponse } from "../../../services/modale.service"; +import { ModalComponent, ModalExitCode } from "../../../services/modale.service"; import { useState } from "react"; import BeatConflict from "../../../../../assets/images/apngs/beat-conflict.png" import { BsmImage } from "renderer/components/shared/bsm-image.component"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -export function GuardModal({resolver}: {resolver: (x: ModalResponse) => void}) { +export const GuardModal: ModalComponent = ({resolver}) => { const [guardCode, setGuardCode] = useState(''); const t = useTranslation(); diff --git a/src/renderer/components/modal/modal-types/installation-folder-modal.component.tsx b/src/renderer/components/modal/modal-types/installation-folder-modal.component.tsx index d84f3beb..1fd173c6 100644 --- a/src/renderer/components/modal/modal-types/installation-folder-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/installation-folder-modal.component.tsx @@ -1,16 +1,15 @@ import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmImage } from "renderer/components/shared/bsm-image.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -import { ModalExitCode, ModalResponse } from "renderer/services/modale.service"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; import BeatConflict from "../../../../../assets/images/apngs/beat-conflict.png" -export function InstallationFolderModal({resolver}: {resolver: (x: ModalResponse) => void}) { +export const InstallationFolderModal: ModalComponent = ({resolver}) => { const t = useTranslation(); return ( - <> - +

    {t("modals.install-folder.title")}

    {t("modals.install-folder.description")}

    @@ -18,6 +17,6 @@ export function InstallationFolderModal({resolver}: {resolver: (x: ModalResponse resolver({exitCode: ModalExitCode.CANCELED})} withBar={false} text="misc.cancel"/> resolver({exitCode: ModalExitCode.COMPLETED})} withBar={false} text="modals.install-folder.buttons.submit"/>
    - + ) } diff --git a/src/renderer/components/modal/modal-types/link-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/link-maps-modal.component.tsx new file mode 100644 index 00000000..3cd82119 --- /dev/null +++ b/src/renderer/components/modal/modal-types/link-maps-modal.component.tsx @@ -0,0 +1,30 @@ +import { useState } from "react"; +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; +import BeatRunning from '../../../../../assets/images/apngs/beat-running.png' + +export const LinkMapsModal: ModalComponent = ({resolver}) => { + + const t = useTranslation(); + const [keepMaps, setKeepMaps] = useState(true); + + return ( +
    +

    {t("modals.maps-actions.link-maps.title")}

    + +

    {t("modals.maps-actions.link-maps.desc")}

    +

    {t("modals.maps-actions.link-maps.info")}

    +
    + + {t("modals.maps-actions.link-maps.keep-maps.label")} +
    +
    + resolver({exitCode: ModalExitCode.CANCELED})} withBar={false} text="misc.cancel"/> + resolver({exitCode: ModalExitCode.COMPLETED, data: keepMaps})} withBar={false} text="modals.maps-actions.link-maps.valid-btn"/> +
    + + ) +} \ No newline at end of file diff --git a/src/renderer/components/modal/modal-types/login-modal.component.tsx b/src/renderer/components/modal/modal-types/login-modal.component.tsx index 81b58349..87e01e1d 100644 --- a/src/renderer/components/modal/modal-types/login-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/login-modal.component.tsx @@ -2,10 +2,10 @@ import { useState } from "react"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmImage } from "renderer/components/shared/bsm-image.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -import { ModalExitCode, ModalResponse } from "renderer/services/modale.service"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; import BeatImpatient from '../../../../../assets/images/apngs/beat-impatient.png' -export function LoginModal({resolver}: {resolver: (x: ModalResponse) => void}) { +export const LoginModal: ModalComponent<{username: string, password: string, stay: boolean}> = ({resolver}) => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); @@ -35,7 +35,7 @@ export function LoginModal({resolver}: {resolver: (x: ModalResponse) => voi
    {resolver({exitCode: ModalExitCode.CANCELED})}} withBar={false} text="misc.cancel"/> - +
    ) diff --git a/src/renderer/components/modal/modal-types/uninstall-all-mods-modal.component.tsx b/src/renderer/components/modal/modal-types/uninstall-all-mods-modal.component.tsx new file mode 100644 index 00000000..d95b6978 --- /dev/null +++ b/src/renderer/components/modal/modal-types/uninstall-all-mods-modal.component.tsx @@ -0,0 +1,27 @@ +import { ModalComponent, ModalExitCode } from "../../../services/modale.service"; +import BeatConflict from "../../../../../assets/images/apngs/beat-conflict.png" +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { BSVersion } from "shared/bs-version.interface"; + + +export const UninstallAllModsModal: ModalComponent = ({resolver, data}) => { + + const version = data; + const t = useTranslation(); + + const desc = "modals.uninstall-all-mods.description"; + + return ( +
    {e.preventDefault(); resolver({exitCode: ModalExitCode.COMPLETED})}}> +

    {t("modals.uninstall-all-mods.title")}

    + +

    {t(desc, {version: version.name ?? version.BSVersion})}

    +
    + {resolver({exitCode: ModalExitCode.CANCELED})}} withBar={false} text="misc.cancel"/> + +
    + + ) +} diff --git a/src/renderer/components/modal/modal-types/uninstall-mod-modal.component.tsx b/src/renderer/components/modal/modal-types/uninstall-mod-modal.component.tsx new file mode 100644 index 00000000..7e10e036 --- /dev/null +++ b/src/renderer/components/modal/modal-types/uninstall-mod-modal.component.tsx @@ -0,0 +1,27 @@ +import { ModalComponent, ModalExitCode } from "../../../services/modale.service"; +import BeatConflict from "../../../../../assets/images/apngs/beat-conflict.png" +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { Mod } from "shared/models/mods/mod.interface"; + + +export const UninstallModModal: ModalComponent = ({resolver, data}) => { + + const mod = data; + const t = useTranslation(); + + const desc = mod.name.toLowerCase() === "bsipa" ? "modals.uninstall-mod.description-bsipa" : "modals.uninstall-mod.description"; + + return ( +
    {e.preventDefault(); resolver({exitCode: ModalExitCode.COMPLETED})}}> +

    {t("modals.uninstall-mod.title")}

    + +

    {t(desc, {mod: mod.name})}

    +
    + {resolver({exitCode: ModalExitCode.CANCELED})}} withBar={false} text="misc.cancel"/> + +
    + + ) +} diff --git a/src/renderer/components/modal/modal-types/uninstall-modal.component.tsx b/src/renderer/components/modal/modal-types/uninstall-modal.component.tsx index 812db48c..0f4aa913 100644 --- a/src/renderer/components/modal/modal-types/uninstall-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/uninstall-modal.component.tsx @@ -1,13 +1,13 @@ -import { ModalExitCode, ModalResponse, ModalService } from "../../../services/modale.service"; +import { ModalComponent, ModalExitCode } from "../../../services/modale.service"; import BeatConflict from "../../../../../assets/images/apngs/beat-conflict.png" import { BSVersion } from 'shared/bs-version.interface'; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmImage } from "renderer/components/shared/bsm-image.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -export function UninstallModal({resolver}: {resolver: (x: ModalResponse) => void}) { +export const UninstallModal: ModalComponent = ({resolver, data}) => { - const version = ModalService.getInsance().getModalData(); + const version = data; const t = useTranslation(); return ( diff --git a/src/renderer/components/modal/modal-types/unlink-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/unlink-maps-modal.component.tsx new file mode 100644 index 00000000..40822438 --- /dev/null +++ b/src/renderer/components/modal/modal-types/unlink-maps-modal.component.tsx @@ -0,0 +1,29 @@ +import { useState } from "react"; +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; +import BeatConflict from '../../../../../assets/images/apngs/beat-conflict.png' + +export const UnlinkMapsModal: ModalComponent = ({resolver}) => { + + const t = useTranslation(); + const [keepMaps, setKeepMaps] = useState(true); + + return ( +
    +

    {t("modals.maps-actions.unlink-maps.title")}

    + +

    {t("modals.maps-actions.unlink-maps.desc")}

    +
    + + {t("modals.maps-actions.unlink-maps.keep-maps.label")} +
    +
    + resolver({exitCode: ModalExitCode.CANCELED})} withBar={false} text="misc.cancel"/> + resolver({exitCode: ModalExitCode.COMPLETED, data: keepMaps})} withBar={false} text="modals.maps-actions.unlink-maps.valid-btn"/> +
    + + ) +} \ No newline at end of file diff --git a/src/renderer/components/modal/modal.component.tsx b/src/renderer/components/modal/modal.component.tsx index 47245a30..b74b8517 100644 --- a/src/renderer/components/modal/modal.component.tsx +++ b/src/renderer/components/modal/modal.component.tsx @@ -1,34 +1,55 @@ -import { ModalExitCode, ModalService, ModalType } from "renderer/services/modale.service"; +import { ModalExitCode, ModalService } from "renderer/services/modale.service"; import { AnimatePresence, motion } from "framer-motion"; -import { LoginModal } from "./modal-types/login-modal.component"; -import { GuardModal } from "./modal-types/guard-modal.component"; -import { UninstallModal } from "./modal-types/uninstall-modal.component"; -import { InstallationFolderModal } from "./modal-types/installation-folder-modal.component"; -import { EditVersionModal } from "./modal-types/edit-version-modal.component"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; +import { useEffect } from "react"; +import { BsmIcon } from "../svgs/bsm-icon.component"; export function Modal() { const modalSevice = ModalService.getInsance(); - const modalType = useObservable(modalSevice.modalType$); + const ModalComponent = useObservable(modalSevice.getModalToShow()); + + const modalData = modalSevice.getModalData(); + const resolver = modalSevice.getResolver(); + const {firstColor, secondColor} = useThemeColor(); + useEffect(() => { + + const onEscape = (e: KeyboardEvent) => { + if(e.key !== "Escape"){ return; } + resolver?.(ModalExitCode.NO_CHOICE); + } + + if(!!ModalComponent){ + window.addEventListener("keyup", onEscape) + } + else{ + window.removeEventListener("keyup", onEscape); + } + + return () => { + window.removeEventListener("keyup", onEscape); + } + }, [ModalComponent]) + + return ( - {modalType && ( + {ModalComponent && (
    - modalSevice.resolve({exitCode: ModalExitCode.NO_CHOICE})} className="absolute top-0 bottom-0 right-0 left-0 bg-black" initial={{opacity: 0}} animate={{opacity: modalType && .60}} exit={{opacity: 0}} transition={{duration: .2}}/> + modalSevice.resolve({exitCode: ModalExitCode.NO_CHOICE})} className="absolute top-0 bottom-0 right-0 left-0 bg-black" initial={{opacity: 0}} animate={{opacity: ModalComponent && .60}} exit={{opacity: 0}} transition={{duration: .2}}/> -
    - - {modalType === ModalType.STEAM_LOGIN && } - {modalType === ModalType.GUARD_CODE && } - {modalType === ModalType.UNINSTALL && } - {modalType === ModalType.INSTALLATION_FOLDER && } - {modalType === ModalType.EDIT_VERSION && } - {modalType === ModalType.CLONE_VERSION && } +
    +
    + +
    +
    {e.stopPropagation(); resolver(ModalExitCode.CLOSED)}}> + +
    +
    diff --git a/src/renderer/components/nav-bar/bsmanager-icon.component.tsx b/src/renderer/components/nav-bar/bsmanager-icon.component.tsx index f938016d..dc9b9ece 100644 --- a/src/renderer/components/nav-bar/bsmanager-icon.component.tsx +++ b/src/renderer/components/nav-bar/bsmanager-icon.component.tsx @@ -1,13 +1,34 @@ import { memo } from "react" import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; -import { motion } from "framer-motion"; +import { motion, Variants } from "framer-motion"; +import { useObservable } from "renderer/hooks/use-observable.hook"; +import { AudioPlayerService } from "renderer/services/audio-player.service"; export const BsManagerIcon = memo(({className}: {className?: string}) => { + const audioPlayer = AudioPlayerService.getInstance(); + const {firstColor, secondColor} = useThemeColor(); + const playing= useObservable(audioPlayer.playing$); + + const bpm = audioPlayer.bpm; + + const transitions: Variants = { + playing: { + scale: [1, 1.05, 1], + transition: {repeat: Infinity, duration: ((60/bpm))/2, repeatDelay: ((60/bpm))/2} + }, + idle: {} + } + + const clickAction = () => { + if(playing){ + audioPlayer.pause(); + } + } return ( - + 0 ? "playing" : "idle"} onClick={clickAction}> diff --git a/src/renderer/components/nav-bar/bs-version-item.component.tsx b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx similarity index 51% rename from src/renderer/components/nav-bar/bs-version-item.component.tsx rename to src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx index d1451a08..1a7bbb09 100644 --- a/src/renderer/components/nav-bar/bs-version-item.component.tsx +++ b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx @@ -5,12 +5,13 @@ import { useEffect, useState } from "react"; import { combineLatest, Subscription } from "rxjs"; import { BSLauncherService, LaunchMods } from "renderer/services/bs-launcher.service"; import { ConfigurationService } from "renderer/services/configuration.service"; -import { BsmButton } from "../shared/bsm-button.component"; import { BSUninstallerService } from "renderer/services/bs-uninstaller.service"; import { BSVersionManagerService } from "renderer/services/bs-version-manager.service"; -import { BsmIcon } from "../svgs/bsm-icon.component"; -import { ReactFitty } from "react-fitty"; +import { BsmIcon } from "../../svgs/bsm-icon.component"; import { useThemeColor } from 'renderer/hooks/use-theme-color.hook'; +import { NavBarItem } from './nav-bar-item.component'; +import useFitText from 'use-fit-text'; +import Tippy from '@tippyjs/react'; export function BsVersionItem(props: {version: BSVersion}) { @@ -21,13 +22,14 @@ export function BsVersionItem(props: {version: BSVersion}) { const bsUninstallerService = BSUninstallerService.getInstance(); const { state } = useLocation() as { state: BSVersion}; + const { fontSize, ref } = useFitText(); const [downloading, setDownloading] = useState(false); const [downloadPercent, setDownloadPercent] = useState(0); - const {firstColor, secondColor} = useThemeColor(); + const secondColor = useThemeColor("second-color"); const isActive = (): boolean => { - return props.version?.BSVersion === state?.BSVersion && props?.version.steam === state?.steam && props?.version.name === state?.name; + return props.version?.BSVersion === state?.BSVersion && props?.version.steam === state?.steam && props?.version.oculus === state?.oculus && props?.version.name === state?.name; } const handleDoubleClick = () => { @@ -52,9 +54,9 @@ export function BsVersionItem(props: {version: BSVersion}) { useEffect(() => { const subs: Subscription[] = []; const downloadSub = combineLatest([downloaderService.currentBsVersionDownload$, downloaderService.downloadProgress$]).subscribe(vals => { - if(vals[0]?.BSVersion === props.version.BSVersion && vals[0]?.steam === props.version.steam && vals[0]?.name === props.version.name){ - setDownloading(true); - setDownloadPercent(vals[1]); + if(vals[0]?.BSVersion === props.version.BSVersion && vals[0]?.steam === props.version.steam && vals[0].oculus === props.version.oculus && vals[0]?.name === props.version.name){ + setDownloading(true); + setDownloadPercent(vals[1]); } else{ setDownloading(false); @@ -65,21 +67,41 @@ export function BsVersionItem(props: {version: BSVersion}) { return () => { subs.forEach(s => s.unsubscribe()); } }, []); + const renderIcon = () => { + const classes = "w-[19px] h-[19px] mr-[5px] shrink-0" + if(props.version.steam){ + return + } + if(props.version.oculus){ + return + } + return + } - return ( -
    - {downloading &&
    } -
    - - {props.version.steam && } - {!props.version.steam && } -
    - {props.version.name || props.version.BSVersion} + const renderVersionText = () => { + if(props.version.name){ + return ( + +
    +
    {props.version.name}
    +
    +
    + ) + } + return ( +
    + {props.version.BSVersion}
    - - {downloading && } -
    -
    + ) + } - ) + + return ( + + + {renderIcon()} + {renderVersionText()} + + + ) } \ No newline at end of file diff --git a/src/renderer/components/nav-bar/nav-bar-items/maps-nav-bar-item.component.tsx b/src/renderer/components/nav-bar/nav-bar-items/maps-nav-bar-item.component.tsx new file mode 100644 index 00000000..0b366265 --- /dev/null +++ b/src/renderer/components/nav-bar/nav-bar-items/maps-nav-bar-item.component.tsx @@ -0,0 +1,24 @@ +import { Link } from "react-router-dom"; +import { BsmIcon } from "renderer/components/svgs/bsm-icon.component"; +import { useObservable } from "renderer/hooks/use-observable.hook"; +import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; +import { PageStateService } from "renderer/services/page-state.service"; +import { NavBarItem } from "./nav-bar-item.component"; + +export function MapsNavBarItem() { + + const pageState = PageStateService.getInstance(); + + const route = useObservable(pageState.route$); + + const color = useThemeColor("first-color"); + + return ( + + + + Maps + + + ) +} diff --git a/src/renderer/components/nav-bar/nav-bar-items/nav-bar-item.component.tsx b/src/renderer/components/nav-bar/nav-bar-items/nav-bar-item.component.tsx new file mode 100644 index 00000000..91a47f11 --- /dev/null +++ b/src/renderer/components/nav-bar/nav-bar-items/nav-bar-item.component.tsx @@ -0,0 +1,25 @@ +import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; +import { BsmButton } from "../../shared/bsm-button.component"; + +type Props = { + children: JSX.Element, + isDownloading?: boolean + progress?: number, + isActive?: boolean, + onCancel?: (e: React.MouseEvent) => void +} + +export function NavBarItem({progress, isDownloading, children, isActive, onCancel}: Props) { + + const {firstColor, secondColor} = useThemeColor(); + + return ( +
  • + {isDownloading &&
    } +
    + {children} + {isDownloading && } +
    +
  • + ) +} diff --git a/src/renderer/components/nav-bar/nav-bar-spliter.component.tsx b/src/renderer/components/nav-bar/nav-bar-spliter.component.tsx new file mode 100644 index 00000000..35521307 --- /dev/null +++ b/src/renderer/components/nav-bar/nav-bar-spliter.component.tsx @@ -0,0 +1,5 @@ +export function NavBarSpliter() { + return ( + + ) +} diff --git a/src/renderer/components/nav-bar/nav-bar.component.tsx b/src/renderer/components/nav-bar/nav-bar.component.tsx index 638a155c..fe3421e3 100644 --- a/src/renderer/components/nav-bar/nav-bar.component.tsx +++ b/src/renderer/components/nav-bar/nav-bar.component.tsx @@ -1,10 +1,12 @@ import './nav-bar.component.css' -import { BsVersionItem } from './bs-version-item.component'; +import { BsVersionItem } from './nav-bar-items/bs-version-item.component'; import { BSVersionManagerService } from '../../services/bs-version-manager.service'; import { Link } from 'react-router-dom'; import { BsmIcon } from '../svgs/bsm-icon.component'; import { useObservable } from 'renderer/hooks/use-observable.hook'; import { BsManagerIcon } from './bsmanager-icon.component'; +import { MapsNavBarItem } from './nav-bar-items/maps-nav-bar-item.component'; +import { NavBarSpliter } from './nav-bar-spliter.component'; export function NavBar() { @@ -13,21 +15,22 @@ export function NavBar() { const installedVersions = useObservable(bsVersionServoce.installedVersions$); return ( -