diff --git a/desktop/.eslintignore b/desktop/.eslintignore deleted file mode 100644 index d5314d13e2848163449d0f2e741e6c1238f72f0a..0000000000000000000000000000000000000000 --- a/desktop/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -ui/* diff --git a/desktop/.eslintrc b/desktop/.eslintrc deleted file mode 100644 index e3916e17ce6f721e1b18a72720d8cd29818db81b..0000000000000000000000000000000000000000 --- a/desktop/.eslintrc +++ /dev/null @@ -1,55 +0,0 @@ -{ - "root": true, - "env": { - "browser": true, - "es2021": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "google", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "rules": { - "indent": "off", - "class-methods-use-this": "off", - "react/prop-types": "off", - "react/display-name": "off", - "react/no-unescaped-entities": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": ["error"], - "require-jsdoc": "off", - "valid-jsdoc": "off", - "max-len": "off", - "new-cap": "off", - "no-invalid-this": "off", - "eqeqeq": "error", - "object-curly-spacing": ["error", "always"], - "space-before-function-paren": "off", - "operator-linebreak": [ - "error", - "after", - { "overrides": { "?": "before", ":": "before" } } - ] - }, - "settings": { - "react": { - "version": "detect" - } - }, - "globals": { - "JSX": "readonly", - "NodeJS": "readonly", - "ReadableStreamDefaultController": "readonly" - } -} diff --git a/desktop/.eslintrc.js b/desktop/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..491d9aed3bc02dc1c10ca8a2e940a05c3369b4ca --- /dev/null +++ b/desktop/.eslintrc.js @@ -0,0 +1,31 @@ +/* eslint-env node */ +module.exports = { + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + /* What we really want eventually */ + // "plugin:@typescript-eslint/strict-type-checked", + // "plugin:@typescript-eslint/stylistic-type-checked", + ], + /* Temporarily disable some rules + Enhancement: Remove me */ + rules: { + "no-unused-vars": "off", + }, + /* Temporarily add a global + Enhancement: Remove me */ + globals: { + NodeJS: "readonly", + }, + plugins: ["@typescript-eslint"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, + root: true, + ignorePatterns: [".eslintrc.js", "app", "out", "dist"], + env: { + es2022: true, + node: true, + }, +}; diff --git a/desktop/.gitignore b/desktop/.gitignore index 9b7e0cc60875ffc1689b9589e4c7fa625fe3f1d5..f81ee56caf0d44bb99fe4b911849d9c3f4613913 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -14,7 +14,8 @@ node_modules/ # tsc transpiles src/**/*.ts and emits the generated JS into app app/ -# out is a symlink to the photos web app's dir +# out is a symlink to the photos web app's out dir, which contains the built up +# photos app. out # electron-builder diff --git a/desktop/.prettierrc.json b/desktop/.prettierrc.json index 8b06525972064c87f87a5e109a74b7f1b5cbb718..7cf8c86c774c3af28c43a1e3b928d041b8641b12 100644 --- a/desktop/.prettierrc.json +++ b/desktop/.prettierrc.json @@ -1,5 +1,6 @@ { "tabWidth": 4, + "proseWrap": "always", "plugins": [ "prettier-plugin-organize-imports", "prettier-plugin-packagejson" diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index 73aae2397d4ed847c298cc10913e062a7d6f8971..83d2123d86183870259e96fdc964a48577857cff 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -131,7 +131,8 @@ ### Photo Editor -Check out our [blog](https://ente.io/blog/introducing-web-desktop-photo-editor/) to know about feature and functionalities. +Check out our [blog](https://ente.io/blog/introducing-web-desktop-photo-editor/) +to know about feature and functionalities. ## v1.6.47 @@ -146,15 +147,19 @@ Check out our [blog](https://ente.io/blog/introducing-web-desktop-photo-editor/) ### Bug Fixes -- Fixes OOM crashes during file upload [#1379](https://github.com/ente-io/photos-web/pull/1379) +- Fixes OOM crashes during file upload + [#1379](https://github.com/ente-io/photos-web/pull/1379) ## v1.6.45 ### Bug Fixes -- Fixed app keeps reloading issue [#235](https://github.com/ente-io/photos-desktop/pull/235) -- Fixed dng and arw preview issue [#1378](https://github.com/ente-io/photos-web/pull/1378) -- Added view crash report option (help menu) for user to share electron crash report locally +- Fixed app keeps reloading issue + [#235](https://github.com/ente-io/photos-desktop/pull/235) +- Fixed dng and arw preview issue + [#1378](https://github.com/ente-io/photos-web/pull/1378) +- Added view crash report option (help menu) for user to share electron crash + report locally ## v1.6.44 @@ -166,23 +171,28 @@ Check out our [blog](https://ente.io/blog/introducing-web-desktop-photo-editor/) - #### Check for update and changelog option - Added options to check for update manually and a view changelog via the app menubar + Added options to check for update manually and a view changelog via the app + menubar - #### Opt out of crash reporting - Added option to out of a crash reporting, it can accessed from the settings -> preferences -> disable crash reporting + Added option to out of a crash reporting, it can accessed from the settings + -> preferences -> disable crash reporting - #### Type search - Added new search option to search files based on file type i.e, image, video, live-photo. + Added new search option to search files based on file type i.e, image, + video, live-photo. - #### Manual Convert Button - In case the video is not playable, Now there is a convert button which can be used to trigger conversion of the video to supported format. + In case the video is not playable, Now there is a convert button which can + be used to trigger conversion of the video to supported format. - #### File Download Progress - The file loader now also shows the exact percentage download progress, instead of just a simple loader. + The file loader now also shows the exact percentage download progress, + instead of just a simple loader. - #### Bug fixes & other enhancements @@ -198,16 +208,19 @@ Check out our [blog](https://ente.io/blog/introducing-web-desktop-photo-editor/) - #### Email verification - We have now made email verification optional, so you can sign in with just your email address and password, without waiting for a verification code. + We have now made email verification optional, so you can sign in with just + your email address and password, without waiting for a verification code. You can opt in / out of email verification from Settings > Security. - #### Download Album - You can now chose the download location for downloading albums. Along with that we have also added progress bar for album download. + You can now chose the download location for downloading albums. Along with + that we have also added progress bar for album download. - #### Bug fixes & other enhancements We have squashed a few pesky bugs that were reported by our community - If you would like to help us improve ente, come join the party @ ente.io/community! + If you would like to help us improve ente, come join the party @ + ente.io/community! diff --git a/desktop/README.md b/desktop/README.md index da74b133ffa4236500b5ef35d1965fb32ac8885f..29559158411d50595b107af84d3b54ba049083b4 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -2,14 +2,20 @@ The sweetness of Ente Photos, right on your computer. Linux, Windows and macOS. -You can [**download** a pre-built binary from -releases](https://github.com/ente-io/photos-desktop/releases/latest). +You can +[**download** a pre-built binary from releases](https://github.com/ente-io/photos-desktop/releases/latest). To know more about Ente, see [our main README](../README.md) or visit [ente.io](https://ente.io). ## Building from source +Fetch submodules + +```sh +git submodule update --init --recursive +``` + Install dependencies ```sh diff --git a/desktop/build/error.html b/desktop/build/error.html deleted file mode 100644 index cf1ea149d5ab67c3d3e3b49da26ce9c5aa30fcb5..0000000000000000000000000000000000000000 --- a/desktop/build/error.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - ente Photos - - - -
-
-
- Site unreachable, please try again later -
- -
-
- - diff --git a/desktop/docs/dependencies.md b/desktop/docs/dependencies.md index 6b019672341bf1d97d2136656a1c95c090185010..502ea6ea9db696b8fdaf64e33695b9c721dcb847 100644 --- a/desktop/docs/dependencies.md +++ b/desktop/docs/dependencies.md @@ -1,14 +1,61 @@ # Dependencies -See [web/docs/dependencies.md](../../web/docs/dependencies.md) for general web -specific dependencies. See [electron.md](electron.md) for our main dependency, -Electron. The rest of this document describes the remaining, desktop specific -dependencies that are used by the Photos desktop app. +## Electron -## Electron related +[Electron](https://www.electronjs.org) is a cross-platform (Linux, Windows, +macOS) way for creating desktop apps using TypeScript. + +Electron embeds Chromium and Node.js in the generated app's binary. The +generated app thus consists of two separate processes - the _main_ process, and +a _renderer_ process. + +- The _main_ process is runs the embedded node. This process can deal with the + host OS - it is conceptually like a `node` repl running on your machine. In + our case, the TypeScript code (in the `src/` directory) gets transpiled by + `tsc` into JavaScript in the `build/app/` directory, which gets bundled in + the generated app's binary and is loaded by the node (main) process when the + app starts. + +- The _renderer_ process is a regular web app that gets loaded into the + embedded Chromium. When the main process starts, it creates a new "window" + that shows this embedded Chromium. In our case, we build and bundle a static + export of the [Photos web app](../web/README.md) in the generated app. This + gets loaded by the embedded Chromium at runtime, acting as the app's UI. + +There is also a third environment that gets temporarily created: + +- The [preload script](../src/preload.ts) acts as a gateway between the _main_ + and the _renderer_ process. It runs in its own isolated environment. + +### electron-builder + +[Electron Builder](https://www.electron.build) is used for packaging the app for +distribution. + +During the build it uses +[electron-builder-notarize](https://github.com/karaggeorge/electron-builder-notarize) +to notarize the macOS binary. ### next-electron-server This spins up a server for serving files using a protocol handler inside our -Electron process. This allows us to directly use the output produced by `next -build` for loading into our renderer process. +Electron process. This allows us to directly use the output produced by +`next build` for loading into our renderer process. + +### electron-reload + +Reloads contents of the BrowserWindow (renderer process) when source files are +changed. + +* TODO (MR): Do we need this? Isn't the next-electron-server HMR covering this? + +## DX + +See [web/docs/dependencies#DX](../../web/docs/dependencies.md#dx) for the +general development experience related dependencies like TypeScript etc, which +are similar to that in the web code. + +Some extra ones specific to the code here are: + +* [concurrently](https://github.com/open-cli-tools/concurrently) for spawning + parallel tasks when we do `yarn dev`. diff --git a/desktop/docs/dev.md b/desktop/docs/dev.md index bfa80df6907623c47cc4c5c7a3559de1d0c94479..a175f9b81126b27afbb21827871ec7f07701f462 100644 --- a/desktop/docs/dev.md +++ b/desktop/docs/dev.md @@ -1,4 +1,41 @@ -# Development tips +# Development -- `yarn build:quick` is a variant of `yarn build` that uses the - `--config.compression=store` flag to (slightly) speed up electron-builder. +## Yarn commands + +### yarn dev + +Launch the app in development mode + +- Runs a development server for the renderer, with HMR. + +- Starts tsc in watch mode to recompile the JS files used by the main process. + +- Starts the main process, reloading it on changes to the the TS files in + `src/`. + +### yarn build + +Build a binary for your current platform. + +Note that our actual releases use a +[GitHub workflow](../.github/workflows/desktop-release.yml) that is similar to +this, except it builds binaries for all the supported OSes and uses production +signing credentials. + +During development, you might find `yarn build:quick` helpful. It is a variant +of `yarn build` that omits some steps to build a binary quicker, something that +can be useful during development. + +### postinstall + +When using native node modules (those written in C/C++), we need to ensure they +are built against `electron`'s packaged `node` version. We use +[electron-builder](https://www.electron.build/cli)'s `install-app-deps` command +to rebuild those modules automatically after each `yarn install` by invoking it +in as the `postinstall` step in our package.json. + +### lint and lint-fix + +Use `yarn lint` to check that your code formatting is as expected, and that +there are no linter errors. Use `yarn lint-fix` to try and automatically fix the +issues. diff --git a/desktop/docs/electron.md b/desktop/docs/electron.md deleted file mode 100644 index 84c47e329b77b1bc290ab429a7e5b5edf23c5d76..0000000000000000000000000000000000000000 --- a/desktop/docs/electron.md +++ /dev/null @@ -1,21 +0,0 @@ -# Electron - -[Electron](https://www.electronjs.org) is a cross-platform (Linux, Windows, -macOS) way for creating desktop apps using TypeScript. - -Electron embeds Chromium and Node.js in the generated app's binary. The -generated app thus consists of two separate processes - the _main_ process, and -a _renderer_ process. - -- The _main_ process is runs the embedded node. This process can deal with the - host OS - it is conceptually like a `node` repl running on your machine. In our - case, the TypeScript code (in the `src/` directory) gets transpiled by `tsc` - into JavaScript in the `build/app/` directory, which gets bundled in the - generated app's binary and is loaded by the node (main) process when the app - starts. - -- The _renderer_ process is a regular web app that gets loaded into the embedded - Chromium. When the main process starts, it creates a new "window" that shows - this embedded Chromium. In our case, we build and bundle a static export of - the [Photos web app](../web/README.md) in the generated app. This gets loaded - by the embedded Chromium at runtime, acting as the app's UI. diff --git a/desktop/docs/release.md b/desktop/docs/release.md index bdda428e1a11f812c71c3f35b94ea66b0d56f6fd..7254e26fc175fd0a8b3fe0565b55642b420a8388 100644 --- a/desktop/docs/release.md +++ b/desktop/docs/release.md @@ -20,11 +20,11 @@ So the process for doing a release would be. 4. Commit and push to remote - ```sh - git add package.json && git commit -m 'Release v1.x.x' - git tag v1.x.x - git push && git push --tags - ``` + ```sh + git add package.json && git commit -m 'Release v1.x.x' + git tag v1.x.x + git push && git push --tags + ``` This by itself will already trigger a new release. The GitHub action will create a new draft release that can then be used as descibed below. @@ -42,9 +42,9 @@ To wrap up, we also need to merge back these changes into main. So for that, The GitHub Action runs on Windows, Linux and macOS. It produces the artifacts defined in the `build` value in `package.json`. -* Windows - An NSIS installer. -* Linux - An AppImage, and 3 other packages (`.rpm`, `.deb`, `.pacman`) -* macOS - A universal DMG +- Windows - An NSIS installer. +- Linux - An AppImage, and 3 other packages (`.rpm`, `.deb`, `.pacman`) +- macOS - A universal DMG Additionally, the GitHub action notarizes the macOS DMG. For this it needs credentials provided via GitHub secrets. @@ -70,19 +70,19 @@ If everything goes well, we'll have a release on GitHub, and the corresponding source maps for the renderer process uploaded to Sentry. There isn't anything else to do: -* The website automatically redirects to the latest release on GitHub when - people try to download. +- The website automatically redirects to the latest release on GitHub when + people try to download. -* The file formats with support auto update (Windows `exe`, the Linux AppImage - and the macOS DMG) also check the latest GitHub release automatically to - download and apply the update (the rest of the formats don't support auto - updates). +- The file formats with support auto update (Windows `exe`, the Linux AppImage + and the macOS DMG) also check the latest GitHub release automatically to + download and apply the update (the rest of the formats don't support auto + updates). -* We're not putting the desktop app in other stores currently. It is available - as a `brew cask`, but we only had to open a PR to add the initial formula, now - their maintainers automatically bump the SHA, version number and the (derived - from the version) URL in the formula when their tools notice a new release on - our GitHub. +- We're not putting the desktop app in other stores currently. It is available + as a `brew cask`, but we only had to open a PR to add the initial formula, + now their maintainers automatically bump the SHA, version number and the + (derived from the version) URL in the formula when their tools notice a new + release on our GitHub. We can also publish the draft releases by checking the "pre-release" option. Such releases don't cause any of the channels (our website, or the desktop app diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml new file mode 100644 index 0000000000000000000000000000000000000000..fb147b5726282da7839b2037d99fc758b3c7db4b --- /dev/null +++ b/desktop/electron-builder.yml @@ -0,0 +1,43 @@ +appId: io.ente.bhari-frame +artifactName: ${productName}-${version}-${arch}.${ext} +nsis: + deleteAppDataOnUninstall: true +linux: + target: + - target: AppImage + arch: + - x64 + - arm64 + - target: deb + arch: + - x64 + - arm64 + - target: rpm + arch: + - x64 + - arm64 + - target: pacman + arch: + - x64 + - arm64 + icon: ./resources/icon.icns + category: Photography +mac: + target: + target: default + arch: + - universal + category: public.app-category.photography + hardenedRuntime: true + x64ArchFiles: Contents/Resources/ggmlclip-mac +afterSign: electron-builder-notarize +asarUnpack: + - node_modules/ffmpeg-static/bin/${os}/${arch}/ffmpeg + - node_modules/ffmpeg-static/index.js + - node_modules/ffmpeg-static/package.json +extraFiles: + - from: build + to: resources +files: + - app/**/* + - out diff --git a/desktop/package.json b/desktop/package.json index 8d90fca6e6da7243df21978efd967770a4078af2..3dafdce33bf0b6d859a0e69d3a764a9555703e57 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "yarn build-renderer && yarn build-main", "build-main": "tsc && electron-builder", - "build-main:quick": "tsc && electron-builder --config.compression=store", + "build-main:quick": "tsc && electron-builder --dir --config.compression=store --config.mac.identity=null", "build-renderer": "cd ../web && yarn install && yarn build:photos && cd ../desktop && rm -f out && ln -sf ../web/apps/photos/out", "build:quick": "yarn build-renderer && yarn build-main:quick", "dev": "concurrently --names 'main,rndr,tscw' \"yarn dev-main\" \"yarn dev-renderer\" \"yarn dev-main-watch\"", @@ -16,8 +16,8 @@ "dev-main-watch": "tsc --watch --preserveWatchOutput", "dev-renderer": "cd ../web && yarn install && yarn dev:photos", "postinstall": "electron-builder install-app-deps", - "lint": "yarn prettier --check . && eslint \"src/**/*.ts\"", - "lint-fix": "yarn prettier --write . && eslint --fix src" + "lint": "yarn prettier --check . && eslint --ext .ts src", + "lint-fix": "yarn prettier --write . && eslint --fix --ext .ts src" }, "dependencies": { "any-shell-escape": "^0.1.1", @@ -42,94 +42,19 @@ "@types/auto-launch": "^5.0.2", "@types/ffmpeg-static": "^3.0.1", "@types/get-folder-size": "^2.0.0", - "@types/node": "18.15.0", "@types/node-fetch": "^2.6.2", "@types/promise-fs": "^2.1.1", - "@typescript-eslint/eslint-plugin": "^5.28.0", - "@typescript-eslint/parser": "^5.28.0", - "concurrently": "^7.0.0", + "@typescript-eslint/eslint-plugin": "^7", + "@typescript-eslint/parser": "^7", + "concurrently": "^8", "electron": "^25.8.4", "electron-builder": "^24.6.4", "electron-builder-notarize": "^1.2.0", - "electron-download": "^4.1.1", - "eslint": "^7.23.0", - "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8", "prettier": "^3", "prettier-plugin-organize-imports": "^3.2", "prettier-plugin-packagejson": "^2.4", - "typescript": "^4.2.3" + "typescript": "^5" }, - "build": { - "appId": "io.ente.bhari-frame", - "artifactName": "${productName}-${version}-${arch}.${ext}", - "nsis": { - "deleteAppDataOnUninstall": true - }, - "linux": { - "target": [ - { - "target": "AppImage", - "arch": [ - "x64", - "arm64" - ] - }, - { - "target": "deb", - "arch": [ - "x64", - "arm64" - ] - }, - { - "target": "rpm", - "arch": [ - "x64", - "arm64" - ] - }, - { - "target": "pacman", - "arch": [ - "x64", - "arm64" - ] - } - ], - "icon": "./resources/icon.icns", - "category": "Photography" - }, - "mac": { - "target": { - "target": "default", - "arch": [ - "universal" - ] - }, - "category": "public.app-category.photography", - "hardenedRuntime": true, - "x64ArchFiles": "Contents/Resources/ggmlclip-mac" - }, - "afterSign": "electron-builder-notarize", - "asarUnpack": [ - "node_modules/ffmpeg-static/bin/${os}/${arch}/ffmpeg", - "node_modules/ffmpeg-static/index.js", - "node_modules/ffmpeg-static/package.json" - ], - "extraFiles": [ - { - "from": "build", - "to": "resources" - } - ], - "files": [ - "app/**/*", - "out" - ] - }, - "productName": "ente", - "standard": { - "parser": "babel-eslint" - } + "productName": "ente" } diff --git a/desktop/src/api/cache.ts b/desktop/src/api/cache.ts index 86ba4378c3e3137f1ddb990b08c19e8d060f8e33..bf7182fad2aa7b8966bb51a5f8861228df415940 100644 --- a/desktop/src/api/cache.ts +++ b/desktop/src/api/cache.ts @@ -5,11 +5,7 @@ import { DiskCache } from "../services/diskCache"; const ENTE_CACHE_DIR_NAME = "ente"; -export const getCacheDirectory = async () => { - const customCacheDir = await getCustomCacheDirectory(); - if (customCacheDir && existsSync(customCacheDir)) { - return customCacheDir; - } +const getCacheDirectory = async () => { const defaultSystemCacheDir = await ipcRenderer.invoke("get-path", "cache"); return path.join(defaultSystemCacheDir, ENTE_CACHE_DIR_NAME); }; @@ -40,13 +36,3 @@ export async function deleteDiskCache(cacheName: string) { return false; } } - -export async function setCustomCacheDirectory( - directory: string, -): Promise { - await ipcRenderer.invoke("set-custom-cache-directory", directory); -} - -async function getCustomCacheDirectory(): Promise { - return await ipcRenderer.invoke("get-custom-cache-directory"); -} diff --git a/desktop/src/api/clip.ts b/desktop/src/api/clip.ts index d2469e7b984e858151a6344e45ca58933a72347b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/desktop/src/api/clip.ts +++ b/desktop/src/api/clip.ts @@ -1,54 +0,0 @@ -import { ipcRenderer } from "electron"; -import { writeStream } from "../services/fs"; -import { Model } from "../types"; -import { isExecError, parseExecError } from "../utils/error"; - -export async function computeImageEmbedding( - model: Model, - imageData: Uint8Array, -): Promise { - let tempInputFilePath = null; - try { - tempInputFilePath = await ipcRenderer.invoke("get-temp-file-path", ""); - const imageStream = new Response(imageData.buffer).body; - await writeStream(tempInputFilePath, imageStream); - const embedding = await ipcRenderer.invoke( - "compute-image-embedding", - model, - tempInputFilePath, - ); - return embedding; - } catch (err) { - if (isExecError(err)) { - const parsedExecError = parseExecError(err); - throw Error(parsedExecError); - } else { - throw err; - } - } finally { - if (tempInputFilePath) { - await ipcRenderer.invoke("remove-temp-file", tempInputFilePath); - } - } -} - -export async function computeTextEmbedding( - model: Model, - text: string, -): Promise { - try { - const embedding = await ipcRenderer.invoke( - "compute-text-embedding", - model, - text, - ); - return embedding; - } catch (err) { - if (isExecError(err)) { - const parsedExecError = parseExecError(err); - throw Error(parsedExecError); - } else { - throw err; - } - } -} diff --git a/desktop/src/api/common.ts b/desktop/src/api/common.ts index f185069817eeb44404937757e1095ed06cf45095..64a1bbdfffe885c2126eaaf82359cc058c85314f 100644 --- a/desktop/src/api/common.ts +++ b/desktop/src/api/common.ts @@ -1,39 +1,5 @@ import { ipcRenderer } from "electron/renderer"; import { logError } from "../services/logging"; -export const selectDirectory = async (): Promise => { - try { - return await ipcRenderer.invoke("select-dir"); - } catch (e) { - logError(e, "error while selecting root directory"); - } -}; - -export const getAppVersion = async (): Promise => { - try { - return await ipcRenderer.invoke("get-app-version"); - } catch (e) { - logError(e, "failed to get release version"); - throw e; - } -}; - -export const openDirectory = async (dirPath: string): Promise => { - try { - await ipcRenderer.invoke("open-dir", dirPath); - } catch (e) { - logError(e, "error while opening directory"); - throw e; - } -}; - -export const getPlatform = async (): Promise<"mac" | "windows" | "linux"> => { - try { - return await ipcRenderer.invoke("get-platform"); - } catch (e) { - logError(e, "failed to get platform"); - throw e; - } -}; export { logToDisk, openLogDirectory } from "../services/logging"; diff --git a/desktop/src/api/fs.ts b/desktop/src/api/fs.ts index d9ec2eeecc98746c5cedd736e436fc12ce10c994..5acc5fd48a9849f329905f02d84c0947f2eec94b 100644 --- a/desktop/src/api/fs.ts +++ b/desktop/src/api/fs.ts @@ -5,11 +5,3 @@ export async function getDirFiles(dirPath: string) { const electronFiles = await Promise.all(files.map(getElectronFile)); return electronFiles; } -export { - deleteFile, - deleteFolder, - isFolder, - moveFile, - readTextFile, - rename, -} from "../services/fs"; diff --git a/desktop/src/api/system.ts b/desktop/src/api/system.ts index a4dc91e054de1d0c02a9ff3e5a3cfb03416621b0..422df34ae526928e1702a477184f1e743d08cd86 100644 --- a/desktop/src/api/system.ts +++ b/desktop/src/api/system.ts @@ -1,13 +1,6 @@ import { ipcRenderer } from "electron"; import { AppUpdateInfo } from "../types"; -export const sendNotification = (content: string) => { - ipcRenderer.send("send-notification", content); -}; -export const reloadWindow = () => { - ipcRenderer.send("reload-window"); -}; - export const registerUpdateEventListener = ( showUpdateDialog: (updateInfo: AppUpdateInfo) => void, ) => { @@ -23,15 +16,3 @@ export const registerForegroundEventListener = (onForeground: () => void) => { onForeground(); }); }; - -export const updateAndRestart = () => { - ipcRenderer.send("update-and-restart"); -}; - -export const skipAppUpdate = (version: string) => { - ipcRenderer.send("skip-app-update", version); -}; - -export const muteUpdateNotification = (version: string) => { - ipcRenderer.send("mute-update-notification", version); -}; diff --git a/desktop/src/main.ts b/desktop/src/main.ts index a280a9b59e93eff2da14c74354a84be4e3b7fb3f..4de93046a32410af1d0bce6f82d948eaa512d7e9 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -19,7 +19,6 @@ import { setupMainMenu, setupTrayItem, } from "./utils/main"; -import { setupMainProcessStatsLogger } from "./utils/processStats"; let mainWindow: BrowserWindow; @@ -104,7 +103,6 @@ if (!gotTheLock) { // Some APIs can only be used after this event occurs. app.on("ready", async () => { logSystemInfo(); - setupMainProcessStatsLogger(); mainWindow = await createWindow(); const tray = setupTrayItem(mainWindow); const watcher = initWatcher(mainWindow); diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts index a602e76bbd1e78b23c06b909abfb484dda631bec..40b37fe51639fe4af16b4879fce75a7ba20cdf36 100644 --- a/desktop/src/preload.ts +++ b/desktop/src/preload.ts @@ -1,19 +1,39 @@ -import { - deleteDiskCache, - getCacheDirectory, - openDiskCache, - setCustomCacheDirectory, -} from "./api/cache"; -import { computeImageEmbedding, computeTextEmbedding } from "./api/clip"; -import { - getAppVersion, - getPlatform, - logToDisk, - openDirectory, - openLogDirectory, - selectDirectory, -} from "./api/common"; -import { clearElectronStore } from "./api/electronStore"; +/** + * @file The preload script + * + * The preload script runs in a renderer process before its web contents begin + * loading. During their execution they have access to a subset of Node.js APIs + * and imports. Its purpose is to expose the relevant imports and other + * functions as an object on the DOM, so that the renderer process can invoke + * functions that live in the main (Node.js) process if needed. + * + * Note that this script cannot import other code from `src/` - conceptually it + * can be thought of as running in a separate, third, process different from + * both the main or a renderer process (technically, it runs in a BrowserWindow + * context that runs prior to the renderer process). + * + * That said, this can be split into multiple files if we wished. However, + * that'd require us setting up a bundler to package it back up into a single JS + * file that can be used at runtime. + * + * > Since enabling the sandbox disables Node.js integration in your preload + * > scripts, you can no longer use require("../my-script"). In other words, + * > your preload script needs to be a single file. + * > + * > https://www.electronjs.org/blog/breach-to-barrier + * + * Since most of this is just boilerplate code providing a bridge between the + * main and renderer, we avoid introducing another moving part into the mix and + * just keep the entire preload setup in this single file. + */ + +import { contextBridge, ipcRenderer } from "electron"; +import { existsSync } from "fs"; +import path from "path"; +import * as fs from "promise-fs"; +import { Readable } from "stream"; +import { deleteDiskCache, openDiskCache } from "./api/cache"; +import { logToDisk, openLogDirectory } from "./api/common"; import { checkExistsAndCreateDir, exists, @@ -21,25 +41,12 @@ import { saveStreamToDisk, } from "./api/export"; import { runFFmpegCmd } from "./api/ffmpeg"; -import { - deleteFile, - deleteFolder, - getDirFiles, - isFolder, - moveFile, - readTextFile, - rename, -} from "./api/fs"; +import { getDirFiles } from "./api/fs"; import { convertToJPEG, generateImageThumbnail } from "./api/imageProcessor"; import { getEncryptionKey, setEncryptionKey } from "./api/safeStorage"; import { - muteUpdateNotification, registerForegroundEventListener, registerUpdateEventListener, - reloadWindow, - sendNotification, - skipAppUpdate, - updateAndRestart, } from "./api/system"; import { getElectronFilesFromGoogleZip, @@ -59,25 +66,318 @@ import { updateWatchMappingSyncedFiles, } from "./api/watch"; import { setupLogging } from "./utils/logging"; -import { - logRendererProcessMemoryUsage, - setupRendererProcessStatsLogger, -} from "./utils/processStats"; -setupLogging(); -setupRendererProcessStatsLogger(); +/* Some of the code below has been duplicated to make this file self contained. +Enhancement: consider alternatives */ + +/* preload: duplicated logError */ +export function logError(error: Error, message: string, info?: string): void { + ipcRenderer.invoke("log-error", error, message, info); +} + +// - + +export const convertBrowserStreamToNode = ( + fileStream: ReadableStream, +) => { + const reader = fileStream.getReader(); + const rs = new Readable(); + + rs._read = async () => { + try { + const result = await reader.read(); + + if (!result.done) { + rs.push(Buffer.from(result.value)); + } else { + rs.push(null); + return; + } + } catch (e) { + rs.emit("error", e); + } + }; + + return rs; +}; + +export async function writeNodeStream( + filePath: string, + fileStream: NodeJS.ReadableStream, +) { + const writeable = fs.createWriteStream(filePath); + + fileStream.on("error", (error) => { + writeable.destroy(error); // Close the writable stream with an error + }); + + fileStream.pipe(writeable); + + await new Promise((resolve, reject) => { + writeable.on("finish", resolve); + writeable.on("error", async (e) => { + if (existsSync(filePath)) { + await fs.unlink(filePath); + } + reject(e); + }); + }); +} + +/* preload: duplicated writeStream */ +export async function writeStream( + filePath: string, + fileStream: ReadableStream, +) { + const readable = convertBrowserStreamToNode(fileStream); + await writeNodeStream(filePath, readable); +} + +// - + +async function readTextFile(filePath: string) { + if (!existsSync(filePath)) { + throw new Error("File does not exist"); + } + return await fs.readFile(filePath, "utf-8"); +} -const windowObject: any = window; +async function moveFile( + sourcePath: string, + destinationPath: string, +): Promise { + if (!existsSync(sourcePath)) { + throw new Error("File does not exist"); + } + if (existsSync(destinationPath)) { + throw new Error("Destination file already exists"); + } + // check if destination folder exists + const destinationFolder = path.dirname(destinationPath); + if (!existsSync(destinationFolder)) { + await fs.mkdir(destinationFolder, { recursive: true }); + } + await fs.rename(sourcePath, destinationPath); +} -windowObject["ElectronAPIs"] = { +export async function isFolder(dirPath: string) { + try { + const stats = await fs.stat(dirPath); + return stats.isDirectory(); + } catch (e) { + let err = e; + // if code is defined, it's an error from fs.stat + if (typeof e.code !== "undefined") { + // ENOENT means the file does not exist + if (e.code === "ENOENT") { + return false; + } + err = Error(`fs error code: ${e.code}`); + } + logError(err, "isFolder failed"); + return false; + } +} + +async function deleteFolder(folderPath: string): Promise { + if (!existsSync(folderPath)) { + return; + } + if (!fs.statSync(folderPath).isDirectory()) { + throw new Error("Path is not a folder"); + } + // check if folder is empty + const files = await fs.readdir(folderPath); + if (files.length > 0) { + throw new Error("Folder is not empty"); + } + await fs.rmdir(folderPath); +} + +async function rename(oldPath: string, newPath: string) { + if (!existsSync(oldPath)) { + throw new Error("Path does not exist"); + } + await fs.rename(oldPath, newPath); +} + +function deleteFile(filePath: string): void { + if (!existsSync(filePath)) { + return; + } + if (!fs.statSync(filePath).isFile()) { + throw new Error("Path is not a file"); + } + fs.rmSync(filePath); +} + +// - + +/* preload: duplicated Model */ +export enum Model { + GGML_CLIP = "ggml-clip", + ONNX_CLIP = "onnx-clip", +} + +const computeImageEmbedding = async ( + model: Model, + imageData: Uint8Array, +): Promise => { + let tempInputFilePath = null; + try { + tempInputFilePath = await ipcRenderer.invoke("get-temp-file-path", ""); + const imageStream = new Response(imageData.buffer).body; + await writeStream(tempInputFilePath, imageStream); + const embedding = await ipcRenderer.invoke( + "compute-image-embedding", + model, + tempInputFilePath, + ); + return embedding; + } catch (err) { + if (isExecError(err)) { + const parsedExecError = parseExecError(err); + throw Error(parsedExecError); + } else { + throw err; + } + } finally { + if (tempInputFilePath) { + await ipcRenderer.invoke("remove-temp-file", tempInputFilePath); + } + } +}; + +export async function computeTextEmbedding( + model: Model, + text: string, +): Promise { + try { + const embedding = await ipcRenderer.invoke( + "compute-text-embedding", + model, + text, + ); + return embedding; + } catch (err) { + if (isExecError(err)) { + const parsedExecError = parseExecError(err); + throw Error(parsedExecError); + } else { + throw err; + } + } +} + +// - + +/** + * [Note: Custom errors across Electron/Renderer boundary] + * + * We need to use the `message` field to disambiguate between errors thrown by + * the main process when invoked from the renderer process. This is because: + * + * > Errors thrown throw `handle` in the main process are not transparent as + * > they are serialized and only the `message` property from the original error + * > is provided to the renderer process. + * > + * > - https://www.electronjs.org/docs/latest/tutorial/ipc + * > + * > Ref: https://github.com/electron/electron/issues/24427 + */ +/* preload: duplicated CustomErrors */ +const CustomErrorsP = { + WINDOWS_NATIVE_IMAGE_PROCESSING_NOT_SUPPORTED: + "Windows native image processing is not supported", + INVALID_OS: (os: string) => `Invalid OS - ${os}`, + WAIT_TIME_EXCEEDED: "Wait time exceeded", + UNSUPPORTED_PLATFORM: (platform: string, arch: string) => + `Unsupported platform - ${platform} ${arch}`, + MODEL_DOWNLOAD_PENDING: + "Model download pending, skipping clip search request", + INVALID_FILE_PATH: "Invalid file path", + INVALID_CLIP_MODEL: (model: string) => `Invalid Clip model - ${model}`, +}; + +const isExecError = (err: any) => { + return err.message.includes("Command failed:"); +}; + +const parseExecError = (err: any) => { + const errMessage = err.message; + if (errMessage.includes("Bad CPU type in executable")) { + return CustomErrorsP.UNSUPPORTED_PLATFORM( + process.platform, + process.arch, + ); + } else { + return errMessage; + } +}; + +// - + +const selectDirectory = async (): Promise => { + try { + return await ipcRenderer.invoke("select-dir"); + } catch (e) { + logError(e, "error while selecting root directory"); + } +}; + +const getAppVersion = async (): Promise => { + try { + return await ipcRenderer.invoke("get-app-version"); + } catch (e) { + logError(e, "failed to get release version"); + throw e; + } +}; + +const openDirectory = async (dirPath: string): Promise => { + try { + await ipcRenderer.invoke("open-dir", dirPath); + } catch (e) { + logError(e, "error while opening directory"); + throw e; + } +}; + +// - + +const clearElectronStore = () => { + ipcRenderer.send("clear-electron-store"); +}; + +// - + +const updateAndRestart = () => { + ipcRenderer.send("update-and-restart"); +}; + +const skipAppUpdate = (version: string) => { + ipcRenderer.send("skip-app-update", version); +}; + +const muteUpdateNotification = (version: string) => { + ipcRenderer.send("mute-update-notification", version); +}; + +// - + +setupLogging(); + +// These objects exposed here will become available to the JS code in our +// renderer (the web/ code) as `window.ElectronAPIs.*` +// +// https://www.electronjs.org/docs/latest/tutorial/tutorial-preload +contextBridge.exposeInMainWorld("ElectronAPIs", { exists, checkExistsAndCreateDir, saveStreamToDisk, saveFileToDisk, selectDirectory, clearElectronStore, - sendNotification, - reloadWindow, readTextFile, showUploadFilesDialog, showUploadDirsDialog, @@ -108,7 +408,6 @@ windowObject["ElectronAPIs"] = { runFFmpegCmd, muteUpdateNotification, generateImageThumbnail, - logRendererProcessMemoryUsage, registerForegroundEventListener, openDirectory, moveFile, @@ -117,7 +416,4 @@ windowObject["ElectronAPIs"] = { deleteFile, computeImageEmbedding, computeTextEmbedding, - getPlatform, - getCacheDirectory, - setCustomCacheDirectory, -}; +}); diff --git a/desktop/src/services/fs.ts b/desktop/src/services/fs.ts index 06d413c1f08e353160cc816760217931ffc93cf1..bcc49ae5ca26c5f34672f3b1ae524d340fc64314 100644 --- a/desktop/src/services/fs.ts +++ b/desktop/src/services/fs.ts @@ -184,25 +184,6 @@ export const getZipFileStream = async ( return readableStream; }; -export async function isFolder(dirPath: string) { - try { - const stats = await fs.stat(dirPath); - return stats.isDirectory(); - } catch (e) { - let err = e; - // if code is defined, it's an error from fs.stat - if (typeof e.code !== "undefined") { - // ENOENT means the file does not exist - if (e.code === "ENOENT") { - return false; - } - err = Error(`fs error code: ${e.code}`); - } - logError(err, "isFolder failed"); - return false; - } -} - export const convertBrowserStreamToNode = ( fileStream: ReadableStream, ) => { @@ -257,60 +238,3 @@ export async function writeStream( const readable = convertBrowserStreamToNode(fileStream); await writeNodeStream(filePath, readable); } - -export async function readTextFile(filePath: string) { - if (!existsSync(filePath)) { - throw new Error("File does not exist"); - } - return await fs.readFile(filePath, "utf-8"); -} - -export async function moveFile( - sourcePath: string, - destinationPath: string, -): Promise { - if (!existsSync(sourcePath)) { - throw new Error("File does not exist"); - } - if (existsSync(destinationPath)) { - throw new Error("Destination file already exists"); - } - // check if destination folder exists - const destinationFolder = path.dirname(destinationPath); - if (!existsSync(destinationFolder)) { - await fs.mkdir(destinationFolder, { recursive: true }); - } - await fs.rename(sourcePath, destinationPath); -} - -export async function deleteFolder(folderPath: string): Promise { - if (!existsSync(folderPath)) { - return; - } - if (!fs.statSync(folderPath).isDirectory()) { - throw new Error("Path is not a folder"); - } - // check if folder is empty - const files = await fs.readdir(folderPath); - if (files.length > 0) { - throw new Error("Folder is not empty"); - } - await fs.rmdir(folderPath); -} - -export async function rename(oldPath: string, newPath: string) { - if (!existsSync(oldPath)) { - throw new Error("Path does not exist"); - } - await fs.rename(oldPath, newPath); -} - -export function deleteFile(filePath: string): void { - if (!existsSync(filePath)) { - return; - } - if (!fs.statSync(filePath).isFile()) { - throw new Error("Path is not a file"); - } - fs.rmSync(filePath); -} diff --git a/desktop/src/services/userPreference.ts b/desktop/src/services/userPreference.ts index e3c6db29047165106a5a911ff7c95346a5380224..8074ee4def450e8c74aef58ddc4b56412caa7fb3 100644 --- a/desktop/src/services/userPreference.ts +++ b/desktop/src/services/userPreference.ts @@ -31,11 +31,3 @@ export function clearSkipAppVersion() { export function clearMuteUpdateNotificationVersion() { userPreferencesStore.delete("muteUpdateNotificationVersion"); } - -export function setCustomCacheDirectory(directory: string) { - userPreferencesStore.set("customCacheDirectory", directory); -} - -export function getCustomCacheDirectory(): string { - return userPreferencesStore.get("customCacheDirectory"); -} diff --git a/desktop/src/stores/userPreferences.store.ts b/desktop/src/stores/userPreferences.store.ts index e6fec425ae5a9f0cecd5f8d79980d6b22e4877a2..7e17182ad1b25594ccd4fa95fba670f2cd5444a2 100644 --- a/desktop/src/stores/userPreferences.store.ts +++ b/desktop/src/stores/userPreferences.store.ts @@ -11,9 +11,6 @@ const userPreferencesSchema: Schema = { muteUpdateNotificationVersion: { type: "string", }, - customCacheDirectory: { - type: "string", - }, }; export const userPreferencesStore = new Store({ diff --git a/desktop/src/types/index.ts b/desktop/src/types/index.ts index 208983826b1705d5915728dbc498a08e979b5c65..87f724b58ace10da589d2719aac9c6492a4579c6 100644 --- a/desktop/src/types/index.ts +++ b/desktop/src/types/index.ts @@ -58,7 +58,6 @@ export interface UserPreferencesType { hideDockIcon: boolean; skipAppVersion: string; muteUpdateNotificationVersion: string; - customCacheDirectory: string; } export interface AppUpdateInfo { diff --git a/desktop/src/utils/clip-bpe-ts/README.md b/desktop/src/utils/clip-bpe-ts/README.md index ee052eb41427880c2e6dd1173a5197e7818620c8..48b4c942392f962bbe485c72c6879e6da37796cc 100644 --- a/desktop/src/utils/clip-bpe-ts/README.md +++ b/desktop/src/utils/clip-bpe-ts/README.md @@ -1,6 +1,7 @@ # CLIP Byte Pair Encoding JavaScript Port -A JavaScript port of [OpenAI's CLIP byte-pair-encoding tokenizer](https://github.com/openai/CLIP/blob/3bee28119e6b28e75b82b811b87b56935314e6a5/clip/simple_tokenizer.py). +A JavaScript port of +[OpenAI's CLIP byte-pair-encoding tokenizer](https://github.com/openai/CLIP/blob/3bee28119e6b28e75b82b811b87b56935314e6a5/clip/simple_tokenizer.py). ```js import Tokenizer from "https://deno.land/x/clip_bpe@v0.0.6/mod.js"; @@ -18,10 +19,22 @@ t.encode("hello world!"); // [3306, 1002, 256] t.encodeForCLIP("hello world!"); // [49406,3306,1002,256,49407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ``` -This encoder/decoder behaves differently to the the GPT-2/3 tokenizer (JavaScript version of that [here](https://github.com/latitudegames/GPT-3-Encoder)). For example, it doesn't preserve capital letters, as shown above. - -The [Python version](https://github.com/openai/CLIP/blob/3bee28119e6b28e75b82b811b87b56935314e6a5/clip/simple_tokenizer.py) of this tokenizer uses the `ftfy` module to clean up the text before encoding it. I didn't include that module by default because currently the only version available in JavaScript is [this one](https://github.com/josephrocca/ftfy-pyodide), which requires importing a full Python runtime as a WebAssembly module. If you want the `ftfy` cleaning, just import it and clean your text with it before passing it to the `.encode()` method. +This encoder/decoder behaves differently to the the GPT-2/3 tokenizer +(JavaScript version of that +[here](https://github.com/latitudegames/GPT-3-Encoder)). For example, it doesn't +preserve capital letters, as shown above. + +The +[Python version](https://github.com/openai/CLIP/blob/3bee28119e6b28e75b82b811b87b56935314e6a5/clip/simple_tokenizer.py) +of this tokenizer uses the `ftfy` module to clean up the text before encoding +it. I didn't include that module by default because currently the only version +available in JavaScript is +[this one](https://github.com/josephrocca/ftfy-pyodide), which requires +importing a full Python runtime as a WebAssembly module. If you want the `ftfy` +cleaning, just import it and clean your text with it before passing it to the +`.encode()` method. # License -To the extent that there is any original work in this repo, it is MIT Licensed, just like [openai/CLIP](https://github.com/openai/CLIP). +To the extent that there is any original work in this repo, it is MIT Licensed, +just like [openai/CLIP](https://github.com/openai/CLIP). diff --git a/desktop/src/utils/createWindow.ts b/desktop/src/utils/createWindow.ts index c7d44e6c9a7df7540f0d6fa899f4c39003c056b4..11f05f8c1e513a8a38357b6098f0ed43eb61db5b 100644 --- a/desktop/src/utils/createWindow.ts +++ b/desktop/src/utils/createWindow.ts @@ -8,7 +8,12 @@ import { getHideDockIconPreference } from "../services/userPreference"; import { isDev } from "./common"; import { isPlatform } from "./common/platform"; -export async function createWindow(): Promise { +/** + * Create an return the {@link BrowserWindow} that will form our app's UI. + * + * This window will show the HTML served from {@link rendererURL}. + */ +export const createWindow = async () => { const appImgPath = isDev ? "resources/window-icon.png" : path.join(process.resourcesPath, "window-icon.png"); @@ -16,9 +21,7 @@ export async function createWindow(): Promise { // Create the browser window. const mainWindow = new BrowserWindow({ webPreferences: { - sandbox: false, preload: path.join(__dirname, "../preload.js"), - contextIsolation: false, }, icon: appIcon, show: false, // don't show the main window on load, @@ -49,16 +52,6 @@ export async function createWindow(): Promise { ); mainWindow.loadURL(rendererURL); } - mainWindow.webContents.on("did-fail-load", () => { - splash.close(); - isDev - ? mainWindow.loadFile(`../resources/error.html`) - : splash.loadURL( - `file://${path.join(process.resourcesPath, "error.html")}`, - ); - mainWindow.maximize(); - mainWindow.show(); - }); mainWindow.once("ready-to-show", async () => { try { splash.destroy(); @@ -114,4 +107,4 @@ export async function createWindow(): Promise { } }); return mainWindow; -} +}; diff --git a/desktop/src/utils/error.ts b/desktop/src/utils/error.ts index 1922045a2c5e7dfa264c928053fcfc6284058eb3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/desktop/src/utils/error.ts +++ b/desktop/src/utils/error.ts @@ -1,17 +0,0 @@ -import { CustomErrors } from "../constants/errors"; - -export const isExecError = (err: any) => { - return err.message.includes("Command failed:"); -}; - -export const parseExecError = (err: any) => { - const errMessage = err.message; - if (errMessage.includes("Bad CPU type in executable")) { - return CustomErrors.UNSUPPORTED_PLATFORM( - process.platform, - process.arch, - ); - } else { - return errMessage; - } -}; diff --git a/desktop/src/utils/ipcComms.ts b/desktop/src/utils/ipcComms.ts index eec644aebbf4e26dc17d012ad3cdc80b53a72d4e..861cec75e8d35bccc4818fa1e17035bb81eab388 100644 --- a/desktop/src/utils/ipcComms.ts +++ b/desktop/src/utils/ipcComms.ts @@ -4,12 +4,12 @@ import { BrowserWindow, dialog, ipcMain, - Notification, safeStorage, shell, Tray, } from "electron"; import path from "path"; +import { clearElectronStore } from "../api/electronStore"; import { getAppVersion, muteUpdateNotification, @@ -27,12 +27,6 @@ import { generateImageThumbnail, } from "../services/imageProcessor"; import { logErrorSentry } from "../services/sentry"; -import { - getCustomCacheDirectory, - setCustomCacheDirectory, -} from "../services/userPreference"; -import { getPlatform } from "./common/platform"; -import { createWindow } from "./createWindow"; import { generateTempFilePath } from "./temp"; export default function setupIpcComs( @@ -49,19 +43,6 @@ export default function setupIpcComs( } }); - ipcMain.on("send-notification", (_, args) => { - const notification = { - title: "ente", - body: args, - }; - new Notification(notification).show(); - }); - ipcMain.on("reload-window", async () => { - const secondWindow = await createWindow(); - mainWindow.destroy(); - mainWindow = secondWindow; - }); - ipcMain.handle("show-upload-files-dialog", async () => { const files = await dialog.showOpenDialog({ properties: ["openFile", "multiSelections"], @@ -110,6 +91,10 @@ export default function setupIpcComs( return safeStorage.decryptString(message); }); + ipcMain.on("clear-electron-store", () => { + clearElectronStore(); + }); + ipcMain.handle("get-path", (_, message) => { // By default, these paths are at the following locations: // @@ -180,15 +165,4 @@ export default function setupIpcComs( ipcMain.handle("compute-text-embedding", (_, model, text) => { return computeTextEmbedding(model, text); }); - ipcMain.handle("get-platform", () => { - return getPlatform(); - }); - - ipcMain.handle("set-custom-cache-directory", (_, directory: string) => { - setCustomCacheDirectory(directory); - }); - - ipcMain.handle("get-custom-cache-directory", async () => { - return getCustomCacheDirectory(); - }); } diff --git a/desktop/src/utils/logging.ts b/desktop/src/utils/logging.ts index 351a1aef860cea34775eeb2ddeee6a9d6020a421..e57382a652309f7af33de9968480093201faaab5 100644 --- a/desktop/src/utils/logging.ts +++ b/desktop/src/utils/logging.ts @@ -9,16 +9,3 @@ export function setupLogging(isDev?: boolean) { log.transports.file.format = "[{y}-{m}-{d}T{h}:{i}:{s}{z}] [{level}]{scope} {text}"; } - -export function convertBytesToHumanReadable( - bytes: number, - precision = 2, -): string { - if (bytes === 0 || isNaN(bytes)) { - return "0 MB"; - } - - const i = Math.floor(Math.log(bytes) / Math.log(1024)); - const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; - return (bytes / Math.pow(1024, i)).toFixed(precision) + " " + sizes[i]; -} diff --git a/desktop/src/utils/processStats.ts b/desktop/src/utils/processStats.ts deleted file mode 100644 index b10238eeaac02afde587fa71148deb78012e3bde..0000000000000000000000000000000000000000 --- a/desktop/src/utils/processStats.ts +++ /dev/null @@ -1,295 +0,0 @@ -import ElectronLog from "electron-log"; -import { webFrame } from "electron/renderer"; -import { convertBytesToHumanReadable } from "./logging"; - -const LOGGING_INTERVAL_IN_MICROSECONDS = 30 * 1000; // 30 seconds - -const SPIKE_DETECTION_INTERVAL_IN_MICROSECONDS = 1 * 1000; // 1 seconds - -const MAIN_MEMORY_USAGE_DIFF_IN_KILOBYTES_CONSIDERED_AS_SPIKE = 50 * 1024; // 50 MB - -const HIGH_MAIN_MEMORY_USAGE_THRESHOLD_IN_KILOBYTES = 200 * 1024; // 200 MB - -const RENDERER_MEMORY_USAGE_DIFF_IN_KILOBYTES_CONSIDERED_AS_SPIKE = 200 * 1024; // 200 MB - -const HIGH_RENDERER_MEMORY_USAGE_THRESHOLD_IN_KILOBYTES = 1024 * 1024; // 1 GB - -async function logMainProcessStats() { - const processMemoryInfo = await getNormalizedProcessMemoryInfo( - await process.getProcessMemoryInfo(), - ); - const cpuUsage = process.getCPUUsage(); - const heapStatistics = getNormalizedHeapStatistics( - process.getHeapStatistics(), - ); - - ElectronLog.log("main process stats", { - processMemoryInfo, - heapStatistics, - cpuUsage, - }); -} - -let previousMainProcessMemoryInfo: Electron.ProcessMemoryInfo = { - private: 0, - shared: 0, - residentSet: 0, -}; - -let mainProcessUsingHighMemory = false; - -async function logSpikeMainMemoryUsage() { - const processMemoryInfo = await process.getProcessMemoryInfo(); - const currentMemoryUsage = Math.max( - processMemoryInfo.residentSet ?? 0, - processMemoryInfo.private, - ); - const previousMemoryUsage = Math.max( - previousMainProcessMemoryInfo.residentSet ?? 0, - previousMainProcessMemoryInfo.private, - ); - const isSpiking = - currentMemoryUsage - previousMemoryUsage >= - MAIN_MEMORY_USAGE_DIFF_IN_KILOBYTES_CONSIDERED_AS_SPIKE; - - const isHighMemoryUsage = - currentMemoryUsage >= HIGH_MAIN_MEMORY_USAGE_THRESHOLD_IN_KILOBYTES; - - const shouldReport = - (isHighMemoryUsage && !mainProcessUsingHighMemory) || - (!isHighMemoryUsage && mainProcessUsingHighMemory); - - if (isSpiking || shouldReport) { - const normalizedCurrentProcessMemoryInfo = - await getNormalizedProcessMemoryInfo(processMemoryInfo); - const normalizedPreviousProcessMemoryInfo = - await getNormalizedProcessMemoryInfo(previousMainProcessMemoryInfo); - const cpuUsage = process.getCPUUsage(); - const heapStatistics = getNormalizedHeapStatistics( - process.getHeapStatistics(), - ); - - ElectronLog.log("reporting main memory usage spike", { - currentProcessMemoryInfo: normalizedCurrentProcessMemoryInfo, - previousProcessMemoryInfo: normalizedPreviousProcessMemoryInfo, - heapStatistics, - cpuUsage, - }); - } - previousMainProcessMemoryInfo = processMemoryInfo; - if (shouldReport) { - mainProcessUsingHighMemory = !mainProcessUsingHighMemory; - } -} - -let previousRendererProcessMemoryInfo: Electron.ProcessMemoryInfo = { - private: 0, - shared: 0, - residentSet: 0, -}; - -let rendererUsingHighMemory = false; - -async function logSpikeRendererMemoryUsage() { - const processMemoryInfo = await process.getProcessMemoryInfo(); - const currentMemoryUsage = Math.max( - processMemoryInfo.residentSet ?? 0, - processMemoryInfo.private, - ); - - const previousMemoryUsage = Math.max( - previousRendererProcessMemoryInfo.private, - previousRendererProcessMemoryInfo.residentSet ?? 0, - ); - const isSpiking = - currentMemoryUsage - previousMemoryUsage >= - RENDERER_MEMORY_USAGE_DIFF_IN_KILOBYTES_CONSIDERED_AS_SPIKE; - - const isHighMemoryUsage = - currentMemoryUsage >= HIGH_RENDERER_MEMORY_USAGE_THRESHOLD_IN_KILOBYTES; - - const shouldReport = - (isHighMemoryUsage && !rendererUsingHighMemory) || - (!isHighMemoryUsage && rendererUsingHighMemory); - - if (isSpiking || shouldReport) { - const normalizedCurrentProcessMemoryInfo = - await getNormalizedProcessMemoryInfo(processMemoryInfo); - const normalizedPreviousProcessMemoryInfo = - await getNormalizedProcessMemoryInfo( - previousRendererProcessMemoryInfo, - ); - const cpuUsage = process.getCPUUsage(); - const heapStatistics = getNormalizedHeapStatistics( - process.getHeapStatistics(), - ); - - ElectronLog.log("reporting renderer memory usage spike", { - currentProcessMemoryInfo: normalizedCurrentProcessMemoryInfo, - previousProcessMemoryInfo: normalizedPreviousProcessMemoryInfo, - heapStatistics, - cpuUsage, - }); - } - previousRendererProcessMemoryInfo = processMemoryInfo; - if (shouldReport) { - rendererUsingHighMemory = !rendererUsingHighMemory; - } -} - -async function logRendererProcessStats() { - const blinkMemoryInfo = getNormalizedBlinkMemoryInfo(); - const heapStatistics = getNormalizedHeapStatistics( - process.getHeapStatistics(), - ); - const webFrameResourceUsage = getNormalizedWebFrameResourceUsage(); - const processMemoryInfo = await getNormalizedProcessMemoryInfo( - await process.getProcessMemoryInfo(), - ); - ElectronLog.log("renderer process stats", { - blinkMemoryInfo, - heapStatistics, - processMemoryInfo, - webFrameResourceUsage, - }); -} - -export function setupMainProcessStatsLogger() { - setInterval( - logSpikeMainMemoryUsage, - SPIKE_DETECTION_INTERVAL_IN_MICROSECONDS, - ); - setInterval(logMainProcessStats, LOGGING_INTERVAL_IN_MICROSECONDS); -} - -export function setupRendererProcessStatsLogger() { - setInterval( - logSpikeRendererMemoryUsage, - SPIKE_DETECTION_INTERVAL_IN_MICROSECONDS, - ); - setInterval(logRendererProcessStats, LOGGING_INTERVAL_IN_MICROSECONDS); -} - -export async function logRendererProcessMemoryUsage(message: string) { - const processMemoryInfo = await process.getProcessMemoryInfo(); - const processMemory = Math.max( - processMemoryInfo.private, - processMemoryInfo.residentSet ?? 0, - ); - ElectronLog.log( - "renderer ProcessMemory", - message, - convertBytesToHumanReadable(processMemory * 1024), - ); -} - -const getNormalizedProcessMemoryInfo = async ( - processMemoryInfo: Electron.ProcessMemoryInfo, -) => { - return { - residentSet: convertBytesToHumanReadable( - processMemoryInfo.residentSet * 1024, - ), - private: convertBytesToHumanReadable(processMemoryInfo.private * 1024), - shared: convertBytesToHumanReadable(processMemoryInfo.shared * 1024), - }; -}; - -const getNormalizedBlinkMemoryInfo = () => { - const blinkMemoryInfo = process.getBlinkMemoryInfo(); - return { - allocated: convertBytesToHumanReadable( - blinkMemoryInfo.allocated * 1024, - ), - total: convertBytesToHumanReadable(blinkMemoryInfo.total * 1024), - }; -}; - -const getNormalizedHeapStatistics = ( - heapStatistics: Electron.HeapStatistics, -) => { - return { - totalHeapSize: convertBytesToHumanReadable( - heapStatistics.totalHeapSize * 1024, - ), - totalHeapSizeExecutable: convertBytesToHumanReadable( - heapStatistics.totalHeapSizeExecutable * 1024, - ), - totalPhysicalSize: convertBytesToHumanReadable( - heapStatistics.totalPhysicalSize * 1024, - ), - totalAvailableSize: convertBytesToHumanReadable( - heapStatistics.totalAvailableSize * 1024, - ), - usedHeapSize: convertBytesToHumanReadable( - heapStatistics.usedHeapSize * 1024, - ), - - heapSizeLimit: convertBytesToHumanReadable( - heapStatistics.heapSizeLimit * 1024, - ), - mallocedMemory: convertBytesToHumanReadable( - heapStatistics.mallocedMemory * 1024, - ), - peakMallocedMemory: convertBytesToHumanReadable( - heapStatistics.peakMallocedMemory * 1024, - ), - doesZapGarbage: heapStatistics.doesZapGarbage, - }; -}; - -const getNormalizedWebFrameResourceUsage = () => { - const webFrameResourceUsage = webFrame.getResourceUsage(); - return { - images: { - count: webFrameResourceUsage.images.count, - size: convertBytesToHumanReadable( - webFrameResourceUsage.images.size, - ), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.images.liveSize, - ), - }, - scripts: { - count: webFrameResourceUsage.scripts.count, - size: convertBytesToHumanReadable( - webFrameResourceUsage.scripts.size, - ), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.scripts.liveSize, - ), - }, - cssStyleSheets: { - count: webFrameResourceUsage.cssStyleSheets.count, - size: convertBytesToHumanReadable( - webFrameResourceUsage.cssStyleSheets.size, - ), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.cssStyleSheets.liveSize, - ), - }, - xslStyleSheets: { - count: webFrameResourceUsage.xslStyleSheets.count, - size: convertBytesToHumanReadable( - webFrameResourceUsage.xslStyleSheets.size, - ), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.xslStyleSheets.liveSize, - ), - }, - fonts: { - count: webFrameResourceUsage.fonts.count, - size: convertBytesToHumanReadable(webFrameResourceUsage.fonts.size), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.fonts.liveSize, - ), - }, - other: { - count: webFrameResourceUsage.other.count, - size: convertBytesToHumanReadable(webFrameResourceUsage.other.size), - liveSize: convertBytesToHumanReadable( - webFrameResourceUsage.other.liveSize, - ), - }, - }; -}; diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 142c36005caac7324d254a34cdd39d3114b3ab3d..30e62626d555588742c1fb84e550b72d8c606d3f 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -1,17 +1,82 @@ { + /* TSConfig for a set of vanilla TypeScript files that need to be transpiled + into JavaScript that'll then be loaded and run by the main (node) process + of our Electron app. */ + + /* TSConfig docs: https://aka.ms/tsconfig.json */ + "compilerOptions": { - "target": "es2021", - "module": "commonjs", + /* Recommended target, lib and other settings for code running in the + version of Node.js bundled with Electron. + + Currently, with Electron 25, this is Node.js 18 + https://www.electronjs.org/blog/electron-25-0 + + Note that we cannot do + + "extends": "@tsconfig/node18/tsconfig.json", + + because that sets "lib": ["es2023"]. However (and I don't fully + understand what's going on here), that breaks our compilation since + tsc can then not find type definitions of things like ReadableStream. + + Adding "dom" to "lib" (e.g. `"lib": ["es2023", "dom"]`) fixes the + issue, but that doesn't sound correct - the main Electron process + isn't running in a browser context. + + It is possible that we're using some of the types incorrectly. For + now, we just omit the "lib" definition and rely on the defaults for + the "target" we've chosen. This is also what the current + electron-forge starter does: + + yarn create electron-app electron-forge-starter -- --template=webpack-typescript + + Enhancement: Can revisit this later. + + Refs: + - https://github.com/electron/electron/issues/27092 + - https://github.com/electron/electron/issues/16146 + */ + + "target": "es2022", + "module": "node16", + + /* Enable various workarounds to play better with CJS libraries */ "esModuleInterop": true, - /* Emit the generated JS into app */ + /* Speed things up by not type checking `node_modules` */ + "skipLibCheck": true, + + /* Emit the generated JS into `app/` */ "outDir": "app", - "noImplicitAny": true, + /* Generate source maps */ "sourceMap": true, + /* Allow absolute imports starting with src as root */ "baseUrl": "src", + /* Allow imports of paths from node_modules */ "paths": { "*": ["node_modules/*"] - } + }, + + /* Temporary overrides to get things to compile with the older config */ + "strict": false, + "noImplicitAny": true + + /* Below is the state we want */ + /* Enable these one by one */ + // "strict": true, + + /* Require the `type` modifier when importing types */ + // "verbatimModuleSyntax": true + + /* Stricter than strict */ + // "noImplicitReturns": true, + // "noUnusedParameters": true, + // "noUnusedLocals": true, + // "noFallthroughCasesInSwitch": true, + /* e.g. makes array indexing returns undefined */ + // "noUncheckedIndexedAccess": true, + // "exactOptionalPropertyTypes": true, }, - /* Transpile all ts files in src/ */ + /* Transpile all `.ts` files in `src/` */ "include": ["src/**/*.ts"] } diff --git a/desktop/yarn.lock b/desktop/yarn.lock index c8080d23fd853b517fa2372aba0fd69326df9b08..f23ac47cca10594b5569a4a68b4a29fc72dbfd37 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -7,12 +7,10 @@ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@babel/code-frame@^7.0.0": version "7.18.6" @@ -26,7 +24,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -35,6 +33,13 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/runtime@^7.21.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== + dependencies: + regenerator-runtime "^0.14.0" + "@derhuerst/http-basic@^8.2.0": version "8.2.4" resolved "https://registry.yarnpkg.com/@derhuerst/http-basic/-/http-basic-8.2.4.tgz#d021ebb8f65d54bea681ae6f4a8733ce89e7f59b" @@ -111,34 +116,56 @@ minimatch "^3.0.4" plist "^3.0.4" -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" @@ -170,7 +197,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -249,10 +276,10 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/keyv@^3.1.4": version "3.1.4" @@ -279,11 +306,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== -"@types/node@18.15.0": - version "18.15.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" - integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== - "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" @@ -326,6 +348,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw== +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/verror@^1.10.3": version "1.10.5" resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" @@ -338,100 +365,111 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.28.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz#9c6017b6c1d04894141b4a87816388967f64c359" - integrity sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg== - dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/type-utils" "5.30.6" - "@typescript-eslint/utils" "5.30.6" +"@typescript-eslint/eslint-plugin@^7": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz#5a5fcad1a7baed85c10080d71ad901f98c38d5b7" + integrity sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/type-utils" "7.2.0" + "@typescript-eslint/utils" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" - functional-red-black-tree "^1.0.1" - ignore "^5.2.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.28.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.6.tgz#add440db038fa9d777e4ebdaf66da9e7fb7abe92" - integrity sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA== - dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^7": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== + dependencies: + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz#ce1b49ff5ce47f55518d63dbe8fc9181ddbd1a33" - integrity sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g== +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" -"@typescript-eslint/type-utils@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz#a64aa9acbe609ab77f09f53434a6af2b9685f3af" - integrity sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA== +"@typescript-eslint/type-utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz#7be5c30e9b4d49971b79095a1181324ef6089a19" + integrity sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA== dependencies: - "@typescript-eslint/utils" "5.30.6" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/utils" "7.2.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.6.tgz#86369d0a7af8c67024115ac1da3e8fb2d38907e1" - integrity sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg== +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== -"@typescript-eslint/typescript-estree@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz#a84a0d6a486f9b54042da1de3d671a2c9f14484e" - integrity sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A== +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.6.tgz#1de2da14f678e7d187daa6f2e4cdb558ed0609dc" - integrity sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz#94dd10bb481c8083378d24de1742a14b38a2678c" - integrity sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA== - dependencies: - "@typescript-eslint/types" "5.30.6" - eslint-visitor-keys "^3.3.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.2.0.tgz#fc8164be2f2a7068debb4556881acddbf0b7ce2a" + integrity sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== + dependencies: + "@typescript-eslint/types" "7.2.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@xmldom/xmldom@^0.8.8": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agent-base@6: version "6.0.2" @@ -452,7 +490,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -462,7 +500,7 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3: +ajv@^8.0.0, ajv@^8.6.3: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -472,16 +510,6 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -575,14 +603,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -628,16 +649,6 @@ auto-launch@^5.0.5: untildify "^3.0.2" winreg "1.2.4" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -648,13 +659,6 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -783,7 +787,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caseless@^0.12.0, caseless@~0.12.0: +caseless@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== @@ -797,7 +801,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -843,15 +847,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -868,11 +863,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -897,7 +887,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -934,20 +924,20 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concurrently@^7.0.0: - version "7.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.2.2.tgz#4ad4a4dfd3945f668d727379de2a29502e6a531c" - integrity sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw== +concurrently@^8: + version "8.2.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== dependencies: - chalk "^4.1.0" - date-fns "^2.16.1" + chalk "^4.1.2" + date-fns "^2.30.0" lodash "^4.17.21" - rxjs "^7.0.0" - shell-quote "^1.7.3" - spawn-command "^0.0.2-1" - supports-color "^8.1.0" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" tree-kill "^1.2.2" - yargs "^17.3.1" + yargs "^17.7.2" conf@^10.1.2: version "10.1.2" @@ -978,11 +968,6 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - crc@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" @@ -999,17 +984,12 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: - assert-plus "^1.0.0" - -date-fns@^2.16.1: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + "@babel/runtime" "^7.21.0" debounce-fn@^4.0.0: version "4.0.0" @@ -1018,27 +998,13 @@ debounce-fn@^4.0.0: dependencies: mimic-fn "^3.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.1.3, debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.0.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -1046,11 +1012,6 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1161,14 +1122,6 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ejs@^3.1.8: version "3.1.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" @@ -1203,21 +1156,6 @@ electron-builder@^24.6.4: simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-download@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" - integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== - dependencies: - debug "^3.0.0" - env-paths "^1.0.0" - fs-extra "^4.0.1" - minimist "^1.2.0" - nugget "^2.0.1" - path-exists "^3.0.0" - rc "^1.2.1" - semver "^5.4.1" - sumchecker "^2.0.2" - electron-log@^4.3.5: version "4.4.8" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.8.tgz#fcb9f714dbcaefb6ac7984c4683912c74730248a" @@ -1294,18 +1232,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - integrity sha512-+6r/UAzikJWJPcQZpBQS+bVmjAMz2BkDP/N4n2Uz1zz8lyw1IHWUeVdh/85gs0dp5A+z76LOQhCZkR6F88mlUw== - env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -1343,117 +1269,86 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-google@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a" - integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw== - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + estraverse "^5.2.0" eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^7.23.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -1464,11 +1359,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -1479,11 +1369,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -1495,11 +1380,6 @@ extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - extsprintf@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" @@ -1602,6 +1482,14 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -1615,11 +1503,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -1638,15 +1521,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -1656,15 +1530,6 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -1706,11 +1571,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - gar@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" @@ -1750,13 +1610,6 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - git-hooks-list@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc" @@ -1769,6 +1622,13 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -1793,10 +1653,10 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -globals@^13.6.0, globals@^13.9.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" - integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -1847,23 +1707,15 @@ got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^3.0.0: version "3.0.0" @@ -1932,15 +1784,6 @@ http-response-object@^3.0.1: dependencies: "@types/node" "^10.0.3" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -1977,11 +1820,6 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -1992,7 +1830,7 @@ ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2013,16 +1851,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.1: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2054,13 +1887,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -2083,21 +1909,16 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" @@ -2113,11 +1934,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -2138,7 +1954,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1, js-yaml@^3.14.0: +js-yaml@^3.14.0: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -2153,11 +1969,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -2183,17 +1994,12 @@ json-schema-typed@^7.0.3: resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -2219,16 +2025,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - keyv@^4.0.0: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" @@ -2269,6 +2065,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" @@ -2284,11 +2087,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2331,7 +2129,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -2363,7 +2161,14 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2384,7 +2189,7 @@ minimatch@^5.1.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -2421,27 +2226,17 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next-electron-server@^1.0.0: +next-electron-server@^1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-electron-server/-/next-electron-server-1.0.0.tgz#03e133ed64a5ef671b6c6409f908c4901b1828cb" integrity sha512-fTUaHwT0Jry2fbdUSIkAiIqgDAInI5BJFF4/j90/okvZCYlyx6yxpXB30KpzmOG6TN/ESwyvsFJVvS2WHT8PAA== @@ -2483,39 +2278,11 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -nugget@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.2.tgz#398b591377b740b3dd308fabecd5ea09cf3443da" - integrity sha512-A8A8+PtlH937KWXJnfct6ubGPfgHOe3lwFkkmrT5xW8+aRBnDWqSiW5NRuiVuh/k/auLGsZdu+WrIU2epL/FHg== - dependencies: - debug "^2.1.3" - minimist "^1.1.0" - pretty-bytes "^4.0.2" - progress-stream "^1.1.0" - request "^2.45.0" - single-line-log "^1.1.2" - throttleit "0.0.2" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2542,17 +2309,17 @@ onnxruntime-node@^1.16.3: dependencies: onnxruntime-common "~1.16.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" p-cancelable@^2.0.0: version "2.1.1" @@ -2566,6 +2333,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -2580,6 +2354,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -2642,11 +2423,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picomatch@^2.0.4, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -2704,20 +2480,7 @@ prettier@^3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -pretty-bytes@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" - integrity sha512-yJAF+AjbHKlxQ8eezMd/34Mnj/YTQ3i6kLzvVsH4l/BfIFtp444n0wVbnsn66JimZ9uBofv815aRp1zCppxlWw== - -progress-stream@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" - integrity sha512-MIBPjZz6oGNSw5rn2mSp+nP9FGoaVo6QsPyPVEaD4puilz5hZNa3kfnrlqRNYFsugslbU3An4mnkLLtZOaWvrA== - dependencies: - speedometer "~0.1.2" - through2 "~0.2.3" - -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -2737,11 +2500,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2750,16 +2508,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2770,16 +2523,6 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -rc@^1.2.1: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-config-file@6.3.2: version "6.3.2" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" @@ -2820,16 +2563,6 @@ readable-stream@^3.0.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2837,36 +2570,10 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -regexpp@^3.1.0, regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -request@^2.45.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== require-directory@^2.1.1: version "2.1.1" @@ -2940,19 +2647,19 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.0.0: - version "7.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -2974,7 +2681,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.4.1: +"semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -2984,7 +2691,7 @@ semver@^6.2.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: +semver@^7.3.2, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -2998,6 +2705,13 @@ semver@^7.3.8, semver@^7.5.3: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -3017,10 +2731,10 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== simple-update-notifier@2.0.0: version "2.0.0" @@ -3029,13 +2743,6 @@ simple-update-notifier@2.0.0: dependencies: semver "^7.5.3" -single-line-log@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" - integrity sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA== - dependencies: - string-width "^1.0.1" - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -3055,15 +2762,6 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - smart-buffer@^4.0.2: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -3100,10 +2798,10 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== spdx-correct@^3.0.0: version "3.1.1" @@ -3131,11 +2829,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== -speedometer@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" - integrity sha512-phdEoDlA6EUIVtzwq1UiNMXDUogczp204aYF/yfOhjNePWFfIpBJ1k5wLMuXQhEOOMjuTJEcc4vdZa+vuP+n/Q== - sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -3146,35 +2839,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - stat-mode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -3191,18 +2860,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -3210,23 +2867,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -sumchecker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - integrity sha512-16O54scwFPgX60Of/+QJSufmklGqnHZyBK6uewBvtcp3VxT5RM65c/OnGCeEPnjBF8TJoO5Pf6gHAOXfxIjNpA== - dependencies: - debug "^2.2.0" - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -3248,7 +2893,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.0: +supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -3268,17 +2913,6 @@ synckit@0.9.0: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - tar@^6.1.12: version "6.2.0" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" @@ -3304,19 +2938,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throttleit@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" - integrity sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag== - -through2@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" - integrity sha512-mLa8Bn2mZurjyomGKWRu3Bo2mvoQojFks9NvOK8H+k4kDJNkdEqG522KFZsEFBEl6rKkxTgFbE5+OPcgfvPEHA== - dependencies: - readable-stream "~1.1.9" - xtend "~2.1.1" - tiny-each-async@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" @@ -3343,14 +2964,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -3368,10 +2981,10 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== tslib@^2.1.0: version "2.4.0" @@ -3383,25 +2996,6 @@ tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -3444,10 +3038,10 @@ typescript@^4.0.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typescript@^4.2.3: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@^5: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== universalify@^0.1.0: version "0.1.2" @@ -3481,16 +3075,6 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -3499,15 +3083,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - verror@^1.10.0: version "1.10.1" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" @@ -3542,11 +3117,6 @@ winreg@1.2.4: resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" integrity sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA== -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -3566,13 +3136,6 @@ xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== - dependencies: - object-keys "~0.4.0" - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -3583,30 +3146,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^17.6.2: +yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -3626,3 +3171,8 @@ yauzl@^2.10.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/infra/services/README.md b/infra/services/README.md index 8c3a3d5691c53b73ea61fb3315b787acb83f8779..1c3c6a3680ab49f1d7bf610c80ddd58eb7fbe897 100644 --- a/infra/services/README.md +++ b/infra/services/README.md @@ -95,10 +95,19 @@ sudo journalctl --follow --unit example ## Logging -Services should log to files in `/var/logs` within the container. This should be -mounted to `/root/var/logs` on the instance (using the `-v` flag in the service -file which launches the Docker container or the Docker compose cluster). +Simple services can log to their standard output: these are captured by Docker, +and by default promtail is setup to injest Docker logs and send them to Grafana. -If these logs need to be sent to Grafana, then ensure that there is an entry for -this log file in the `promtail/promtail.yaml` on that instance. The logs will -then get scraped by Promtail and sent over to Grafana. +One issue with the above simple setup is that we cannot attach job names. + +If the service needs to to attach a specific job name, or if the service wants +more control over the log retention etc, then then services can log to to its +own files. + +* Such files should be in `/var/logs` within the container, and this should be + mounted to `/root/var/logs` on the instance (using the `-v` flag in the + service file which launches the Docker container or the Docker compose cluster). + +* There should be entry for this log file in the `promtail/promtail.yaml` on + that instance. The logs will then get scraped by Promtail and sent over to + Grafana. diff --git a/infra/workers/github-discord-notifier/src/index.ts b/infra/workers/github-discord-notifier/src/index.ts index 7a70206b64e4f08c0657fd72d8ec0cf7755bfe08..19191d9587c161a90b05208dc86532035ff0dc56 100644 --- a/infra/workers/github-discord-notifier/src/index.ts +++ b/infra/workers/github-discord-notifier/src/index.ts @@ -3,16 +3,6 @@ * * This worker receives webhooks from GitHub, filters out the ones we don't * need, and forwards them to a Discord webhook. - * - * [Note: GitHub specific Discord Webhooks] - * - * By appending `/github` to the end of the webhook URL, we can get Discord to - * automatically parse the payload sent by GitHub. - * https://discord.com/developers/docs/resources/webhook#execute-githubcompatible-webhook - * - * Note that this doesn't work for all events. And sadly, the events it doesn't - * work for get silently ignored (Discord responds with a 204). - * https://github.com/discord/discord-api-docs/issues/6203#issuecomment-1608151265 */ export default { async fetch(request: Request, env: Env) { @@ -24,20 +14,78 @@ interface Env { DISCORD_WEBHOOK_URL: string; } -const handleRequest = async (request: Request, targetURL: string) => { +const handleRequest = async (request: Request, discordWebhookURL: string) => { const requestBody = await request.text(); - let sender = JSON.parse(requestBody)["sender"]["login"]; + const requestJSON = JSON.parse(requestBody); + const sender = requestJSON["sender"]["login"]; if (sender === "cloudflare-pages[bot]" || sender === "CLAassistant") { // Ignore pings from CF bot return new Response(null, { status: 200 }); } - const response = await fetch(targetURL, { + // [Note: GitHub specific Discord Webhooks] + // + // By appending `/github` to the end of the webhook URL, we can get Discord + // to automatically parse the payload sent by GitHub. + // https://discord.com/developers/docs/resources/webhook#execute-githubcompatible-webhook + // + // Note that this doesn't work for all events. And sadly, the events it + // doesn't work for get silently ignored (Discord responds with a 204). + // https://github.com/discord/discord-api-docs/issues/6203#issuecomment-1608151265 + + let response = await fetch(`${discordWebhookURL}/github`, { method: request.method, headers: request.headers, body: requestBody, }); + if (response.status === 429) { + // Sometimes Discord starts returning 429 Rate Limited responses when we + // try to invoke the webhook. + // + // Retry-After: 300 + // X-Ratelimit-Global: true + // X-Ratelimit-Scope: global + // + // {"message": "You are being rate limited.", "retry_after": 0.3, "global": true} + // + // This just seems to be a bug on their end, and it goes away on its own + // after a while. My best guess is that the IP of the Cloudflare Worker + // somehow gets rate limited because of someone else trying to spam from + // a worker running on the same IP. But it's a guess. I'm not sure. + // + // Ref: + // https://discord.com/developers/docs/topics/rate-limits#global-rate-limit + // + // Interestingly, this only happens for the `/github` specific webhook. + // The normal webhook still works. So as a workaround, just send a + // normal text message to the webhook when we get a 429. + + // The JSON sent by GitHub has a varied schema. This is a stop-gap + // arrangement (we shouldn't be getting 429s forever), so just try to + // see if we can extract a URL from something we recognize. + let activityURL: string | undefined; + if (requestJSON["issue"]) { + activityURL = requestJSON["issue"]["html_url"]; + } + if (!activityURL && requestJSON["discussion"]) { + activityURL = requestJSON["discussion"]["html_url"]; + } + + // Ignore things like issue label changes. + const action = requestJSON["action"]; + + if (activityURL && ["created", "opened"].includes(action)) { + response = await fetch(discordWebhookURL, { + method: request.method, + headers: request.headers, + body: JSON.stringify({ + content: `Activity in ${activityURL}`, + }), + }); + } + } + const responseBody = await response.text(); const newResponse = new Response(responseBody, { status: response.status, diff --git a/infra/workers/github-discord-notifier/wrangler.toml b/infra/workers/github-discord-notifier/wrangler.toml index a19cb44bee7d68f3e0e664f26a3a2cdac6159ce6..5cc16fb612dd7d9456ee9e2bbad49d722cc69637 100644 --- a/infra/workers/github-discord-notifier/wrangler.toml +++ b/infra/workers/github-discord-notifier/wrangler.toml @@ -4,4 +4,4 @@ compatibility_date = "2024-03-14" [vars] # Added as a secret via the Cloudflare dashboard -# DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/{webhook.id}/{webhook.token}/github" +# DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/{webhook.id}/{webhook.token}" diff --git a/mobile/lib/services/billing_service.dart b/mobile/lib/services/billing_service.dart index e9485f50c737bc409f2e8546211a09fde4c5700c..1d67531cc9ec7d0f62399a8489da1b2172c16ae9 100644 --- a/mobile/lib/services/billing_service.dart +++ b/mobile/lib/services/billing_service.dart @@ -16,7 +16,11 @@ import 'package:photos/services/user_service.dart'; import 'package:photos/ui/common/web_page.dart'; import 'package:photos/utils/dialog_util.dart'; -const kWebPaymentRedirectUrl = "https://payments.ente.io/frameRedirect"; +const kWebPaymentRedirectUrl = String.fromEnvironment( + "web-payment-redirect", + defaultValue: "https://payments.ente.io/frameRedirect", +); + const kWebPaymentBaseEndpoint = String.fromEnvironment( "web-payment", defaultValue: "https://payments.ente.io", diff --git a/mobile/lib/ui/payment/stripe_subscription_page.dart b/mobile/lib/ui/payment/stripe_subscription_page.dart index 51a80a67eba2b0b2fbbee0b5617c9967ad2797f6..a36ad11512ebde4e7bb3cf85c36327e2f72cee1e 100644 --- a/mobile/lib/ui/payment/stripe_subscription_page.dart +++ b/mobile/lib/ui/payment/stripe_subscription_page.dart @@ -331,6 +331,7 @@ class _StripeSubscriptionPageState extends State { await _dialog.show(); try { final String url = await _billingService.getStripeCustomerPortalUrl(); + await _dialog.hide(); await Navigator.of(context).push( MaterialPageRoute( builder: (BuildContext context) { @@ -342,7 +343,6 @@ class _StripeSubscriptionPageState extends State { await _dialog.hide(); await showGenericErrorDialog(context: context, error: e); } - await _dialog.hide(); } Widget _stripeRenewOrCancelButton() { diff --git a/server/pkg/controller/stripe.go b/server/pkg/controller/stripe.go index 0b044e29b1198dd0094aa9965832ed71a39c2084..115cb3c1d138245af55217878dadef6608b5bd6c 100644 --- a/server/pkg/controller/stripe.go +++ b/server/pkg/controller/stripe.go @@ -300,6 +300,11 @@ func (c *StripeController) handleCustomerSubscriptionDeleted(event stripe.Event, return ente.StripeEventLog{}, stacktrace.Propagate(err, "") } + err = c.BillingRepo.UpdateSubscriptionCancellationStatus(userID, true) + if err != nil { + return ente.StripeEventLog{}, stacktrace.Propagate(err, "") + } + skipMail := stripeSubscription.Metadata[SkipMailKey] // Send a cancellation notification email for folks who are either on // individual plan or admin of a family plan. diff --git a/web/apps/photos/src/components/Sidebar/AdvancedSettings.tsx b/web/apps/photos/src/components/Sidebar/AdvancedSettings.tsx index 5adc0361d37ee28c6b2213a41507ac900dc3805d..e854d70d6808588bb388438ff9ccec8df9c2d03f 100644 --- a/web/apps/photos/src/components/Sidebar/AdvancedSettings.tsx +++ b/web/apps/photos/src/components/Sidebar/AdvancedSettings.tsx @@ -16,7 +16,6 @@ import isElectron from "is-electron"; import { AppContext } from "pages/_app"; import { ClipExtractionStatus, ClipService } from "services/clipService"; import { formatNumber } from "utils/number/format"; -import CacheDirectory from "./Preferences/CacheDirectory"; export default function AdvancedSettings({ open, onClose, onRootClose }) { const appContext = useContext(AppContext); @@ -77,22 +76,19 @@ export default function AdvancedSettings({ open, onClose, onRootClose }) { {isElectron() && ( - <> - - - } + + } + /> + + } + onClick={openMlSearchSettings} + label={t("ML_SEARCH")} /> - - } - onClick={openMlSearchSettings} - label={t("ML_SEARCH")} - /> - - - + + )} diff --git a/web/apps/photos/src/components/Sidebar/Preferences/CacheDirectory.tsx b/web/apps/photos/src/components/Sidebar/Preferences/CacheDirectory.tsx deleted file mode 100644 index be23d9cbb9311f58ec24101e6e88ae400fd5418d..0000000000000000000000000000000000000000 --- a/web/apps/photos/src/components/Sidebar/Preferences/CacheDirectory.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import ElectronAPIs from "@ente/shared/electron"; -import { addLogLine } from "@ente/shared/logging"; -import { logError } from "@ente/shared/sentry"; -import Box from "@mui/material/Box"; -import { DirectoryPath } from "components/Directory"; -import { EnteMenuItem } from "components/Menu/EnteMenuItem"; -import { MenuItemGroup } from "components/Menu/MenuItemGroup"; -import MenuSectionTitle from "components/Menu/MenuSectionTitle"; -import { t } from "i18next"; -import isElectron from "is-electron"; -import { useEffect, useState } from "react"; -import DownloadManager from "services/download"; - -export default function CacheDirectory() { - const [cacheDirectory, setCacheDirectory] = useState(undefined); - - useEffect(() => { - const main = async () => { - if (isElectron()) { - const customCacheDirectory = - await ElectronAPIs.getCacheDirectory(); - setCacheDirectory(customCacheDirectory); - } - }; - main(); - }, []); - - const handleCacheDirectoryChange = async () => { - try { - if (!isElectron()) { - return; - } - const newFolder = await ElectronAPIs.selectDirectory(); - if (!newFolder) { - return; - } - addLogLine(`Export folder changed to ${newFolder}`); - await ElectronAPIs.setCustomCacheDirectory(newFolder); - setCacheDirectory(newFolder); - await DownloadManager.reloadCaches(); - } catch (e) { - logError(e, "handleCacheDirectoryChange failed"); - } - }; - - return ( - - - - - } - /> - - - ); -} diff --git a/web/apps/photos/src/services/download/index.ts b/web/apps/photos/src/services/download/index.ts index 3d71ed8ad1b4a99043cb8c54df0bf4046e5525b5..1d57d468fcb6f8aff9a831ae1dc5201ca3859f6a 100644 --- a/web/apps/photos/src/services/download/index.ts +++ b/web/apps/photos/src/services/download/index.ts @@ -130,11 +130,6 @@ class DownloadManagerImpl { this.progressUpdater = progressUpdater; } - async reloadCaches() { - this.thumbnailCache = await openThumbnailCache(); - this.diskFileCache = isElectron() && (await openDiskFileCache()); - } - private async getCachedThumbnail(fileID: number) { try { const cacheResp: Response = await this.thumbnailCache?.match( diff --git a/web/docs/dependencies.md b/web/docs/dependencies.md index 8f5ace07166c17e5e7fe21b942c91f6096e30c3e..14cb61417bd18284dcbe7a718d891d83d0adc1d7 100644 --- a/web/docs/dependencies.md +++ b/web/docs/dependencies.md @@ -1,18 +1,25 @@ # Dependencies -## Global +## DX These are some global dev dependencies in the root `package.json`. These set the -baseline for how our code be in all the workspaces in the monorepo. +baseline for how our code be in all the workspaces in this (yarn) monorepo. * "prettier" - Formatter * "eslint" - Linter * "typescript" - Type checker -They also need some support packages: +They also need some support packages, which come from the leaf `@/build-config` +package: * "@typescript-eslint/parser" - Tells ESLint how to read TypeScript syntax * "@typescript-eslint/eslint-plugin" - Provides TypeScript rules and presets +* "eslint-plugin-react-hooks", "eslint-plugin-react-namespace-import" - Some + React specific ESLint rules and configurations that are used by the workspaces + that have React code. +* "prettier-plugin-organize-imports" - A Prettier plugin to sort imports. +* "prettier-plugin-packagejson" - A Prettier plugin to also prettify + `package.json`. ## Utils diff --git a/web/packages/eslint-config/package.json b/web/packages/eslint-config/package.json index a886b015ea30fa9c107b363d099ff510ca527386..1bc33981572c2bcb77f13fbdcceb0f06d5b9ca1d 100644 --- a/web/packages/eslint-config/package.json +++ b/web/packages/eslint-config/package.json @@ -10,8 +10,5 @@ "eslint-config-next": "latest", "eslint-config-prettier": "latest", "eslint-plugin-react": "latest" - }, - "standard": { - "parser": "babel-eslint" } } diff --git a/web/packages/shared/electron/types.ts b/web/packages/shared/electron/types.ts index 34b8ee591b23c0c3462ee16a23c2a21cb4876866..43d55faac9dbe881dbac8579c38cdb5aa002f20c 100644 --- a/web/packages/shared/electron/types.ts +++ b/web/packages/shared/electron/types.ts @@ -21,7 +21,6 @@ export interface ElectronAPIsType { ) => Promise; saveFileToDisk: (path: string, file: any) => Promise; selectDirectory: () => Promise; - sendNotification: (content: string) => void; readTextFile: (path: string) => Promise; showUploadFilesDialog: () => Promise; showUploadDirsDialog: () => Promise; @@ -93,7 +92,6 @@ export interface ElectronAPIsType { maxDimension: number, maxSize: number, ) => Promise; - logRendererProcessMemoryUsage: (message: string) => Promise; registerForegroundEventListener: (onForeground: () => void) => void; openDirectory: (dirPath: string) => Promise; moveFile: (oldPath: string, newPath: string) => Promise; @@ -105,7 +103,4 @@ export interface ElectronAPIsType { imageData: Uint8Array, ) => Promise; computeTextEmbedding: (model: Model, text: string) => Promise; - getPlatform: () => Promise<"mac" | "windows" | "linux">; - setCustomCacheDirectory: (directory: string) => Promise; - getCacheDirectory: () => Promise; }