diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000..cc8665505e --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/devcontainers/base:bookworm + +# Install Homebrew For Linux +RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" && \ + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" && \ + echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> /home/vscode/.zshrc && \ + echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> /home/vscode/.bashrc && \ + # Install Graphite + brew install withgraphite/tap/graphite && gt --version \ No newline at end of file diff --git a/.devcontainer/build.sh b/.devcontainer/build.sh new file mode 100644 index 0000000000..10000e663b --- /dev/null +++ b/.devcontainer/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# This is a script used by the devcontainer to build the project + +#Enable yarn +corepack enable +corepack prepare yarn@stable --activate + +# install dependencies +yarn install + +# Create database +yarn workspace @affine/server prisma db push \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..191a02c0e9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,25 @@ +// For format details, see https://aka.ms/devcontainer.json. +{ + "name": "Debian", + "dockerComposeFile": "docker-compose.yml", + "service": "app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "18" + }, + "ghcr.io/devcontainers/features/rust:1": {} + }, + // Configure tool-specific properties. + "customizations": { + "vscode": { + "extensions": [ + "ms-playwright.playwright", + "esbenp.prettier-vscode", + "streetsidesoftware.code-spell-checker" + ] + } + }, + "updateContentCommand": "bash ./.devcontainer/build.sh", + "postCreateCommand": "bash ./.devcontainer/setup-user.sh" +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000000..0263548fc9 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + app: + build: + context: . + dockerfile: Dockerfile + volumes: + - ../..:/workspaces:cached + command: sleep infinity + network_mode: service:db + environment: + DATABASE_URL: postgresql://affine:affine@db:5432/affine + + db: + image: postgres:latest + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_PASSWORD: affine + POSTGRES_USER: affine + POSTGRES_DB: affine + +volumes: + postgres-data: diff --git a/.devcontainer/setup-user.sh b/.devcontainer/setup-user.sh new file mode 100755 index 0000000000..1171f79d46 --- /dev/null +++ b/.devcontainer/setup-user.sh @@ -0,0 +1,7 @@ +if [ -v GRAPHITE_TOKEN ];then + gt auth --token $GRAPHITE_TOKEN +fi + +git fetch +git branch canary -t origin/canary +gt init --trunk canary diff --git a/.eslintrc.js b/.eslintrc.js index e0f1244bc4..31e36813f7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -58,7 +58,7 @@ const createPattern = packageName => [ const allPackages = [ 'packages/backend/server', 'packages/frontend/component', - 'packages/frontend/web', + 'packages/frontend/core', 'packages/frontend/electron', 'packages/frontend/graphql', 'packages/frontend/hooks', @@ -255,6 +255,12 @@ const config = { ], '@typescript-eslint/no-misused-promises': ['error'], 'i/no-extraneous-dependencies': ['error'], + 'react-hooks/exhaustive-deps': [ + 'warn', + { + additionalHooks: 'useAsyncCallback', + }, + ], }, })), { diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml index 810fede66e..cb47aa0dda 100644 --- a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -58,6 +58,6 @@ body: label: Are you willing to submit a PR? description: > (Optional) We encourage you to submit a [Pull Request](https://github.com/toeverything/affine/pulls) (PR) to help improve AFFiNE for everyone, especially if you have a good understanding of how to implement a fix or feature. - See the AFFiNE [Contributing Guide](https://github.com/toeverything/affine/blob/master/CONTRIBUTING.md) to get started. + See the AFFiNE [Contributing Guide](https://github.com/toeverything/affine/blob/canary/CONTRIBUTING.md) to get started. options: - label: Yes I'd like to help by submitting a PR! diff --git a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml index 86f21963ed..f9cd162291 100644 --- a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml +++ b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml @@ -31,6 +31,6 @@ body: label: Are you willing to submit a PR? description: > (Optional) We encourage you to submit a [Pull Request](https://github.com/toeverything/affine/pulls) (PR) to help improve AFFiNE for everyone, especially if you have a good understanding of how to implement a fix or feature. - See the AFFiNE [Contributing Guide](https://github.com/toeverything/affine/blob/master/CONTRIBUTING.md) to get started. + See the AFFiNE [Contributing Guide](https://github.com/toeverything/affine/blob/canary/CONTRIBUTING.md) to get started. options: - label: Yes I'd like to help by submitting a PR! diff --git a/.github/actions/deploy/deploy.mjs b/.github/actions/deploy/deploy.mjs index dcbb812252..43d0855df8 100644 --- a/.github/actions/deploy/deploy.mjs +++ b/.github/actions/deploy/deploy.mjs @@ -41,8 +41,8 @@ const createHelmCommand = ({ isDryRun }) => { const staticIpName = isProduction ? 'affine-cluster-production' : isBeta - ? 'affine-cluster-beta' - : 'affine-cluster-dev'; + ? 'affine-cluster-beta' + : 'affine-cluster-dev'; const redisAndPostgres = isProduction || isBeta ? [ diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index d74ec72f19..f00e6b47ef 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -49,9 +49,9 @@ runs: cache: 'yarn' - name: Set nmMode - if: ${{ inputs.hard-link-nm == 'true' }} + if: ${{ inputs.hard-link-nm == 'false' }} shell: bash - run: yarn config set nmMode hardlinks-local + run: yarn config set nmMode classic - name: Set nmHoistingLimits if: ${{ inputs.nmHoistingLimits }} diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 2ffbfbcb6a..8017e0edf7 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -3,7 +3,7 @@ name: Build(Desktop) & Test on: push: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: @@ -15,7 +15,7 @@ on: pull_request: merge_group: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: @@ -159,7 +159,8 @@ jobs: env: SKIP_BUNDLE: true SKIP_WEB_BUILD: true - run: yarn workspace @affine/electron make --platform=darwin --arch=arm64 + HOIST_NODE_MODULES: 1 + run: yarn workspace @affine/electron package --platform=darwin --arch=arm64 - name: Output check if: ${{ matrix.spec.os == 'macos-latest' && matrix.spec.arch == 'arm64' }} diff --git a/.github/workflows/build-server.yml b/.github/workflows/build-server.yml index d444a4dd4e..9fb88605c4 100644 --- a/.github/workflows/build-server.yml +++ b/.github/workflows/build-server.yml @@ -3,7 +3,7 @@ name: Build(Server) & Test on: push: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: @@ -15,7 +15,7 @@ on: pull_request: merge_group: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 33d84dc1a9..9bd2266a4f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Build & Test on: push: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: @@ -15,7 +15,7 @@ on: pull_request: merge_group: branches: - - master + - canary - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bb6e448b7a..3e219c0dce 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,11 +13,11 @@ name: 'CodeQL' on: push: - branches: [master] + branches: [canary] pull_request: merge_group: # The branches below must be a subset of the branches above - branches: [master] + branches: [canary] jobs: analyze: diff --git a/.github/workflows/helm-releaser.yml b/.github/workflows/helm-releaser.yml index 72eeb05ebd..ed1f48ad53 100644 --- a/.github/workflows/helm-releaser.yml +++ b/.github/workflows/helm-releaser.yml @@ -2,7 +2,7 @@ name: Release Charts on: push: - branches: [master] + branches: [canary] paths: - '.github/helm/**/Chart.yml' diff --git a/.github/workflows/label-checker.yml b/.github/workflows/label-checker.yml index c60d676cae..8138ccdce9 100644 --- a/.github/workflows/label-checker.yml +++ b/.github/workflows/label-checker.yml @@ -6,7 +6,7 @@ on: - labeled - unlabeled branches: - - master + - canary jobs: check_labels: diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml index 8ef8cc9aa6..073cf20813 100644 --- a/.github/workflows/languages-sync.yml +++ b/.github/workflows/languages-sync.yml @@ -2,13 +2,13 @@ name: Languages Sync on: push: - branches: ['master'] + branches: ['canary'] paths: - 'packages/frontend/i18n/**' - '.github/workflows/languages-sync.yml' - '!.github/actions/setup-node/action.yml' pull_request_target: - branches: ['master'] + branches: ['canary'] paths: - 'packages/frontend/i18n/**' - '.github/workflows/languages-sync.yml' @@ -23,13 +23,13 @@ jobs: - name: Setup Node.js uses: ./.github/actions/setup-node - name: Check Language Key - if: github.ref != 'refs/heads/master' + if: github.ref != 'refs/heads/canary' run: yarn workspace @affine/i18n run sync-languages:check env: TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} - name: Sync Languages - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/canary' run: yarn workspace @affine/i18n run sync-languages env: TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} diff --git a/.github/workflows/pr-title-lint.yml b/.github/workflows/pr-title-lint.yml index 5632c82f38..75ecb019bf 100644 --- a/.github/workflows/pr-title-lint.yml +++ b/.github/workflows/pr-title-lint.yml @@ -7,7 +7,7 @@ on: - edited - synchronize branches: - - master + - canary permissions: contents: read diff --git a/.github/workflows/publish-storybook.yml b/.github/workflows/publish-storybook.yml index ca8745ab69..166e795196 100644 --- a/.github/workflows/publish-storybook.yml +++ b/.github/workflows/publish-storybook.yml @@ -7,10 +7,10 @@ on: workflow_dispatch: push: branches: - - master + - canary pull_request: branches: - - master + - canary paths-ignore: - README.md - .github/** diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6fd95b15a6..bbaac8305c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release on: push: branches: - - master + - canary env: BUILD_TYPE: stable @@ -89,7 +89,7 @@ jobs: if-no-files-found: error build-docker: - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/canary' name: Build Docker runs-on: ubuntu-latest needs: diff --git a/.github/workflows/workers.yml b/.github/workflows/workers.yml index bf4b131b00..b51fc50926 100644 --- a/.github/workflows/workers.yml +++ b/.github/workflows/workers.yml @@ -3,7 +3,7 @@ name: Deploy Cloudflare Worker on: push: branches: - - master + - canary paths: - tools/workers/** diff --git a/.gitignore b/.gitignore index e1e8744557..77f2822fc1 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ tsconfig.node.tsbuildinfo lib affine.db apps/web/next-routes.conf +.nx diff --git a/.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch b/.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch deleted file mode 100644 index b8e0df7783..0000000000 --- a/.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/dist/util/forge-config.js b/dist/util/forge-config.js -index 3466ac1a340c8dfe5ea8997178961e8328457d68..ceb33770db48df80e4355e6bac12e8c99162d7bc 100644 ---- a/dist/util/forge-config.js -+++ b/dist/util/forge-config.js -@@ -130,7 +130,7 @@ exports.default = async (dir) => { - try { - // The loaded "config" could potentially be a static forge config, ESM module or async function - // eslint-disable-next-line @typescript-eslint/no-var-requires -- const loaded = require(path_1.default.resolve(dir, forgeConfig)); -+ const loaded = await import(require('node:url').pathToFileURL(path_1.default.join(dir, forgeConfig))) - const maybeForgeConfig = 'default' in loaded ? loaded.default : loaded; - forgeConfig = typeof maybeForgeConfig === 'function' ? await maybeForgeConfig() : maybeForgeConfig; - } diff --git a/.yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch b/.yarn/patches/next-auth-npm-4.24.5-8428e11927.patch similarity index 54% rename from .yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch rename to .yarn/patches/next-auth-npm-4.24.5-8428e11927.patch index f493cb4dea..c66072ae0f 100644 --- a/.yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch +++ b/.yarn/patches/next-auth-npm-4.24.5-8428e11927.patch @@ -1,15 +1,15 @@ diff --git a/package.json b/package.json -index 26dcf8217f3e221e4c53722f14d29bb788332772..57a66dcb0943b9dd5cdaac2eaffccd9225a6b735 100644 +index ca30bca63196b923fa5a27eb85ce2ee890222d36..39e9d08dea40f25568a39bfbc0154458d32c8a66 100644 --- a/package.json +++ b/package.json -@@ -34,6 +34,10 @@ - "./adapters": { - "types": "./adapters.d.ts" +@@ -31,6 +31,10 @@ + "types": "./index.d.ts", + "default": "./index.js" }, + "./core": { + "types": "./core/index.d.ts", + "default": "./core/index.js" + }, - "./jwt": { - "types": "./jwt/index.d.ts", - "default": "./jwt/index.js" + "./adapters": { + "types": "./adapters.d.ts" + }, diff --git a/Cargo.lock b/Cargo.lock index 72fcab10cf..4f03beba90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1241,12 +1241,12 @@ checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys", ] [[package]] @@ -1354,9 +1354,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "log", @@ -1375,9 +1375,9 @@ dependencies = [ [[package]] name = "napi" -version = "2.13.3" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd063c93b900149304e3ba96ce5bf210cd4f81ef5eb80ded0d100df3e85a3ac0" +checksum = "f9d90182620f32fe34b6ac9b52cba898af26e94c7f5abc01eb4094c417ae2e6c" dependencies = [ "anyhow", "bitflags 2.4.1", @@ -1393,15 +1393,15 @@ dependencies = [ [[package]] name = "napi-build" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e" +checksum = "d4b4532cf86bfef556348ac65e561e3123879f0e7566cca6d43a6ff5326f13df" [[package]] name = "napi-derive" -version = "2.13.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da1c6a8fa84d549aa8708fcd062372bf8ec6e849de39016ab921067d21bde367" +checksum = "3619fa472d23cd5af94d63a2bae454a77a8863251f40230fbf59ce20eafa8a86" dependencies = [ "cfg-if", "convert_case", @@ -1413,9 +1413,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.52" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20bbc7c69168d06a848f925ec5f0e0997f98e8c8d4f2cc30157f0da51c009e17" +checksum = "ecd3ea4b54020c73d591a49cd192f6334c5f37f71a63ead54dbc851fa991ef00" dependencies = [ "convert_case", "once_cell", @@ -1428,9 +1428,9 @@ dependencies = [ [[package]] name = "napi-sys" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166b5ef52a3ab5575047a9fe8d4a030cdd0f63c96f071cd6907674453b07bae3" +checksum = "2503fa6af34dc83fb74888df8b22afe933b58d37daf7d80424b1c60c68196b8b" dependencies = [ "libloading", ] @@ -2292,18 +2292,18 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", @@ -2817,9 +2817,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2836,9 +2836,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", @@ -3032,9 +3032,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "c58fe91d841bc04822c9801002db4ea904b9e4b8e6bbad25127b46eff8dc516b" dependencies = [ "getrandom", "rand", diff --git a/README.md b/README.md index bc3c4dad59..10562298e3 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,13 @@ For feature request, please see [community.affine.pro](https://community.affine. ## Building +### Codespaces + +From the GitHub repo main page, click the green "Code" button and select "Create codespace on master". This will open a new Codespace with the (supposedly auto-forked +AFFiNE repo cloned, built, and ready to go. + +### Local + See [BUILDING.md] for instructions on how to build AFFiNE from source code. ## Contributing @@ -220,10 +227,10 @@ See [LICENSE] for details. [update page]: https://affine.pro/blog?tag=Release%20Note [jobs available]: ./docs/jobs.md [latest packages]: https://github.com/toeverything/AFFiNE/pkgs/container/affine-self-hosted -[contributor license agreement]: https://github.com/toeverything/affine/edit/master/.github/CLA.md +[contributor license agreement]: https://github.com/toeverything/affine/edit/canary/.github/CLA.md [rust-version-icon]: https://img.shields.io/badge/Rust-1.71.0-dea584 [stars-icon]: https://img.shields.io/github/stars/toeverything/AFFiNE.svg?style=flat&logo=github&colorB=red&label=stars -[codecov]: https://codecov.io/gh/toeverything/affine/branch/master/graphs/badge.svg?branch=master +[codecov]: https://codecov.io/gh/toeverything/affine/branch/canary/graphs/badge.svg?branch=canary [node-version-icon]: https://img.shields.io/badge/node-%3E=18.16.1-success [typescript-version-icon]: https://img.shields.io/github/package-json/dependency-version/toeverything/affine/dev/typescript [react-version-icon]: https://img.shields.io/github/package-json/dependency-version/toeverything/AFFiNE/react?filename=packages%2Ffrontend%2Fcore%2Fpackage.json&color=rgb(97%2C228%2C251) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index b611799abf..44cd1265a5 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -13,7 +13,7 @@ Use the table of contents icon on the top left corner of this document to get to Currently we have two versions of AFFiNE: - [AFFiNE Pre-Alpha](https://livedemo.affine.pro/). This version uses the branch `Pre-Alpha`, it is no longer actively developed but contains some different functions and features. -- [AFFiNE Alpha](https://pathfinder.affine.pro/). This version uses the `master` branch, this is the latest version under active development. +- [AFFiNE Alpha](https://pathfinder.affine.pro/). This version uses the `canary` branch, this is the latest version under active development. To get an overview of the project, read the [README](../README.md). Here are some resources to help you get started with open source contributions: diff --git a/docs/contributing/releases.md b/docs/contributing/releases.md index f0c3480e63..1e2b5ee2fc 100644 --- a/docs/contributing/releases.md +++ b/docs/contributing/releases.md @@ -11,7 +11,7 @@ The AFFiNE core team gives release authorization. And also have the following re ## How to make a release? -Before releasing, ensure you have the latest version of the `master` branch. +Before releasing, ensure you have the latest version of the `canary` branch. And Read the semver specification to understand how to version your release. https://semver.org @@ -21,13 +21,13 @@ And Read the semver specification to understand how to version your release. htt ./scripts/set-version.sh 0.5.4-canary.5 ``` -### 2. Commit changes and push to `master` +### 2. Commit changes and push to `canary` ```shell git add . # vx.y.z-canary.n git commit -m "v0.5.4-canary.5" -git push origin master +git push origin canary ``` ### 3. Create a release action diff --git a/nx.json b/nx.json index 7835c08f79..da98371a7a 100644 --- a/nx.json +++ b/nx.json @@ -11,7 +11,7 @@ } }, "affected": { - "defaultBase": "master" + "defaultBase": "canary" }, "namedInputs": { "default": ["{projectRoot}/**/*", "sharedGlobals"], diff --git a/package.json b/package.json index 5a9f971a7e..7497d27ef0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@affine/monorepo", - "version": "0.10.2", + "version": "0.10.3-canary.2", "private": true, "author": "toeverything", "license": "MIT", @@ -38,7 +38,6 @@ "test": "vitest --run", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "notify": "node scripts/notify.mjs", "circular": "madge --circular --ts-config ./tsconfig.json ./packages/frontend/core/src/pages/**/*.tsx ./packages/frontend/core/src/index.tsx ./packages/frontend/electron/src/*/index.ts", "typecheck": "tsc -b tsconfig.json --diagnostics", "postinstall": "node ./scripts/check-version.mjs && yarn i18n-codegen gen && yarn husky install" @@ -46,11 +45,11 @@ "lint-staged": { "*": "prettier --write --ignore-unknown --cache", "*.{ts,tsx,mjs,js,jsx}": [ - "prettier . --ignore-unknown --write", + "prettier --ignore-unknown --write", "eslint --cache --fix" ], "*.toml": [ - "prettier . --ignore-unknown --write", + "prettier --ignore-unknown --write", "taplo format" ] }, @@ -58,58 +57,58 @@ "@affine-test/kit": "workspace:*", "@affine/cli": "workspace:*", "@affine/plugin-cli": "workspace:*", - "@commitlint/cli": "^17.8.0", - "@commitlint/config-conventional": "^17.8.0", - "@faker-js/faker": "^8.2.0", + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", + "@faker-js/faker": "^8.3.1", "@istanbuljs/schema": "^0.1.3", "@magic-works/i18n-codegen": "^0.5.0", - "@nx/vite": "16.10.0", + "@nx/vite": "17.1.3", "@perfsee/sdk": "^1.9.0", - "@playwright/test": "^1.39.0", + "@playwright/test": "^1.40.0", "@taplo/cli": "^0.5.2", - "@testing-library/react": "^14.0.0", + "@testing-library/react": "^14.1.2", "@toeverything/infra": "workspace:*", "@types/affine__env": "workspace:*", - "@types/eslint": "^8.44.4", - "@types/node": "^18.18.5", - "@typescript-eslint/eslint-plugin": "^6.7.5", - "@typescript-eslint/parser": "^6.7.5", - "@vanilla-extract/vite-plugin": "^3.9.0", + "@types/eslint": "^8.44.7", + "@types/node": "^20.9.3", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "@vanilla-extract/vite-plugin": "^3.9.2", "@vanilla-extract/webpack-plugin": "^2.3.1", - "@vitejs/plugin-react-swc": "^3.4.0", + "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-istanbul": "0.34.6", "@vitest/ui": "0.34.6", - "electron": "^27.0.0", - "eslint": "^8.51.0", + "electron": "^27.1.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-i": "^2.28.1", + "eslint-plugin-i": "^2.29.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-simple-import-sort": "^10.0.0", - "eslint-plugin-sonarjs": "^0.21.0", - "eslint-plugin-unicorn": "^48.0.1", + "eslint-plugin-sonarjs": "^0.23.0", + "eslint-plugin-unicorn": "^49.0.0", "eslint-plugin-unused-imports": "^3.0.0", - "eslint-plugin-vue": "^9.17.0", - "fake-indexeddb": "5.0.0", - "happy-dom": "^12.9.1", + "eslint-plugin-vue": "^9.18.1", + "fake-indexeddb": "5.0.1", + "happy-dom": "^12.10.3", "husky": "^8.0.3", - "lint-staged": "^15.0.0", + "lint-staged": "^15.1.0", "madge": "^6.1.0", - "msw": "^1.3.2", - "nanoid": "^5.0.1", - "nx": "^16.10.0", + "msw": "^2.0.8", + "nanoid": "^5.0.3", + "nx": "^17.1.3", "nx-cloud": "^16.5.2", "nyc": "^15.1.0", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "semver": "^7.5.4", "serve": "^14.2.1", - "string-width": "^6.1.0", + "string-width": "^7.0.0", "ts-node": "^10.9.1", - "typescript": "^5.2.2", - "vite": "^4.4.11", + "typescript": "^5.3.2", + "vite": "^5.0.1", "vite-plugin-istanbul": "^5.0.0", - "vite-plugin-static-copy": "^0.17.0", + "vite-plugin-static-copy": "^0.17.1", "vite-tsconfig-paths": "^4.2.1", "vitest": "0.34.6", "vitest-fetch-mock": "^0.2.2", @@ -173,9 +172,8 @@ "unbox-primitive": "npm:@nolyfill/unbox-primitive@latest", "which-boxed-primitive": "npm:@nolyfill/which-boxed-primitive@latest", "which-typed-array": "npm:@nolyfill/which-typed-array@latest", - "next-auth@^4.23.2": "patch:next-auth@npm%3A4.23.2#./.yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch", - "@electron-forge/core@^6.4.2": "patch:@electron-forge/core@npm%3A6.4.2#./.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch", - "@electron-forge/core@6.4.2": "patch:@electron-forge/core@npm%3A6.4.2#./.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch", + "next-auth@^4.24.5": "patch:next-auth@npm%3A4.24.5#~/.yarn/patches/next-auth-npm-4.24.5-8428e11927.patch", + "@reforged/maker-appimage/@electron-forge/maker-base": "7.1.0", "macos-alias": "npm:macos-alias-building@latest", "fs-xattr": "npm:@napi-rs/xattr@latest" } diff --git a/packages/backend/server/migrations/20231121033532_history/migration.sql b/packages/backend/server/migrations/20231121033532_history/migration.sql new file mode 100644 index 0000000000..43db522934 --- /dev/null +++ b/packages/backend/server/migrations/20231121033532_history/migration.sql @@ -0,0 +1,14 @@ +-- AlterTable +ALTER TABLE "blobs" ADD COLUMN "deleted_at" TIMESTAMPTZ(6); + +-- CreateTable +CREATE TABLE "snapshot_histories" ( + "workspace_id" VARCHAR(36) NOT NULL, + "guid" VARCHAR(36) NOT NULL, + "timestamp" TIMESTAMPTZ(6) NOT NULL, + "blob" BYTEA NOT NULL, + "state" BYTEA, + "expired_at" TIMESTAMPTZ(6) NOT NULL, + + CONSTRAINT "snapshot_histories_pkey" PRIMARY KEY ("workspace_id","guid","timestamp") +); diff --git a/packages/backend/server/migrations/migration_lock.toml b/packages/backend/server/migrations/migration_lock.toml index 99e4f20090..fbffa92c2b 100644 --- a/packages/backend/server/migrations/migration_lock.toml +++ b/packages/backend/server/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (i.e. Git) -provider = "postgresql" +provider = "postgresql" \ No newline at end of file diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index 4266bc12f9..c85508e259 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -1,7 +1,7 @@ { "name": "@affine/server", "private": true, - "version": "0.10.2", + "version": "0.10.3-canary.2", "description": "Affine Node.js server", "type": "module", "bin": { @@ -18,42 +18,43 @@ "predeploy": "yarn prisma migrate deploy && node --es-module-specifier-resolution node ./dist/data/app.js run" }, "dependencies": { - "@apollo/server": "^4.9.4", - "@auth/prisma-adapter": "^1.0.3", - "@aws-sdk/client-s3": "^3.433.0", + "@apollo/server": "^4.9.5", + "@auth/prisma-adapter": "^1.0.7", + "@aws-sdk/client-s3": "^3.454.0", "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.17.0", "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0", "@keyv/redis": "^2.8.0", - "@nestjs/apollo": "^12.0.9", - "@nestjs/common": "^10.2.7", - "@nestjs/core": "^10.2.7", - "@nestjs/event-emitter": "^2.0.2", - "@nestjs/graphql": "^12.0.9", - "@nestjs/platform-express": "^10.2.7", - "@nestjs/platform-socket.io": "^10.2.7", - "@nestjs/throttler": "^5.0.0", - "@nestjs/websockets": "^10.2.7", + "@nestjs/apollo": "^12.0.11", + "@nestjs/common": "^10.2.10", + "@nestjs/core": "^10.2.10", + "@nestjs/event-emitter": "^2.0.3", + "@nestjs/graphql": "^12.0.11", + "@nestjs/platform-express": "^10.2.10", + "@nestjs/platform-socket.io": "^10.2.10", + "@nestjs/schedule": "^4.0.0", + "@nestjs/throttler": "^5.0.1", + "@nestjs/websockets": "^10.2.10", "@node-rs/argon2": "^1.5.2", "@node-rs/crc32": "^1.7.2", "@node-rs/jsonwebtoken": "^0.2.3", - "@opentelemetry/api": "^1.6.0", - "@opentelemetry/core": "^1.17.1", - "@opentelemetry/instrumentation": "^0.44.0", - "@opentelemetry/instrumentation-graphql": "^0.35.2", - "@opentelemetry/instrumentation-http": "^0.44.0", - "@opentelemetry/instrumentation-ioredis": "^0.35.2", - "@opentelemetry/instrumentation-nestjs-core": "^0.33.2", - "@opentelemetry/instrumentation-socket.io": "^0.34.2", - "@opentelemetry/sdk-metrics": "^1.17.1", - "@opentelemetry/sdk-node": "^0.44.0", - "@opentelemetry/sdk-trace-node": "^1.17.1", - "@prisma/client": "^5.4.2", - "@prisma/instrumentation": "^5.4.2", + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/core": "^1.18.1", + "@opentelemetry/instrumentation": "^0.45.1", + "@opentelemetry/instrumentation-graphql": "^0.36.0", + "@opentelemetry/instrumentation-http": "^0.45.1", + "@opentelemetry/instrumentation-ioredis": "^0.35.3", + "@opentelemetry/instrumentation-nestjs-core": "^0.33.3", + "@opentelemetry/instrumentation-socket.io": "^0.34.3", + "@opentelemetry/sdk-metrics": "^1.18.1", + "@opentelemetry/sdk-node": "^0.45.1", + "@opentelemetry/sdk-trace-node": "^1.18.1", + "@prisma/client": "^5.6.0", + "@prisma/instrumentation": "^5.6.0", "@socket.io/redis-adapter": "^8.2.1", "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "express": "^4.18.2", - "file-type": "^18.5.0", + "file-type": "^18.7.0", "get-stream": "^8.0.1", "graphql": "^16.8.1", "graphql-type-json": "^0.3.2", @@ -61,49 +62,49 @@ "ioredis": "^5.3.2", "keyv": "^4.5.4", "lodash-es": "^4.17.21", - "nanoid": "^5.0.1", - "nest-commander": "^3.12.0", + "nanoid": "^5.0.3", + "nest-commander": "^3.12.2", "nestjs-throttler-storage-redis": "^0.4.1", - "next-auth": "^4.23.2", - "nodemailer": "^6.9.6", + "next-auth": "^4.24.5", + "nodemailer": "^6.9.7", "on-headers": "^1.0.2", "parse-duration": "^1.1.0", "pretty-time": "^1.1.0", - "prisma": "^5.4.2", + "prisma": "^5.6.0", "prom-client": "^15.0.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "semver": "^7.5.4", "socket.io": "^4.7.2", - "stripe": "^14.1.0", + "stripe": "^14.5.0", "ws": "^8.14.2", - "yjs": "^13.6.8" + "yjs": "^13.6.10" }, "devDependencies": { "@affine-test/kit": "workspace:*", "@affine/storage": "workspace:*", "@napi-rs/image": "^1.7.0", - "@nestjs/testing": "^10.2.7", - "@types/cookie-parser": "^1.4.4", - "@types/engine.io": "^3.1.8", - "@types/express": "^4.17.19", - "@types/graphql-upload": "^16.0.3", + "@nestjs/testing": "^10.2.10", + "@types/cookie-parser": "^1.4.6", + "@types/engine.io": "^3.1.10", + "@types/express": "^4.17.21", + "@types/graphql-upload": "^16.0.5", "@types/keyv": "^4.2.0", - "@types/lodash-es": "^4.17.9", - "@types/node": "^18.18.5", - "@types/nodemailer": "^6.4.11", - "@types/on-headers": "^1.0.1", - "@types/pretty-time": "^1.1.3", - "@types/sinon": "^10.0.19", - "@types/supertest": "^2.0.14", - "@types/ws": "^8.5.7", + "@types/lodash-es": "^4.17.11", + "@types/node": "^20.9.3", + "@types/nodemailer": "^6.4.14", + "@types/on-headers": "^1.0.3", + "@types/pretty-time": "^1.1.5", + "@types/sinon": "^17.0.2", + "@types/supertest": "^2.0.16", + "@types/ws": "^8.5.10", "ava": "^5.3.1", "c8": "^8.0.1", "nodemon": "^3.0.1", - "sinon": "^16.1.0", + "sinon": "^17.0.1", "supertest": "^6.3.3", "ts-node": "^10.9.1", - "typescript": "^5.2.2" + "typescript": "^5.3.2" }, "ava": { "extensions": { diff --git a/packages/backend/server/schema.prisma b/packages/backend/server/schema.prisma index 892810ca42..a35a4187d2 100644 --- a/packages/backend/server/schema.prisma +++ b/packages/backend/server/schema.prisma @@ -164,12 +164,14 @@ model VerificationToken { } model Blob { - id Int @id @default(autoincrement()) @db.Integer - hash String @db.VarChar - workspaceId String @map("workspace_id") @db.VarChar - blob Bytes @db.ByteA + id Int @id @default(autoincrement()) @db.Integer + hash String @db.VarChar + workspaceId String @map("workspace_id") @db.VarChar + blob Bytes @db.ByteA length BigInt - createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) + createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) + // not for keeping, but for snapshot history + deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) @@unique([workspaceId, hash]) @@map("blobs") @@ -191,8 +193,8 @@ model OptimizedBlob { // the latest snapshot of each doc that we've seen // Snapshot + Updates are the latest state of the doc model Snapshot { - id String @default(uuid()) @map("guid") @db.VarChar workspaceId String @map("workspace_id") @db.VarChar + id String @default(uuid()) @map("guid") @db.VarChar blob Bytes @db.ByteA seq Int @default(0) @db.Integer state Bytes? @db.ByteA @@ -214,6 +216,18 @@ model Update { @@map("updates") } +model SnapshotHistory { + workspaceId String @map("workspace_id") @db.VarChar(36) + id String @map("guid") @db.VarChar(36) + timestamp DateTime @db.Timestamptz(6) + blob Bytes @db.ByteA + state Bytes? @db.ByteA + expiredAt DateTime @map("expired_at") @db.Timestamptz(6) + + @@id([workspaceId, id, timestamp]) + @@map("snapshot_histories") +} + model NewFeaturesWaitingList { id String @id @default(uuid()) @db.VarChar email String @unique diff --git a/packages/backend/server/src/app.ts b/packages/backend/server/src/app.ts index de7954ba06..8441983272 100644 --- a/packages/backend/server/src/app.ts +++ b/packages/backend/server/src/app.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; +import { CacheModule } from './cache'; import { ConfigModule } from './config'; import { MetricsModule } from './metrics'; import { BusinessModules } from './modules'; @@ -10,17 +11,19 @@ import { SessionModule } from './session'; import { StorageModule } from './storage'; import { RateLimiterModule } from './throttler'; +const BasicModules = [ + PrismaModule, + ConfigModule.forRoot(), + CacheModule, + StorageModule.forRoot(), + MetricsModule, + SessionModule, + RateLimiterModule, + AuthModule, +]; + @Module({ - imports: [ - PrismaModule, - ConfigModule.forRoot(), - StorageModule.forRoot(), - MetricsModule, - SessionModule, - RateLimiterModule, - AuthModule, - ...BusinessModules, - ], + imports: [...BasicModules, ...BusinessModules], controllers: [AppController], }) export class AppModule {} diff --git a/packages/backend/server/src/cache/cache.ts b/packages/backend/server/src/cache/cache.ts new file mode 100644 index 0000000000..24df6ffe76 --- /dev/null +++ b/packages/backend/server/src/cache/cache.ts @@ -0,0 +1,330 @@ +import Keyv from 'keyv'; + +export interface CacheSetOptions { + // in milliseconds + ttl?: number; +} + +// extends if needed +export interface Cache { + // standard operation + get(key: string): Promise; + set( + key: string, + value: T, + opts?: CacheSetOptions + ): Promise; + setnx( + key: string, + value: T, + opts?: CacheSetOptions + ): Promise; + increase(key: string, count?: number): Promise; + decrease(key: string, count?: number): Promise; + delete(key: string): Promise; + has(key: string): Promise; + ttl(key: string): Promise; + expire(key: string, ttl: number): Promise; + + // list operations + pushBack(key: string, ...values: T[]): Promise; + pushFront(key: string, ...values: T[]): Promise; + len(key: string): Promise; + list(key: string, start: number, end: number): Promise; + popFront(key: string, count?: number): Promise; + popBack(key: string, count?: number): Promise; + + // map operations + mapSet( + map: string, + key: string, + value: T, + opts: CacheSetOptions + ): Promise; + mapIncrease(map: string, key: string, count?: number): Promise; + mapDecrease(map: string, key: string, count?: number): Promise; + mapGet(map: string, key: string): Promise; + mapDelete(map: string, key: string): Promise; + mapKeys(map: string): Promise; + mapRandomKey(map: string): Promise; + mapLen(map: string): Promise; +} + +export class LocalCache implements Cache { + private readonly kv: Keyv; + + constructor() { + this.kv = new Keyv(); + } + + // standard operation + async get(key: string): Promise { + return this.kv.get(key).catch(() => undefined); + } + + async set( + key: string, + value: T, + opts: CacheSetOptions = {} + ): Promise { + return this.kv + .set(key, value, opts.ttl) + .then(() => true) + .catch(() => false); + } + + async setnx( + key: string, + value: T, + opts?: CacheSetOptions | undefined + ): Promise { + if (!(await this.has(key))) { + return this.set(key, value, opts); + } + return false; + } + + async increase(key: string, count: number = 1): Promise { + const prev = (await this.get(key)) ?? 0; + if (typeof prev !== 'number') { + throw new Error( + `Expect a Number keyed by ${key}, but found ${typeof prev}` + ); + } + + const curr = prev + count; + return (await this.set(key, curr)) ? curr : prev; + } + + async decrease(key: string, count: number = 1): Promise { + return this.increase(key, -count); + } + + async delete(key: string): Promise { + return this.kv.delete(key).catch(() => false); + } + + async has(key: string): Promise { + return this.kv.has(key).catch(() => false); + } + + async ttl(key: string): Promise { + return this.kv + .get(key, { raw: true }) + .then(raw => (raw?.expires ? raw.expires - Date.now() : Infinity)) + .catch(() => 0); + } + + async expire(key: string, ttl: number): Promise { + const value = await this.kv.get(key); + return this.set(key, value, { ttl }); + } + + // list operations + private async getArray(key: string) { + const raw = await this.kv.get(key, { raw: true }); + if (raw && !Array.isArray(raw.value)) { + throw new Error( + `Expect an Array keyed by ${key}, but found ${raw.value}` + ); + } + + return raw as Keyv.DeserializedData; + } + + private async setArray( + key: string, + value: T[], + opts: CacheSetOptions = {} + ) { + return this.set(key, value, opts).then(() => value.length); + } + + async pushBack(key: string, ...values: T[]): Promise { + let list: any[] = []; + let ttl: number | undefined = undefined; + const raw = await this.getArray(key); + if (raw) { + list = raw.value; + if (raw.expires) { + ttl = raw.expires - Date.now(); + } + } + + list = list.concat(values); + return this.setArray(key, list, { ttl }); + } + + async pushFront(key: string, ...values: T[]): Promise { + let list: any[] = []; + let ttl: number | undefined = undefined; + const raw = await this.getArray(key); + if (raw) { + list = raw.value; + if (raw.expires) { + ttl = raw.expires - Date.now(); + } + } + + list = values.concat(list); + return this.setArray(key, list, { ttl }); + } + + async len(key: string): Promise { + return this.getArray(key).then(v => v?.value.length ?? 0); + } + + /** + * list array elements with `[start, end]` + * the end indice is inclusive + */ + async list( + key: string, + start: number, + end: number + ): Promise { + const raw = await this.getArray(key); + if (raw?.value) { + start = (raw.value.length + start) % raw.value.length; + end = ((raw.value.length + end) % raw.value.length) + 1; + return raw.value.slice(start, end); + } else { + return []; + } + } + + private async trim(key: string, start: number, end: number) { + const raw = await this.getArray(key); + if (raw) { + start = (raw.value.length + start) % raw.value.length; + // make negative end index work, and end indice is inclusive + end = ((raw.value.length + end) % raw.value.length) + 1; + const result = raw.value.splice(start, end); + + await this.set(key, raw.value, { + ttl: raw.expires ? raw.expires - Date.now() : undefined, + }); + + return result; + } + + return []; + } + + async popFront(key: string, count: number = 1) { + return this.trim(key, 0, count - 1); + } + + async popBack(key: string, count: number = 1) { + return this.trim(key, -count, count - 1); + } + + // map operations + private async getMap(map: string) { + const raw = await this.kv.get(map, { raw: true }); + + if (raw) { + if (typeof raw.value !== 'object') { + throw new Error( + `Expect an Object keyed by ${map}, but found ${typeof raw}` + ); + } + + if (Array.isArray(raw.value)) { + throw new Error(`Expect an Object keyed by ${map}, but found an Array`); + } + } + + return raw as Keyv.DeserializedData>; + } + + private async setMap( + map: string, + value: Record, + opts: CacheSetOptions = {} + ) { + return this.kv.set(map, value, opts.ttl).then(() => true); + } + + async mapGet(map: string, key: string): Promise { + const raw = await this.getMap(map); + if (raw?.value) { + return raw.value[key]; + } + + return undefined; + } + + async mapSet( + map: string, + key: string, + value: T + ): Promise { + const raw = await this.getMap(map); + const data = raw?.value ?? {}; + + data[key] = value; + + return this.setMap(map, data, { + ttl: raw?.expires ? raw.expires - Date.now() : undefined, + }); + } + + async mapDelete(map: string, key: string): Promise { + const raw = await this.getMap(map); + + if (raw?.value) { + delete raw.value[key]; + return this.setMap(map, raw.value, { + ttl: raw.expires ? raw.expires - Date.now() : undefined, + }); + } + + return false; + } + + async mapIncrease( + map: string, + key: string, + count: number = 1 + ): Promise { + const prev = (await this.mapGet(map, key)) ?? 0; + + if (typeof prev !== 'number') { + throw new Error( + `Expect a Number keyed by ${key}, but found ${typeof prev}` + ); + } + + const curr = prev + count; + + return (await this.mapSet(map, key, curr)) ? curr : prev; + } + + async mapDecrease( + map: string, + key: string, + count: number = 1 + ): Promise { + return this.mapIncrease(map, key, -count); + } + + async mapKeys(map: string): Promise { + const raw = await this.getMap(map); + if (raw) { + return Object.keys(raw.value); + } + + return []; + } + + async mapRandomKey(map: string): Promise { + const keys = await this.mapKeys(map); + return keys[Math.floor(Math.random() * keys.length)]; + } + + async mapLen(map: string): Promise { + const raw = await this.getMap(map); + return raw ? Object.keys(raw.value).length : 0; + } +} diff --git a/packages/backend/server/src/cache/index.ts b/packages/backend/server/src/cache/index.ts new file mode 100644 index 0000000000..621407f031 --- /dev/null +++ b/packages/backend/server/src/cache/index.ts @@ -0,0 +1,24 @@ +import { FactoryProvider, Global, Module } from '@nestjs/common'; +import { Redis } from 'ioredis'; + +import { Config } from '../config'; +import { LocalCache } from './cache'; +import { RedisCache } from './redis'; + +const CacheProvider: FactoryProvider = { + provide: LocalCache, + useFactory: (config: Config) => { + return config.redis.enabled + ? new RedisCache(new Redis(config.redis)) + : new LocalCache(); + }, + inject: [Config], +}; + +@Global() +@Module({ + providers: [CacheProvider], + exports: [CacheProvider], +}) +export class CacheModule {} +export { LocalCache as Cache }; diff --git a/packages/backend/server/src/cache/redis.ts b/packages/backend/server/src/cache/redis.ts new file mode 100644 index 0000000000..83cedf2f78 --- /dev/null +++ b/packages/backend/server/src/cache/redis.ts @@ -0,0 +1,194 @@ +import { Redis } from 'ioredis'; + +import { Cache, CacheSetOptions } from './cache'; + +export class RedisCache implements Cache { + constructor(private readonly redis: Redis) {} + + // standard operation + async get(key: string): Promise { + return this.redis + .get(key) + .then(v => { + if (v) { + return JSON.parse(v); + } + return undefined; + }) + .catch(() => undefined); + } + + async set( + key: string, + value: T, + opts: CacheSetOptions = {} + ): Promise { + if (opts.ttl) { + return this.redis + .set(key, JSON.stringify(value), 'PX', opts.ttl) + .then(() => true) + .catch(() => false); + } + + return this.redis + .set(key, JSON.stringify(value)) + .then(() => true) + .catch(() => false); + } + + async increase(key: string, count: number = 1): Promise { + return this.redis.incrby(key, count).catch(() => 0); + } + + async decrease(key: string, count: number = 1): Promise { + return this.redis.decrby(key, count).catch(() => 0); + } + + async setnx( + key: string, + value: T, + opts: CacheSetOptions = {} + ): Promise { + if (opts.ttl) { + return this.redis + .set(key, JSON.stringify(value), 'PX', opts.ttl, 'NX') + .then(v => !!v) + .catch(() => false); + } + + return this.redis + .set(key, JSON.stringify(value), 'NX') + .then(v => !!v) + .catch(() => false); + } + + async delete(key: string): Promise { + return this.redis + .del(key) + .then(v => v > 0) + .catch(() => false); + } + + async has(key: string): Promise { + return this.redis + .exists(key) + .then(v => v > 0) + .catch(() => false); + } + + async ttl(key: string): Promise { + return this.redis.ttl(key).catch(() => 0); + } + + async expire(key: string, ttl: number): Promise { + return this.redis + .pexpire(key, ttl) + .then(v => v > 0) + .catch(() => false); + } + + // list operations + async pushBack(key: string, ...values: T[]): Promise { + return this.redis + .rpush(key, ...values.map(v => JSON.stringify(v))) + .catch(() => 0); + } + + async pushFront(key: string, ...values: T[]): Promise { + return this.redis + .lpush(key, ...values.map(v => JSON.stringify(v))) + .catch(() => 0); + } + + async len(key: string): Promise { + return this.redis.llen(key).catch(() => 0); + } + + async list( + key: string, + start: number, + end: number + ): Promise { + return this.redis + .lrange(key, start, end) + .then(data => data.map(v => JSON.parse(v))) + .catch(() => []); + } + + async popFront(key: string, count: number = 1): Promise { + return this.redis + .lpop(key, count) + .then(data => (data ?? []).map(v => JSON.parse(v))) + .catch(() => []); + } + + async popBack(key: string, count: number = 1): Promise { + return this.redis + .rpop(key, count) + .then(data => (data ?? []).map(v => JSON.parse(v))) + .catch(() => []); + } + + // map operations + async mapSet( + map: string, + key: string, + value: T + ): Promise { + return this.redis + .hset(map, key, JSON.stringify(value)) + .then(v => v > 0) + .catch(() => false); + } + + async mapIncrease( + map: string, + key: string, + count: number = 1 + ): Promise { + return this.redis.hincrby(map, key, count); + } + + async mapDecrease( + map: string, + key: string, + count: number = 1 + ): Promise { + return this.redis.hincrby(map, key, -count); + } + + async mapGet(map: string, key: string): Promise { + return this.redis + .hget(map, key) + .then(v => (v ? JSON.parse(v) : undefined)) + .catch(() => undefined); + } + + async mapDelete(map: string, key: string): Promise { + return this.redis + .hdel(map, key) + .then(v => v > 0) + .catch(() => false); + } + + async mapKeys(map: string): Promise { + return this.redis.hkeys(map).catch(() => []); + } + + async mapRandomKey(map: string): Promise { + return this.redis + .hrandfield(map, 1) + .then(v => + typeof v === 'string' + ? v + : Array.isArray(v) + ? (v[0] as string) + : undefined + ) + .catch(() => undefined); + } + + async mapLen(map: string): Promise { + return this.redis.hlen(map).catch(() => 0); + } +} diff --git a/packages/backend/server/src/config/def.ts b/packages/backend/server/src/config/def.ts index b7d1493d4a..895df5f08d 100644 --- a/packages/backend/server/src/config/def.ts +++ b/packages/backend/server/src/config/def.ts @@ -57,10 +57,10 @@ export function parseEnvValue(value: string | undefined, type?: EnvConfigType) { return type === 'int' ? int(value) : type === 'float' - ? float(value) - : type === 'boolean' - ? boolean(value) - : value; + ? float(value) + : type === 'boolean' + ? boolean(value) + : value; } /** @@ -362,6 +362,14 @@ export interface AFFiNEConfig { */ experimentalMergeWithJwstCodec: boolean; }; + history: { + /** + * How long the buffer time of creating a new history snapshot when doc get updated. + * + * in {ms} + */ + interval: number; + }; }; payment: { diff --git a/packages/backend/server/src/config/default.ts b/packages/backend/server/src/config/default.ts index 271c72a94b..04e6aaacc3 100644 --- a/packages/backend/server/src/config/default.ts +++ b/packages/backend/server/src/config/default.ts @@ -209,6 +209,9 @@ export const getDefaultAFFiNEConfig: () => AFFiNEConfig = () => { updatePollInterval: 3000, experimentalMergeWithJwstCodec: false, }, + history: { + interval: 1000 * 60 * 10 /* 10 mins */, + }, }, payment: { stripe: { diff --git a/packages/backend/server/src/metrics/index.ts b/packages/backend/server/src/metrics/index.ts index 7828b3b980..a4f375e25d 100644 --- a/packages/backend/server/src/metrics/index.ts +++ b/packages/backend/server/src/metrics/index.ts @@ -10,3 +10,4 @@ import { Metrics } from './metrics'; controllers: [MetricsController], }) export class MetricsModule {} +export { Metrics }; diff --git a/packages/backend/server/src/metrics/metrics.ts b/packages/backend/server/src/metrics/metrics.ts index 4a09d802c1..5df022c80e 100644 --- a/packages/backend/server/src/metrics/metrics.ts +++ b/packages/backend/server/src/metrics/metrics.ts @@ -25,4 +25,7 @@ export class Metrics implements OnModuleDestroy { authCounter = metricsCreator.counter('auth'); authFailCounter = metricsCreator.counter('auth_fail', ['reason']); + + docHistoryCounter = metricsCreator.counter('doc_history_created'); + docRecoverCounter = metricsCreator.counter('doc_history_recovered'); } diff --git a/packages/backend/server/src/modules/doc/history.ts b/packages/backend/server/src/modules/doc/history.ts new file mode 100644 index 0000000000..61ae73e55d --- /dev/null +++ b/packages/backend/server/src/modules/doc/history.ts @@ -0,0 +1,241 @@ +import { isDeepStrictEqual } from 'node:util'; + +import { Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { Cron, CronExpression } from '@nestjs/schedule'; +import type { Snapshot } from '@prisma/client'; + +import { Config } from '../../config'; +import { Metrics } from '../../metrics'; +import { PrismaService } from '../../prisma'; +import { SubscriptionStatus } from '../payment/service'; +import { Permission } from '../workspaces/types'; + +@Injectable() +export class DocHistoryManager { + private readonly logger = new Logger(DocHistoryManager.name); + constructor( + private readonly config: Config, + private readonly db: PrismaService, + private readonly metrics: Metrics + ) {} + + @OnEvent('doc:manager:snapshot:beforeUpdate') + async onDocUpdated(snapshot: Snapshot, forceCreate = false) { + const last = await this.last(snapshot.workspaceId, snapshot.id); + + let shouldCreateHistory = false; + + if (!last) { + // never created + shouldCreateHistory = true; + } else if (last.timestamp === snapshot.updatedAt) { + // no change + shouldCreateHistory = false; + } else if ( + // force + forceCreate || + // last history created before interval in configs + last.timestamp.getTime() < + snapshot.updatedAt.getTime() - this.config.doc.history.interval + ) { + shouldCreateHistory = true; + } + + if (shouldCreateHistory) { + // skip the history recording when no actual update on snapshot happended + if (last && isDeepStrictEqual(last.state, snapshot.state)) { + this.logger.debug( + `State matches, skip creating history record for ${snapshot.id} in workspace ${snapshot.workspaceId}` + ); + return; + } + + await this.db.snapshotHistory + .create({ + select: { + timestamp: true, + }, + data: { + workspaceId: snapshot.workspaceId, + id: snapshot.id, + timestamp: snapshot.updatedAt, + blob: snapshot.blob, + state: snapshot.state, + expiredAt: await this.getExpiredDateFromNow(snapshot.workspaceId), + }, + }) + .catch(() => { + // safe to ignore + // only happens when duplicated history record created in multi processes + }); + this.metrics.docHistoryCounter(1, {}); + this.logger.log( + `History created for ${snapshot.id} in workspace ${snapshot.workspaceId}.` + ); + } + } + + async list( + workspaceId: string, + id: string, + before: Date = new Date(), + take: number = 10 + ) { + return this.db.snapshotHistory.findMany({ + select: { + timestamp: true, + }, + where: { + workspaceId, + id, + timestamp: { + lte: before, + }, + // only include the ones has not expired + expiredAt: { + gt: new Date(), + }, + }, + orderBy: { + timestamp: 'desc', + }, + take, + }); + } + + async count(workspaceId: string, id: string) { + return this.db.snapshotHistory.count({ + where: { + workspaceId, + id, + expiredAt: { + gt: new Date(), + }, + }, + }); + } + + async get(workspaceId: string, id: string, timestamp: Date) { + return this.db.snapshotHistory.findUnique({ + where: { + workspaceId_id_timestamp: { + workspaceId, + id, + timestamp, + }, + expiredAt: { + gt: new Date(), + }, + }, + }); + } + + async last(workspaceId: string, id: string) { + return this.db.snapshotHistory.findFirst({ + where: { + workspaceId, + id, + }, + select: { + timestamp: true, + state: true, + }, + orderBy: { + timestamp: 'desc', + }, + }); + } + + async recover(workspaceId: string, id: string, timestamp: Date) { + const history = await this.db.snapshotHistory.findUnique({ + where: { + workspaceId_id_timestamp: { + workspaceId, + id, + timestamp, + }, + }, + }); + + if (!history) { + throw new Error('Given history not found'); + } + + const oldSnapshot = await this.db.snapshot.findUnique({ + where: { + id_workspaceId: { + id, + workspaceId, + }, + }, + }); + + if (!oldSnapshot) { + // unreachable actually + throw new Error('Given Doc not found'); + } + + // save old snapshot as one history record + await this.onDocUpdated(oldSnapshot, true); + // WARN: + // we should never do the snapshot updating in recovering, + // which is not the solution in CRDT. + // let user revert in client and update the data in sync system + // `await this.db.snapshot.update();` + this.metrics.docRecoverCounter(1, {}); + + return history.timestamp; + } + + /** + * @todo(@darkskygit) refactor with [Usage Control] system + */ + async getExpiredDateFromNow(workspaceId: string) { + const permission = await this.db.workspaceUserPermission.findFirst({ + select: { + userId: true, + }, + where: { + workspaceId, + type: Permission.Owner, + }, + }); + + if (!permission) { + // unreachable actually + throw new Error('Workspace owner not found'); + } + + const sub = await this.db.userSubscription.findFirst({ + select: { + id: true, + }, + where: { + userId: permission.userId, + status: SubscriptionStatus.Active, + }, + }); + + return new Date( + Date.now() + + 1000 * + 60 * + 60 * + 24 * + // 30 days for subscription user, 7 days for free user + (sub ? 30 : 7) + ); + } + + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT /* everyday at 12am */) + async cleanupExpiredHistory() { + await this.db.snapshotHistory.deleteMany({ + where: { + expiredAt: { + lte: new Date(), + }, + }, + }); + } +} diff --git a/packages/backend/server/src/modules/doc/index.ts b/packages/backend/server/src/modules/doc/index.ts index 806d3f157f..bc4b719f5e 100644 --- a/packages/backend/server/src/modules/doc/index.ts +++ b/packages/backend/server/src/modules/doc/index.ts @@ -1,7 +1,7 @@ import { DynamicModule } from '@nestjs/common'; +import { DocHistoryManager } from './history'; import { DocManager } from './manager'; -import { RedisDocManager } from './redis-manager'; export class DocModule { /** @@ -15,14 +15,10 @@ export class DocModule { provide: 'DOC_MANAGER_AUTOMATION', useValue: automation, }, - { - provide: DocManager, - useClass: globalThis.AFFiNE.redis.enabled - ? RedisDocManager - : DocManager, - }, + DocManager, + DocHistoryManager, ], - exports: [DocManager], + exports: [DocManager, DocHistoryManager], }; } @@ -39,4 +35,4 @@ export class DocModule { } } -export { DocManager }; +export { DocHistoryManager, DocManager }; diff --git a/packages/backend/server/src/modules/doc/manager.ts b/packages/backend/server/src/modules/doc/manager.ts index c97027f2cd..154546da33 100644 --- a/packages/backend/server/src/modules/doc/manager.ts +++ b/packages/backend/server/src/modules/doc/manager.ts @@ -5,6 +5,7 @@ import { OnModuleDestroy, OnModuleInit, } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { Snapshot, Update } from '@prisma/client'; import { chunk } from 'lodash-es'; import { defer, retry } from 'rxjs'; @@ -16,6 +17,7 @@ import { transact, } from 'yjs'; +import { Cache } from '../../cache'; import { Config } from '../../config'; import { Metrics } from '../../metrics/metrics'; import { PrismaService } from '../../prisma'; @@ -58,17 +60,19 @@ const MAX_SEQ_NUM = 0x3fffffff; // u31 */ @Injectable() export class DocManager implements OnModuleInit, OnModuleDestroy { - protected logger = new Logger(DocManager.name); + private logger = new Logger(DocManager.name); private job: NodeJS.Timeout | null = null; private seqMap = new Map(); private busy = false; constructor( - protected readonly db: PrismaService, @Inject('DOC_MANAGER_AUTOMATION') - protected readonly automation: boolean, - protected readonly config: Config, - protected readonly metrics: Metrics + private readonly automation: boolean, + private readonly db: PrismaService, + private readonly config: Config, + private readonly metrics: Metrics, + private readonly cache: Cache, + private readonly event: EventEmitter2 ) {} onModuleInit() { @@ -82,7 +86,7 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { this.destroy(); } - protected recoverDoc(...updates: Buffer[]): Promise { + private recoverDoc(...updates: Buffer[]): Promise { const doc = new Doc(); const chunks = chunk(updates, 10); @@ -95,11 +99,7 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { try { applyUpdate(doc, u); } catch (e) { - this.logger.error( - `Failed to apply update: ${updates - .map(u => u.toString('hex')) - .join('\n')}` - ); + this.logger.error('Failed to apply update', e); } }); }); @@ -117,14 +117,12 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { }); } - protected async applyUpdates( - guid: string, - ...updates: Buffer[] - ): Promise { + private async applyUpdates(guid: string, ...updates: Buffer[]): Promise { const doc = await this.recoverDoc(...updates); // test jwst codec if ( + this.config.affine.canary && this.config.doc.manager.experimentalMergeWithJwstCodec && updates.length < 100 /* avoid overloading */ ) { @@ -149,7 +147,7 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { this.logger.warn(`jwst apply update failed for ${guid}: ${e}`); log = true; } finally { - if (log) { + if (log && this.config.node.dev) { this.logger.warn( `Updates: ${updates.map(u => u.toString('hex')).join('\n')}` ); @@ -223,8 +221,8 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { .pipe(retry(retryTimes)) // retry until seq num not conflict .subscribe({ next: () => { - this.logger.verbose( - `pushed update for workspace: ${workspaceId}, guid: ${guid}` + this.logger.debug( + `pushed 1 update for ${guid} in workspace ${workspaceId}` ); resolve(); }, @@ -233,6 +231,8 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { reject(new Error('Failed to push update')); }, }); + }).then(() => { + return this.updateCachedUpdatesCount(workspaceId, guid, 1); }); } @@ -267,8 +267,8 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { .pipe(retry(retryTimes)) // retry until seq num not conflict .subscribe({ next: () => { - this.logger.verbose( - `pushed updates for workspace: ${workspaceId}, guid: ${guid}` + this.logger.debug( + `pushed ${updates.length} updates for ${guid} in workspace ${workspaceId}` ); resolve(); }, @@ -277,6 +277,8 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { reject(new Error('Failed to push update')); }, }); + }).then(() => { + return this.updateCachedUpdatesCount(workspaceId, guid, updates.length); }); } @@ -363,21 +365,22 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { /** * apply pending updates to snapshot */ - protected async autoSquash() { + private async autoSquash() { // find the first update and batch process updates with same id - const first = await this.db.update.findFirst({ - select: { - id: true, - workspaceId: true, - }, - }); + const candidate = await this.getAutoSquashCandidate(); // no pending updates - if (!first) { + if (!candidate) { return; } - const { id, workspaceId } = first; + const { id, workspaceId } = candidate; + // acquire lock + const ok = await this.lockUpdatesForAutoSquash(workspaceId, id); + + if (!ok) { + return; + } try { await this._get(workspaceId, id); @@ -386,14 +389,31 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { `Failed to apply updates for workspace: ${workspaceId}, guid: ${id}` ); this.logger.error(e); + } finally { + await this.unlockUpdatesForAutoSquash(workspaceId, id); } } - protected async upsert( + private async getAutoSquashCandidate() { + const cache = await this.getAutoSquashCandidateFromCache(); + + if (cache) { + return cache; + } + + return this.db.update.findFirst({ + select: { + id: true, + workspaceId: true, + }, + }); + } + + private async upsert( workspaceId: string, guid: string, doc: Doc, - seq?: number + initialSeq?: number ) { const blob = Buffer.from(encodeStateAsUpdate(doc)); const state = Buffer.from(encodeStateVector(doc)); @@ -417,7 +437,7 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { workspaceId, blob, state, - seq, + seq: initialSeq, }, update: { blob, @@ -426,7 +446,7 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { }); } - protected async _get( + private async _get( workspaceId: string, guid: string ): Promise<{ doc: Doc } | { snapshot: Buffer } | null> { @@ -446,22 +466,29 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { * Squash updates into a single update and save it as snapshot, * and delete the updates records at the same time. */ - protected async squash(updates: Update[], snapshot: Snapshot | null) { + private async squash(updates: Update[], snapshot: Snapshot | null) { if (!updates.length) { throw new Error('No updates to squash'); } const first = updates[0]; const last = updates[updates.length - 1]; + const { id, workspaceId } = first; + const doc = await this.applyUpdates( first.id, snapshot ? snapshot.blob : Buffer.from([0, 0]), ...updates.map(u => u.blob) ); - const { id, workspaceId } = first; + if (snapshot) { + this.event.emit('doc:manager:snapshot:beforeUpdate', snapshot); + } await this.upsert(workspaceId, id, doc, last.seq); + this.logger.debug( + `Squashed ${updates.length} updates for ${id} in workspace ${workspaceId}` + ); await this.db.update.deleteMany({ where: { id, @@ -471,6 +498,8 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { }, }, }); + + await this.updateCachedUpdatesCount(workspaceId, id, -updates.length); return doc; } @@ -496,6 +525,9 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { // reset if (seq >= MAX_SEQ_NUM) { await this.db.snapshot.update({ + select: { + seq: true, + }, where: { id_workspaceId: { workspaceId, @@ -516,4 +548,56 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { return last + batch; } } + + private async updateCachedUpdatesCount( + workspaceId: string, + guid: string, + count: number + ) { + const result = await this.cache.mapIncrease( + `doc:manager:updates`, + `${workspaceId}::${guid}`, + count + ); + + if (result <= 0) { + await this.cache.mapDelete( + `doc:manager:updates`, + `${workspaceId}::${guid}` + ); + } + } + + private async getAutoSquashCandidateFromCache() { + const key = await this.cache.mapRandomKey('doc:manager:updates'); + + if (key) { + const count = await this.cache.mapGet('doc:manager:updates', key); + if (typeof count === 'number' && count > 0) { + const [workspaceId, id] = key.split('::'); + return { id, workspaceId }; + } + } + + return null; + } + + private async lockUpdatesForAutoSquash(workspaceId: string, guid: string) { + return this.cache.setnx( + `doc:manager:updates-lock:${workspaceId}::${guid}`, + 1, + { + ttl: 60 * 1000, + } + ); + } + + private async unlockUpdatesForAutoSquash(workspaceId: string, guid: string) { + return this.cache + .delete(`doc:manager:updates-lock:${workspaceId}::${guid}`) + .catch(e => { + // safe, the lock will be expired when ttl ends + this.logger.error('Failed to release updates lock', e); + }); + } } diff --git a/packages/backend/server/src/modules/doc/redis-manager.ts b/packages/backend/server/src/modules/doc/redis-manager.ts deleted file mode 100644 index 3ae69c3b26..0000000000 --- a/packages/backend/server/src/modules/doc/redis-manager.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import Redis from 'ioredis'; - -import { Config } from '../../config'; -import { Metrics } from '../../metrics/metrics'; -import { PrismaService } from '../../prisma'; -import { DocID } from '../../utils/doc'; -import { DocManager } from './manager'; - -function makeKey(prefix: string) { - return (parts: TemplateStringsArray, ...args: any[]) => { - return parts.reduce((prev, curr, i) => { - return prev + curr + (args[i] || ''); - }, prefix); - }; -} - -const pending = 'um_pending:'; -const updates = makeKey('um_u:'); -const lock = makeKey('um_l:'); - -const pushUpdateLua = ` - redis.call('sadd', KEYS[1], ARGV[1]) - redis.call('rpush', KEYS[2], ARGV[2]) -`; - -/** - * @deprecated unstable - */ -@Injectable() -export class RedisDocManager extends DocManager { - private readonly redis: Redis; - - constructor( - protected override readonly db: PrismaService, - @Inject('DOC_MANAGER_AUTOMATION') - protected override readonly automation: boolean, - protected override readonly config: Config, - protected override readonly metrics: Metrics - ) { - super(db, automation, config, metrics); - this.redis = new Redis(config.redis); - this.redis.defineCommand('pushDocUpdate', { - numberOfKeys: 2, - lua: pushUpdateLua, - }); - } - - override onModuleInit(): void { - if (this.automation) { - this.setup(); - } - } - - override async autoSquash(): Promise { - // incase some update fallback to db - await super.autoSquash(); - - // consume rest updates in redis queue - const pendingDoc = await this.redis.spop(pending).catch(() => null); // safe - - if (!pendingDoc) { - return; - } - - const docId = new DocID(pendingDoc); - const updateKey = updates`${pendingDoc}`; - const lockKey = lock`${pendingDoc}`; - - // acquire the lock - const lockResult = await this.redis - .set( - lockKey, - '1', - 'EX', - // 10mins, incase progress exit in between lock require & release, which is a rare. - // if the lock is really hold more then 10mins, we should check the merge logic correctness - 600, - 'NX' - ) - .catch(() => null); // safe; - - if (!lockResult) { - // we failed to acquire the lock, put the pending doc back to queue. - await this.redis.sadd(pending, pendingDoc).catch(() => null); // safe - return; - } - - try { - // fetch pending updates - const updates = await this.redis - .lrangeBuffer(updateKey, 0, -1) - .catch(() => []); // safe - - if (!updates.length) { - return; - } - - this.logger.verbose( - `applying ${updates.length} updates for workspace: ${docId}` - ); - - const snapshot = await this.getSnapshot(docId.workspace, docId.guid); - - // merge - const doc = await (snapshot - ? this.applyUpdates(docId.full, snapshot.blob, ...updates) - : this.applyUpdates(docId.full, ...updates)); - - // update snapshot - await this.upsert(docId.workspace, docId.guid, doc, snapshot?.seq); - - // delete merged updates - await this.redis - .ltrim(updateKey, updates.length, -1) - // safe, fallback to mergeUpdates - .catch(e => { - this.logger.error(`Failed to remove merged updates from Redis: ${e}`); - }); - } catch (e) { - this.logger.error( - `Failed to merge updates with snapshot for ${docId}: ${e}` - ); - await this.redis.sadd(pending, docId.toString()).catch(() => null); // safe - } finally { - await this.redis.del(lockKey); - } - } -} diff --git a/packages/backend/server/src/modules/index.ts b/packages/backend/server/src/modules/index.ts index 600c5154b2..34458f4a2d 100644 --- a/packages/backend/server/src/modules/index.ts +++ b/packages/backend/server/src/modules/index.ts @@ -1,5 +1,6 @@ import { DynamicModule, Type } from '@nestjs/common'; import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ScheduleModule } from '@nestjs/schedule'; import { GqlModule } from '../graphql.module'; import { AuthModule } from './auth'; @@ -11,7 +12,11 @@ import { WorkspaceModule } from './workspaces'; const { SERVER_FLAVOR } = process.env; -const BusinessModules: (Type | DynamicModule)[] = []; +const BusinessModules: (Type | DynamicModule)[] = [ + EventEmitterModule.forRoot({ + global: true, + }), +]; switch (SERVER_FLAVOR) { case 'sync': @@ -19,9 +24,7 @@ switch (SERVER_FLAVOR) { break; case 'graphql': BusinessModules.push( - EventEmitterModule.forRoot({ - global: true, - }), + ScheduleModule.forRoot(), GqlModule, WorkspaceModule, UsersModule, @@ -33,9 +36,7 @@ switch (SERVER_FLAVOR) { case 'allinone': default: BusinessModules.push( - EventEmitterModule.forRoot({ - global: true, - }), + ScheduleModule.forRoot(), GqlModule, WorkspaceModule, UsersModule, diff --git a/packages/backend/server/src/modules/workspaces/controller.ts b/packages/backend/server/src/modules/workspaces/controller.ts index 219a10fdf8..6af8867d5a 100644 --- a/packages/backend/server/src/modules/workspaces/controller.ts +++ b/packages/backend/server/src/modules/workspaces/controller.ts @@ -12,12 +12,14 @@ import { import type { Response } from 'express'; import format from 'pretty-time'; +import { PrismaService } from '../../prisma'; import { StorageProvide } from '../../storage'; import { DocID } from '../../utils/doc'; import { Auth, CurrentUser, Publicable } from '../auth'; -import { DocManager } from '../doc'; +import { DocHistoryManager, DocManager } from '../doc'; import { UserType } from '../users'; -import { PermissionService } from './permission'; +import { PermissionService, PublicPageMode } from './permission'; +import { Permission } from './types'; @Controller('/api/workspaces') export class WorkspacesController { @@ -26,7 +28,9 @@ export class WorkspacesController { constructor( @Inject(StorageProvide) private readonly storage: Storage, private readonly permission: PermissionService, - private readonly docManager: DocManager + private readonly docManager: DocManager, + private readonly historyManager: DocHistoryManager, + private readonly prisma: PrismaService ) {} // get workspace blob @@ -82,8 +86,62 @@ export class WorkspacesController { throw new NotFoundException('Doc not found'); } + if (!docId.isWorkspace) { + // fetch the publish page mode for publish page + const publishPage = await this.prisma.workspacePage.findUnique({ + where: { + workspaceId_pageId: { + workspaceId: docId.workspace, + pageId: docId.guid, + }, + }, + }); + const publishPageMode = + publishPage?.mode === PublicPageMode.Edgeless ? 'edgeless' : 'page'; + + res.setHeader('publish-mode', publishPageMode); + } + res.setHeader('content-type', 'application/octet-stream'); res.send(update); this.logger.debug(`workspaces doc api: ${format(process.hrtime(start))}`); } + + @Get('/:id/docs/:guid/histories/:timestamp') + @Auth() + async history( + @CurrentUser() user: UserType, + @Param('id') ws: string, + @Param('guid') guid: string, + @Param('timestamp') timestamp: string, + @Res() res: Response + ) { + const docId = new DocID(guid, ws); + let ts; + try { + ts = new Date(timestamp); + } catch (e) { + throw new Error('Invalid timestamp'); + } + + await this.permission.checkPagePermission( + docId.workspace, + docId.guid, + user.id, + Permission.Write + ); + + const history = await this.historyManager.get( + docId.workspace, + docId.guid, + ts + ); + + if (history) { + res.setHeader('content-type', 'application/octet-stream'); + res.send(history.blob); + } else { + throw new NotFoundException('Doc history not found'); + } + } } diff --git a/packages/backend/server/src/modules/workspaces/history.resolver.ts b/packages/backend/server/src/modules/workspaces/history.resolver.ts new file mode 100644 index 0000000000..ad9483a542 --- /dev/null +++ b/packages/backend/server/src/modules/workspaces/history.resolver.ts @@ -0,0 +1,92 @@ +import { + Args, + Field, + GraphQLISODateTime, + Int, + Mutation, + ObjectType, + Parent, + ResolveField, + Resolver, +} from '@nestjs/graphql'; +import type { SnapshotHistory } from '@prisma/client'; + +import { DocID } from '../../utils/doc'; +import { Auth, CurrentUser } from '../auth'; +import { DocHistoryManager } from '../doc/history'; +import { UserType } from '../users'; +import { PermissionService } from './permission'; +import { WorkspaceType } from './resolver'; +import { Permission } from './types'; + +@ObjectType() +class DocHistoryType implements Partial { + @Field() + workspaceId!: string; + + @Field() + id!: string; + + @Field(() => GraphQLISODateTime) + timestamp!: Date; +} + +@Resolver(() => WorkspaceType) +export class DocHistoryResolver { + constructor( + private readonly historyManager: DocHistoryManager, + private readonly permission: PermissionService + ) {} + + @ResolveField(() => [DocHistoryType]) + async histories( + @Parent() workspace: WorkspaceType, + @Args('guid') guid: string, + @Args({ name: 'before', type: () => GraphQLISODateTime, nullable: true }) + timestamp: Date = new Date(), + @Args({ name: 'take', type: () => Int, nullable: true }) + take?: number + ): Promise { + const docId = new DocID(guid, workspace.id); + + if (docId.isWorkspace) { + throw new Error('Invalid guid for listing doc histories.'); + } + + return this.historyManager + .list(workspace.id, docId.guid, timestamp, take) + .then(rows => + rows.map(({ timestamp }) => { + return { + workspaceId: workspace.id, + id: docId.guid, + timestamp, + }; + }) + ); + } + + @Auth() + @Mutation(() => Date) + async recoverDoc( + @CurrentUser() user: UserType, + @Args('workspaceId') workspaceId: string, + @Args('guid') guid: string, + @Args({ name: 'timestamp', type: () => GraphQLISODateTime }) timestamp: Date + ): Promise { + const docId = new DocID(guid, workspaceId); + + if (docId.isWorkspace) { + throw new Error('Invalid guid for recovering doc from history.'); + } + + await this.permission.checkPagePermission( + docId.workspace, + docId.guid, + user.id, + Permission.Write + ); + + return this.historyManager.recover(docId.workspace, docId.guid, timestamp); + } +} diff --git a/packages/backend/server/src/modules/workspaces/index.ts b/packages/backend/server/src/modules/workspaces/index.ts index 877b5f3d2b..58a9f377af 100644 --- a/packages/backend/server/src/modules/workspaces/index.ts +++ b/packages/backend/server/src/modules/workspaces/index.ts @@ -3,6 +3,7 @@ import { Module } from '@nestjs/common'; import { DocModule } from '../doc'; import { UsersService } from '../users'; import { WorkspacesController } from './controller'; +import { DocHistoryResolver } from './history.resolver'; import { PermissionService } from './permission'; import { PagePermissionResolver, WorkspaceResolver } from './resolver'; @@ -14,6 +15,7 @@ import { PagePermissionResolver, WorkspaceResolver } from './resolver'; PermissionService, UsersService, PagePermissionResolver, + DocHistoryResolver, ], exports: [PermissionService], }) diff --git a/packages/backend/server/src/modules/workspaces/permission.ts b/packages/backend/server/src/modules/workspaces/permission.ts index b6e9a20843..d735625998 100644 --- a/packages/backend/server/src/modules/workspaces/permission.ts +++ b/packages/backend/server/src/modules/workspaces/permission.ts @@ -244,18 +244,20 @@ export class PermissionService { permission = Permission.Read ) { // check whether page is public - const count = await this.prisma.workspacePage.count({ - where: { - workspaceId: ws, - pageId: page, - public: true, - }, - }); + if (permission === Permission.Read) { + const count = await this.prisma.workspacePage.count({ + where: { + workspaceId: ws, + pageId: page, + public: true, + }, + }); - // page is public - // accessible - if (count > 0) { - return true; + // page is public + // accessible + if (count > 0) { + return true; + } } if (user) { diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index af26c82dc2..9bbce9fb1c 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -192,6 +192,7 @@ type WorkspaceType { """Public pages of a workspace""" publicPages: [WorkspacePage!]! + histories(guid: String!, before: DateTime, take: Int): [DocHistoryType!]! } type InvitationWorkspaceType { @@ -232,6 +233,12 @@ enum PublicPageMode { Edgeless } +type DocHistoryType { + workspaceId: String! + id: String! + timestamp: DateTime! +} + type Query { """Get is owner of workspace""" isOwner(workspaceId: String!): Boolean! @@ -288,6 +295,7 @@ type Mutation { publishPage(workspaceId: String!, pageId: String!, mode: PublicPageMode = Page): WorkspacePage! revokePage(workspaceId: String!, pageId: String!): Boolean! @deprecated(reason: "use revokePublicPage") revokePublicPage(workspaceId: String!, pageId: String!): WorkspacePage! + recoverDoc(workspaceId: String!, guid: String!, timestamp: DateTime!): DateTime! """Upload user avatar""" uploadAvatar(avatar: Upload!): UserType! diff --git a/packages/backend/server/src/utils/types.ts b/packages/backend/server/src/utils/types.ts index 37d9c4d4a0..10079af2b5 100644 --- a/packages/backend/server/src/utils/types.ts +++ b/packages/backend/server/src/utils/types.ts @@ -1,12 +1,12 @@ export type DeepPartial = T extends Array ? DeepPartial[] : T extends ReadonlyArray - ? ReadonlyArray> - : T extends object - ? { - [K in keyof T]?: DeepPartial; - } - : T; + ? ReadonlyArray> + : T extends object + ? { + [K in keyof T]?: DeepPartial; + } + : T; type Join = Prefix extends string | number ? Suffixes extends string | number @@ -32,11 +32,11 @@ export type LeafPaths< > = Depth extends MaxDepth ? never : T extends Record - ? { - [K in keyof T]-?: K extends string | number - ? T[K] extends PrimitiveType - ? K - : Join> - : never; - }[keyof T] - : never; + ? { + [K in keyof T]-?: K extends string | number + ? T[K] extends PrimitiveType + ? K + : Join> + : never; + }[keyof T] + : never; diff --git a/packages/backend/server/tests/cache.spec.ts b/packages/backend/server/tests/cache.spec.ts new file mode 100644 index 0000000000..6ffc2c2f00 --- /dev/null +++ b/packages/backend/server/tests/cache.spec.ts @@ -0,0 +1,108 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import test from 'ava'; + +import { Cache, CacheModule } from '../src/cache'; +import { ConfigModule } from '../src/config'; + +let cache: Cache; +let module: TestingModule; +test.beforeEach(async () => { + module = await Test.createTestingModule({ + imports: [ConfigModule.forRoot(), CacheModule], + }).compile(); + const prefix = Math.random().toString(36).slice(2, 7); + cache = new Proxy(module.get(Cache), { + get(target, prop) { + // @ts-expect-error safe + const fn = target[prop]; + if (typeof fn === 'function') { + // replase first parameter of fn with prefix + return (...args: any[]) => + fn.call(target, `${prefix}:${args[0]}`, ...args.slice(1)); + } + + return fn; + }, + }); +}); + +test.afterEach(async () => { + await module.close(); +}); + +test('should be able to set normal cache', async t => { + t.true(await cache.set('test', 1)); + t.is(await cache.get('test'), 1); + + t.true(await cache.has('test')); + t.true(await cache.delete('test')); + t.is(await cache.get('test'), undefined); + + t.true(await cache.set('test', { a: 1 })); + t.deepEqual(await cache.get('test'), { a: 1 }); +}); + +test('should be able to set cache with non-exiting flag', async t => { + t.true(await cache.setnx('test', 1)); + t.false(await cache.setnx('test', 2)); + t.is(await cache.get('test'), 1); +}); + +test('should be able to set cache with ttl', async t => { + t.true(await cache.set('test', 1)); + t.is(await cache.get('test'), 1); + + t.true(await cache.expire('test', 1 * 1000)); + const ttl = await cache.ttl('test'); + t.true(ttl <= 1 * 1000); + t.true(ttl > 0); +}); + +test('should be able to incr/decr number cache', async t => { + t.true(await cache.set('test', 1)); + t.is(await cache.increase('test'), 2); + t.is(await cache.increase('test'), 3); + t.is(await cache.decrease('test'), 2); + t.is(await cache.decrease('test'), 1); + + // increase an nonexists number + t.is(await cache.increase('test2'), 1); + t.is(await cache.increase('test2'), 2); +}); + +test('should be able to manipulate list cache', async t => { + t.is(await cache.pushBack('test', 1), 1); + t.is(await cache.pushBack('test', 2, 3, 4), 4); + t.is(await cache.len('test'), 4); + + t.deepEqual(await cache.list('test', 1, -1), [2, 3, 4]); + + t.deepEqual(await cache.popFront('test', 2), [1, 2]); + t.deepEqual(await cache.popBack('test', 1), [4]); + + t.is(await cache.pushBack('test2', { a: 1 }), 1); + t.deepEqual(await cache.popFront('test2', 1), [{ a: 1 }]); +}); + +test('should be able to manipulate map cache', async t => { + t.is(await cache.mapSet('test', 'a', 1), true); + t.is(await cache.mapSet('test', 'b', 2), true); + t.is(await cache.mapLen('test'), 2); + + t.is(await cache.mapGet('test', 'a'), 1); + t.is(await cache.mapGet('test', 'b'), 2); + + t.is(await cache.mapIncrease('test', 'a'), 2); + t.is(await cache.mapIncrease('test', 'a'), 3); + t.is(await cache.mapDecrease('test', 'b', 3), -1); + + const keys = await cache.mapKeys('test'); + t.deepEqual(keys, ['a', 'b']); + + const randomKey = await cache.mapRandomKey('test'); + t.truthy(randomKey); + t.true(keys.includes(randomKey!)); + + t.is(await cache.mapDelete('test', 'a'), true); + t.is(await cache.mapGet('test', 'a'), undefined); +}); diff --git a/packages/backend/server/tests/doc.spec.ts b/packages/backend/server/tests/doc.spec.ts index 5f18bedbed..9a08909691 100644 --- a/packages/backend/server/tests/doc.spec.ts +++ b/packages/backend/server/tests/doc.spec.ts @@ -1,12 +1,14 @@ import { mock } from 'node:test'; import type { INestApplication } from '@nestjs/common'; +import { EventEmitterModule } from '@nestjs/event-emitter'; import { Test, TestingModule } from '@nestjs/testing'; import test from 'ava'; import { register } from 'prom-client'; import * as Sinon from 'sinon'; import { Doc as YDoc, encodeStateAsUpdate } from 'yjs'; +import { CacheModule } from '../src/cache'; import { Config, ConfigModule } from '../src/config'; import { MetricsModule } from '../src/metrics'; import { DocManager, DocModule } from '../src/modules/doc'; @@ -18,6 +20,8 @@ const createModule = () => { imports: [ PrismaModule, MetricsModule, + CacheModule, + EventEmitterModule.forRoot(), ConfigModule.forRoot(), DocModule.forRoot(), ], diff --git a/packages/backend/server/tests/history.spec.ts b/packages/backend/server/tests/history.spec.ts new file mode 100644 index 0000000000..5555206a3b --- /dev/null +++ b/packages/backend/server/tests/history.spec.ts @@ -0,0 +1,341 @@ +import { INestApplication } from '@nestjs/common'; +import { ScheduleModule } from '@nestjs/schedule'; +import { Test, TestingModule } from '@nestjs/testing'; +import type { Snapshot } from '@prisma/client'; +import test from 'ava'; +import * as Sinon from 'sinon'; + +import { ConfigModule } from '../src/config'; +import { MetricsModule } from '../src/metrics'; +import { DocHistoryManager } from '../src/modules/doc'; +import { PrismaModule, PrismaService } from '../src/prisma'; +import { flushDB } from './utils'; + +let app: INestApplication; +let m: TestingModule; +let manager: DocHistoryManager; +let db: PrismaService; + +// cleanup database before each test +test.beforeEach(async () => { + await flushDB(); + m = await Test.createTestingModule({ + imports: [ + PrismaModule, + MetricsModule, + ScheduleModule.forRoot(), + ConfigModule.forRoot(), + ], + providers: [DocHistoryManager], + }).compile(); + + app = m.createNestApplication(); + await app.init(); + manager = m.get(DocHistoryManager); + Sinon.stub(manager, 'getExpiredDateFromNow').resolves( + new Date(Date.now() + 1000) + ); + db = m.get(PrismaService); +}); + +test.afterEach(async () => { + await app.close(); + await m.close(); + Sinon.restore(); +}); + +const snapshot: Snapshot = { + workspaceId: '1', + id: 'doc1', + blob: Buffer.from([0, 0]), + state: Buffer.from([0, 0]), + seq: 0, + updatedAt: new Date(), + createdAt: new Date(), +}; + +test('should create doc history if never created before', async t => { + Sinon.stub(manager, 'last').resolves(null); + + const timestamp = new Date(); + await manager.onDocUpdated({ + ...snapshot, + updatedAt: timestamp, + }); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.truthy(history); + t.is(history?.timestamp.getTime(), timestamp.getTime()); +}); + +test('should not create history if timestamp equals to last record', async t => { + const timestamp = new Date(); + Sinon.stub(manager, 'last').resolves({ timestamp, state: null }); + + await manager.onDocUpdated({ + ...snapshot, + updatedAt: timestamp, + }); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.falsy(history); +}); + +test('should not create history if state equals to last record', async t => { + const timestamp = new Date(); + Sinon.stub(manager, 'last').resolves({ + timestamp: new Date(timestamp.getTime() - 1), + state: snapshot.state, + }); + + await manager.onDocUpdated({ + ...snapshot, + updatedAt: timestamp, + }); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.falsy(history); +}); + +test('should not create history if time diff is less than interval config', async t => { + const timestamp = new Date(); + Sinon.stub(manager, 'last').resolves({ + timestamp: new Date(timestamp.getTime() - 1000), + state: Buffer.from([0, 1]), + }); + + await manager.onDocUpdated({ + ...snapshot, + updatedAt: timestamp, + }); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.falsy(history); +}); + +test('should create history if time diff is larger than interval config and state diff', async t => { + const timestamp = new Date(); + Sinon.stub(manager, 'last').resolves({ + timestamp: new Date(timestamp.getTime() - 1000 * 60 * 20), + state: Buffer.from([0, 1]), + }); + + await manager.onDocUpdated({ + ...snapshot, + updatedAt: timestamp, + }); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.truthy(history); +}); + +test('should create history with force flag even if time diff in small', async t => { + const timestamp = new Date(); + Sinon.stub(manager, 'last').resolves({ + timestamp: new Date(timestamp.getTime() - 1), + state: Buffer.from([0, 1]), + }); + + await manager.onDocUpdated( + { + ...snapshot, + updatedAt: timestamp, + }, + true + ); + + const history = await db.snapshotHistory.findFirst({ + where: { + workspaceId: '1', + id: 'doc1', + }, + }); + + t.truthy(history); +}); + +test('should correctly list all history records', async t => { + const timestamp = Date.now(); + + // insert expired data + await db.snapshotHistory.createMany({ + data: new Array(10).fill(0).map((_, i) => ({ + workspaceId: snapshot.workspaceId, + id: snapshot.id, + blob: snapshot.blob, + state: snapshot.state, + timestamp: new Date(timestamp - 10 - i), + expiredAt: new Date(timestamp - 1), + })), + }); + + // insert available data + await db.snapshotHistory.createMany({ + data: new Array(10).fill(0).map((_, i) => ({ + workspaceId: snapshot.workspaceId, + id: snapshot.id, + blob: snapshot.blob, + state: snapshot.state, + timestamp: new Date(timestamp + i), + expiredAt: new Date(timestamp + 1000), + })), + }); + + const list = await manager.list( + snapshot.workspaceId, + snapshot.id, + new Date(timestamp + 20), + 8 + ); + const count = await manager.count(snapshot.workspaceId, snapshot.id); + + t.is(list.length, 8); + t.is(count, 10); +}); + +test('should be able to get history data', async t => { + const timestamp = new Date(); + + await manager.onDocUpdated( + { + ...snapshot, + updatedAt: timestamp, + }, + true + ); + + const history = await manager.get( + snapshot.workspaceId, + snapshot.id, + timestamp + ); + + t.truthy(history); + t.deepEqual(history?.blob, snapshot.blob); +}); + +test('should be able to get last history record', async t => { + const timestamp = Date.now(); + + // insert available data + await db.snapshotHistory.createMany({ + data: new Array(10).fill(0).map((_, i) => ({ + workspaceId: snapshot.workspaceId, + id: snapshot.id, + blob: snapshot.blob, + state: snapshot.state, + timestamp: new Date(timestamp + i), + expiredAt: new Date(timestamp + 1000), + })), + }); + + const history = await manager.last(snapshot.workspaceId, snapshot.id); + + t.truthy(history); + t.is(history?.timestamp.getTime(), timestamp + 9); +}); + +test('should be able to recover from history', async t => { + await db.snapshot.create({ + data: { + ...snapshot, + blob: Buffer.from([1, 1]), + state: Buffer.from([1, 1]), + }, + }); + const history1Timestamp = snapshot.updatedAt.getTime() - 10; + await manager.onDocUpdated({ + ...snapshot, + updatedAt: new Date(history1Timestamp), + }); + + await manager.recover( + snapshot.workspaceId, + snapshot.id, + new Date(history1Timestamp) + ); + + const [history1, history2] = await db.snapshotHistory.findMany({ + where: { + workspaceId: snapshot.workspaceId, + id: snapshot.id, + }, + }); + + t.is(history1.timestamp.getTime(), history1Timestamp); + t.is(history2.timestamp.getTime(), snapshot.updatedAt.getTime()); + + // new history data force created with snapshot state before recovered + t.deepEqual(history2?.blob, Buffer.from([1, 1])); + t.deepEqual(history2?.state, Buffer.from([1, 1])); +}); + +test('should be able to cleanup expired history', async t => { + const timestamp = Date.now(); + + // insert expired data + await db.snapshotHistory.createMany({ + data: new Array(10).fill(0).map((_, i) => ({ + workspaceId: snapshot.workspaceId, + id: snapshot.id, + blob: snapshot.blob, + state: snapshot.state, + timestamp: new Date(timestamp - 10 - i), + expiredAt: new Date(timestamp - 1), + })), + }); + + // insert available data + await db.snapshotHistory.createMany({ + data: new Array(10).fill(0).map((_, i) => ({ + workspaceId: snapshot.workspaceId, + id: snapshot.id, + blob: snapshot.blob, + state: snapshot.state, + timestamp: new Date(timestamp + i), + expiredAt: new Date(timestamp + 1000), + })), + }); + + let count = await db.snapshotHistory.count(); + t.is(count, 20); + + await manager.cleanupExpiredHistory(); + + count = await db.snapshotHistory.count(); + t.is(count, 10); + + const example = await db.snapshotHistory.findFirst(); + t.truthy(example); + t.true(example!.expiredAt > new Date()); +}); diff --git a/packages/backend/storage/package.json b/packages/backend/storage/package.json index 1cacce9f7d..874f5fc0f4 100644 --- a/packages/backend/storage/package.json +++ b/packages/backend/storage/package.json @@ -1,6 +1,6 @@ { "name": "@affine/storage", - "version": "0.10.2", + "version": "0.10.3-canary.2", "engines": { "node": ">= 10.16.0 < 11 || >= 11.8.0" }, @@ -36,10 +36,10 @@ "version": "napi version" }, "devDependencies": { - "@napi-rs/cli": "^2.16.3", + "@napi-rs/cli": "^2.16.5", "lib0": "^0.2.87", - "nx": "^16.10.0", + "nx": "^17.1.3", "nx-cloud": "^16.5.2", - "yjs": "^13.6.8" + "yjs": "^13.6.10" } } diff --git a/packages/common/cmdk/package.json b/packages/common/cmdk/package.json index e0e5cdf81d..9b0e51898d 100644 --- a/packages/common/cmdk/package.json +++ b/packages/common/cmdk/package.json @@ -8,5 +8,5 @@ "react": "18.2.0", "react-dom": "18.2.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/common/cmdk/src/index.tsx b/packages/common/cmdk/src/index.tsx index ec48f331ce..e8549a4384 100644 --- a/packages/common/cmdk/src/index.tsx +++ b/packages/common/cmdk/src/index.tsx @@ -496,8 +496,8 @@ const Command = React.forwardRef( index + change < 0 ? items[items.length - 1] : index + change === items.length - ? items[0] - : items[index + change]; + ? items[0] + : items[index + change]; } if (newSelected) @@ -666,10 +666,10 @@ const Item = React.forwardRef( forceMount ? true : context.filter() === false - ? true - : !state.search - ? true - : state.filtered.items.get(id) > 0 + ? true + : !state.search + ? true + : state.filtered.items.get(id) > 0 ); React.useEffect(() => { @@ -728,10 +728,10 @@ const Group = React.forwardRef( forceMount ? true : context.filter() === false - ? true - : !state.search - ? true - : state.filtered.groups.has(id) + ? true + : !state.search + ? true + : state.filtered.groups.has(id) ); useLayoutEffect(() => { diff --git a/packages/common/debug/package.json b/packages/common/debug/package.json index c838af27a3..a9278bb41e 100644 --- a/packages/common/debug/package.json +++ b/packages/common/debug/package.json @@ -9,5 +9,5 @@ "@types/debug": "^4.1.9", "vitest": "0.34.6" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/common/env/package.json b/packages/common/env/package.json index cf9c60cc16..35178ae591 100644 --- a/packages/common/env/package.json +++ b/packages/common/env/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "devDependencies": { - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "react": "18.2.0", "react-dom": "18.2.0", "vitest": "0.34.6", @@ -27,5 +27,5 @@ "dependencies": { "lit": "^3.0.2" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/common/infra/package.json b/packages/common/infra/package.json index 0f33c94676..81a7c8e31a 100644 --- a/packages/common/infra/package.json +++ b/packages/common/infra/package.json @@ -55,34 +55,33 @@ }, "dependencies": { "@affine/sdk": "workspace:*", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", - "jotai": "^2.4.3", - "jotai-effect": "^0.2.2", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", + "jotai": "^2.5.1", + "jotai-effect": "^0.2.3", "tinykeys": "^2.1.0", "zod": "^3.22.4" }, "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", "@testing-library/react": "^14.0.0", "async-call-rpc": "^6.3.1", "electron": "link:../../frontend/electron/node_modules/electron", - "nanoid": "^5.0.1", + "nanoid": "^5.0.3", "react": "^18.2.0", "rxjs": "^7.8.1", "vite": "^4.4.11", "vite-plugin-dts": "3.6.0", "vitest": "0.34.6", - "yjs": "^13.6.8" + "yjs": "^13.6.10" }, "peerDependencies": { "@affine/templates": "*", "@blocksuite/editor": "*", - "@blocksuite/lit": "*", "async-call-rpc": "*", "electron": "*", "react": "*", @@ -95,9 +94,6 @@ "@blocksuite/editor": { "optional": true }, - "@blocksuite/lit": { - "optional": true - }, "async-call-rpc": { "optional": true }, @@ -111,5 +107,5 @@ "optional": true } }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/common/infra/src/blocksuite/index.ts b/packages/common/infra/src/blocksuite/index.ts index 383f8c3bee..a74ca60193 100644 --- a/packages/common/infra/src/blocksuite/index.ts +++ b/packages/common/infra/src/blocksuite/index.ts @@ -1,750 +1,17 @@ -import type { Page, PageMeta, Workspace } from '@blocksuite/store'; -import { createIndexeddbStorage } from '@blocksuite/store'; -import type { createStore, WritableAtom } from 'jotai/vanilla'; -import type { Doc } from 'yjs'; -import { Array as YArray, Doc as YDoc, Map as YMap, transact } from 'yjs'; - -export async function initEmptyPage(page: Page, title?: string) { - await page.waitForLoaded(); - const pageBlockId = page.addBlock('affine:page', { - title: new page.Text(title ?? ''), - }); - page.addBlock('affine:surface', {}, pageBlockId); - const noteBlockId = page.addBlock('affine:note', {}, pageBlockId); - page.addBlock('affine:paragraph', {}, noteBlockId); -} - -export async function buildEmptyBlockSuite(workspace: Workspace) { - const page = workspace.createPage(); - await initEmptyPage(page); - workspace.setPageMeta(page.id, { - jumpOnce: true, - }); -} - -export async function buildShowcaseWorkspace( - workspace: Workspace, - options: { - schema: Schema; - atoms: { - pageMode: WritableAtom< - undefined, - [pageId: string, mode: 'page' | 'edgeless'], - void - >; - }; - store: ReturnType; - } -) { - const prototypes = { - tags: { - options: [ - { - id: 'icg1n5UdkP', - value: 'Travel', - color: 'var(--affine-tag-gray)', - }, - { - id: 'Oe5dSe1DDJ', - value: 'Quick summary', - color: 'var(--affine-tag-green)', - }, - { - id: 'g1L5dXKctL', - value: 'OKR', - color: 'var(--affine-tag-purple)', - }, - { - id: 'q3mceOl_zi', - value: 'Streamline your workflow', - color: 'var(--affine-tag-teal)', - }, - { - id: 'ze07JVwBu4', - value: 'Plan', - color: 'var(--affine-tag-teal)', - }, - { - id: '8qcYPCTK0h', - value: 'Review', - color: 'var(--affine-tag-orange)', - }, - { - id: 'wg-fBtd2eI', - value: 'Engage', - color: 'var(--affine-tag-pink)', - }, - { - id: 'QYFD_HeQc-', - value: 'Create', - color: 'var(--affine-tag-blue)', - }, - { - id: 'ZHBa2NtdSo', - value: 'Learn', - color: 'var(--affine-tag-yellow)', - }, - ], - }, - }; - workspace.meta.setProperties(prototypes); - const edgelessPage1 = nanoid(); - const edgelessPage2 = nanoid(); - const edgelessPage3 = nanoid(); - const { store, atoms } = options; - [edgelessPage1, edgelessPage2, edgelessPage3].forEach(pageId => { - store.set(atoms.pageMode, pageId, 'edgeless'); - }); - - const pageMetas = { - '9f6f3c04-cf32-470c-9648-479dc838f10e': { - createDate: 1691548231530, - tags: ['ZHBa2NtdSo', 'QYFD_HeQc-', 'wg-fBtd2eI'], - updatedDate: 1691676331623, - favorite: true, - jumpOnce: true, - }, - '0773e198-5de0-45d4-a35e-de22ea72b96b': { - createDate: 1691548220794, - tags: [], - updatedDate: 1691676775642, - favorite: false, - }, - '59b140eb-4449-488f-9eeb-42412dcc044e': { - createDate: 1691551731225, - tags: [], - updatedDate: 1691654611175, - favorite: false, - }, - '7217fbe2-61db-4a91-93c6-ad5c800e5a43': { - createDate: 1691552082822, - tags: [], - updatedDate: 1691654606912, - favorite: false, - }, - '6eb43ea8-8c11-456d-bb1d-5193937961ab': { - createDate: 1691552090989, - tags: [], - updatedDate: 1691646748171, - favorite: false, - }, - '3ddc8a4f-62c7-4fd4-8064-9ed9f61e437a': { - createDate: 1691564303138, - tags: [], - updatedDate: 1691646845195, - }, - '512b1cb3-d22d-4b20-a7aa-58e2afcb1238': { - createDate: 1691574743531, - tags: ['icg1n5UdkP'], - updatedDate: 1691647117761, - }, - '22163830-8252-43fe-b62d-fd9bbeaa4caa': { - createDate: 1691574859042, - tags: [], - updatedDate: 1691648159371, - }, - 'b7a9e1bc-e205-44aa-8dad-7e328269d00b': { - createDate: 1691575011078, - tags: ['8qcYPCTK0h'], - updatedDate: 1691645074511, - favorite: false, - }, - '646305d9-93e0-48df-bb92-d82944ceb5a3': { - createDate: 1691634722239, - tags: ['ze07JVwBu4'], - updatedDate: 1691647069662, - favorite: false, - }, - '0350509d-8702-4797-b4d7-168f5e9359c7': { - createDate: 1691635388447, - tags: ['Oe5dSe1DDJ'], - updatedDate: 1691645873930, - }, - 'aa02af3c-5c5c-4856-b7ce-947ad17331f3': { - createDate: 1691636192263, - tags: ['q3mceOl_zi', 'g1L5dXKctL'], - updatedDate: 1691645102104, - }, - '9d6e716e-a071-45a2-88ac-2f2f6eec0109': { - createDate: 1691574743531, - tags: ['icg1n5UdkP'], - updatedDate: 1691574743531, - }, - } satisfies Record>; - const data = [ - [ - '9f6f3c04-cf32-470c-9648-479dc838f10e', - import('@affine/templates/v1/getting-started.json'), - nanoid(), - ], - [ - '0773e198-5de0-45d4-a35e-de22ea72b96b', - import('@affine/templates/v1/preloading.json'), - edgelessPage1, - ], - [ - '59b140eb-4449-488f-9eeb-42412dcc044e', - import('@affine/templates/v1/template-galleries.json'), - nanoid(), - ], - [ - '7217fbe2-61db-4a91-93c6-ad5c800e5a43', - import('@affine/templates/v1/personal-home.json'), - nanoid(), - ], - [ - '6eb43ea8-8c11-456d-bb1d-5193937961ab', - import('@affine/templates/v1/working-home.json'), - nanoid(), - ], - [ - '3ddc8a4f-62c7-4fd4-8064-9ed9f61e437a', - import('@affine/templates/v1/personal-project-management.json'), - nanoid(), - ], - [ - '512b1cb3-d22d-4b20-a7aa-58e2afcb1238', - import('@affine/templates/v1/travel-plan.json'), - edgelessPage2, - ], - [ - '22163830-8252-43fe-b62d-fd9bbeaa4caa', - import('@affine/templates/v1/personal-knowledge-management.json'), - nanoid(), - ], - [ - 'b7a9e1bc-e205-44aa-8dad-7e328269d00b', - import('@affine/templates/v1/annual-performance-review.json'), - nanoid(), - ], - [ - '646305d9-93e0-48df-bb92-d82944ceb5a3', - import('@affine/templates/v1/brief-event-planning.json'), - nanoid(), - ], - [ - '0350509d-8702-4797-b4d7-168f5e9359c7', - import('@affine/templates/v1/meeting-summary.json'), - nanoid(), - ], - [ - 'aa02af3c-5c5c-4856-b7ce-947ad17331f3', - import('@affine/templates/v1/okr-template.json'), - nanoid(), - ], - [ - '9d6e716e-a071-45a2-88ac-2f2f6eec0109', - import('@affine/templates/v1/travel-note.json'), - edgelessPage3, - ], - ] as const; - const idMap = await Promise.all(data).then(async data => { - return data.reduce>( - (record, currentValue) => { - const [oldId, _, newId] = currentValue; - record[oldId] = newId; - return record; - }, - {} as Record - ); - }); - await Promise.all( - data.map(async ([id, promise, newId]) => { - const { default: template } = await promise; - let json = JSON.stringify(template); - Object.entries(idMap).forEach(([oldId, newId]) => { - json = json.replaceAll(oldId, newId); - }); - json = JSON.parse(json); - await workspace - .importPageSnapshot(structuredClone(json), newId) - .catch(error => { - console.error('error importing page', id, error); - }); - const page = workspace.getPage(newId); - assertExists(page); - await page.waitForLoaded(); - workspace.schema.upgradePage( - 0, - { - 'affine:note': 1, - 'affine:bookmark': 1, - 'affine:database': 2, - 'affine:divider': 1, - 'affine:image': 1, - 'affine:list': 1, - 'affine:code': 1, - 'affine:page': 2, - 'affine:paragraph': 1, - 'affine:surface': 3, - }, - page.spaceDoc - ); - }) - ); - Object.entries(pageMetas).forEach(([oldId, meta]) => { - const newId = idMap[oldId]; - workspace.setPageMeta(newId, meta); - }); -} - -import { applyUpdate, encodeStateAsUpdate } from 'yjs'; - -const migrationOrigin = 'affine-migration'; - -import { assertExists } from '@blocksuite/global/utils'; -import type { Schema } from '@blocksuite/store'; -import { nanoid } from 'nanoid'; - -type XYWH = [number, number, number, number]; - -function deserializeXYWH(xywh: string): XYWH { - return JSON.parse(xywh) as XYWH; -} - -const getLatestVersions = (schema: Schema): Record => { - return [...schema.flavourSchemaMap.entries()].reduce( - (record, [flavour, schema]) => { - record[flavour] = schema.version; - return record; - }, - {} as Record - ); -}; - -function migrateDatabase(data: YMap) { - data.delete('prop:mode'); - data.set('prop:views', new YArray()); - const columns = (data.get('prop:columns') as YArray).toJSON() as { - id: string; - name: string; - hide: boolean; - type: string; - width: number; - selection?: unknown[]; - }[]; - const views = [ - { - id: 'default', - name: 'Table', - columns: columns.map(col => ({ - id: col.id, - width: col.width, - hide: col.hide, - })), - filter: { type: 'group', op: 'and', conditions: [] }, - mode: 'table', - }, - ]; - const cells = (data.get('prop:cells') as YMap).toJSON() as Record< - string, - Record< - string, - { - id: string; - value: unknown; - } - > - >; - const convertColumn = ( - id: string, - update: (cell: { id: string; value: unknown }) => void - ) => { - Object.values(cells).forEach(row => { - if (row[id] != null) { - update(row[id]); - } - }); - }; - const newColumns = columns.map(v => { - let data: Record = {}; - if (v.type === 'select' || v.type === 'multi-select') { - data = { options: v.selection }; - if (v.type === 'select') { - convertColumn(v.id, cell => { - if (Array.isArray(cell.value)) { - cell.value = cell.value[0]?.id; - } - }); - } else { - convertColumn(v.id, cell => { - if (Array.isArray(cell.value)) { - cell.value = cell.value.map(v => v.id); - } - }); - } - } - if (v.type === 'number') { - convertColumn(v.id, cell => { - if (typeof cell.value === 'string') { - cell.value = Number.parseFloat(cell.value.toString()); - } - }); - } - return { - id: v.id, - type: v.type, - name: v.name, - data, - }; - }); - data.set('prop:columns', newColumns); - data.set('prop:views', views); - data.set('prop:cells', cells); -} - -function runBlockMigration( - flavour: string, - data: YMap, - version: number -) { - if (flavour === 'affine:frame') { - data.set('sys:flavour', 'affine:note'); - return; - } - if (flavour === 'affine:surface' && version <= 3) { - if (data.has('elements')) { - const elements = data.get('elements') as YMap; - migrateSurface(elements); - data.set('prop:elements', elements.clone()); - data.delete('elements'); - } else { - data.set('prop:elements', new YMap()); - } - } - if (flavour === 'affine:embed') { - data.set('sys:flavour', 'affine:image'); - data.delete('prop:type'); - } - if (flavour === 'affine:database' && version < 2) { - migrateDatabase(data); - } -} - -function migrateSurface(data: YMap) { - for (const [, value] of ]>>( - data.entries() - )) { - if (value.get('type') === 'connector') { - migrateSurfaceConnector(value); - } - } -} - -function migrateSurfaceConnector(data: YMap) { - let id = data.get('startElement')?.id; - const controllers = data.get('controllers'); - const length = controllers.length; - const xywh = deserializeXYWH(data.get('xywh')); - if (id) { - data.set('source', { id }); - } else { - data.set('source', { - position: [controllers[0].x + xywh[0], controllers[0].y + xywh[1]], - }); - } - - id = data.get('endElement')?.id; - if (id) { - data.set('target', { id }); - } else { - data.set('target', { - position: [ - controllers[length - 1].x + xywh[0], - controllers[length - 1].y + xywh[1], - ], - }); - } - - const width = data.get('lineWidth') ?? 4; - data.set('strokeWidth', width); - const color = data.get('color'); - data.set('stroke', color); - - data.delete('startElement'); - data.delete('endElement'); - data.delete('controllers'); - data.delete('lineWidth'); - data.delete('color'); - data.delete('xywh'); -} - -function updateBlockVersions(versions: YMap) { - const frameVersion = versions.get('affine:frame'); - if (frameVersion !== undefined) { - versions.set('affine:note', frameVersion); - versions.delete('affine:frame'); - } - const embedVersion = versions.get('affine:embed'); - if (embedVersion !== undefined) { - versions.set('affine:image', embedVersion); - versions.delete('affine:embed'); - } - const databaseVersion = versions.get('affine:database'); - if (databaseVersion !== undefined && databaseVersion < 2) { - versions.set('affine:database', 2); - } -} - -function migrateMeta( - oldDoc: YDoc, - newDoc: YDoc, - idMap: Record -) { - const originalMeta = oldDoc.getMap('space:meta'); - const originalVersions = originalMeta.get('versions') as YMap; - const originalPages = originalMeta.get('pages') as YArray>; - const meta = newDoc.getMap('meta'); - const pages = new YArray(); - const blockVersions = originalVersions.clone(); - - meta.set('workspaceVersion', 1); - meta.set('blockVersions', blockVersions); - meta.set('pages', pages); - meta.set('name', originalMeta.get('name') as string); - - updateBlockVersions(blockVersions); - const mapList = originalPages.map(page => { - const map = new YMap(); - Array.from(page.entries()) - .filter(([key]) => key !== 'subpageIds') - .forEach(([key, value]) => { - if (key === 'id') { - idMap[value] = nanoid(); - map.set(key, idMap[value]); - } else { - map.set(key, value); - } - }); - return map; - }); - pages.push(mapList); -} - -function migrateBlocks( - oldDoc: YDoc, - newDoc: YDoc, - idMap: Record -) { - const spaces = newDoc.getMap('spaces'); - const originalMeta = oldDoc.getMap('space:meta'); - const originalVersions = originalMeta.get('versions') as YMap; - const originalPages = originalMeta.get('pages') as YArray>; - originalPages.forEach(page => { - const id = page.get('id') as string; - const newId = idMap[id]; - const spaceId = id.startsWith('space:') ? id : `space:${id}`; - const originalBlocks = oldDoc.getMap(spaceId) as YMap; - const subdoc = new YDoc(); - spaces.set(newId, subdoc); - subdoc.guid = id; - const blocks = subdoc.getMap('blocks'); - Array.from(originalBlocks.entries()).forEach(([key, value]) => { - const blockData = value.clone(); - blocks.set(key, blockData); - const flavour = blockData.get('sys:flavour') as string; - const version = originalVersions.get(flavour); - if (version !== undefined) { - runBlockMigration(flavour, blockData, version); - } - }); - }); -} - -export function migrateToSubdoc(oldDoc: YDoc): YDoc { - const needMigration = - Array.from(oldDoc.getMap('space:meta').keys()).length > 0; - if (!needMigration) { - return oldDoc; - } - const newDoc = new YDoc(); - const idMap = {} as Record; - migrateMeta(oldDoc, newDoc, idMap); - migrateBlocks(oldDoc, newDoc, idMap); - return newDoc; -} - -export type UpgradeOptions = { - getCurrentRootDoc: () => Promise; - createWorkspace: () => Promise; - getSchema: () => Schema; -}; - -const upgradeV1ToV2 = async (options: UpgradeOptions) => { - const oldDoc = await options.getCurrentRootDoc(); - const newDoc = migrateToSubdoc(oldDoc); - const newWorkspace = await options.createWorkspace(); - applyUpdate(newWorkspace.doc, encodeStateAsUpdate(newDoc), migrationOrigin); - newDoc.getSubdocs().forEach(subdoc => { - newWorkspace.doc.getSubdocs().forEach(newDoc => { - if (subdoc.guid === newDoc.guid) { - applyUpdate(newDoc, encodeStateAsUpdate(subdoc), migrationOrigin); - } - }); - }); - return newWorkspace; -}; +export * from './initialization'; +export * from './migration/blob'; +export { migratePages as forceUpgradePages } from './migration/blocksuite'; // campatible with electron +export * from './migration/fixing'; +export { migrateToSubdoc } from './migration/subdoc'; +export * from './migration/workspace'; /** - * Force upgrade block schema to the latest. - * Don't force to upgrade the pages without the check. - * - * Please note that this function will not upgrade the workspace version. - * - * @returns true if any schema is upgraded. - * @returns false if no schema is upgraded. + * @deprecated + * Use workspace meta data to determine the workspace version. */ -export async function forceUpgradePages( - options: Omit -): Promise { - const rootDoc = await options.getCurrentRootDoc(); - guidCompatibilityFix(rootDoc); - - const spaces = rootDoc.getMap('spaces') as YMap; - const meta = rootDoc.getMap('meta') as YMap; - const versions = meta.get('blockVersions') as YMap; - const schema = options.getSchema(); - const oldVersions = versions?.toJSON() ?? {}; - spaces.forEach((space: Doc) => { - try { - schema.upgradePage(0, oldVersions, space); - } catch (e) { - console.error(`page ${space.guid} upgrade failed`, e); - } - }); - const newVersions = getLatestVersions(schema); - meta.set('blockVersions', new YMap(Object.entries(newVersions))); - return Object.entries(oldVersions).some( - ([flavour, version]) => newVersions[flavour] !== version - ); -} - -// database from 2 to 3 -async function upgradeV2ToV3(options: UpgradeOptions): Promise { - const rootDoc = await options.getCurrentRootDoc(); - const spaces = rootDoc.getMap('spaces') as YMap; - const meta = rootDoc.getMap('meta') as YMap; - const versions = meta.get('blockVersions') as YMap; - const schema = options.getSchema(); - guidCompatibilityFix(rootDoc); - spaces.forEach((space: Doc) => { - schema.upgradePage( - 0, - { - 'affine:note': 1, - 'affine:bookmark': 1, - 'affine:database': 2, - 'affine:divider': 1, - 'affine:image': 1, - 'affine:list': 1, - 'affine:code': 1, - 'affine:page': 2, - 'affine:paragraph': 1, - 'affine:surface': 3, - }, - space - ); - }); - if ('affine:database' in versions) { - meta.set( - 'blockVersions', - new YMap(Object.entries(getLatestVersions(schema))) - ); - } else { - Object.entries(getLatestVersions(schema)).map(([flavour, version]) => - versions.set(flavour, version) - ); - } - return true; -} - -// patch root doc's space guid compatibility issue -// -// in version 0.10, page id in spaces no longer has prefix "space:" -// The data flow for fetching a doc's updates is: -// - page id in `meta.pages` -> find `${page-id}` in `doc.spaces` -> `doc` -> `doc.guid` -// if `doc` is not found in `doc.spaces`, a new doc will be created and its `doc.guid` is the same with its pageId -// - because of guid logic change, the doc that previously prefixed with "space:" will not be found in `doc.spaces` -// - when fetching the rows of this doc using the doc id === page id, -// it will return empty since there is no updates associated with the page id -export function guidCompatibilityFix(rootDoc: YDoc) { - let changed = false; - transact(rootDoc, () => { - const meta = rootDoc.getMap('meta') as YMap; - const pages = meta.get('pages') as YArray>; - pages?.forEach(page => { - const pageId = page.get('id') as string | undefined; - if (pageId?.includes(':')) { - // remove the prefix "space:" from page id - page.set('id', pageId.split(':').at(-1)); - } - }); - const spaces = rootDoc.getMap('spaces') as YMap; - spaces?.forEach((doc: YDoc, pageId: string) => { - if (pageId.includes(':')) { - const newPageId = pageId.split(':').at(-1) ?? pageId; - const newDoc = new YDoc(); - // clone the original doc. yjs is not happy to use the same doc instance - applyUpdate(newDoc, encodeStateAsUpdate(doc)); - newDoc.guid = doc.guid; - spaces.set(newPageId, newDoc); - // should remove the old doc, otherwise we will do it again in the next run - spaces.delete(pageId); - changed = true; - console.debug( - `fixed space id ${pageId} -> ${newPageId}, doc id: ${doc.guid}` - ); - } - }); - }); - return changed; -} - export enum WorkspaceVersion { // v1 is treated as undefined SubDoc = 2, DatabaseV3 = 3, Surface = 4, } - -/** - * If returns false, it means no migration is needed. - * If returns true, it means migration is done. - * If returns Workspace, it means new workspace is created, - * and the old workspace should be deleted. - */ -export async function migrateWorkspace( - currentVersion: WorkspaceVersion | undefined, - options: UpgradeOptions -): Promise { - if (currentVersion === undefined) { - const workspace = await upgradeV1ToV2(options); - await upgradeV2ToV3({ - ...options, - getCurrentRootDoc: () => Promise.resolve(workspace.doc), - }); - return workspace; - } - if (currentVersion === WorkspaceVersion.SubDoc) { - return upgradeV2ToV3(options); - } else if (currentVersion === WorkspaceVersion.DatabaseV3) { - // surface from 3 to 5 - return forceUpgradePages(options); - } else { - return false; - } -} - -export async function migrateLocalBlobStorage(from: string, to: string) { - const fromStorage = createIndexeddbStorage(from); - const toStorage = createIndexeddbStorage(to); - const keys = await fromStorage.crud.list(); - for (const key of keys) { - const value = await fromStorage.crud.get(key); - if (!value) { - console.warn('cannot find blob:', key); - continue; - } - await toStorage.crud.set(key, value); - } -} diff --git a/packages/common/infra/src/blocksuite/initialization/index.ts b/packages/common/infra/src/blocksuite/initialization/index.ts new file mode 100644 index 0000000000..a45ca66c58 --- /dev/null +++ b/packages/common/infra/src/blocksuite/initialization/index.ts @@ -0,0 +1,291 @@ +import { assertExists } from '@blocksuite/global/utils'; +import type { Page, PageMeta, Workspace } from '@blocksuite/store'; +import type { createStore, WritableAtom } from 'jotai/vanilla'; +import { nanoid } from 'nanoid'; + +import { migratePages } from '../migration/blocksuite'; + +export async function initEmptyPage(page: Page, title?: string) { + await page.load(() => { + const pageBlockId = page.addBlock('affine:page', { + title: new page.Text(title ?? ''), + }); + page.addBlock('affine:surface', {}, pageBlockId); + const noteBlockId = page.addBlock('affine:note', {}, pageBlockId); + page.addBlock('affine:paragraph', {}, noteBlockId); + }); +} + +/** + * FIXME: Use exported json data to instead of building data. + */ +export async function buildShowcaseWorkspace( + workspace: Workspace, + options: { + atoms: { + pageMode: WritableAtom< + undefined, + [pageId: string, mode: 'page' | 'edgeless'], + void + >; + }; + store: ReturnType; + } +) { + const prototypes = { + tags: { + options: [ + { + id: 'icg1n5UdkP', + value: 'Travel', + color: 'var(--affine-tag-gray)', + }, + { + id: 'Oe5dSe1DDJ', + value: 'Quick summary', + color: 'var(--affine-tag-green)', + }, + { + id: 'g1L5dXKctL', + value: 'OKR', + color: 'var(--affine-tag-purple)', + }, + { + id: 'q3mceOl_zi', + value: 'Streamline your workflow', + color: 'var(--affine-tag-teal)', + }, + { + id: 'ze07JVwBu4', + value: 'Plan', + color: 'var(--affine-tag-teal)', + }, + { + id: '8qcYPCTK0h', + value: 'Review', + color: 'var(--affine-tag-orange)', + }, + { + id: 'wg-fBtd2eI', + value: 'Engage', + color: 'var(--affine-tag-pink)', + }, + { + id: 'QYFD_HeQc-', + value: 'Create', + color: 'var(--affine-tag-blue)', + }, + { + id: 'ZHBa2NtdSo', + value: 'Learn', + color: 'var(--affine-tag-yellow)', + }, + ], + }, + }; + workspace.meta.setProperties(prototypes); + const edgelessPage1 = nanoid(); + const edgelessPage2 = nanoid(); + const edgelessPage3 = nanoid(); + const { store, atoms } = options; + [edgelessPage1, edgelessPage2, edgelessPage3].forEach(pageId => { + store.set(atoms.pageMode, pageId, 'edgeless'); + }); + + const pageMetas = { + '9f6f3c04-cf32-470c-9648-479dc838f10e': { + createDate: 1691548231530, + tags: ['ZHBa2NtdSo', 'QYFD_HeQc-', 'wg-fBtd2eI'], + updatedDate: 1691676331623, + favorite: true, + jumpOnce: true, + }, + '0773e198-5de0-45d4-a35e-de22ea72b96b': { + createDate: 1691548220794, + tags: [], + updatedDate: 1691676775642, + favorite: false, + }, + '59b140eb-4449-488f-9eeb-42412dcc044e': { + createDate: 1691551731225, + tags: [], + updatedDate: 1691654611175, + favorite: false, + }, + '7217fbe2-61db-4a91-93c6-ad5c800e5a43': { + createDate: 1691552082822, + tags: [], + updatedDate: 1691654606912, + favorite: false, + }, + '6eb43ea8-8c11-456d-bb1d-5193937961ab': { + createDate: 1691552090989, + tags: [], + updatedDate: 1691646748171, + favorite: false, + }, + '3ddc8a4f-62c7-4fd4-8064-9ed9f61e437a': { + createDate: 1691564303138, + tags: [], + updatedDate: 1691646845195, + }, + '512b1cb3-d22d-4b20-a7aa-58e2afcb1238': { + createDate: 1691574743531, + tags: ['icg1n5UdkP'], + updatedDate: 1691647117761, + }, + '22163830-8252-43fe-b62d-fd9bbeaa4caa': { + createDate: 1691574859042, + tags: [], + updatedDate: 1691648159371, + }, + 'b7a9e1bc-e205-44aa-8dad-7e328269d00b': { + createDate: 1691575011078, + tags: ['8qcYPCTK0h'], + updatedDate: 1691645074511, + favorite: false, + }, + '646305d9-93e0-48df-bb92-d82944ceb5a3': { + createDate: 1691634722239, + tags: ['ze07JVwBu4'], + updatedDate: 1691647069662, + favorite: false, + }, + '0350509d-8702-4797-b4d7-168f5e9359c7': { + createDate: 1691635388447, + tags: ['Oe5dSe1DDJ'], + updatedDate: 1691645873930, + }, + 'aa02af3c-5c5c-4856-b7ce-947ad17331f3': { + createDate: 1691636192263, + tags: ['q3mceOl_zi', 'g1L5dXKctL'], + updatedDate: 1691645102104, + }, + '9d6e716e-a071-45a2-88ac-2f2f6eec0109': { + createDate: 1691574743531, + tags: ['icg1n5UdkP'], + updatedDate: 1691574743531, + }, + } satisfies Record>; + const data = [ + [ + '9f6f3c04-cf32-470c-9648-479dc838f10e', + import('@affine/templates/v1/getting-started.json'), + nanoid(), + ], + [ + '0773e198-5de0-45d4-a35e-de22ea72b96b', + import('@affine/templates/v1/preloading.json'), + edgelessPage1, + ], + [ + '59b140eb-4449-488f-9eeb-42412dcc044e', + import('@affine/templates/v1/template-galleries.json'), + nanoid(), + ], + [ + '7217fbe2-61db-4a91-93c6-ad5c800e5a43', + import('@affine/templates/v1/personal-home.json'), + nanoid(), + ], + [ + '6eb43ea8-8c11-456d-bb1d-5193937961ab', + import('@affine/templates/v1/working-home.json'), + nanoid(), + ], + [ + '3ddc8a4f-62c7-4fd4-8064-9ed9f61e437a', + import('@affine/templates/v1/personal-project-management.json'), + nanoid(), + ], + [ + '512b1cb3-d22d-4b20-a7aa-58e2afcb1238', + import('@affine/templates/v1/travel-plan.json'), + edgelessPage2, + ], + [ + '22163830-8252-43fe-b62d-fd9bbeaa4caa', + import('@affine/templates/v1/personal-knowledge-management.json'), + nanoid(), + ], + [ + 'b7a9e1bc-e205-44aa-8dad-7e328269d00b', + import('@affine/templates/v1/annual-performance-review.json'), + nanoid(), + ], + [ + '646305d9-93e0-48df-bb92-d82944ceb5a3', + import('@affine/templates/v1/brief-event-planning.json'), + nanoid(), + ], + [ + '0350509d-8702-4797-b4d7-168f5e9359c7', + import('@affine/templates/v1/meeting-summary.json'), + nanoid(), + ], + [ + 'aa02af3c-5c5c-4856-b7ce-947ad17331f3', + import('@affine/templates/v1/okr-template.json'), + nanoid(), + ], + [ + '9d6e716e-a071-45a2-88ac-2f2f6eec0109', + import('@affine/templates/v1/travel-note.json'), + edgelessPage3, + ], + ] as const; + const idMap = await Promise.all(data).then(async data => { + return data.reduce>( + (record, currentValue) => { + const [oldId, _, newId] = currentValue; + record[oldId] = newId; + return record; + }, + {} as Record + ); + }); + await Promise.all( + data.map(async ([id, promise, newId]) => { + const { default: template } = await promise; + let json = JSON.stringify(template); + Object.entries(idMap).forEach(([oldId, newId]) => { + json = json.replaceAll(oldId, newId); + }); + json = JSON.parse(json); + await workspace + .importPageSnapshot(structuredClone(json), newId) + .catch(error => { + console.error('error importing page', id, error); + }); + const page = workspace.getPage(newId); + assertExists(page); + await page.load(); + workspace.schema.upgradePage( + 0, + { + 'affine:note': 1, + 'affine:bookmark': 1, + 'affine:database': 2, + 'affine:divider': 1, + 'affine:image': 1, + 'affine:list': 1, + 'affine:code': 1, + 'affine:page': 2, + 'affine:paragraph': 1, + 'affine:surface': 3, + }, + page.spaceDoc + ); + + // The showcase building will create multiple pages once, and may skip the version writing. + // https://github.com/toeverything/blocksuite/blob/master/packages/store/src/workspace/page.ts#L662 + if (!workspace.meta.blockVersions) { + await migratePages(workspace.doc, workspace.schema); + } + }) + ); + Object.entries(pageMetas).forEach(([oldId, meta]) => { + const newId = idMap[oldId]; + workspace.setPageMeta(newId, meta); + }); +} diff --git a/packages/common/infra/src/blocksuite/migration/blob.ts b/packages/common/infra/src/blocksuite/migration/blob.ts new file mode 100644 index 0000000000..45f5f10820 --- /dev/null +++ b/packages/common/infra/src/blocksuite/migration/blob.ts @@ -0,0 +1,15 @@ +import { createIndexeddbStorage } from '@blocksuite/store'; + +export async function migrateLocalBlobStorage(from: string, to: string) { + const fromStorage = createIndexeddbStorage(from); + const toStorage = createIndexeddbStorage(to); + const keys = await fromStorage.crud.list(); + for (const key of keys) { + const value = await fromStorage.crud.get(key); + if (!value) { + console.warn('cannot find blob:', key); + continue; + } + await toStorage.crud.set(key, value); + } +} diff --git a/packages/common/infra/src/blocksuite/migration/blocksuite.ts b/packages/common/infra/src/blocksuite/migration/blocksuite.ts new file mode 100644 index 0000000000..10474d5b97 --- /dev/null +++ b/packages/common/infra/src/blocksuite/migration/blocksuite.ts @@ -0,0 +1,36 @@ +import type { Schema } from '@blocksuite/store'; +import type { Doc as YDoc } from 'yjs'; +import { Map as YMap } from 'yjs'; + +const getLatestVersions = (schema: Schema): Record => { + return [...schema.flavourSchemaMap.entries()].reduce( + (record, [flavour, schema]) => { + record[flavour] = schema.version; + return record; + }, + {} as Record + ); +}; + +export async function migratePages( + rootDoc: YDoc, + schema: Schema +): Promise { + const spaces = rootDoc.getMap('spaces') as YMap; + const meta = rootDoc.getMap('meta') as YMap; + const versions = meta.get('blockVersions') as YMap; + const oldVersions = versions?.toJSON() ?? {}; + spaces.forEach((space: YDoc) => { + try { + schema.upgradePage(0, oldVersions, space); + } catch (e) { + console.error(`page ${space.guid} upgrade failed`, e); + } + }); + + const newVersions = getLatestVersions(schema); + meta.set('blockVersions', new YMap(Object.entries(newVersions))); + return Object.entries(oldVersions).some( + ([flavour, version]) => newVersions[flavour] !== version + ); +} diff --git a/packages/common/infra/src/blocksuite/migration/fixing.ts b/packages/common/infra/src/blocksuite/migration/fixing.ts new file mode 100644 index 0000000000..c677179cc4 --- /dev/null +++ b/packages/common/infra/src/blocksuite/migration/fixing.ts @@ -0,0 +1,45 @@ +import type { Array as YArray, Map as YMap } from 'yjs'; +import { Doc as YDoc, transact } from 'yjs'; +import { applyUpdate, encodeStateAsUpdate } from 'yjs'; + +// patch root doc's space guid compatibility issue +// +// in version 0.10, page id in spaces no longer has prefix "space:" +// The data flow for fetching a doc's updates is: +// - page id in `meta.pages` -> find `${page-id}` in `doc.spaces` -> `doc` -> `doc.guid` +// if `doc` is not found in `doc.spaces`, a new doc will be created and its `doc.guid` is the same with its pageId +// - because of guid logic change, the doc that previously prefixed with "space:" will not be found in `doc.spaces` +// - when fetching the rows of this doc using the doc id === page id, +// it will return empty since there is no updates associated with the page id +export function guidCompatibilityFix(rootDoc: YDoc) { + let changed = false; + transact(rootDoc, () => { + const meta = rootDoc.getMap('meta') as YMap; + const pages = meta.get('pages') as YArray>; + pages?.forEach(page => { + const pageId = page.get('id') as string | undefined; + if (pageId?.includes(':')) { + // remove the prefix "space:" from page id + page.set('id', pageId.split(':').at(-1)); + } + }); + const spaces = rootDoc.getMap('spaces') as YMap; + spaces?.forEach((doc: YDoc, pageId: string) => { + if (pageId.includes(':')) { + const newPageId = pageId.split(':').at(-1) ?? pageId; + const newDoc = new YDoc(); + // clone the original doc. yjs is not happy to use the same doc instance + applyUpdate(newDoc, encodeStateAsUpdate(doc)); + newDoc.guid = doc.guid; + spaces.set(newPageId, newDoc); + // should remove the old doc, otherwise we will do it again in the next run + spaces.delete(pageId); + changed = true; + console.debug( + `fixed space id ${pageId} -> ${newPageId}, doc id: ${doc.guid}` + ); + } + }); + }); + return changed; +} diff --git a/packages/common/infra/src/blocksuite/migration/subdoc.ts b/packages/common/infra/src/blocksuite/migration/subdoc.ts new file mode 100644 index 0000000000..c8acf278cb --- /dev/null +++ b/packages/common/infra/src/blocksuite/migration/subdoc.ts @@ -0,0 +1,282 @@ +import type { Workspace } from '@blocksuite/store'; +import { nanoid } from 'nanoid'; +import { Array as YArray, Doc as YDoc, Map as YMap } from 'yjs'; +import { applyUpdate, encodeStateAsUpdate } from 'yjs'; + +const migrationOrigin = 'affine-migration'; + +type XYWH = [number, number, number, number]; + +function deserializeXYWH(xywh: string): XYWH { + return JSON.parse(xywh) as XYWH; +} + +function migrateDatabase(data: YMap) { + data.delete('prop:mode'); + data.set('prop:views', new YArray()); + const columns = (data.get('prop:columns') as YArray).toJSON() as { + id: string; + name: string; + hide: boolean; + type: string; + width: number; + selection?: unknown[]; + }[]; + const views = [ + { + id: 'default', + name: 'Table', + columns: columns.map(col => ({ + id: col.id, + width: col.width, + hide: col.hide, + })), + filter: { type: 'group', op: 'and', conditions: [] }, + mode: 'table', + }, + ]; + const cells = (data.get('prop:cells') as YMap).toJSON() as Record< + string, + Record< + string, + { + id: string; + value: unknown; + } + > + >; + const convertColumn = ( + id: string, + update: (cell: { id: string; value: unknown }) => void + ) => { + Object.values(cells).forEach(row => { + if (row[id] != null) { + update(row[id]); + } + }); + }; + const newColumns = columns.map(v => { + let data: Record = {}; + if (v.type === 'select' || v.type === 'multi-select') { + data = { options: v.selection }; + if (v.type === 'select') { + convertColumn(v.id, cell => { + if (Array.isArray(cell.value)) { + cell.value = cell.value[0]?.id; + } + }); + } else { + convertColumn(v.id, cell => { + if (Array.isArray(cell.value)) { + cell.value = cell.value.map(v => v.id); + } + }); + } + } + if (v.type === 'number') { + convertColumn(v.id, cell => { + if (typeof cell.value === 'string') { + cell.value = Number.parseFloat(cell.value.toString()); + } + }); + } + return { + id: v.id, + type: v.type, + name: v.name, + data, + }; + }); + data.set('prop:columns', newColumns); + data.set('prop:views', views); + data.set('prop:cells', cells); +} + +function runBlockMigration( + flavour: string, + data: YMap, + version: number +) { + if (flavour === 'affine:frame') { + data.set('sys:flavour', 'affine:note'); + return; + } + if (flavour === 'affine:surface' && version <= 3) { + if (data.has('elements')) { + const elements = data.get('elements') as YMap; + migrateSurface(elements); + data.set('prop:elements', elements.clone()); + data.delete('elements'); + } else { + data.set('prop:elements', new YMap()); + } + } + if (flavour === 'affine:embed') { + data.set('sys:flavour', 'affine:image'); + data.delete('prop:type'); + } + if (flavour === 'affine:database' && version < 2) { + migrateDatabase(data); + } +} + +function migrateSurface(data: YMap) { + for (const [, value] of ]>>( + data.entries() + )) { + if (value.get('type') === 'connector') { + migrateSurfaceConnector(value); + } + } +} + +function migrateSurfaceConnector(data: YMap) { + let id = data.get('startElement')?.id; + const controllers = data.get('controllers'); + const length = controllers.length; + const xywh = deserializeXYWH(data.get('xywh')); + if (id) { + data.set('source', { id }); + } else { + data.set('source', { + position: [controllers[0].x + xywh[0], controllers[0].y + xywh[1]], + }); + } + + id = data.get('endElement')?.id; + if (id) { + data.set('target', { id }); + } else { + data.set('target', { + position: [ + controllers[length - 1].x + xywh[0], + controllers[length - 1].y + xywh[1], + ], + }); + } + + const width = data.get('lineWidth') ?? 4; + data.set('strokeWidth', width); + const color = data.get('color'); + data.set('stroke', color); + + data.delete('startElement'); + data.delete('endElement'); + data.delete('controllers'); + data.delete('lineWidth'); + data.delete('color'); + data.delete('xywh'); +} + +function updateBlockVersions(versions: YMap) { + const frameVersion = versions.get('affine:frame'); + if (frameVersion !== undefined) { + versions.set('affine:note', frameVersion); + versions.delete('affine:frame'); + } + const embedVersion = versions.get('affine:embed'); + if (embedVersion !== undefined) { + versions.set('affine:image', embedVersion); + versions.delete('affine:embed'); + } + const databaseVersion = versions.get('affine:database'); + if (databaseVersion !== undefined && databaseVersion < 2) { + versions.set('affine:database', 2); + } +} + +function migrateMeta( + oldDoc: YDoc, + newDoc: YDoc, + idMap: Record +) { + const originalMeta = oldDoc.getMap('space:meta'); + const originalVersions = originalMeta.get('versions') as YMap; + const originalPages = originalMeta.get('pages') as YArray>; + const meta = newDoc.getMap('meta'); + const pages = new YArray(); + const blockVersions = originalVersions.clone(); + + meta.set('workspaceVersion', 1); + meta.set('blockVersions', blockVersions); + meta.set('pages', pages); + meta.set('name', originalMeta.get('name') as string); + + updateBlockVersions(blockVersions); + const mapList = originalPages.map(page => { + const map = new YMap(); + Array.from(page.entries()) + .filter(([key]) => key !== 'subpageIds') + .forEach(([key, value]) => { + if (key === 'id') { + idMap[value] = nanoid(); + map.set(key, idMap[value]); + } else { + map.set(key, value); + } + }); + return map; + }); + pages.push(mapList); +} + +function migrateBlocks( + oldDoc: YDoc, + newDoc: YDoc, + idMap: Record +) { + const spaces = newDoc.getMap('spaces'); + const originalMeta = oldDoc.getMap('space:meta'); + const originalVersions = originalMeta.get('versions') as YMap; + const originalPages = originalMeta.get('pages') as YArray>; + originalPages.forEach(page => { + const id = page.get('id') as string; + const newId = idMap[id]; + const spaceId = id.startsWith('space:') ? id : `space:${id}`; + const originalBlocks = oldDoc.getMap(spaceId) as YMap; + const subdoc = new YDoc(); + spaces.set(newId, subdoc); + subdoc.guid = id; + const blocks = subdoc.getMap('blocks'); + Array.from(originalBlocks.entries()).forEach(([key, value]) => { + // @ts-expect-error clone method exists + const blockData = value.clone(); + blocks.set(key, blockData); + const flavour = blockData.get('sys:flavour') as string; + const version = originalVersions.get(flavour); + if (version !== undefined) { + runBlockMigration(flavour, blockData, version); + } + }); + }); +} + +export function migrateToSubdoc(oldDoc: YDoc): YDoc { + const needMigration = + Array.from(oldDoc.getMap('space:meta').keys()).length > 0; + if (!needMigration) { + return oldDoc; + } + const newDoc = new YDoc(); + const idMap = {} as Record; + migrateMeta(oldDoc, newDoc, idMap); + migrateBlocks(oldDoc, newDoc, idMap); + return newDoc; +} + +export const upgradeV1ToV2 = async ( + oldDoc: YDoc, + createWorkspace: () => Promise +) => { + const newDoc = migrateToSubdoc(oldDoc); + const newWorkspace = await createWorkspace(); + applyUpdate(newWorkspace.doc, encodeStateAsUpdate(newDoc), migrationOrigin); + newDoc.getSubdocs().forEach(subdoc => { + newWorkspace.doc.getSubdocs().forEach(newDoc => { + if (subdoc.guid === newDoc.guid) { + applyUpdate(newDoc, encodeStateAsUpdate(subdoc), migrationOrigin); + } + }); + }); + return newWorkspace; +}; diff --git a/packages/common/infra/src/blocksuite/migration/workspace.ts b/packages/common/infra/src/blocksuite/migration/workspace.ts new file mode 100644 index 0000000000..24d09671b2 --- /dev/null +++ b/packages/common/infra/src/blocksuite/migration/workspace.ts @@ -0,0 +1,77 @@ +import type { Workspace } from '@blocksuite/store'; +import type { Schema } from '@blocksuite/store'; +import type { Doc as YDoc } from 'yjs'; + +import { migratePages } from './blocksuite'; +import { upgradeV1ToV2 } from './subdoc'; + +interface MigrationOptions { + doc: YDoc; + schema: Schema; + createWorkspace: () => Promise; +} + +function createMigrationQueue(options: MigrationOptions) { + return [ + async (doc: YDoc) => { + const newWorkspace = await upgradeV1ToV2(doc, options.createWorkspace); + return newWorkspace.doc; + }, + async (doc: YDoc) => { + await migratePages(doc, options.schema); + return doc; + }, + ]; +} + +/** + * For split migrate function from MigrationQueue. + */ +export enum MigrationPoint { + SubDoc = 1, + BlockVersion = 2, +} + +export async function migrateWorkspace( + point: MigrationPoint, + options: MigrationOptions +) { + const migrationQueue = createMigrationQueue(options); + const migrationFns = migrationQueue.slice(point - 1); + + let doc = options.doc; + for (const migrate of migrationFns) { + doc = await migrate(doc); + } + return doc; +} + +export function checkWorkspaceCompatibility( + workspace: Workspace +): MigrationPoint | null { + const workspaceDocJSON = workspace.doc.toJSON(); + const spaceMetaObj = workspaceDocJSON['space:meta']; + const docKeys = Object.keys(workspaceDocJSON); + const haveSpaceMeta = !!spaceMetaObj && Object.keys(spaceMetaObj).length > 0; + const haveLegacySpace = docKeys.some(key => key.startsWith('space:')); + if (haveSpaceMeta || haveLegacySpace) { + return MigrationPoint.SubDoc; + } + + // Sometimes, blocksuite will not write blockVersions to meta. + // Just fix it when user open the workspace. + const blockVersions = workspace.meta.blockVersions; + if (!blockVersions) { + return MigrationPoint.BlockVersion; + } + + // From v2, we depend on blocksuite to check and migrate data. + for (const [flavour, version] of Object.entries(blockVersions)) { + const schema = workspace.schema.flavourSchemaMap.get(flavour); + if (schema?.version !== version) { + return MigrationPoint.BlockVersion; + } + } + + return null; +} diff --git a/packages/common/infra/src/type.ts b/packages/common/infra/src/type.ts index f3ac432917..e998db425b 100644 --- a/packages/common/infra/src/type.ts +++ b/packages/common/infra/src/type.ts @@ -200,6 +200,7 @@ export type WorkspaceHandlers = { list: () => Promise<[workspaceId: string, meta: WorkspaceMeta][]>; delete: (id: string) => Promise; getMeta: (id: string) => Promise; + clone: (id: string, newId: string) => Promise; }; export type UnwrapManagerHandlerToServerSide< diff --git a/packages/common/sdk/package.json b/packages/common/sdk/package.json index 8123f322c5..574a769c88 100644 --- a/packages/common/sdk/package.json +++ b/packages/common/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@affine/sdk", - "version": "0.10.2", + "version": "0.10.3-canary.2", "type": "module", "scripts": { "build": "vite build", @@ -22,12 +22,12 @@ "dist" ], "dependencies": { - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", - "jotai": "^2.4.3", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", + "jotai": "^2.5.1", "zod": "^3.22.4" }, "devDependencies": { diff --git a/packages/common/y-indexeddb/README.md b/packages/common/y-indexeddb/README.md index 7c618c007f..6b5833c78f 100644 --- a/packages/common/y-indexeddb/README.md +++ b/packages/common/y-indexeddb/README.md @@ -35,4 +35,4 @@ downloadBinary(yDoc.guid).then(blob => { ## LICENSE -[MIT](https://github.com/toeverything/AFFiNE/blob/master/LICENSE-MIT) +[MIT](https://github.com/toeverything/AFFiNE/blob/canary/LICENSE-MIT) diff --git a/packages/common/y-indexeddb/package.json b/packages/common/y-indexeddb/package.json index 6afdfe5f1a..3dc95f92f7 100644 --- a/packages/common/y-indexeddb/package.json +++ b/packages/common/y-indexeddb/package.json @@ -1,7 +1,7 @@ { "name": "@toeverything/y-indexeddb", "type": "module", - "version": "0.10.2", + "version": "0.10.3-canary.2", "description": "IndexedDB database adapter for Yjs", "repository": "toeverything/AFFiNE", "author": "toeverything", @@ -33,18 +33,18 @@ }, "dependencies": { "idb": "^7.1.1", - "nanoid": "^5.0.1", + "nanoid": "^5.0.3", "y-provider": "workspace:*" }, "devDependencies": { - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "fake-indexeddb": "^5.0.0", "vite": "^4.4.11", "vite-plugin-dts": "3.6.0", "vitest": "0.34.6", "y-indexeddb": "^9.0.11", - "yjs": "^13.6.8" + "yjs": "^13.6.10" }, "peerDependencies": { "yjs": "^13" diff --git a/packages/common/y-provider/package.json b/packages/common/y-provider/package.json index 6c57f65d98..8ec4e93f62 100644 --- a/packages/common/y-provider/package.json +++ b/packages/common/y-provider/package.json @@ -1,7 +1,7 @@ { "name": "y-provider", "type": "module", - "version": "0.10.2", + "version": "0.10.3-canary.2", "description": "Yjs provider protocol for multi document support", "exports": { ".": "./src/index.ts" @@ -24,11 +24,11 @@ "build": "vite build" }, "devDependencies": { - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "vite": "^4.4.11", "vite-plugin-dts": "3.6.0", "vitest": "0.34.6", - "yjs": "^13.6.8" + "yjs": "^13.6.10" }, "peerDependencies": { "yjs": "^13" diff --git a/packages/frontend/component/package.json b/packages/frontend/component/package.json index c0b1096f2e..08976bb9a3 100644 --- a/packages/frontend/component/package.json +++ b/packages/frontend/component/package.json @@ -12,7 +12,6 @@ "@blocksuite/editor": "*", "@blocksuite/global": "*", "@blocksuite/icons": "2.1.34", - "@blocksuite/lit": "*", "@blocksuite/store": "*" }, "dependencies": { @@ -22,14 +21,11 @@ "@affine/workspace": "workspace:*", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", - "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/sortable": "^8.0.0", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", "@emotion/styled": "^11.11.0", - "@mui/base": "5.0.0-beta.19", - "@mui/icons-material": "^5.14.14", - "@mui/material": "^5.14.14", "@popperjs/core": "^2.11.8", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-collapsible": "^1.0.3", @@ -47,15 +43,14 @@ "clsx": "^2.0.0", "dayjs": "^1.11.10", "foxact": "^0.2.20", - "jotai": "^2.4.3", - "jotai-effect": "^0.2.2", - "jotai-scope": "^0.4.0", + "jotai": "^2.5.1", + "jotai-effect": "^0.2.3", + "jotai-scope": "^0.4.1", "lit": "^3.0.2", - "lodash": "^4.17.21", "lodash-es": "^4.17.21", "lottie-react": "^2.4.0", "lottie-web": "^5.12.2", - "nanoid": "^5.0.1", + "nanoid": "^5.0.3", "next-themes": "^0.2.1", "react": "18.2.0", "react-datepicker": "^4.20.0", @@ -69,12 +64,12 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/icons": "2.1.35", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/icons": "2.1.36", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@storybook/jest": "^0.2.3", "@storybook/testing-library": "^0.2.2", "@testing-library/react": "^14.0.0", @@ -85,10 +80,10 @@ "@types/react-dom": "^18.2.13", "@vanilla-extract/css": "^1.13.0", "fake-indexeddb": "^5.0.0", - "typescript": "^5.2.2", + "typescript": "^5.3.2", "vite": "^4.4.11", "vitest": "0.34.6", - "yjs": "^13.6.8" + "yjs": "^13.6.10" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/component/src/components/affine-banner/download-client.tsx b/packages/frontend/component/src/components/affine-banner/download-client.tsx deleted file mode 100644 index 593721af5c..0000000000 --- a/packages/frontend/component/src/components/affine-banner/download-client.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Trans } from '@affine/i18n'; -import { CloseIcon, Logo1Icon } from '@blocksuite/icons'; - -import { - downloadCloseButtonStyle, - downloadMessageStyle, - downloadTipContainerStyle, - downloadTipIconStyle, - downloadTipStyle, - linkStyle, -} from './index.css'; - -export const DownloadTips = ({ onClose }: { onClose: () => void }) => { - return ( -
-
- -
- - This demo is limited. - - Download the AFFiNE Client - - for the latest features and Performance. - -
-
-
- -
-
- ); -}; - -export default DownloadTips; diff --git a/packages/frontend/component/src/components/affine-banner/index.css.ts b/packages/frontend/component/src/components/affine-banner/index.css.ts index 515f15c760..345f9eb30f 100644 --- a/packages/frontend/component/src/components/affine-banner/index.css.ts +++ b/packages/frontend/component/src/components/affine-banner/index.css.ts @@ -1,13 +1,4 @@ -import { keyframes, style } from '@vanilla-extract/css'; - -const slideDown = keyframes({ - '0%': { - height: '0px', - }, - '100%': { - height: '44px', - }, -}); +import { style } from '@vanilla-extract/css'; export const browserWarningStyle = style({ backgroundColor: 'var(--affine-background-warning-color)', @@ -36,52 +27,31 @@ export const closeIconStyle = style({ position: 'relative', zIndex: 1, }); -export const downloadTipContainerStyle = style({ - backgroundColor: 'var(--affine-primary-color)', - color: 'var(--affine-white)', +export const tipsContainer = style({ + backgroundColor: 'var(--affine-background-error-color)', + color: 'var(--affine-error-color)', width: '100%', - height: '44px', - fontSize: 'var(--affine-font-base)', + fontSize: 'var(--affine-font-sm)', + fontWeight: '700', display: 'flex', - justifyContent: 'center', + justifyContent: 'space-between', alignItems: 'center', - position: 'relative', - animation: `${slideDown} .3s ease-in-out forwards`, + padding: '12px 16px', + position: 'sticky', + gap: '16px', + containerType: 'inline-size', }); -export const downloadTipStyle = style({ + +export const tipsMessage = style({ + color: 'var(--affine-error-color)', + flexGrow: 1, + flexShrink: 1, +}); + +export const tipsRightItem = style({ display: 'flex', - justifyContent: 'center', + flexShrink: 0, + justifyContent: 'space-between', alignItems: 'center', -}); -export const downloadTipIconStyle = style({ - color: 'var(--affine-white)', - width: '24px', - height: '24px', - fontSize: '24px', - position: 'relative', - zIndex: 1, -}); -export const downloadCloseButtonStyle = style({ - color: 'var(--affine-white)', - cursor: 'pointer', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - position: 'absolute', - right: '24px', -}); -export const downloadMessageStyle = style({ - color: 'var(--affine-white)', - marginLeft: '8px', -}); -export const linkStyle = style({ - color: 'var(--affine-white)', - textDecoration: 'underline', - ':hover': { - textDecoration: 'underline', - }, - ':visited': { - color: 'var(--affine-white)', - textDecoration: 'underline', - }, + gap: '16px', }); diff --git a/packages/frontend/component/src/components/affine-banner/index.tsx b/packages/frontend/component/src/components/affine-banner/index.tsx index 24c34dfbfb..fae16ec0f7 100644 --- a/packages/frontend/component/src/components/affine-banner/index.tsx +++ b/packages/frontend/component/src/components/affine-banner/index.tsx @@ -1,2 +1,2 @@ export * from './browser-warning'; -export * from './download-client'; +export * from './local-demo-tips'; diff --git a/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx b/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx new file mode 100644 index 0000000000..3a9eea2ef2 --- /dev/null +++ b/packages/frontend/component/src/components/affine-banner/local-demo-tips.tsx @@ -0,0 +1,54 @@ +import { CloseIcon } from '@blocksuite/icons'; +import { Button, IconButton } from '@toeverything/components/button'; +import { useCallback } from 'react'; + +import * as styles from './index.css'; + +type LocalDemoTipsProps = { + isLoggedIn: boolean; + onLogin: () => void; + onEnableCloud: () => void; + onClose: () => void; +}; + +export const LocalDemoTips = ({ + onClose, + isLoggedIn, + onLogin, + onEnableCloud, +}: LocalDemoTipsProps) => { + const content = isLoggedIn + ? 'This is a local demo workspace, and the data is stored locally. We recommend enabling AFFiNE Cloud.' + : 'This is a local demo workspace, and the data is stored locally in the browser. We recommend Enabling AFFiNE Cloud or downloading the client for a better experience.'; + + const buttonLabel = isLoggedIn + ? 'Enable AFFiNE Cloud' + : 'Sign in with AFFiNE Cloud'; + + const handleClick = useCallback(() => { + if (isLoggedIn) { + return onEnableCloud(); + } + return onLogin(); + }, [isLoggedIn, onEnableCloud, onLogin]); + + return ( +
+
{content}
+ +
+
+ +
+ + + +
+
+ ); +}; + +export default LocalDemoTips; diff --git a/packages/frontend/component/src/components/app-sidebar/app-download-button/index.css.ts b/packages/frontend/component/src/components/app-sidebar/app-download-button/index.css.ts new file mode 100644 index 0000000000..22ccf82a88 --- /dev/null +++ b/packages/frontend/component/src/components/app-sidebar/app-download-button/index.css.ts @@ -0,0 +1,22 @@ +import { style } from '@vanilla-extract/css'; +export { + closeIcon, + ellipsisTextOverflow, + halo, + icon, + particles, + root, +} from '../app-updater-button/index.css'; + +export const rootPadding = style({ + padding: '0 24px', +}); + +export const label = style({ + display: 'flex', + alignItems: 'center', + width: '100%', + height: '100%', + fontSize: 'var(--affine-font-sm)', + whiteSpace: 'nowrap', +}); diff --git a/packages/frontend/component/src/components/app-sidebar/app-download-button/index.tsx b/packages/frontend/component/src/components/app-sidebar/app-download-button/index.tsx new file mode 100644 index 0000000000..8ec414aa9d --- /dev/null +++ b/packages/frontend/component/src/components/app-sidebar/app-download-button/index.tsx @@ -0,0 +1,53 @@ +import { CloseIcon, DownloadIcon } from '@blocksuite/icons'; +import clsx from 'clsx'; +import { useCallback, useState } from 'react'; + +import * as styles from './index.css'; + +// Although it is called an input, it is actually a button. +export function AppDownloadButton({ + className, + style, +}: { + className?: string; + style?: React.CSSProperties; +}) { + const [show, setShow] = useState(true); + + const handleClose = useCallback(() => { + setShow(false); + }, []); + + // TODO: unify this type of literal value. + const handleClick = useCallback(() => { + const url = `https://affine.pro/download?channel=stable`; + open(url, '_blank'); + }, []); + + if (!show) { + return null; + } + return ( + + ); +} diff --git a/packages/frontend/component/src/components/app-sidebar/index.tsx b/packages/frontend/component/src/components/app-sidebar/index.tsx index 78afc60237..69bc06f419 100644 --- a/packages/frontend/component/src/components/app-sidebar/index.tsx +++ b/packages/frontend/component/src/components/app-sidebar/index.tsx @@ -1,11 +1,11 @@ -import { Skeleton } from '@mui/material'; import { assignInlineVars } from '@vanilla-extract/dynamic'; import clsx from 'clsx'; import { useAtom, useAtomValue } from 'jotai'; -import debounce from 'lodash/debounce'; +import { debounce } from 'lodash-es'; import type { PropsWithChildren, ReactElement } from 'react'; import { useEffect, useRef, useState } from 'react'; +import { Skeleton } from '../../ui/skeleton'; import { fallbackHeaderStyle, fallbackStyle } from './fallback.css'; import { floatingMaxWidth, @@ -159,6 +159,7 @@ export const AppSidebarFallback = (): ReactElement | null => { }; export * from './add-page-button'; +export * from './app-download-button'; export * from './app-updater-button'; export * from './category-divider'; export * from './index.css'; diff --git a/packages/frontend/component/src/components/block-suite-editor/index.tsx b/packages/frontend/component/src/components/block-suite-editor/index.tsx index 3d2062458b..450a73382d 100644 --- a/packages/frontend/component/src/components/block-suite-editor/index.tsx +++ b/packages/frontend/component/src/components/block-suite-editor/index.tsx @@ -1,7 +1,6 @@ import { EditorContainer } from '@blocksuite/editor'; import { assertExists } from '@blocksuite/global/utils'; import type { Page } from '@blocksuite/store'; -import { Skeleton } from '@mui/material'; import clsx from 'clsx'; import { use } from 'foxact/use'; import type { CSSProperties, ReactElement } from 'react'; @@ -17,11 +16,12 @@ import { import type { FallbackProps } from 'react-error-boundary'; import { ErrorBoundary } from 'react-error-boundary'; +import { Skeleton } from '../../ui/skeleton'; import { blockSuiteEditorHeaderStyle, blockSuiteEditorStyle, } from './index.css'; -import { getPresets } from './preset'; +import { editorPresets } from './preset'; interface BlockElement extends Element { path: string[]; @@ -104,12 +104,10 @@ const BlockSuiteEditorImpl = ({ if (editor.page !== page) { editor.page = page; + editor.pagePreset = editorPresets.pageModePreset; + editor.edgelessPreset = editorPresets.edgelessModePreset; } - const presets = getPresets(); - editor.pagePreset = presets.pageModePreset; - editor.edgelessPreset = presets.edgelessModePreset; - useLayoutEffect(() => { if (editor) { const disposes: (() => void)[] = []; diff --git a/packages/frontend/component/src/components/block-suite-editor/preset.ts b/packages/frontend/component/src/components/block-suite-editor/preset.ts index 4da074e566..14184ab5c0 100644 --- a/packages/frontend/component/src/components/block-suite-editor/preset.ts +++ b/packages/frontend/component/src/components/block-suite-editor/preset.ts @@ -17,7 +17,7 @@ class CustomAttachmentService extends AttachmentService { } } -export function getPresets() { +function getPresets() { const pageModePreset = PagePreset.map(preset => { if (preset.schema.model.flavour === 'affine:attachment') { return { @@ -42,3 +42,5 @@ export function getPresets() { edgelessModePreset, }; } + +export const editorPresets = getPresets(); diff --git a/packages/frontend/component/src/components/card/workspace-card/index.tsx b/packages/frontend/component/src/components/card/workspace-card/index.tsx index 88949055e6..3df908a3f9 100644 --- a/packages/frontend/component/src/components/card/workspace-card/index.tsx +++ b/packages/frontend/component/src/components/card/workspace-card/index.tsx @@ -2,7 +2,6 @@ import { WorkspaceFlavour } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import type { RootWorkspaceMetadata } from '@affine/workspace/atom'; import { CollaborationIcon, SettingsIcon } from '@blocksuite/icons'; -import { Skeleton } from '@mui/material'; import { Avatar } from '@toeverything/components/avatar'; import { Divider } from '@toeverything/components/divider'; import { Tooltip } from '@toeverything/components/tooltip'; @@ -12,6 +11,7 @@ import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/wor import { useAtomValue } from 'jotai/react'; import { useCallback } from 'react'; +import { Skeleton } from '../../../ui/skeleton'; import { StyledCard, StyledIconContainer, diff --git a/packages/frontend/component/src/components/share-menu/disable-public-link/index.tsx b/packages/frontend/component/src/components/disable-public-link/index.tsx similarity index 100% rename from packages/frontend/component/src/components/share-menu/disable-public-link/index.tsx rename to packages/frontend/component/src/components/disable-public-link/index.tsx diff --git a/packages/frontend/component/src/components/list-skeleton.tsx b/packages/frontend/component/src/components/list-skeleton.tsx deleted file mode 100644 index 9d24d8b5a6..0000000000 --- a/packages/frontend/component/src/components/list-skeleton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Skeleton } from '@mui/material'; -import { memo } from 'react'; - -export const ListSkeleton = memo(function ListItemSkeleton() { - return ( - <> - - - - - - ); -}); diff --git a/packages/frontend/component/src/components/notification-center/index.css.ts b/packages/frontend/component/src/components/notification-center/index.css.ts index dc7cc02d7a..a99a55b8ef 100644 --- a/packages/frontend/component/src/components/notification-center/index.css.ts +++ b/packages/frontend/component/src/components/notification-center/index.css.ts @@ -60,9 +60,9 @@ export const notificationStyle = style({ opacity: 1, height: 'var(--front-toast-height)', vars: { - '--scale': 'var(--toasts-before)* 0.05 + 1', + '--scale': 'calc(1 - var(--toasts-before)* 0.05)', '--y': - 'translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)))', + 'translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(var(--scale))', }, }, '&[data-mounted=true][data-expanded=true]': { diff --git a/packages/frontend/component/src/components/page-list/operation-menu-items/disable-public-sharing.tsx b/packages/frontend/component/src/components/page-list/operation-menu-items/disable-public-sharing.tsx index e89b37d76d..296c220db8 100644 --- a/packages/frontend/component/src/components/page-list/operation-menu-items/disable-public-sharing.tsx +++ b/packages/frontend/component/src/components/page-list/operation-menu-items/disable-public-sharing.tsx @@ -6,7 +6,7 @@ import { type MenuItemProps, } from '@toeverything/components/menu'; -import { PublicLinkDisableModal } from '../../share-menu'; +import { PublicLinkDisableModal } from '../../disable-public-link'; export const DisablePublicSharing = (props: MenuItemProps) => { const t = useAFFiNEI18N(); diff --git a/packages/frontend/component/src/components/page-list/page-tags.css.ts b/packages/frontend/component/src/components/page-list/page-tags.css.ts index 8211c9bbe2..543c655216 100644 --- a/packages/frontend/component/src/components/page-list/page-tags.css.ts +++ b/packages/frontend/component/src/components/page-list/page-tags.css.ts @@ -64,14 +64,6 @@ export const innerBackdrop = style({ }, }); -const range = (start: number, end: number) => { - const result = []; - for (let i = start; i < end; i++) { - result.push(i); - } - return result; -}; - export const tag = style({ height: '20px', display: 'flex', @@ -94,14 +86,6 @@ export const tagSticky = style([ textOverflow: 'ellipsis', whiteSpace: 'nowrap', left: 0, - selectors: range(0, 20).reduce((selectors, i) => { - return { - ...selectors, - [`&:nth-last-child(${i + 1})`]: { - right: `${i * 48}px`, - }, - }; - }, {}), }, ]); diff --git a/packages/frontend/component/src/components/page-list/page-tags.tsx b/packages/frontend/component/src/components/page-list/page-tags.tsx index 4b6b4072a2..8650979983 100644 --- a/packages/frontend/component/src/components/page-list/page-tags.tsx +++ b/packages/frontend/component/src/components/page-list/page-tags.tsx @@ -18,6 +18,7 @@ interface TagItemProps { tag: Tag; idx: number; mode: 'sticky' | 'list-item'; + style?: React.CSSProperties; } // hack: map var(--affine-tag-xxx) colors to var(--affine-palette-line-xxx) @@ -37,13 +38,14 @@ const tagColorMap = (color: string) => { return mapping[color] || color; }; -const TagItem = ({ tag, idx, mode }: TagItemProps) => { +const TagItem = ({ tag, idx, mode, style }: TagItemProps) => { return (
{ const nTags = maxItems ? tags.slice(0, maxItems) : tags; + + // sort tags by length + nTags.sort((a, b) => a.value.length - b.value.length); + + const tagRightCharLength = nTags.reduceRight( + (acc, tag) => { + const curr = acc[0] + Math.min(tag.value.length, 10); + return [curr, ...acc]; + }, + [0] + ); + + tagRightCharLength.shift(); + return nTags.map((tag, idx) => ( - + )); }, [maxItems, tags]); return ( diff --git a/packages/frontend/component/src/components/page-list/scoped-atoms.tsx b/packages/frontend/component/src/components/page-list/scoped-atoms.tsx index f252693d5d..9ad94f539e 100644 --- a/packages/frontend/component/src/components/page-list/scoped-atoms.tsx +++ b/packages/frontend/component/src/components/page-list/scoped-atoms.tsx @@ -192,9 +192,9 @@ export const pageGroupsAtom = atom(get => { sorter.key === 'createDate' || sorter.key === 'updatedDate' ? sorter.key : // default sort - !sorter.key - ? DEFAULT_SORT_KEY - : undefined; + !sorter.key + ? DEFAULT_SORT_KEY + : undefined; } return pagesToPageGroups(sorter.pages, groupBy); }); diff --git a/packages/frontend/component/src/components/page-list/utils.tsx b/packages/frontend/component/src/components/page-list/utils.tsx index b98e2fea98..8acf0002eb 100644 --- a/packages/frontend/component/src/components/page-list/utils.tsx +++ b/packages/frontend/component/src/components/page-list/utils.tsx @@ -1,4 +1,3 @@ -import { useMediaQuery, useTheme } from '@mui/material'; import clsx from 'clsx'; import { type BaseSyntheticEvent, @@ -8,12 +7,6 @@ import { import * as styles from './page-list.css'; -export const useIsSmallDevices = () => { - const theme = useTheme(); - const isSmallDevices = useMediaQuery(theme.breakpoints.down(900)); - return isSmallDevices; -}; - export function isToday(date: Date): boolean { const today = new Date(); return ( diff --git a/packages/frontend/component/src/components/page-list/view/edit-collection/rules-mode.tsx b/packages/frontend/component/src/components/page-list/view/edit-collection/rules-mode.tsx index 277a30dc86..c7e4b009c3 100644 --- a/packages/frontend/component/src/components/page-list/view/edit-collection/rules-mode.tsx +++ b/packages/frontend/component/src/components/page-list/view/edit-collection/rules-mode.tsx @@ -92,10 +92,10 @@ export const RulesMode = ({ values={{ highlight: t['com.affine.editCollection.rules.tips.highlight'](), }} - > - Pages that meet the rules will be added to the current collection{' '} - highlight. - + components={{ + 2: , + }} + />
diff --git a/packages/frontend/component/src/components/setting-components/workspace-detail-skeleton.tsx b/packages/frontend/component/src/components/setting-components/workspace-detail-skeleton.tsx index 0b9ee85557..6755c200d6 100644 --- a/packages/frontend/component/src/components/setting-components/workspace-detail-skeleton.tsx +++ b/packages/frontend/component/src/components/setting-components/workspace-detail-skeleton.tsx @@ -1,5 +1,4 @@ -import { Skeleton } from '@mui/material'; - +import { Skeleton } from '../../ui/skeleton'; import { SettingHeader } from './setting-header'; import { SettingRow } from './setting-row'; import { SettingWrapper } from './wrapper'; diff --git a/packages/frontend/component/src/components/setting-components/workspace-list-skeleton.tsx b/packages/frontend/component/src/components/setting-components/workspace-list-skeleton.tsx index 047f4119eb..170798d4a4 100644 --- a/packages/frontend/component/src/components/setting-components/workspace-list-skeleton.tsx +++ b/packages/frontend/component/src/components/setting-components/workspace-list-skeleton.tsx @@ -1,12 +1,11 @@ -import { Skeleton } from '@mui/material'; - import { FlexWrapper } from '../../ui/layout'; +import { Skeleton } from '../../ui/skeleton'; export const WorkspaceListItemSkeleton = () => { return ( { height={14} style={{ marginRight: 10 }} /> - + ); }; diff --git a/packages/frontend/component/src/components/share-menu/index.tsx b/packages/frontend/component/src/components/share-menu/index.tsx deleted file mode 100644 index 6dabe4f3d1..0000000000 --- a/packages/frontend/component/src/components/share-menu/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export * from './disable-public-link'; -export * from './share-menu'; -export * from './styles'; diff --git a/packages/frontend/component/src/components/share-menu/styles.ts b/packages/frontend/component/src/components/share-menu/styles.ts deleted file mode 100644 index 86e2e18c85..0000000000 --- a/packages/frontend/component/src/components/share-menu/styles.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Button } from '@toeverything/components/button'; - -import { displayFlex, styled } from '../..'; - -export const TabItem = styled('li')<{ isActive?: boolean }>(({ isActive }) => { - { - return { - ...displayFlex('center', 'center'), - flex: '1', - height: '30px', - color: 'var(--affine-text-primary-color)', - opacity: isActive ? 1 : 0.2, - fontWeight: '500', - fontSize: 'var(--affine-font-base)', - lineHeight: 'var(--affine-line-height)', - cursor: 'pointer', - transition: 'all 0.15s ease', - padding: '0 10px', - marginBottom: '4px', - borderRadius: '4px', - position: 'relative', - ':hover': { - background: 'var(--affine-hover-color)', - opacity: 1, - color: isActive - ? 'var(--affine-t/ext-primary-color)' - : 'var(--affine-text-secondary-color)', - svg: { - fill: isActive - ? 'var(--affine-text-primary-color)' - : 'var(--affine-text-secondary-color)', - }, - }, - svg: { - fontSize: '20px', - marginRight: '12px', - }, - ':after': { - content: '""', - position: 'absolute', - bottom: '-6px', - left: '0', - width: '100%', - height: '2px', - background: 'var(--affine-text-primary-color)', - opacity: 0.2, - }, - }; - } -}); -export const StyledIndicator = styled('div')(() => { - return { - height: '2px', - background: 'var(--affine-text-primary-color)', - position: 'absolute', - left: '0', - transition: 'left .3s, width .3s', - }; -}); -export const StyledInput = styled('input')(() => { - return { - padding: '4px 8px', - height: '28px', - color: 'var(--affine-placeholder-color)', - border: `1px solid ${'var(--affine-placeholder-color)'}`, - cursor: 'default', - overflow: 'hidden', - userSelect: 'text', - borderRadius: '4px', - flexGrow: 1, - marginRight: '10px', - }; -}); -export const StyledDisableButton = styled(Button)(() => { - return { - color: '#FF631F', - height: '32px', - border: 'none', - marginTop: '16px', - borderRadius: '8px', - padding: '0', - }; -}); -export const StyledLinkSpan = styled('span')(() => { - return { - marginLeft: '4px', - color: 'var(--affine-primary-color)', - fontWeight: '500', - cursor: 'pointer', - }; -}); diff --git a/packages/frontend/component/src/components/workspace/index.css.ts b/packages/frontend/component/src/components/workspace/index.css.ts index 622036a395..02a86963a5 100644 --- a/packages/frontend/component/src/components/workspace/index.css.ts +++ b/packages/frontend/component/src/components/workspace/index.css.ts @@ -2,8 +2,6 @@ import { lightCssVariables } from '@toeverything/theme'; import type { ComplexStyleRule } from '@vanilla-extract/css'; import { globalStyle, style } from '@vanilla-extract/css'; -import { breakpoints } from '../../styles/mui-theme'; - export const appStyle = style({ width: '100%', position: 'relative', @@ -134,10 +132,10 @@ export const toolStyle = style({ flexDirection: 'column', gap: '12px', '@media': { - [breakpoints.down('md', true)]: { + 'screen and (max-width: 960px)': { right: 'calc((100vw - 640px) * 3 / 19 + 14px)', }, - [breakpoints.down('sm', true)]: { + 'screen and (max-width: 640px)': { right: '5px', bottom: '5px', }, @@ -149,10 +147,10 @@ export const toolStyle = style({ '&[data-in-trash-page="true"]': { bottom: '70px', '@media': { - [breakpoints.down('md', true)]: { + 'screen and (max-width: 960px)': { bottom: '80px', }, - [breakpoints.down('sm', true)]: { + 'screen and (max-width: 640px)': { bottom: '85px', }, print: { diff --git a/packages/frontend/component/src/index.ts b/packages/frontend/component/src/index.ts index 3ce35948ff..25218e5bc3 100644 --- a/packages/frontend/component/src/index.ts +++ b/packages/frontend/component/src/index.ts @@ -1,6 +1,4 @@ -export * from './components/list-skeleton'; export * from './styles'; -export * from './ui/breadcrumbs'; export * from './ui/button'; export * from './ui/checkbox'; export * from './ui/empty'; @@ -8,12 +6,8 @@ export * from './ui/input'; export * from './ui/layout'; export * from './ui/lottie/collections-icon'; export * from './ui/lottie/delete-icon'; -export * from './ui/menu'; -export * from './ui/mui'; -export * from './ui/popper'; export * from './ui/scrollbar'; -export * from './ui/shared/container'; +export * from './ui/skeleton'; export * from './ui/switch'; export * from './ui/table'; export * from './ui/toast'; -export * from './ui/tree-view'; diff --git a/packages/frontend/component/src/styles/index.ts b/packages/frontend/component/src/styles/index.ts index 575d48515d..e28c833f70 100644 --- a/packages/frontend/component/src/styles/index.ts +++ b/packages/frontend/component/src/styles/index.ts @@ -1,3 +1,2 @@ export * from './helper'; -export * from './mui-theme'; -export * from './mui-theme-provider'; +export * from './styled'; diff --git a/packages/frontend/component/src/styles/mui-theme-provider.tsx b/packages/frontend/component/src/styles/mui-theme-provider.tsx deleted file mode 100644 index 7d1e11ef4e..0000000000 --- a/packages/frontend/component/src/styles/mui-theme-provider.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import { alpha, css, keyframes, styled } from '@mui/material/styles'; - -export { alpha, css, keyframes, styled }; diff --git a/packages/frontend/component/src/styles/mui-theme.ts b/packages/frontend/component/src/styles/mui-theme.ts deleted file mode 100644 index 35da7f787c..0000000000 --- a/packages/frontend/component/src/styles/mui-theme.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { - Breakpoint, - BreakpointsOptions, - ThemeOptions, -} from '@mui/material'; - -export const muiThemes = { - breakpoints: { - values: { - xs: 0, - sm: 640, - md: 960, - lg: 1280, - xl: 1920, - }, - }, -} satisfies ThemeOptions; - -// Ported from mui -// See https://github.com/mui/material-ui/blob/eba90da5359ff9c58b02800dfe468dc6c0b95bd2/packages/mui-system/src/createTheme/createBreakpoints.js -// License under MIT -function createBreakpoints(breakpoints: BreakpointsOptions): Readonly< - Omit & { - up: (key: Breakpoint | number, pure?: boolean) => string; - down: (key: Breakpoint | number, pure?: boolean) => string; - } -> { - const { - // The breakpoint **start** at this value. - // For instance with the first breakpoint xs: [xs, sm). - values = { - xs: 0, // phone - sm: 600, // tablet - md: 900, // small laptop - lg: 1200, // desktop - xl: 1536, // large screen - }, - unit = 'px', - step = 5, - ...other - } = breakpoints; - - const keys = Object.keys(values) as ['xs', 'sm', 'md', 'lg', 'xl']; - - function up(key: Breakpoint | number, pure = false) { - const value = typeof key === 'number' ? key : values[key]; - const original = `(min-width:${value}${unit})`; - if (pure) { - return original; - } - return `@media ${original}`; - } - - function down(key: Breakpoint | number, pure = false) { - const value = typeof key === 'number' ? key : values[key]; - const original = `(max-width:${value - step / 100}${unit})`; - if (pure) { - return original; - } - return `@media ${original}`; - } - - return { - keys, - values, - up, - down, - unit, - // between, - // only, - // not, - ...other, - }; -} - -/** - * @example - * ```ts - * export const iconButtonStyle = style({ - * [breakpoints.up('sm')]: { - * padding: '6px' - * }, - * }); - * ``` - */ -export const breakpoints = createBreakpoints(muiThemes.breakpoints); diff --git a/packages/frontend/component/src/styles/styled.tsx b/packages/frontend/component/src/styles/styled.tsx new file mode 100644 index 0000000000..f357a2d9e5 --- /dev/null +++ b/packages/frontend/component/src/styles/styled.tsx @@ -0,0 +1,3 @@ +import styled from '@emotion/styled'; + +export { styled }; diff --git a/packages/frontend/component/src/ui/breadcrumbs/index.ts b/packages/frontend/component/src/ui/breadcrumbs/index.ts deleted file mode 100644 index 9a87e958a6..0000000000 --- a/packages/frontend/component/src/ui/breadcrumbs/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { BreadcrumbsProps } from '@mui/material/Breadcrumbs'; -import MuiBreadcrumbs from '@mui/material/Breadcrumbs'; -import type { ComponentType } from 'react'; - -import { styled } from '../../styles'; - -const StyledMuiBreadcrumbs = styled(MuiBreadcrumbs)(() => { - return { - color: 'var(--affine-text-primary-color)', - }; -}); - -export const Breadcrumbs: ComponentType = - StyledMuiBreadcrumbs; diff --git a/packages/frontend/component/src/ui/button/loading.tsx b/packages/frontend/component/src/ui/button/loading.tsx deleted file mode 100644 index 60d1234244..0000000000 --- a/packages/frontend/component/src/ui/button/loading.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { styled } from '../../styles'; -import type { ButtonProps } from './interface'; -import { getButtonColors } from './utils'; -export const LoadingContainer = styled('div')>(({ - theme, - type = 'default', -}) => { - const { color } = getButtonColors(theme, type, false); - return ` - margin: 0px auto; - width: 38px; - text-align: center; - .load { - width: 8px; - height: 8px; - background-color: ${color}; - - border-radius: 100%; - display: inline-block; - -webkit-animation: bouncedelay 1.4s infinite ease-in-out; - animation: bouncedelay 1.4s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - } - .load1 { - -webkit-animation-delay: -0.32s; - animation-delay: -0.32s; - } - .load2 { - -webkit-animation-delay: -0.16s; - animation-delay: -0.16s; - } - - @-webkit-keyframes bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0) } - 40% { -webkit-transform: scale(1.0) } - } - - @keyframes bouncedelay { - 0%, 80%, 100% { - transform: scale(0); - -webkit-transform: scale(0); - } 40% { - transform: scale(1.0); - -webkit-transform: scale(1.0); - } - } - `; -}); - -export const Loading = ({ type }: Pick) => { - return ( - -
-
-
-
- ); -}; diff --git a/packages/frontend/component/src/ui/button/utils.ts b/packages/frontend/component/src/ui/button/utils.ts index 725694b87c..09a3a6a0c7 100644 --- a/packages/frontend/component/src/ui/button/utils.ts +++ b/packages/frontend/component/src/ui/button/utils.ts @@ -1,9 +1,6 @@ -import type { Theme } from '@mui/material'; - import type { ButtonProps } from './interface'; export const getButtonColors = ( - _theme: Theme, type: ButtonProps['type'], disabled: boolean, extend?: { diff --git a/packages/frontend/component/src/ui/checkbox/checkbox.tsx b/packages/frontend/component/src/ui/checkbox/checkbox.tsx index 285767e3a7..3acb39bf89 100644 --- a/packages/frontend/component/src/ui/checkbox/checkbox.tsx +++ b/packages/frontend/component/src/ui/checkbox/checkbox.tsx @@ -51,8 +51,8 @@ export const Checkbox = ({ const icon = indeterminate ? icons.indeterminate : checked - ? icons.checked - : icons.unchecked; + ? icons.checked + : icons.unchecked; return (
& - HTMLAttributes; - -export const MenuItem = forwardRef( - ({ endIcon, icon, children, gap, fontSize, iconSize, ...props }, ref) => { - return ( - - {icon && ( - - {icon} - - )} - {children} - {endIcon && ( - - {endIcon} - - )} - - ); - } -); -MenuItem.displayName = 'MenuItem'; -export default MenuItem; diff --git a/packages/frontend/component/src/ui/menu/pure-menu.tsx b/packages/frontend/component/src/ui/menu/pure-menu.tsx deleted file mode 100644 index 779d80115b..0000000000 --- a/packages/frontend/component/src/ui/menu/pure-menu.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import type { CSSProperties } from 'react'; - -import type { PurePopperProps } from '../popper'; -import { PurePopper } from '../popper'; -import { StyledMenuWrapper } from './styles'; - -export type PureMenuProps = PurePopperProps & { - width?: CSSProperties['width']; - height?: CSSProperties['height']; -}; -export const PureMenu = ({ - children, - placement, - width, - ...otherProps -}: PureMenuProps) => { - return ( - - - {children} - - - ); -}; diff --git a/packages/frontend/component/src/ui/menu/styles.ts b/packages/frontend/component/src/ui/menu/styles.ts deleted file mode 100644 index d11258bd52..0000000000 --- a/packages/frontend/component/src/ui/menu/styles.ts +++ /dev/null @@ -1,115 +0,0 @@ -import type { CSSProperties } from 'react'; - -import { displayFlex, styled, textEllipsis } from '../../styles'; -import StyledPopperContainer from '../shared/container'; - -export const StyledMenuWrapper = styled(StyledPopperContainer, { - shouldForwardProp: propName => - !['width', 'height'].includes(propName as string), -})<{ - width?: CSSProperties['width']; - height?: CSSProperties['height']; -}>(({ width, height }) => { - return { - width, - height, - minWidth: '200px', - background: 'var(--affine-white)', - padding: '8px 4px', - fontSize: '14px', - backgroundColor: 'var(--affine-white)', - boxShadow: 'var(--affine-menu-shadow)', - userSelect: 'none', - }; -}); - -export const StyledStartIconWrapper = styled('div')<{ - gap?: CSSProperties['gap']; - iconSize?: CSSProperties['fontSize']; -}>(({ gap, iconSize }) => { - return { - display: 'flex', - marginRight: gap ? gap : '12px', - fontSize: iconSize ? iconSize : '20px', - color: 'var(--affine-icon-color)', - }; -}); -export const StyledEndIconWrapper = styled('div')<{ - gap?: CSSProperties['gap']; - iconSize?: CSSProperties['fontSize']; -}>(({ gap, iconSize }) => { - return { - display: 'flex', - marginLeft: gap ? gap : '12px', - fontSize: iconSize ? iconSize : '20px', - color: 'var(--affine-icon-color)', - }; -}); - -export const StyledContent = styled('div')<{ - fontSize?: CSSProperties['fontSize']; -}>(({ fontSize }) => { - return { - textAlign: 'left', - flexGrow: 1, - fontSize: fontSize ? fontSize : 'var(--affine-font-base)', - ...textEllipsis(1), - }; -}); - -export const StyledMenuItem = styled('button')<{ - isDir?: boolean; - disabled?: boolean; - active?: boolean; - disableHover?: boolean; - userFocused?: boolean; -}>(({ - isDir = false, - disabled = false, - active = false, - disableHover = false, - userFocused = false, -}) => { - return { - width: '100%', - borderRadius: '5px', - padding: '0 14px', - fontSize: 'var(--affine-font-sm)', - height: '32px', - ...displayFlex('flex-start', 'center'), - cursor: isDir ? 'pointer' : '', - position: 'relative', - backgroundColor: 'transparent', - color: disabled - ? 'var(--affine-text-disable-color)' - : 'var(--affine-text-primary-color)', - svg: { - color: disabled - ? 'var(--affine-text-disable-color)' - : 'var(--affine-icon-color)', - }, - ...(disabled - ? { - cursor: 'not-allowed', - pointerEvents: 'none', - } - : {}), - - ':hover': - disabled || disableHover - ? {} - : { - backgroundColor: 'var(--affine-hover-color)', - }, - ...(userFocused && !disabled - ? { - backgroundColor: 'var(--affine-hover-color)', - } - : {}), - ...(active && !disabled - ? { - backgroundColor: 'var(--affine-hover-color)', - } - : {}), - }; -}); diff --git a/packages/frontend/component/src/ui/mui.ts b/packages/frontend/component/src/ui/mui.ts deleted file mode 100644 index 88975fdbb6..0000000000 --- a/packages/frontend/component/src/ui/mui.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ClickAwayListener as MuiClickAwayListener } from '@mui/base/ClickAwayListener'; -import MuiAvatar from '@mui/material/Avatar'; -import MuiBreadcrumbs from '@mui/material/Breadcrumbs'; -import MuiCollapse from '@mui/material/Collapse'; -import MuiFade from '@mui/material/Fade'; -import MuiGrow from '@mui/material/Grow'; -import MuiSkeleton from '@mui/material/Skeleton'; -import MuiSlide from '@mui/material/Slide'; - -export { - MuiAvatar, - MuiBreadcrumbs, - MuiClickAwayListener, - MuiCollapse, - MuiFade, - MuiGrow, - MuiSkeleton, - MuiSlide, -}; diff --git a/packages/frontend/component/src/ui/popper/index.ts b/packages/frontend/component/src/ui/popper/index.ts deleted file mode 100644 index 997f45f466..0000000000 --- a/packages/frontend/component/src/ui/popper/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './interface'; -export * from './popper'; -export * from './pure-popper'; diff --git a/packages/frontend/component/src/ui/popper/interface.ts b/packages/frontend/component/src/ui/popper/interface.ts deleted file mode 100644 index 47b5a6942c..0000000000 --- a/packages/frontend/component/src/ui/popper/interface.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - type PopperPlacementType, - type PopperProps as PopperUnstyledProps, -} from '@mui/base/Popper'; -import type { CSSProperties, ReactElement, ReactNode, Ref } from 'react'; -export type VirtualElement = { - getBoundingClientRect: () => ClientRect | DOMRect; - contextElement?: Element; -}; - -export type PopperHandler = { - setVisible: (visible: boolean) => void; -}; - -export type PopperArrowProps = { - placement?: PopperPlacementType; -}; - -export type PopperProps = { - // Popover content - content?: ReactNode; - - // Popover trigger - children: ReactElement; - - // Whether the default is implicit - defaultVisible?: boolean; - - // Used to manually control the visibility of the Popover - visible?: boolean; - - // TODO: support focus - trigger?: 'hover' | 'click' | 'focus' | ('click' | 'hover' | 'focus')[]; - - // How long does it take for the mouse to display the Popover, in milliseconds - pointerEnterDelay?: number; - - // How long does it take to hide the Popover after the mouse moves out, in milliseconds - pointerLeaveDelay?: number; - - // Callback fired when the component closed or open - onVisibleChange?: (visible: boolean) => void; - - // Popover container style - popoverStyle?: CSSProperties; - - // Popover container class name - popoverClassName?: string; - - // Anchor class name - anchorClassName?: string; - - // Popover z-index - zIndex?: number; - - offset?: [number, number]; - - showArrow?: boolean; - - popperHandlerRef?: Ref; - - onClickAway?: () => void; - triggerContainerStyle?: CSSProperties; -} & Omit; diff --git a/packages/frontend/component/src/ui/popper/popover-arrow.tsx b/packages/frontend/component/src/ui/popper/popover-arrow.tsx deleted file mode 100644 index aae788a4b3..0000000000 --- a/packages/frontend/component/src/ui/popper/popover-arrow.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import type { CSSProperties } from 'react'; -import { forwardRef } from 'react'; - -import { styled } from '../../styles'; -import type { PopperArrowProps } from './interface'; - -export const PopperArrow = forwardRef( - function PopperArrow({ placement }, ref) { - return ; - } -); - -const getArrowStyle = ( - placement: PopperArrowProps['placement'] = 'bottom', - backgroundColor: CSSProperties['backgroundColor'] -) => { - if (placement.indexOf('bottom') === 0) { - return { - top: 0, - left: 0, - marginTop: '-0.9em', - width: '3em', - height: '1em', - '&::before': { - borderWidth: '0 1em 1em 1em', - borderColor: `transparent transparent ${backgroundColor} transparent`, - }, - }; - } - - if (placement.indexOf('top') === 0) { - return { - bottom: 0, - left: 0, - marginBottom: '-0.9em', - width: '3em', - height: '1em', - '&::before': { - borderWidth: '1em 1em 0 1em', - borderColor: `${backgroundColor} transparent transparent transparent`, - }, - }; - } - if (placement.indexOf('left') === 0) { - return { - right: 0, - marginRight: '-0.9em', - height: '3em', - width: '1em', - '&::before': { - borderWidth: '1em 0 1em 1em', - borderColor: `transparent transparent transparent ${backgroundColor}`, - }, - }; - } - if (placement.indexOf('right') === 0) { - return { - left: 0, - marginLeft: '-0.9em', - height: '3em', - width: '1em', - '&::before': { - borderWidth: '1em 1em 1em 0', - borderColor: `transparent ${backgroundColor} transparent transparent`, - }, - }; - } - - return { - display: 'none', - }; -}; - -const StyledArrow = styled('span')<{ - placement?: PopperArrowProps['placement']; -}>(({ placement }) => { - return { - position: 'absolute', - fontSize: '7px', - width: '3em', - '::before': { - content: '""', - margin: 'auto', - display: 'block', - width: 0, - height: 0, - borderStyle: 'solid', - position: 'absolute', - left: 0, - right: 0, - top: 0, - bottom: 0, - }, - - ...getArrowStyle(placement, 'var(--affine-tooltip)'), - }; -}); diff --git a/packages/frontend/component/src/ui/popper/popper.tsx b/packages/frontend/component/src/ui/popper/popper.tsx deleted file mode 100644 index f54f1aae71..0000000000 --- a/packages/frontend/component/src/ui/popper/popper.tsx +++ /dev/null @@ -1,300 +0,0 @@ -import { ClickAwayListener } from '@mui/base/ClickAwayListener'; -import { Popper as PopperUnstyled } from '@mui/base/Popper'; -import Grow from '@mui/material/Grow'; -import type { CSSProperties, PointerEvent } from 'react'; -import { - cloneElement, - useEffect, - useImperativeHandle, - useMemo, - useRef, - useState, -} from 'react'; - -import { styled } from '../../styles'; -import type { PopperProps, VirtualElement } from './interface'; -export const Popper = ({ - children, - content, - anchorEl: propsAnchorEl, - placement = 'top-start', - defaultVisible = false, - visible: propsVisible, - trigger = 'hover', - pointerEnterDelay = 500, - pointerLeaveDelay = 100, - onVisibleChange, - popoverStyle, - popoverClassName, - anchorClassName, - zIndex, - offset = [0, 5], - showArrow = false, - popperHandlerRef, - onClick, - onClickAway, - onPointerEnter, - onPointerLeave, - triggerContainerStyle = {}, - ...popperProps -}: PopperProps) => { - const [anchorEl, setAnchorEl] = useState(); - const [visible, setVisible] = useState(defaultVisible); - //const [arrowRef, setArrowRef] = useState(); - const arrowRef = null; - const pointerLeaveTimer = useRef(); - const pointerEnterTimer = useRef(); - - const visibleControlledByParent = typeof propsVisible !== 'undefined'; - const isAnchorCustom = typeof propsAnchorEl !== 'undefined'; - - const hasHoverTrigger = useMemo(() => { - return ( - trigger === 'hover' || - (Array.isArray(trigger) && trigger.includes('hover')) - ); - }, [trigger]); - - const hasClickTrigger = useMemo(() => { - return ( - trigger === 'click' || - (Array.isArray(trigger) && trigger.includes('click')) - ); - }, [trigger]); - - const onPointerEnterHandler = (e: PointerEvent) => { - onPointerEnter?.(e); - if (!hasHoverTrigger || visibleControlledByParent) { - return; - } - window.clearTimeout(pointerLeaveTimer.current); - - pointerEnterTimer.current = window.window.setTimeout(() => { - setVisible(true); - }, pointerEnterDelay); - }; - - const onPointerLeaveHandler = (e: PointerEvent) => { - onPointerLeave?.(e); - - if (!hasHoverTrigger || visibleControlledByParent) { - return; - } - window.clearTimeout(pointerEnterTimer.current); - pointerLeaveTimer.current = window.window.setTimeout(() => { - setVisible(false); - }, pointerLeaveDelay); - }; - - useEffect(() => { - onVisibleChange?.(visible); - }, [visible, onVisibleChange]); - - useImperativeHandle(popperHandlerRef, () => { - return { - setVisible: (visible: boolean) => { - !visibleControlledByParent && setVisible(visible); - }, - }; - }); - - const mergedClass = [anchorClassName, children.props.className] - .filter(Boolean) - .join(' '); - - return ( - { - if (visibleControlledByParent) { - onClickAway?.(); - } else { - setVisible(false); - } - }} - > - - {cloneElement(children, { - ref: (dom: HTMLDivElement) => setAnchorEl(dom), - onClick: (e: MouseEvent) => { - children.props.onClick?.(e); - if (!hasClickTrigger || visibleControlledByParent) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - onClick?.(e); - return; - } - setVisible(!visible); - }, - onPointerEnter: onPointerEnterHandler, - onPointerLeave: onPointerLeaveHandler, - ...(mergedClass - ? { - className: mergedClass, - } - : {}), - })} - {content && ( - - {({ TransitionProps }) => ( - -
{ - if (hasClickTrigger && !visibleControlledByParent) { - setVisible(false); - } - }} - > - {showArrow ? ( - placement.indexOf('bottom') === 0 ? ( -
- - - - {content} -
- ) : placement.indexOf('top') === 0 ? ( -
- {content} - - - -
- ) : placement.indexOf('left') === 0 ? ( - <> - {content} - - - - - ) : placement.indexOf('right') === 0 ? ( - <> - - - - {content} - - ) : ( -
- {content} - - - -
- ) - ) : ( - content - )} -
-
- )} -
- )} -
-
- ); -}; - -// The children of ClickAwayListener must be a DOM Node to judge whether the click is outside, use node.contains -const Container = styled('div')({ - display: 'contents', -}); - -export const BasicStyledPopper = styled(PopperUnstyled, { - shouldForwardProp: (propName: string) => - !['zIndex'].some(name => name === propName), -})<{ - zIndex?: CSSProperties['zIndex']; -}>(({ zIndex }) => { - return { - zIndex: zIndex ?? 'var(--affine-z-index-popover)', - }; -}); diff --git a/packages/frontend/component/src/ui/popper/pure-popper.tsx b/packages/frontend/component/src/ui/popper/pure-popper.tsx deleted file mode 100644 index c0e856c3c2..0000000000 --- a/packages/frontend/component/src/ui/popper/pure-popper.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import type { PopperProps as PopperUnstyledProps } from '@mui/base/Popper'; -import Grow from '@mui/material/Grow'; -import type { CSSProperties, PropsWithChildren } from 'react'; -import { useState } from 'react'; - -import { PopperArrow } from './popover-arrow'; -import { BasicStyledPopper } from './popper'; -import { PopperWrapper } from './styles'; - -export type PurePopperProps = { - zIndex?: CSSProperties['zIndex']; - - offset?: [number, number]; - - showArrow?: boolean; -} & PopperUnstyledProps & - PropsWithChildren; - -export const PurePopper = (props: PurePopperProps) => { - const { - children, - zIndex, - offset, - showArrow = false, - modifiers = [], - placement, - ...otherProps - } = props; - const [arrowRef, setArrowRef] = useState(); - - return ( - - {({ TransitionProps }) => ( - - - {showArrow && ( - - )} - {children} - - - )} - - ); -}; diff --git a/packages/frontend/component/src/ui/popper/styles.ts b/packages/frontend/component/src/ui/popper/styles.ts deleted file mode 100644 index 58fd4c01f9..0000000000 --- a/packages/frontend/component/src/ui/popper/styles.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { styled } from '../../styles'; - -export const PopperWrapper = styled('div')(() => { - return { - position: 'relative', - }; -}); diff --git a/packages/frontend/component/src/ui/shared/container.tsx b/packages/frontend/component/src/ui/shared/container.tsx deleted file mode 100644 index c110c847d5..0000000000 --- a/packages/frontend/component/src/ui/shared/container.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import type { PopperPlacementType } from '@mui/material'; - -import { styled } from '../../styles'; - -export type PopperDirection = - | 'none' - | 'left-top' - | 'left-bottom' - | 'right-top' - | 'right-bottom'; - -const getBorderRadius = (direction: PopperDirection, radius = '0') => { - const map: Record = { - none: `${radius}`, - 'left-top': `0 ${radius} ${radius} ${radius}`, - 'left-bottom': `${radius} ${radius} ${radius} 0`, - 'right-top': `${radius} 0 ${radius} ${radius}`, - 'right-bottom': `${radius} ${radius} 0 ${radius}`, - }; - return map[direction]; -}; - -export const placementToContainerDirection: Record< - PopperPlacementType, - PopperDirection -> = { - top: 'none', - 'top-start': 'left-bottom', - 'top-end': 'right-bottom', - right: 'none', - 'right-start': 'left-top', - 'right-end': 'left-bottom', - bottom: 'none', - 'bottom-start': 'none', - 'bottom-end': 'none', - left: 'none', - 'left-start': 'right-top', - 'left-end': 'right-bottom', - auto: 'none', - 'auto-start': 'none', - 'auto-end': 'none', -}; - -export const StyledPopperContainer = styled('div')<{ - placement?: PopperPlacementType; -}>(({ placement = 'top' }) => { - const direction = placementToContainerDirection[placement]; - const borderRadius = getBorderRadius( - direction, - 'var(--affine-popover-radius)' - ); - return { - borderRadius, - }; -}); - -export default StyledPopperContainer; diff --git a/packages/frontend/component/src/ui/skeleton/index.css.ts b/packages/frontend/component/src/ui/skeleton/index.css.ts new file mode 100644 index 0000000000..6115cce470 --- /dev/null +++ b/packages/frontend/component/src/ui/skeleton/index.css.ts @@ -0,0 +1,94 @@ +import { keyframes, style } from '@vanilla-extract/css'; + +import type { PickStringFromUnion, SkeletonProps } from './types'; + +// variables +const bg = 'var(--affine-placeholder-color)'; +const highlight = 'rgba(255, 255, 255, 0.4)'; +const defaultHeight = '32px'; + +const pulseKeyframes = keyframes({ + '0%': { opacity: 1 }, + '50%': { opacity: 0.5 }, + '100%': { opacity: 1 }, +}); + +const waveKeyframes = keyframes({ + '0%': { transform: 'translateX(-100%)' }, + '50%': { transform: 'translateX(100%)' }, + '100%': { transform: 'translateX(100%)' }, +}); + +export const root = style({ + display: 'block', + width: '100%', + height: defaultHeight, + flexShrink: 0, + + /** + * paint background in ::before, + * so that we can use opacity to control the color + **/ + position: 'relative', + '::before': { + content: '', + position: 'absolute', + borderRadius: 'inherit', + inset: 0, + opacity: 0.3, + backgroundColor: bg, + }, +}); + +export const variant: Record = { + circular: style({ + width: defaultHeight, + borderRadius: '50%', + }), + rectangular: style({ + borderRadius: '0px', + }), + rounded: style({ + borderRadius: '8px', + }), + text: style({ + borderRadius: '4px', + height: '1.2em', + marginTop: '0.2em', + marginBottom: '0.2em', + }), +}; + +export const animation: Record< + PickStringFromUnion, + string +> = { + pulse: style({ + animation: `${pulseKeyframes} 2s ease-in-out 0.5s infinite`, + }), + wave: style({ + position: 'relative', + overflow: 'hidden', + + /* Fix bug in Safari https://bugs.webkit.org/show_bug.cgi?id=68196 */ + WebkitMaskImage: '-webkit-radial-gradient(white, black)', + + '::after': { + animation: `${waveKeyframes} 2s linear 0.5s infinite`, + background: `linear-gradient( + 90deg, + transparent, + ${highlight}, + transparent + )`, + content: '', + position: 'absolute', + transform: + 'translateX(-100%)' /* Avoid flash during server-side hydration */, + bottom: 0, + left: 0, + right: 0, + top: 0, + }, + }), +}; diff --git a/packages/frontend/component/src/ui/skeleton/index.ts b/packages/frontend/component/src/ui/skeleton/index.ts new file mode 100644 index 0000000000..19b31c918f --- /dev/null +++ b/packages/frontend/component/src/ui/skeleton/index.ts @@ -0,0 +1,2 @@ +export * from './skeleton'; +export * from './types'; diff --git a/packages/frontend/component/src/ui/skeleton/skeleton.tsx b/packages/frontend/component/src/ui/skeleton/skeleton.tsx new file mode 100644 index 0000000000..fef3285905 --- /dev/null +++ b/packages/frontend/component/src/ui/skeleton/skeleton.tsx @@ -0,0 +1,49 @@ +import clsx from 'clsx'; + +import * as styles from './index.css'; +import type { SkeletonProps } from './types'; + +function getSize(size: number | string) { + return typeof size === 'number' || /^\d+$/.test(size) ? `${size}px` : size; +} + +/** + * + * @returns + */ +export const Skeleton = ({ + animation = 'pulse', + variant = 'text', + children, + + width: _width, + height: _height, + style: _style, + className: _className, + + ...props +}: SkeletonProps) => { + const width = _width !== undefined ? getSize(_width) : undefined; + const height = _height !== undefined ? getSize(_height) : undefined; + + const style = { + width, + height, + ...(_style || {}), + }; + + return ( +
+ {children} +
+ ); +}; diff --git a/packages/frontend/component/src/ui/skeleton/types.ts b/packages/frontend/component/src/ui/skeleton/types.ts new file mode 100644 index 0000000000..e0ad3eaae9 --- /dev/null +++ b/packages/frontend/component/src/ui/skeleton/types.ts @@ -0,0 +1,33 @@ +import type { HTMLAttributes, PropsWithChildren } from 'react'; + +export interface SkeletonProps + extends PropsWithChildren, + HTMLAttributes { + /** + * The animation. If `false` the animation effect is disabled. + */ + animation?: 'pulse' | 'wave' | false; + + /** + * The type of content that will be rendered. + * @default `'text'` + */ + variant?: 'circular' | 'rectangular' | 'rounded' | 'text' | string; + + /** + * Width of the skeleton. Useful when the skeleton is inside an inline element with no width of its own. + */ + width?: number | string; + + /** + * Height of the skeleton. Useful when you don't want to adapt the skeleton to a text element but for instance a card. + */ + height?: number | string; + + /** + * Wrapper component. If not provided, the default element is a div. + */ + wrapper?: string; +} + +export type PickStringFromUnion = T extends string ? T : never; diff --git a/packages/frontend/component/src/ui/table/index.ts b/packages/frontend/component/src/ui/table/index.ts index c919389f22..95352ed1f1 100644 --- a/packages/frontend/component/src/ui/table/index.ts +++ b/packages/frontend/component/src/ui/table/index.ts @@ -1,10 +1,3 @@ -// import Table from '@mui/material/Table'; -// import TableBody from '@mui/material/TableBody'; -// import TableCell from '@mui/material/TableCell'; -// import TableHead from '@mui/material/TableHead'; -// import TableRow from '@mui/material/TableRow'; -// - export * from './interface'; export * from './table'; export * from './table-body'; diff --git a/packages/frontend/component/src/ui/toast/toast.ts b/packages/frontend/component/src/ui/toast/toast.ts index b858dcf9d6..794ae40491 100644 --- a/packages/frontend/component/src/ui/toast/toast.ts +++ b/packages/frontend/component/src/ui/toast/toast.ts @@ -30,15 +30,15 @@ const htmlToElement = (html: string | TemplateResult) => { const createToastContainer = (portal?: HTMLElement) => { portal = portal || document.body; const styles = css` - position: absolute; + width: 100%; + position: fixed; z-index: 9999; - top: 16px; - left: 16px; - right: 16px; bottom: 78px; + left: 50%; + transform: translateX(-50%); pointer-events: none; display: flex; - flex-direction: column-reverse; + flex-direction: column; align-items: center; `; const template = html`
{ + toastElement.style.opacity = '0'; + setTimeout(() => toastElement.remove(), 300); // Match transition duration +}; + +const createAndShowNewToast = ( + message: string, + duration: number, + portal?: HTMLElement +) => { + if (!ToastContainer || (portal && !portal.contains(ToastContainer))) { + ToastContainer = createToastContainer(portal); + } + + const toastStyles = css` + position: absolute; + bottom: 0; + max-width: 480px; + text-align: center; + font-family: var(--affine-font-family); + font-size: var(--affine-font-sm); + padding: 10px 16px; + margin: 0; + color: var(--affine-white); + background: var(--affine-tooltip); + box-shadow: var(--affine-float-button-shadow); + border-radius: 8px; + opacity: 0; + transform: translateY(100%); + transition: + transform 0.3s cubic-bezier(0.25, 0.1, 0.25, 1), + opacity 0.3s ease; + `; + + const toastTemplate = html`
+ ${message} +
`; + const toastElement = htmlToElement(toastTemplate); + // message is not trusted + toastElement.textContent = message; + ToastContainer.appendChild(toastElement); + logger.debug(`toast with message: "${message}"`); + window.dispatchEvent( + new CustomEvent('affine-toast:emit', { detail: message }) + ); + + setTimeout(() => { + toastElement.style.opacity = '1'; + toastElement.style.transform = 'translateY(0)'; + }, 100); + + setTimeout(() => { + animateToastOut(toastElement); + }, duration); +}; + /** * @example * ```ts @@ -63,80 +122,21 @@ export type ToastOptions = { */ export const toast = ( message: string, - { duration = 2500, portal }: ToastOptions = { - duration: 2500, - } + { duration = 3000, portal }: ToastOptions = {} ) => { - if (!ToastContainer || (portal && !portal.contains(ToastContainer))) { - ToastContainer = createToastContainer(portal); + if (ToastContainer && ToastContainer.children.length >= 2) { + // If there are already two toasts, remove the oldest one immediately + const oldestToast = ToastContainer.children[0] as HTMLDivElement; + oldestToast.remove(); } - const styles = css` - max-width: 480px; - text-align: center; - font-family: var(--affine-font-family); - font-size: var(--affine-font-sm); - padding: 6px 12px; - margin: 10px 0 0 0; - color: var(--affine-white); - background: var(--affine-tooltip); - box-shadow: var(--affine-float-button-shadow); - border-radius: 10px; - transition: all 230ms cubic-bezier(0.21, 1.02, 0.73, 1); - opacity: 0; - `; + // If there is one toast already, start its disappearing animation + if (ToastContainer && ToastContainer.children.length === 1) { + const currentToast = ToastContainer.children[0] as HTMLDivElement; + animateToastOut(currentToast); + } - const template = html`
`; - const element = htmlToElement(template); - // message is not trusted - element.textContent = message; - ToastContainer.appendChild(element); - - logger.debug(`toast with message: "${message}"`); - window.dispatchEvent( - new CustomEvent('affine-toast:emit', { detail: message }) - ); - - const fadeIn = [ - { - opacity: 0, - }, - { opacity: 1 }, - ]; - - const options = { - duration: 230, - easing: 'cubic-bezier(0.21, 1.02, 0.73, 1)', - fill: 'forwards' as const, - } satisfies KeyframeAnimationOptions; - - element.animate(fadeIn, options); - - setTimeout(() => { - const animation = element.animate( - // fade out - fadeIn.reverse(), - options - ); - animation.finished - .then(() => { - element.style.maxHeight = '0'; - element.style.margin = '0'; - element.style.padding = '0'; - // wait for transition - // ToastContainer = null; - element.addEventListener('transitionend', () => { - element.remove(); - }); - }) - .catch(err => { - console.error(err); - }); - }, duration); - return element; + createAndShowNewToast(message, duration, portal); }; export default toast; diff --git a/packages/frontend/component/src/ui/tree-view/hooks/use-collapsed.ts b/packages/frontend/component/src/ui/tree-view/hooks/use-collapsed.ts deleted file mode 100644 index 50ef9d96bd..0000000000 --- a/packages/frontend/component/src/ui/tree-view/hooks/use-collapsed.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useState } from 'react'; - -import type { TreeNodeProps } from '../types'; -export const useCollapsed = ({ - initialCollapsedIds = [], - disableCollapse = false, -}: { - disableCollapse?: boolean; - initialCollapsedIds?: string[]; -}) => { - // TODO: should record collapsedIds in localStorage - const [collapsedIds, setCollapsedIds] = - useState(initialCollapsedIds); - - const setCollapsed: TreeNodeProps['setCollapsed'] = (id, collapsed) => { - if (disableCollapse) { - return; - } - if (collapsed) { - setCollapsedIds(ids => [...ids, id]); - } else { - setCollapsedIds(ids => ids.filter(i => i !== id)); - } - }; - - return { - collapsedIds, - setCollapsed, - }; -}; - -export default useCollapsed; diff --git a/packages/frontend/component/src/ui/tree-view/hooks/use-select-with-keyboard.ts b/packages/frontend/component/src/ui/tree-view/hooks/use-select-with-keyboard.ts deleted file mode 100644 index 79eb78260a..0000000000 --- a/packages/frontend/component/src/ui/tree-view/hooks/use-select-with-keyboard.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { useEffect, useState } from 'react'; - -import type { TreeViewProps } from '../types'; -import { flattenIds } from '../utils'; -export const useSelectWithKeyboard = ({ - data, - enableKeyboardSelection, - onSelect, -}: Pick< - TreeViewProps, - 'data' | 'enableKeyboardSelection' | 'onSelect' ->) => { - const [selectedId, setSelectedId] = useState(); - // TODO: should record collapsedIds in localStorage - - useEffect(() => { - if (!enableKeyboardSelection) { - return; - } - - const flattenedIds = flattenIds(data); - - const handleDirectionKeyDown = (e: KeyboardEvent) => { - if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') { - return; - } - if (selectedId === undefined) { - setSelectedId(flattenedIds[0]); - return; - } - let selectedIndex = flattenedIds.indexOf(selectedId); - if (e.key === 'ArrowDown') { - selectedIndex < flattenedIds.length - 1 && selectedIndex++; - } - if (e.key === 'ArrowUp') { - selectedIndex > 0 && selectedIndex--; - } - - setSelectedId(flattenedIds[selectedIndex]); - }; - - const handleEnterKeyDown = (e: KeyboardEvent) => { - if (e.key !== 'Enter') { - return; - } - selectedId && onSelect?.(selectedId); - }; - - document.addEventListener('keydown', handleDirectionKeyDown); - document.addEventListener('keydown', handleEnterKeyDown); - - return () => { - document.removeEventListener('keydown', handleDirectionKeyDown); - document.removeEventListener('keydown', handleEnterKeyDown); - }; - }, [data, enableKeyboardSelection, onSelect, selectedId]); - - return { - selectedId, - }; -}; - -export default useSelectWithKeyboard; diff --git a/packages/frontend/component/src/ui/tree-view/index.ts b/packages/frontend/component/src/ui/tree-view/index.ts deleted file mode 100644 index caad1c7efc..0000000000 --- a/packages/frontend/component/src/ui/tree-view/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './tree-node'; -export * from './tree-view'; -export * from './types'; diff --git a/packages/frontend/component/src/ui/tree-view/styles.ts b/packages/frontend/component/src/ui/tree-view/styles.ts deleted file mode 100644 index 59e7039933..0000000000 --- a/packages/frontend/component/src/ui/tree-view/styles.ts +++ /dev/null @@ -1,44 +0,0 @@ -import MuiCollapse from '@mui/material/Collapse'; -import { lightTheme } from '@toeverything/theme'; -import type { CSSProperties } from 'react'; - -import { alpha, styled } from '../../styles'; - -export const StyledCollapse = styled(MuiCollapse)<{ - indent?: CSSProperties['paddingLeft']; -}>(({ indent = 12 }) => { - return { - paddingLeft: indent, - }; -}); -export const StyledTreeNodeWrapper = styled('div')(() => { - return { - position: 'relative', - }; -}); -export const StyledTreeNodeContainer = styled('div')<{ isDragging?: boolean }>( - ({ isDragging = false }) => { - return { - background: isDragging ? 'var(--affine-hover-color)' : '', - }; - } -); - -export const StyledNodeLine = styled('div')<{ - isOver: boolean; - isTop?: boolean; -}>(({ isOver, isTop = false }) => { - return { - position: 'absolute', - left: '0', - ...(isTop ? { top: '-1px' } : { bottom: '-1px' }), - width: '100%', - paddingTop: '2x', - borderTop: '2px solid', - borderColor: isOver ? 'var(--affine-primary-color)' : 'transparent', - boxShadow: isOver - ? `0px 0px 8px ${alpha(lightTheme.primaryColor, 0.35)}` - : 'none', - zIndex: 1, - }; -}); diff --git a/packages/frontend/component/src/ui/tree-view/tree-node-inner.tsx b/packages/frontend/component/src/ui/tree-view/tree-node-inner.tsx deleted file mode 100644 index ef24330083..0000000000 --- a/packages/frontend/component/src/ui/tree-view/tree-node-inner.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { useDroppable } from '@dnd-kit/core'; - -import { StyledNodeLine } from './styles'; -import type { NodeLIneProps, TreeNodeItemProps } from './types'; - -export const NodeLine = ({ - node, - allowDrop = true, - isTop = false, -}: NodeLIneProps) => { - const { isOver, setNodeRef } = useDroppable({ - id: `${node.id}-${isTop ? 'top' : 'bottom'}-line`, - disabled: !allowDrop, - data: { - node, - position: { - topLine: isTop, - bottomLine: !isTop, - internal: false, - }, - }, - }); - - return ( - - ); -}; -export const TreeNodeItemWithDnd = ({ - node, - allowDrop, - setCollapsed, - ...otherProps -}: TreeNodeItemProps) => { - const { onAdd, onDelete } = otherProps; - - const { isOver, setNodeRef } = useDroppable({ - id: node.id, - disabled: !allowDrop, - data: { - node, - position: { - topLine: false, - bottomLine: false, - internal: true, - }, - }, - }); - - return ( -
- -
- ); -}; - -export const TreeNodeItem = ({ - node, - collapsed, - setCollapsed, - selectedId, - isOver = false, - onAdd, - onDelete, - disableCollapse, - allowDrop = true, -}: TreeNodeItemProps) => { - return node.render?.(node, { - isOver: isOver && allowDrop, - onAdd: () => onAdd?.(node.id), - onDelete: () => onDelete?.(node.id), - collapsed, - setCollapsed, - isSelected: selectedId === node.id, - disableCollapse, - }); -}; diff --git a/packages/frontend/component/src/ui/tree-view/tree-node.tsx b/packages/frontend/component/src/ui/tree-view/tree-node.tsx deleted file mode 100644 index 80d9727474..0000000000 --- a/packages/frontend/component/src/ui/tree-view/tree-node.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { useDraggable } from '@dnd-kit/core'; -import { useMemo } from 'react'; - -import { - StyledCollapse, - StyledTreeNodeContainer, - StyledTreeNodeWrapper, -} from './styles'; -import { NodeLine, TreeNodeItem, TreeNodeItemWithDnd } from './tree-node-inner'; -import type { TreeNodeProps } from './types'; -export const TreeNodeWithDnd = ( - props: TreeNodeProps -) => { - const { draggingId, node, allowDrop } = props; - const { attributes, listeners, setNodeRef } = useDraggable({ - id: props.node.id, - }); - const isDragging = useMemo( - () => draggingId === node.id, - [draggingId, node.id] - ); - return ( - - - - ); -}; - -export const TreeNode = ({ - node, - index, - allowDrop = true, - ...otherProps -}: TreeNodeProps) => { - const { indent, enableDnd, collapsedIds } = otherProps; - const collapsed = collapsedIds.includes(node.id); - const { renderTopLine = true, renderBottomLine = true } = node; - - return ( - <> - - {enableDnd && renderTopLine && index === 0 && ( - - )} - {enableDnd ? ( - - ) : ( - - )} - - {enableDnd && - renderBottomLine && - (!node.children?.length || collapsed) && ( - - )} - - - {node.children && - node.children.map((childNode, index) => - enableDnd ? ( - - ) : ( - - ) - )} - - - ); -}; diff --git a/packages/frontend/component/src/ui/tree-view/tree-view.tsx b/packages/frontend/component/src/ui/tree-view/tree-view.tsx deleted file mode 100644 index 67ca39388d..0000000000 --- a/packages/frontend/component/src/ui/tree-view/tree-view.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import type { DragEndEvent } from '@dnd-kit/core'; -import { - closestCenter, - DndContext, - DragOverlay, - PointerSensor, - useSensor, - useSensors, -} from '@dnd-kit/core'; -import { useCallback, useState } from 'react'; - -import useCollapsed from './hooks/use-collapsed'; -import useSelectWithKeyboard from './hooks/use-select-with-keyboard'; -import { TreeNode, TreeNodeWithDnd } from './tree-node'; -import type { Node, TreeViewProps } from './types'; -import { findNode } from './utils'; -export const TreeView = ({ - data, - enableKeyboardSelection, - onSelect, - enableDnd = true, - disableCollapse, - onDrop, - ...otherProps -}: TreeViewProps) => { - const sensors = useSensors( - useSensor(PointerSensor, { - activationConstraint: { - distance: 8, - }, - }) - ); - const { selectedId } = useSelectWithKeyboard({ - data, - onSelect, - enableKeyboardSelection, - }); - - const { collapsedIds, setCollapsed } = useCollapsed({ disableCollapse }); - - const [draggingId, setDraggingId] = useState(); - - const onDragEnd = useCallback( - (e: DragEndEvent) => { - const { active, over } = e; - const position = over?.data.current?.position; - const dropId = over?.data.current?.node.id; - setDraggingId(undefined); - if (!over || !active || !position) { - return; - } - - onDrop?.(active.id as string, dropId, position); - }, - [onDrop] - ); - const onDragMove = useCallback((e: DragEndEvent) => { - setDraggingId(e.active.id as string); - }, []); - if (enableDnd) { - const treeNodes = data.map((node, index) => ( - - )); - const draggingNode = (function () { - let draggingNode: Node | undefined; - if (draggingId) { - draggingNode = findNode(draggingId, data); - } - if (draggingNode) { - return ( - {}} - {...otherProps} - /> - ); - } - return null; - })(); - return ( - - {treeNodes} - {draggingNode} - - ); - } - - return ( - <> - {data.map((node, index) => ( - - ))} - - ); -}; - -export default TreeView; diff --git a/packages/frontend/component/src/ui/tree-view/types.ts b/packages/frontend/component/src/ui/tree-view/types.ts deleted file mode 100644 index 99276adf36..0000000000 --- a/packages/frontend/component/src/ui/tree-view/types.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { CSSProperties, ReactNode } from 'react'; - -export type DropPosition = { - topLine: boolean; - bottomLine: boolean; - internal: boolean; -}; -export type OnDrop = ( - dragId: string, - dropId: string, - position: DropPosition -) => void; - -export type Node = { - id: string; - children?: Node[]; - render: ( - node: Node, - eventsAndStatus: { - isOver: boolean; - onAdd: () => void; - onDelete: () => void; - collapsed: boolean; - setCollapsed: (id: string, collapsed: boolean) => void; - isSelected: boolean; - disableCollapse?: ReactNode; - }, - renderProps?: RenderProps - ) => ReactNode; - renderTopLine?: boolean; - renderBottomLine?: boolean; -}; - -type CommonProps = { - enableDnd?: boolean; - enableKeyboardSelection?: boolean; - indent?: CSSProperties['paddingLeft']; - onAdd?: (parentId: string) => void; - onDelete?: (deleteId: string) => void; - onDrop?: OnDrop; - // Only trigger when the enableKeyboardSelection is true - onSelect?: (id: string) => void; - disableCollapse?: ReactNode; -}; - -export type TreeNodeProps = { - node: Node; - index: number; - collapsedIds: string[]; - setCollapsed: (id: string, collapsed: boolean) => void; - allowDrop?: boolean; - selectedId?: string; - draggingId?: string; -} & CommonProps; - -export type TreeNodeItemProps = { - collapsed: boolean; - setCollapsed: (id: string, collapsed: boolean) => void; - - isOver?: boolean; -} & TreeNodeProps; - -export type TreeViewProps = { - data: Node[]; - initialCollapsedIds?: string[]; - disableCollapse?: boolean; -} & CommonProps; - -export type NodeLIneProps = { - allowDrop: boolean; - isTop?: boolean; -} & Pick, 'node'>; diff --git a/packages/frontend/component/src/ui/tree-view/utils.ts b/packages/frontend/component/src/ui/tree-view/utils.ts deleted file mode 100644 index 66c01726b7..0000000000 --- a/packages/frontend/component/src/ui/tree-view/utils.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { Node } from './types'; - -export function flattenIds(arr: Node[]): string[] { - const result: string[] = []; - - function flatten(arr: Node[]) { - for (let i = 0, len = arr.length; i < len; i++) { - const item = arr[i]; - result.push(item.id); - if (Array.isArray(item.children)) { - flatten(item.children); - } - } - } - - flatten(arr); - return result; -} - -export function findNode( - id: string, - nodes: Node[] -): Node | undefined { - for (let i = 0, len = nodes.length; i < len; i++) { - const node = nodes[i]; - if (node.id === id) { - return node; - } - if (node.children) { - const result = findNode(id, node.children); - if (result) { - return result; - } - } - } - return undefined; -} diff --git a/packages/frontend/core/.webpack/cache-group.ts b/packages/frontend/core/.webpack/cache-group.ts index 9e710c2c0c..bdbffd9428 100644 --- a/packages/frontend/core/.webpack/cache-group.ts +++ b/packages/frontend/core/.webpack/cache-group.ts @@ -20,12 +20,6 @@ export const productionCacheGroups = { priority: Number.MAX_SAFE_INTEGER, chunks: 'async' as const, }, - mui: { - name: `npm-mui`, - test: testPackageName(/[\\/]node_modules[\\/](mui|@mui)[\\/]/), - priority: 200, - enforce: true, - }, blocksuite: { name: `npm-blocksuite`, test: testPackageName(/[\\/]node_modules[\\/](@blocksuite)[\\/]/), diff --git a/packages/frontend/core/.webpack/config.ts b/packages/frontend/core/.webpack/config.ts index e15188558d..2586b8ce8a 100644 --- a/packages/frontend/core/.webpack/config.ts +++ b/packages/frontend/core/.webpack/config.ts @@ -186,9 +186,6 @@ export const createConfiguration: ( 'global', 'dist' ), - '@blocksuite/lit': blocksuiteBaseDir - ? join(blocksuiteBaseDir, 'packages', 'lit', 'src') - : join(workspaceRoot, 'node_modules', '@blocksuite', 'lit', 'dist'), '@blocksuite/store/providers/broadcast-channel': blocksuiteBaseDir ? join( blocksuiteBaseDir, diff --git a/packages/frontend/core/.webpack/runtime-config.ts b/packages/frontend/core/.webpack/runtime-config.ts index b9c7836f72..52eead3d66 100644 --- a/packages/frontend/core/.webpack/runtime-config.ts +++ b/packages/frontend/core/.webpack/runtime-config.ts @@ -129,8 +129,8 @@ export function getRuntimeConfig(buildFlags: BuildFlags): RuntimeConfig { enableCaptcha: process.env.ENABLE_CAPTCHA ? process.env.ENABLE_CAPTCHA === 'true' : buildFlags.mode === 'development' - ? false - : currentBuildPreset.enableCaptcha, + ? false + : currentBuildPreset.enableCaptcha, enableEnhanceShareMode: process.env.ENABLE_ENHANCE_SHARE_MODE ? process.env.ENABLE_ENHANCE_SHARE_MODE === 'true' : currentBuildPreset.enableEnhanceShareMode, @@ -140,8 +140,8 @@ export function getRuntimeConfig(buildFlags: BuildFlags): RuntimeConfig { enablePayment: process.env.ENABLE_PAYMENT ? process.env.ENABLE_PAYMENT !== 'false' : buildFlags.mode === 'development' - ? true - : currentBuildPreset.enablePayment, + ? true + : currentBuildPreset.enablePayment, }; if (buildFlags.mode === 'development') { diff --git a/packages/frontend/core/.webpack/webpack.config.ts b/packages/frontend/core/.webpack/webpack.config.ts index dfbcf38f61..b78b4545d7 100644 --- a/packages/frontend/core/.webpack/webpack.config.ts +++ b/packages/frontend/core/.webpack/webpack.config.ts @@ -19,26 +19,8 @@ export default async function (cli_env: any, _: any) { const config = createConfiguration(flags, runtimeConfig); return merge(config, { entry: { - 'polyfill/intl-segmenter': { - import: resolve(rootPath, 'src/polyfill/intl-segmenter.ts'), - }, - 'polyfill/ses': { - import: resolve(rootPath, 'src/polyfill/ses.ts'), - }, - plugin: { - dependOn: ['polyfill/intl-segmenter', 'polyfill/ses'], - import: resolve(rootPath, 'src/bootstrap/register-plugins.ts'), - }, - app: { - chunkLoading: 'import', - dependOn: ['polyfill/intl-segmenter', 'polyfill/ses', 'plugin'], - import: resolve(rootPath, 'src/index.tsx'), - }, - '_plugin/index.test': { - chunkLoading: 'import', - dependOn: ['polyfill/intl-segmenter', 'polyfill/ses', 'plugin'], - import: resolve(rootPath, 'src/_plugin/index.test.tsx'), - }, + app: resolve(rootPath, 'src/index.tsx'), + '_plugin/index.test': resolve(rootPath, 'src/_plugin/index.test.tsx'), }, plugins: [ new HTMLPlugin({ @@ -46,7 +28,7 @@ export default async function (cli_env: any, _: any) { inject: 'body', scriptLoading: 'module', minify: false, - chunks: ['app', 'plugin', 'polyfill/intl-segmenter', 'polyfill/ses'], + chunks: ['app'], filename: 'index.html', templateParameters: { GIT_SHORT_SHA: gitShortHash(), @@ -59,12 +41,7 @@ export default async function (cli_env: any, _: any) { scriptLoading: 'module', minify: false, publicPath: getPublicPath(flags), - chunks: [ - '_plugin/index.test', - 'plugin', - 'polyfill/intl-segmenter', - 'polyfill/ses', - ], + chunks: ['_plugin/index.test'], filename: '_plugin/index.html', templateParameters: { GIT_SHORT_SHA: gitShortHash(), diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json index 70c65c4c2a..87660c3037 100644 --- a/packages/frontend/core/package.json +++ b/packages/frontend/core/package.json @@ -2,7 +2,7 @@ "name": "@affine/core", "type": "module", "private": true, - "version": "0.10.2", + "version": "0.10.3-canary.2", "scripts": { "build": "yarn -T run build-core", "dev": "yarn -T run dev-core", @@ -17,6 +17,7 @@ }, "dependencies": { "@affine-test/fixtures": "workspace:*", + "@affine/cmdk": "workspace:*", "@affine/component": "workspace:*", "@affine/debug": "workspace:*", "@affine/env": "workspace:*", @@ -24,49 +25,62 @@ "@affine/i18n": "workspace:*", "@affine/templates": "workspace:*", "@affine/workspace": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/icons": "2.1.35", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/icons": "2.1.36", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/virgo": "0.0.0-20231122113751-6bf81eb3-nightly", "@dnd-kit/core": "^6.0.8", - "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/sortable": "^8.0.0", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", "@emotion/styled": "^11.11.0", "@marsidev/react-turnstile": "^0.3.1", - "@mui/material": "^5.14.14", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.4", + "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", "@react-hookz/web": "^23.1.0", "@toeverything/components": "^0.0.46", + "@toeverything/theme": "^0.7.20", + "@vanilla-extract/css": "^1.13.0", + "@vanilla-extract/dynamic": "^2.0.3", "async-call-rpc": "^6.3.1", "bytes": "^3.1.2", + "clsx": "^2.0.0", "css-spring": "^4.1.0", "cssnano": "^6.0.1", + "dayjs": "^1.11.10", + "foxact": "^0.2.20", "graphql": "^16.8.1", + "idb": "^7.1.1", "intl-segmenter-polyfill-rs": "^0.1.6", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "jotai-devtools": "^0.7.0", "lit": "^3.0.2", "lottie-web": "^5.12.2", "mini-css-extract-plugin": "^2.7.6", - "next-auth": "^4.23.2", + "nanoid": "^5.0.3", + "next-auth": "^4.24.5", "next-themes": "^0.2.1", "postcss-loader": "^7.3.3", "react": "18.2.0", "react-dom": "18.2.0", + "react-error-boundary": "^4.0.11", "react-is": "18.2.0", - "react-resizable-panels": "^0.0.55", + "react-resizable-panels": "^0.0.61", "react-router-dom": "^6.16.0", "rxjs": "^7.8.1", "ses": "^0.18.8", "swr": "2.2.4", + "uuid": "^9.0.1", "valtio": "^1.11.2", "y-protocols": "^1.0.6", - "yjs": "^13.6.8", + "yjs": "^13.6.10", "zod": "^3.22.4" }, "devDependencies": { @@ -76,12 +90,15 @@ "@sentry/webpack-plugin": "^2.8.0", "@svgr/webpack": "^8.1.0", "@swc/core": "^1.3.93", + "@testing-library/react": "^14.0.0", "@types/bytes": "^3.1.3", "@types/lodash-es": "^4.17.9", + "@types/uuid": "^9.0.5", "@types/webpack-env": "^1.18.2", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.8.1", "express": "^4.18.2", + "fake-indexeddb": "^5.0.0", "html-webpack-plugin": "^5.5.3", "lodash-es": "^4.17.21", "mime-types": "^2.1.35", @@ -91,6 +108,7 @@ "swc-loader": "^0.2.3", "swc-plugin-coverage-instrument": "^0.0.20", "thread-loader": "^4.0.2", + "vitest": "0.34.6", "webpack": "^5.89.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1", diff --git a/packages/frontend/core/src/_plugin/index.test.tsx b/packages/frontend/core/src/_plugin/index.test.tsx index e1568cf9df..053afdca12 100644 --- a/packages/frontend/core/src/_plugin/index.test.tsx +++ b/packages/frontend/core/src/_plugin/index.test.tsx @@ -1,3 +1,6 @@ +import '../polyfill/ses-lockdown'; +import '../polyfill/intl-segmenter'; + import { assertExists } from '@blocksuite/global/utils'; import { getCurrentStore, diff --git a/packages/frontend/core/src/adapters/local/index.tsx b/packages/frontend/core/src/adapters/local/index.tsx index a6a84d5b96..1b99823f23 100644 --- a/packages/frontend/core/src/adapters/local/index.tsx +++ b/packages/frontend/core/src/adapters/local/index.tsx @@ -3,7 +3,6 @@ import { DEFAULT_WORKSPACE_NAME, PageNotFoundError, } from '@affine/env/constant'; -import type { LocalIndexedDBDownloadProvider } from '@affine/env/workspace'; import type { WorkspaceAdapter } from '@affine/env/workspace'; import { LoadPriority, @@ -14,11 +13,7 @@ import { CRUD, saveWorkspaceToLocalStorage, } from '@affine/workspace/local/crud'; -import { - getOrCreateWorkspace, - globalBlockSuiteSchema, -} from '@affine/workspace/manager'; -import { createIndexedDBDownloadProvider } from '@affine/workspace/providers'; +import { getOrCreateWorkspace } from '@affine/workspace/manager'; import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import { getCurrentStore } from '@toeverything/infra/atom'; import { initEmptyPage } from '@toeverything/infra/blocksuite'; @@ -49,7 +44,6 @@ export const LocalAdapter: WorkspaceAdapter = { blockSuiteWorkspace.meta.setName(DEFAULT_WORKSPACE_NAME); if (runtimeConfig.enablePreloading) { buildShowcaseWorkspace(blockSuiteWorkspace, { - schema: globalBlockSuiteSchema, store: getCurrentStore(), atoms: { pageMode: setPageModeAtom, @@ -66,15 +60,6 @@ export const LocalAdapter: WorkspaceAdapter = { logger.error('init page with empty failed', error); }); } - const provider = createIndexedDBDownloadProvider( - blockSuiteWorkspace.id, - blockSuiteWorkspace.doc, - { - awareness: blockSuiteWorkspace.awarenessStore.awareness, - } - ) as LocalIndexedDBDownloadProvider; - provider.sync(); - provider.whenReady.catch(console.error); saveWorkspaceToLocalStorage(blockSuiteWorkspace.id); logger.debug('create first workspace'); return [blockSuiteWorkspace.id]; diff --git a/packages/frontend/core/src/atoms/collections.ts b/packages/frontend/core/src/atoms/collections.ts index 6bf960229d..1091480228 100644 --- a/packages/frontend/core/src/atoms/collections.ts +++ b/packages/frontend/core/src/atoms/collections.ts @@ -130,7 +130,9 @@ export const pageCollectionBaseAtom = await userSetting.loaded; const view = userSetting.view; if (view) { - const collections: DeprecatedCollection[] = [...view.values()]; + const collections: Omit[] = [ + ...view.values(), + ]; //delete collections view.clear(); return collections.map(v => { @@ -147,36 +149,49 @@ export const pageCollectionBaseAtom = return new Observable(subscriber => { const group = new DisposableGroup(); - currentWorkspacePromise.then(async currentWorkspace => { - const workspaceSetting = getWorkspaceSetting(currentWorkspace); - migrateCollectionsFromIdbData(currentWorkspace).then(collections => { - if (collections.length) { - workspaceSetting.addCollection(...collections); - } - }); - migrateCollectionsFromUserData(currentWorkspace).then(collections => { - if (collections.length) { - workspaceSetting.addCollection(...collections); - } - }); - subscriber.next({ - loading: false, - collections: workspaceSetting.collections, - }); - if (group.disposed) { - return; - } - const fn = () => { + currentWorkspacePromise + .then(async currentWorkspace => { + const workspaceSetting = getWorkspaceSetting(currentWorkspace); + migrateCollectionsFromIdbData(currentWorkspace) + .then(collections => { + if (collections.length) { + workspaceSetting.addCollection(...collections); + } + }) + .catch(error => { + console.error(error); + }); + migrateCollectionsFromUserData(currentWorkspace) + .then(collections => { + if (collections.length) { + workspaceSetting.addCollection(...collections); + } + }) + .catch(error => { + console.error(error); + }); subscriber.next({ loading: false, collections: workspaceSetting.collections, }); - }; - workspaceSetting.collectionsYArray.observe(fn); - group.add(() => { - workspaceSetting.collectionsYArray.unobserve(fn); + if (group.disposed) { + return; + } + const fn = () => { + subscriber.next({ + loading: false, + collections: workspaceSetting.collections, + }); + }; + workspaceSetting.collectionsYArray.observe(fn); + group.add(() => { + workspaceSetting.collectionsYArray.unobserve(fn); + }); + }) + .catch(error => { + subscriber.error(error); }); - }); + return () => { group.dispose(); }; diff --git a/packages/frontend/core/src/atoms/index.ts b/packages/frontend/core/src/atoms/index.ts index 82e911331b..c275bf321a 100644 --- a/packages/frontend/core/src/atoms/index.ts +++ b/packages/frontend/core/src/atoms/index.ts @@ -40,7 +40,7 @@ export const authAtom = atom({ export const openDisableCloudAlertModalAtom = atom(false); -type PageMode = 'page' | 'edgeless'; +export type PageMode = 'page' | 'edgeless'; type PageLocalSetting = { mode: PageMode; }; diff --git a/packages/frontend/core/src/bootstrap/setup.ts b/packages/frontend/core/src/bootstrap/setup.ts index 53b2021a9f..27353eb870 100644 --- a/packages/frontend/core/src/bootstrap/setup.ts +++ b/packages/frontend/core/src/bootstrap/setup.ts @@ -1,129 +1,18 @@ import { setupGlobal } from '@affine/env/global'; import type { WorkspaceAdapter } from '@affine/env/workspace'; -import { WorkspaceFlavour } from '@affine/env/workspace'; -import type { RootWorkspaceMetadata } from '@affine/workspace/atom'; +import type { WorkspaceFlavour } from '@affine/env/workspace'; import { type RootWorkspaceMetadataV2, rootWorkspacesMetadataAtom, workspaceAdaptersAtom, } from '@affine/workspace/atom'; -import { - getOrCreateWorkspace, - globalBlockSuiteSchema, -} from '@affine/workspace/manager'; -import { assertExists } from '@blocksuite/global/utils'; -import { - migrateLocalBlobStorage, - migrateWorkspace, - WorkspaceVersion, -} from '@toeverything/infra/blocksuite'; -import { downloadBinary, overwriteBinary } from '@toeverything/y-indexeddb'; import type { createStore } from 'jotai/vanilla'; -import { nanoid } from 'nanoid'; -import { applyUpdate, Doc as YDoc, encodeStateAsUpdate } from 'yjs'; import { WorkspaceAdapters } from '../adapters/workspace'; import { performanceLogger } from '../shared'; const performanceSetupLogger = performanceLogger.namespace('setup'); -async function tryMigration() { - const value = localStorage.getItem('jotai-workspaces'); - if (value) { - try { - const metadata = JSON.parse(value) as RootWorkspaceMetadata[]; - const promises: Promise[] = []; - const newMetadata = [...metadata]; - metadata.forEach(oldMeta => { - if (oldMeta.flavour === WorkspaceFlavour.LOCAL) { - let doc: YDoc; - const options = { - getCurrentRootDoc: async () => { - doc = new YDoc({ - guid: oldMeta.id, - }); - const downloadWorkspace = async (doc: YDoc): Promise => { - const binary = await downloadBinary(doc.guid); - if (binary) { - applyUpdate(doc, binary); - } - await Promise.all( - [...doc.subdocs.values()].map(subdoc => - downloadWorkspace(subdoc) - ) - ); - }; - await downloadWorkspace(doc); - return doc; - }, - createWorkspace: async () => - getOrCreateWorkspace(nanoid(), WorkspaceFlavour.LOCAL), - getSchema: () => globalBlockSuiteSchema, - }; - promises.push( - migrateWorkspace( - 'version' in oldMeta ? oldMeta.version : undefined, - options - ).then(async status => { - if (typeof status !== 'boolean') { - const adapter = WorkspaceAdapters[oldMeta.flavour]; - const oldWorkspace = await adapter.CRUD.get(oldMeta.id); - const newId = await adapter.CRUD.create(status); - assertExists( - oldWorkspace, - 'workspace should exist after migrate' - ); - await adapter.CRUD.delete(oldWorkspace.blockSuiteWorkspace); - const index = newMetadata.findIndex( - meta => meta.id === oldMeta.id - ); - newMetadata[index] = { - ...oldMeta, - id: newId, - version: WorkspaceVersion.Surface, - }; - await migrateLocalBlobStorage(status.id, newId); - console.log('workspace migrated', oldMeta.id, newId); - } else if (status) { - const index = newMetadata.findIndex( - meta => meta.id === oldMeta.id - ); - newMetadata[index] = { - ...oldMeta, - version: WorkspaceVersion.Surface, - }; - const overWrite = async (doc: YDoc): Promise => { - await overwriteBinary(doc.guid, encodeStateAsUpdate(doc)); - return Promise.all( - [...doc.subdocs.values()].map(subdoc => overWrite(subdoc)) - ).then(); - }; - await overWrite(doc); - console.log('workspace migrated', oldMeta.id); - } - }) - ); - } - }); - - await Promise.all(promises) - .then(() => { - console.log('migration done'); - }) - .catch(e => { - console.error('migration failed', e); - }) - .finally(() => { - localStorage.setItem('jotai-workspaces', JSON.stringify(newMetadata)); - window.dispatchEvent(new CustomEvent('migration-done')); - window.$migrationDone = true; - }); - } catch (e) { - console.error('error when migrating data', e); - } - } -} - export function createFirstAppData(store: ReturnType) { const createFirst = (): RootWorkspaceMetadataV2[] => { const Plugins = Object.values(WorkspaceAdapters).sort( @@ -136,7 +25,6 @@ export function createFirstAppData(store: ReturnType) { { id, flavour: Plugin.flavour, - version: WorkspaceVersion.DatabaseV3, } ); }).filter((ids): ids is RootWorkspaceMetadataV2 => !!ids); @@ -163,9 +51,6 @@ export async function setup(store: ReturnType) { performanceSetupLogger.info('setup global'); setupGlobal(); - performanceSetupLogger.info('try migration'); - await tryMigration(); - performanceSetupLogger.info('get root workspace meta'); // do not read `rootWorkspacesMetadataAtom` before migration await store.get(rootWorkspacesMetadataAtom); diff --git a/packages/frontend/core/src/components/affine/affine-error-boundary.css.ts b/packages/frontend/core/src/components/affine/affine-error-boundary.css.ts index 145b0c6aec..5999d7ec1c 100644 --- a/packages/frontend/core/src/components/affine/affine-error-boundary.css.ts +++ b/packages/frontend/core/src/components/affine/affine-error-boundary.css.ts @@ -15,7 +15,7 @@ export const errorDetailStyle = style({ }); export const errorTitle = style({ - fontSize: '36px', + fontSize: '32px', lineHeight: '44px', fontWeight: 700, }); diff --git a/packages/frontend/core/src/components/affine/affine-error-boundary.tsx b/packages/frontend/core/src/components/affine/affine-error-boundary.tsx index 648e5f1e00..cd576a0ec2 100644 --- a/packages/frontend/core/src/components/affine/affine-error-boundary.tsx +++ b/packages/frontend/core/src/components/affine/affine-error-boundary.tsx @@ -20,7 +20,7 @@ import { useLocation, useParams } from 'react-router-dom'; import { RecoverableError, - SessionFetchErrorRightAfterLoginOrSignUp, + type SessionFetchErrorRightAfterLoginOrSignUp, } from '../../unexpected-application-state/errors'; import { errorDescription, @@ -33,7 +33,9 @@ import { } from './affine-error-boundary.css'; import errorBackground from './error-status.assets.svg'; -export type AffineErrorBoundaryProps = React.PropsWithChildren; +export type AffineErrorBoundaryProps = React.PropsWithChildren & { + height?: number | string; +}; type AffineError = | QueryParamError @@ -81,7 +83,7 @@ export class AffineErrorBoundary extends Component< if (this.state.error.canRetry()) { this.state.error.retry(); this.setState({ - error: this.state.error, + error: null, canRetryRecoveredError: this.state.error.canRetry(), }); } else { @@ -90,6 +92,10 @@ export class AffineErrorBoundary extends Component< } }; + private readonly handleRefresh = () => { + this.setState({ error: null }); + }; + static getDerivedStateFromError( error: AffineError ): AffineErrorBoundaryState { @@ -121,14 +127,14 @@ export class AffineErrorBoundary extends Component< ); - } else if (error instanceof SessionFetchErrorRightAfterLoginOrSignUp) { + } else if (error instanceof RecoverableError) { const retryButtonDesc = this.state.canRetryRecoveredError ? 'Refetch' : 'Reload'; errorDetail = ( <>

Sorry.. there was an error

- Fetching session failed + {error.message} If you are still experiencing this issue, please{' '} -

Sorry.. there was an error

- {error.message ?? error.toString()} +

Sorry.. there was an error

+ + {error.message ?? error.toString()} + + ); } return ( -
+
{errorDetail}
{ + const onResendClick = useAsyncCallback(async () => { if (verifyToken) { await signIn(email, verifyToken, challenge); } diff --git a/packages/frontend/core/src/components/affine/auth/after-sign-up-send-email.tsx b/packages/frontend/core/src/components/affine/auth/after-sign-up-send-email.tsx index 3a2d21ff19..3841104620 100644 --- a/packages/frontend/core/src/components/affine/auth/after-sign-up-send-email.tsx +++ b/packages/frontend/core/src/components/affine/auth/after-sign-up-send-email.tsx @@ -6,6 +6,7 @@ import { } from '@affine/component/auth-components'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { type FC, useCallback } from 'react'; import { useCurrentLoginStatus } from '../../../hooks/affine/use-current-login-status'; @@ -29,7 +30,7 @@ export const AfterSignUpSendEmail: FC = ({ onSignedIn?.(); } - const onResendClick = useCallback(async () => { + const onResendClick = useAsyncCallback(async () => { if (verifyToken) { await signUp(email, verifyToken, challenge); } diff --git a/packages/frontend/core/src/components/affine/auth/send-email.tsx b/packages/frontend/core/src/components/affine/auth/send-email.tsx index e2abe99d06..0b3399c1d8 100644 --- a/packages/frontend/core/src/components/affine/auth/send-email.tsx +++ b/packages/frontend/core/src/components/affine/auth/send-email.tsx @@ -14,6 +14,7 @@ import { import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useMutation } from '@affine/workspace/affine/gql'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useSetAtom } from 'jotai/react'; import { useCallback, useState } from 'react'; @@ -146,7 +147,7 @@ export const SendEmail = ({ const buttonContent = useButtonContent(emailType); const { loading, sendEmail } = useSendEmail(emailType); - const onSendEmail = useCallback(async () => { + const onSendEmail = useAsyncCallback(async () => { // TODO: add error handler await sendEmail(email); diff --git a/packages/frontend/core/src/components/affine/auth/sign-in-with-password.tsx b/packages/frontend/core/src/components/affine/auth/sign-in-with-password.tsx index 5559e70433..9657c850c3 100644 --- a/packages/frontend/core/src/components/affine/auth/sign-in-with-password.tsx +++ b/packages/frontend/core/src/components/affine/auth/sign-in-with-password.tsx @@ -6,6 +6,7 @@ import { } from '@affine/component/auth-components'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { useSession } from 'next-auth/react'; import type { FC } from 'react'; @@ -26,7 +27,7 @@ export const SignInWithPassword: FC = ({ const [password, setPassword] = useState(''); const [passwordError, setPasswordError] = useState(false); - const onSignIn = useCallback(async () => { + const onSignIn = useAsyncCallback(async () => { const res = await signInCloud('credentials', { redirect: false, email, diff --git a/packages/frontend/core/src/components/affine/auth/sign-in.tsx b/packages/frontend/core/src/components/affine/auth/sign-in.tsx index fcc68f3040..93bd0d42be 100644 --- a/packages/frontend/core/src/components/affine/auth/sign-in.tsx +++ b/packages/frontend/core/src/components/affine/auth/sign-in.tsx @@ -9,6 +9,7 @@ import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useMutation } from '@affine/workspace/affine/gql'; import { ArrowDownBigIcon, GoogleDuotoneIcon } from '@blocksuite/icons'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { GraphQLError } from 'graphql'; import { type FC, useState } from 'react'; import { useCallback } from 'react'; @@ -52,7 +53,7 @@ export const SignIn: FC = ({ onSignedIn?.(); } - const onContinue = useCallback(async () => { + const onContinue = useAsyncCallback(async () => { if (!validateEmail(email)) { setIsValidEmail(false); return; diff --git a/packages/frontend/core/src/components/affine/auth/subscription-redirect.tsx b/packages/frontend/core/src/components/affine/auth/subscription-redirect.tsx index a64eeab270..26b720b60f 100644 --- a/packages/frontend/core/src/components/affine/auth/subscription-redirect.tsx +++ b/packages/frontend/core/src/components/affine/auth/subscription-redirect.tsx @@ -10,6 +10,7 @@ import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useMutation, useQuery } from '@affine/workspace/affine/gql'; import { Button } from '@toeverything/components/button'; import { Loading } from '@toeverything/components/loading'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { nanoid } from 'nanoid'; import { Suspense, useCallback, useEffect, useMemo } from 'react'; @@ -33,12 +34,12 @@ const usePaymentRedirect = () => { mutation: checkoutMutation, }); - return useCallback(() => { - checkoutSubscription({ recurring, idempotencyKey }) - .then(({ checkout }) => { - window.open(checkout, '_self', 'norefferer'); - }) - .catch(e => console.error(e)); + return useAsyncCallback(async () => { + const { checkout } = await checkoutSubscription({ + recurring, + idempotencyKey, + }); + window.open(checkout, '_self', 'norefferer'); }, [recurring, idempotencyKey, checkoutSubscription]); }; diff --git a/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx b/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx index 373b86a584..0ec4f8920d 100644 --- a/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx +++ b/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx @@ -9,6 +9,7 @@ import { Modal, } from '@toeverything/components/modal'; import { Tooltip } from '@toeverything/components/tooltip'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import type { LoadDBFileResult, SelectDBFileLocationResult, @@ -330,14 +331,13 @@ export const CreateWorkspaceModal = ({ ] ); - const onConfirmName = useCallback( - (name: string) => { + const onConfirmName = useAsyncCallback( + async (name: string) => { setWorkspaceName(name); // this will be the last step for web for now // fix me later - createLocalWorkspace(name).then(id => { - onCreate(id); - }); + const id = await createLocalWorkspace(name); + onCreate(id); }, [createLocalWorkspace, onCreate] ); diff --git a/packages/frontend/core/src/components/affine/enable-affine-cloud-modal/index.tsx b/packages/frontend/core/src/components/affine/enable-affine-cloud-modal/index.tsx index 62320122b0..e26990481d 100644 --- a/packages/frontend/core/src/components/affine/enable-affine-cloud-modal/index.tsx +++ b/packages/frontend/core/src/components/affine/enable-affine-cloud-modal/index.tsx @@ -19,7 +19,7 @@ export const EnableAffineCloudModal = ({ const setAuthAtom = useSetAtom(authAtom); const setOnceSignedInEvent = useSetAtom(setOnceSignedInEventAtom); - const confirm = useCallback(async () => { + const confirm = useCallback(() => { return propsOnConfirm?.(); }, [propsOnConfirm]); diff --git a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/export.tsx b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/export.tsx index 91b40a1503..592ccf09c0 100644 --- a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/export.tsx +++ b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/export.tsx @@ -1,17 +1,17 @@ import { pushNotificationAtom } from '@affine/component/notification-center'; import { SettingRow } from '@affine/component/setting-components'; -import { isDesktop } from '@affine/env/constant'; import type { AffineOfficialWorkspace } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import type { SaveDBFileResult } from '@toeverything/infra/type'; import { useSetAtom } from 'jotai'; -import { useCallback, useState } from 'react'; +import { useState } from 'react'; import type { Doc } from 'yjs'; import { encodeStateAsUpdate } from 'yjs'; async function syncBlobsToSqliteDb(workspace: AffineOfficialWorkspace) { - if (window.apis && isDesktop) { + if (window.apis && environment.isDesktop) { const bs = workspace.blockSuiteWorkspace.blob; const blobsInDb = await window.apis.db.getBlobKeys(workspace.id); const blobsInStorage = await bs.list(); @@ -32,7 +32,7 @@ async function syncBlobsToSqliteDb(workspace: AffineOfficialWorkspace) { } async function syncDocsToSqliteDb(workspace: AffineOfficialWorkspace) { - if (window.apis && isDesktop) { + if (window.apis && environment.isDesktop) { const workspaceId = workspace.blockSuiteWorkspace.doc.guid; const syncDoc = async (doc: Doc) => { await window.apis.db.applyDocUpdate( @@ -56,7 +56,7 @@ export const ExportPanel = ({ workspace }: ExportPanelProps) => { const t = useAFFiNEI18N(); const [syncing, setSyncing] = useState(false); const pushNotification = useSetAtom(pushNotificationAtom); - const onExport = useCallback(async () => { + const onExport = useAsyncCallback(async () => { if (syncing) { return; } diff --git a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/members.tsx b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/members.tsx index 66eef647c6..687e453467 100644 --- a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/members.tsx +++ b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/members.tsx @@ -167,7 +167,9 @@ export const CloudWorkspaceMembersPanel = ({ })} ,
- go upgrade + + {t['com.affine.payment.member.description.go-upgrade']()} +
diff --git a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/profile.tsx b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/profile.tsx index 04844e7df0..80eacda929 100644 --- a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/profile.tsx +++ b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/profile.tsx @@ -77,8 +77,8 @@ export const ProfilePanel = ({ workspace, isOwner }: ProfilePanelProps) => { ); const handleUploadAvatar = useCallback( - async (file: File) => { - await update(file) + (file: File) => { + update(file) .then(() => { pushNotification({ title: 'Update workspace avatar success', diff --git a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/publish.tsx b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/publish.tsx index 0e824e842d..95652cdd91 100644 --- a/packages/frontend/core/src/components/affine/new-workspace-setting-detail/publish.tsx +++ b/packages/frontend/core/src/components/affine/new-workspace-setting-detail/publish.tsx @@ -11,9 +11,10 @@ import { WorkspaceFlavour } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { Button } from '@toeverything/components/button'; import { Tooltip } from '@toeverything/components/tooltip'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; import { noop } from 'foxact/noop'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { toast } from '../../../utils'; import { EnableAffineCloudModal } from '../enable-affine-cloud-modal'; @@ -52,7 +53,7 @@ const PublishPanelAffine = (props: PublishPanelAffineProps) => { ); }, []); - const copyUrl = useCallback(async () => { + const copyUrl = useAsyncCallback(async () => { await navigator.clipboard.writeText(shareUrl); toast(t['Copied link to clipboard']()); }, [shareUrl, t]); diff --git a/packages/frontend/core/src/components/affine/setting-modal/account-setting/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/account-setting/index.tsx index 3f887cdefb..2c16543363 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/account-setting/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/account-setting/index.tsx @@ -16,6 +16,7 @@ import { useMutation, useQuery } from '@affine/workspace/affine/gql'; import { ArrowRightSmallIcon, CameraIcon } from '@blocksuite/icons'; import { Avatar } from '@toeverything/components/avatar'; import { Button } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { validateAndReduceImage } from '@toeverything/hooks/use-block-suite-workspace-avatar-url'; import bytes from 'bytes'; import { useSetAtom } from 'jotai'; @@ -50,7 +51,7 @@ export const UserAvatar = () => { mutation: removeAvatarMutation, }); - const handleUpdateUserAvatar = useCallback( + const handleUpdateUserAvatar = useAsyncCallback( async (file: File) => { try { const reducedFile = await validateAndReduceImage(file); diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx index 8f44116fca..48b10075f3 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/billing/index.tsx @@ -1,3 +1,4 @@ +import { Skeleton } from '@affine/component'; import { Pagination } from '@affine/component/member-components'; import { SettingHeader, @@ -19,9 +20,9 @@ import { Trans } from '@affine/i18n'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useMutation, useQuery } from '@affine/workspace/affine/gql'; import { ArrowRightSmallIcon } from '@blocksuite/icons'; -import { Skeleton } from '@mui/material'; import { Button, IconButton } from '@toeverything/components/button'; import { Loading } from '@toeverything/components/loading'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useSetAtom } from 'jotai'; import { Suspense, useCallback, useMemo, useState } from 'react'; @@ -105,10 +106,10 @@ const SubscriptionSettings = () => { plan === SubscriptionPlan.Free ? '0' : price - ? recurring === SubscriptionRecurring.Monthly - ? String(price.amount / 100) - : String(price.yearlyAmount / 100) - : '?'; + ? recurring === SubscriptionRecurring.Monthly + ? String(price.amount / 100) + : String(price.yearlyAmount / 100) + : '?'; const t = useAFFiNEI18N(); @@ -255,8 +256,8 @@ const PaymentMethodUpdater = () => { }); const t = useAFFiNEI18N(); - const update = useCallback(() => { - trigger(null, { + const update = useAsyncCallback(async () => { + await trigger(null, { onSuccess: data => { window.open(data.createCustomerPortal, '_blank', 'noopener noreferrer'); }, diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/actions.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/actions.tsx index 7bf7c0cc7d..4b8a7c0b1d 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/actions.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/actions.tsx @@ -4,9 +4,10 @@ import { resumeSubscriptionMutation, } from '@affine/graphql'; import { useMutation } from '@affine/workspace/affine/gql'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { nanoid } from 'nanoid'; import type { PropsWithChildren } from 'react'; -import { useCallback, useState } from 'react'; +import { useState } from 'react'; import { ConfirmLoadingModal, DowngradeModal } from './modals'; @@ -30,8 +31,8 @@ export const CancelAction = ({ mutation: cancelSubscriptionMutation, }); - const downgrade = useCallback(() => { - trigger( + const downgrade = useAsyncCallback(async () => { + await trigger( { idempotencyKey }, { onSuccess: data => { @@ -78,8 +79,8 @@ export const ResumeAction = ({ mutation: resumeSubscriptionMutation, }); - const resume = useCallback(() => { - trigger( + const resume = useAsyncCallback(async () => { + await trigger( { idempotencyKey }, { onSuccess: data => { diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/layout.css.ts b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/layout.css.ts index 738ba740a9..c3665d2242 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/layout.css.ts +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/layout.css.ts @@ -13,6 +13,10 @@ export const scrollArea = style({ overflowX: 'auto', scrollSnapType: 'x mandatory', paddingBottom: '21px', + + /** Avoid box-shadow clipping */ + paddingTop: '21px', + marginTop: '-21px', }); export const scrollBar = style({ diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/plan-card.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/plan-card.tsx index 98dbc7ced6..16074b71dc 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/plan-card.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/plan-card.tsx @@ -15,6 +15,7 @@ import { useMutation } from '@affine/workspace/affine/gql'; import { DoneIcon } from '@blocksuite/icons'; import { Button } from '@toeverything/components/button'; import { Tooltip } from '@toeverything/components/tooltip'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useSetAtom } from 'jotai'; import { useAtom } from 'jotai'; import { nanoid } from 'nanoid'; @@ -127,21 +128,25 @@ export function getPlanDetail(t: ReturnType) { } export const PlanCard = (props: PlanCardProps) => { + const t = useAFFiNEI18N(); const { detail, subscription, recurring } = props; const loggedIn = useCurrentLoginStatus() === 'authenticated'; const currentPlan = subscription?.plan ?? SubscriptionPlan.Free; const isCurrent = loggedIn && detail.plan === currentPlan; + const isPro = detail.plan === SubscriptionPlan.Pro; return (

- {detail.plan}{' '} + + {detail.plan} + {' '} {'discount' in detail && recurring === SubscriptionRecurring.Yearly && ( @@ -161,7 +166,9 @@ export const PlanCard = (props: PlanCardProps) => { ? detail.price : detail.yearlyPrice} - per month + + {t['com.affine.payment.price-description.per-month']()} + )}

@@ -364,7 +371,7 @@ const Upgrade = ({ }, [onSubscriptionUpdate]); const [, openPaymentDisableModal] = useAtom(openPaymentDisableAtom); - const upgrade = useCallback(() => { + const upgrade = useAsyncCallback(async () => { if (!runtimeConfig.enablePayment) { openPaymentDisableModal(true); return; @@ -373,7 +380,7 @@ const Upgrade = ({ if (newTabRef.current) { newTabRef.current.focus(); } else { - trigger( + await trigger( { recurring, idempotencyKey }, { onSuccess: data => { @@ -439,8 +446,8 @@ const ChangeRecurring = ({ mutation: updateSubscriptionMutation, }); - const change = useCallback(() => { - trigger( + const change = useAsyncCallback(async () => { + await trigger( { recurring: to, idempotencyKey }, { onSuccess: data => { @@ -492,7 +499,7 @@ const ChangeRecurring = ({ const SignUpAction = ({ children }: PropsWithChildren) => { const setOpen = useSetAtom(authAtom); - const onClickSignIn = useCallback(async () => { + const onClickSignIn = useCallback(() => { setOpen(state => ({ ...state, openModal: true, diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/skeleton.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/skeleton.tsx index 1ae9a390b7..6d437a594c 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/skeleton.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/skeleton.tsx @@ -1,4 +1,4 @@ -import { Skeleton } from '@mui/material'; +import { Skeleton } from '@affine/component'; import { PlanLayout } from './layout'; import * as styles from './skeleton.css'; diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/style.css.ts b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/style.css.ts index 6e13c4d423..28b8ed4443 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/style.css.ts +++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/plans/style.css.ts @@ -9,7 +9,7 @@ export const recurringRadioGroup = style({ export const radioButtonDiscount = style({ marginLeft: '4px', - color: 'var(--affine-primary-color)', + color: 'var(--affine-brand-color)', fontWeight: 400, }); export const radioButtonText = style({ @@ -46,23 +46,41 @@ export const planCard = style({ }, }); -export const currentPlanCard = style([ +export const proPlanCard = style([ planCard, { - borderWidth: '2px', - borderColor: 'var(--affine-primary-color)', + borderWidth: '1px', + borderColor: 'var(--affine-brand-color)', boxShadow: 'var(--affine-shadow-2)', + position: 'relative', + '::after': { + content: '', + position: 'absolute', + inset: '-1px', + borderRadius: 'inherit', + boxShadow: '0px 0px 0px 2px var(--affine-brand-color)', + opacity: 0.3, + zIndex: 1, + pointerEvents: 'none', + }, }, ]); +export const proPlanTitle = style({ + backgroundColor: 'var(--affine-brand-color)', + color: 'var(--affine-white)', + padding: '0px 6px', + borderRadius: '4px', + height: '24px', + display: 'inline-block', +}); + export const discountLabel = style({ - color: 'var(--affine-primary-color)', + color: 'var(--affine-text-emphasis-color)', marginLeft: '8px', lineHeight: '20px', fontSize: 'var(--affine-font-xs)', fontWeight: 500, - padding: '0 4px', - backgroundColor: 'var(--affine-blue-50)', borderRadius: '4px', display: 'inline-block', height: '100%', diff --git a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx index a96a0b9514..111aa96d36 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx @@ -2,6 +2,7 @@ import { pushNotificationAtom } from '@affine/component/notification-center'; import { WorkspaceSubPath } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; import { useSetAtom } from 'jotai'; import { useAtomValue } from 'jotai'; @@ -65,7 +66,7 @@ export const WorkspaceSetting = ({ workspaceId }: { workspaceId: string }) => { workspaces, ]); - const handleDeleteWorkspace = useCallback(async () => { + const handleDeleteWorkspace = useAsyncCallback(async () => { closeAndJumpOut(); await deleteWorkspace(workspaceId); @@ -75,7 +76,7 @@ export const WorkspaceSetting = ({ workspaceId }: { workspaceId: string }) => { }); }, [closeAndJumpOut, deleteWorkspace, pushNotification, t, workspaceId]); - const handleLeaveWorkspace = useCallback(async () => { + const handleLeaveWorkspace = useAsyncCallback(async () => { closeAndJumpOut(); await leaveWorkspace(workspaceId, workspaceName); diff --git a/packages/frontend/core/src/components/affine/share-page-modal/index.tsx b/packages/frontend/core/src/components/affine/share-page-modal/index.tsx index 80b0b9973f..1e4395ce46 100644 --- a/packages/frontend/core/src/components/affine/share-page-modal/index.tsx +++ b/packages/frontend/core/src/components/affine/share-page-modal/index.tsx @@ -1,4 +1,3 @@ -import { ShareMenu } from '@affine/component/share-menu'; import { type AffineOfficialWorkspace, WorkspaceFlavour, @@ -6,10 +5,9 @@ import { import type { Page } from '@blocksuite/store'; import { useCallback, useState } from 'react'; -import { useExportPage } from '../../../hooks/affine/use-export-page'; -import { useIsSharedPage } from '../../../hooks/affine/use-is-shared-page'; import { useOnTransformWorkspace } from '../../../hooks/root/use-on-transform-workspace'; import { EnableAffineCloudModal } from '../enable-affine-cloud-modal'; +import { ShareMenu } from './share-menu'; type SharePageModalProps = { workspace: AffineOfficialWorkspace; @@ -19,7 +17,7 @@ type SharePageModalProps = { export const SharePageModal = ({ workspace, page }: SharePageModalProps) => { const onTransformWorkspace = useOnTransformWorkspace(); const [open, setOpen] = useState(false); - const exportHandler = useExportPage(page); + const handleConfirm = useCallback(() => { if (workspace.flavour !== WorkspaceFlavour.LOCAL) { return; @@ -31,15 +29,13 @@ export const SharePageModal = ({ workspace, page }: SharePageModalProps) => { ); setOpen(false); }, [onTransformWorkspace, workspace]); + return ( <> setOpen(true)} - togglePagePublic={async () => {}} - exportHandler={exportHandler} /> {workspace.flavour === WorkspaceFlavour.LOCAL ? ( { +export const ShareExport = ({ workspace, currentPage }: ShareMenuProps) => { const t = useAFFiNEI18N(); const workspaceId = workspace.id; const pageId = currentPage.id; @@ -22,6 +19,7 @@ export const ShareExport = ({ pageId, urlType: 'workspace', }); + const exportHandler = useExportPage(currentPage); return ( <> diff --git a/packages/frontend/component/src/components/share-menu/share-menu.tsx b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx similarity index 87% rename from packages/frontend/component/src/components/share-menu/share-menu.tsx rename to packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx index a40c42adfa..9b364cc04a 100644 --- a/packages/frontend/component/src/components/share-menu/share-menu.tsx +++ b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx @@ -12,9 +12,11 @@ import { Button } from '@toeverything/components/button'; import { Divider } from '@toeverything/components/divider'; import { Menu } from '@toeverything/components/menu'; +import { useIsSharedPage } from '../../../../hooks/affine/use-is-shared-page'; import * as styles from './index.css'; import { ShareExport } from './share-export'; import { SharePage } from './share-page'; + export interface ShareMenuProps< Workspace extends AffineOfficialWorkspace = | AffineCloudWorkspace @@ -23,13 +25,7 @@ export interface ShareMenuProps< > { workspace: Workspace; currentPage: Page; - useIsSharedPage: ( - workspaceId: string, - pageId: string - ) => [isSharePage: boolean, setIsSharePage: (enable: boolean) => void]; onEnableAffineCloud: () => void; - togglePagePublic: () => Promise; - exportHandler: (type: 'pdf' | 'html' | 'png' | 'markdown') => Promise; } const ShareMenuContent = (props: ShareMenuProps) => { @@ -73,9 +69,14 @@ const LocalShareMenu = (props: ShareMenuProps) => { const CloudShareMenu = (props: ShareMenuProps) => { const t = useAFFiNEI18N(); - - const { workspace, currentPage, useIsSharedPage } = props; - const [isSharedPage] = useIsSharedPage(workspace.id, currentPage.id); + const { + workspace: { id: workspaceId }, + currentPage, + } = props; + const { isSharedPage } = useIsSharedPage( + workspaceId, + currentPage.spaceDoc.guid + ); return ( { export const AffineSharePage = (props: ShareMenuProps) => { const { workspace: { id: workspaceId }, - currentPage: { id: pageId }, + currentPage, } = props; - const [isPublic, setIsPublic] = props.useIsSharedPage(workspaceId, pageId); + const pageId = currentPage.id; const [showDisable, setShowDisable] = useState(false); + const { + isSharedPage, + enableShare, + changeShare, + currentShareMode, + disableShare, + } = useIsSharedPage(workspaceId, currentPage.spaceDoc.guid); + const currentPageMode = useAtomValue(currentModeAtom); + + const defaultMode = useMemo(() => { + if (isSharedPage) { + // if it's a shared page, use the share mode + return currentShareMode; + } + // default to current page mode + return currentPageMode; + }, [currentPageMode, currentShareMode, isSharedPage]); + const [mode, setMode] = useState(defaultMode); + const { sharingUrl, onClickCopyLink } = useSharingUrl({ workspaceId, pageId, @@ -75,16 +101,26 @@ export const AffineSharePage = (props: ShareMenuProps) => { const t = useAFFiNEI18N(); const onClickCreateLink = useCallback(() => { - setIsPublic(true); - }, [setIsPublic]); + enableShare(mode); + }, [enableShare, mode]); const onDisablePublic = useCallback(() => { - setIsPublic(false); + disableShare(); toast('Successfully disabled', { portal: document.body, }); setShowDisable(false); - }, [setIsPublic]); + }, [disableShare]); + + const onShareModeChange = useCallback( + (value: PageMode) => { + setMode(value); + if (isSharedPage) { + changeShare(value); + } + }, + [changeShare, isSharedPage] + ); return ( <> @@ -103,10 +139,12 @@ export const AffineSharePage = (props: ShareMenuProps) => { fontSize: 'var(--affine-font-xs)', lineHeight: '20px', }} - value={isPublic ? sharingUrl : `${runtimeConfig.serverUrlPrefix}/...`} + value={ + isSharedPage ? sharingUrl : `${runtimeConfig.serverUrlPrefix}/...` + } readOnly /> - {isPublic ? ( + {isSharedPage ? ( )}
- {runtimeConfig.enableEnhanceShareMode ? ( -
-
- {t['com.affine.share-menu.ShareMode']()} -
-
- {}} - > - - {t['com.affine.pageMode.page']()} - - - {t['com.affine.pageMode.edgeless']()} - - -
+
+
+ {t['com.affine.share-menu.ShareMode']()}
- ) : null} - {isPublic ? ( +
+ + + {t['com.affine.pageMode.page']()} + + + {t['com.affine.pageMode.edgeless']()} + + +
+
+ {isSharedPage ? ( <> {runtimeConfig.enableEnhanceShareMode && ( <> diff --git a/packages/frontend/component/src/components/share-menu/use-share-url.ts b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/use-share-url.ts similarity index 67% rename from packages/frontend/component/src/components/share-menu/use-share-url.ts rename to packages/frontend/core/src/components/affine/share-page-modal/share-menu/use-share-url.ts index a1eaea3d66..d349235f6f 100644 --- a/packages/frontend/component/src/components/share-menu/use-share-url.ts +++ b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/use-share-url.ts @@ -1,8 +1,7 @@ +import { toast } from '@affine/component'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useCallback, useMemo } from 'react'; -import { toast } from '../../ui/toast'; - type UrlType = 'share' | 'workspace'; type UseSharingUrl = { @@ -16,7 +15,14 @@ export const generateUrl = ({ pageId, urlType, }: UseSharingUrl) => { - return `${runtimeConfig.serverUrlPrefix}/${urlType}/${workspaceId}/${pageId}`; + // to generate a private url like https://affine.app/workspace/123/456 + // to generate a public url like https://affine.app/share/123/456 + // or https://affine.app/share/123/456?mode=edgeless + + const url = new URL( + `${runtimeConfig.serverUrlPrefix}/${urlType}/${workspaceId}/${pageId}` + ); + return url.toString(); }; export const useSharingUrl = ({ @@ -27,7 +33,7 @@ export const useSharingUrl = ({ const t = useAFFiNEI18N(); const sharingUrl = useMemo( () => generateUrl({ workspaceId, pageId, urlType }), - [urlType, workspaceId, pageId] + [workspaceId, pageId, urlType] ); const onClickCopyLink = useCallback(() => { diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-header-title/index.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-header-title/index.tsx index 68d02cb88b..cdbbd3bc8b 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-header-title/index.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-header-title/index.tsx @@ -1,5 +1,4 @@ import type { AffineOfficialWorkspace } from '@affine/env/workspace'; -import { WorkspaceFlavour } from '@affine/env/workspace'; import { useBlockSuitePageMeta, usePageMetaHelper, @@ -13,6 +12,7 @@ import { useState, } from 'react'; +import type { PageMode } from '../../../atoms'; import { EditorModeSwitch } from '../block-suite-mode-switch'; import { PageMenu } from './operation-menu'; import * as styles from './styles.css'; @@ -20,6 +20,8 @@ import * as styles from './styles.css'; export interface BlockSuiteHeaderTitleProps { workspace: AffineOfficialWorkspace; pageId: string; + isPublic?: boolean; + publicMode?: PageMode; } const EditableTitle = ({ @@ -54,6 +56,8 @@ const StableTitle = ({ workspace, pageId, onRename, + isPublic, + publicMode, }: BlockSuiteHeaderTitleProps & { onRename?: () => void; }) => { @@ -64,11 +68,19 @@ const StableTitle = ({ const title = pageMeta?.title; + const handleRename = useCallback(() => { + if (!isPublic && onRename) { + onRename(); + } + }, [isPublic, onRename]); + return (
{title || 'Untitled'} - + {isPublic ? null : }
); }; @@ -139,7 +151,7 @@ const BlockSuiteTitleWithRename = (props: BlockSuiteHeaderTitleProps) => { }; export const BlockSuiteHeaderTitle = (props: BlockSuiteHeaderTitleProps) => { - if (props.workspace.flavour === WorkspaceFlavour.AFFINE_PUBLIC) { + if (props.isPublic) { return ; } return ; diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-header-title/operation-menu.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-header-title/operation-menu.tsx index 4a5976724f..42c702a40c 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-header-title/operation-menu.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-header-title/operation-menu.tsx @@ -18,6 +18,7 @@ import { MenuItem, MenuSeparator, } from '@toeverything/components/menu'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useBlockSuitePageMeta, usePageMetaHelper, @@ -99,7 +100,7 @@ export const PageMenu = ({ rename, pageId }: PageMenuProps) => { const exportHandler = useExportPage(currentPage); const setPageMode = useSetAtom(setPageModeAtom); - const duplicate = useCallback(async () => { + const duplicate = useAsyncCallback(async () => { const currentPageMeta = currentPage.meta; const newPage = createPage(); await newPage.waitForLoaded(); diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-mode-switch/index.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-mode-switch/index.tsx index 7cc1f7a348..477fa4be2c 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-mode-switch/index.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-mode-switch/index.tsx @@ -6,6 +6,7 @@ import { useAtomValue } from 'jotai'; import type { CSSProperties } from 'react'; import { useCallback, useEffect } from 'react'; +import type { PageMode } from '../../../atoms'; import { currentModeAtom } from '../../../atoms/mode'; import { useBlockSuiteMetaHelper } from '../../../hooks/affine/use-block-suite-meta-helper'; import type { BlockSuiteWorkspace } from '../../../shared'; @@ -18,6 +19,8 @@ export type EditorModeSwitchProps = { blockSuiteWorkspace: BlockSuiteWorkspace; pageId: string; style?: CSSProperties; + isPublic?: boolean; + publicMode?: PageMode; }; const TooltipContent = () => { const t = useAFFiNEI18N(); @@ -34,6 +37,8 @@ export const EditorModeSwitch = ({ style, blockSuiteWorkspace, pageId, + isPublic, + publicMode, }: EditorModeSwitchProps) => { const t = useAFFiNEI18N(); const pageMeta = useBlockSuitePageMeta(blockSuiteWorkspace).find( @@ -47,7 +52,7 @@ export const EditorModeSwitch = ({ const currentMode = useAtomValue(currentModeAtom); useEffect(() => { - if (trash) { + if (trash || isPublic) { return; } const keydown = (e: KeyboardEvent) => { @@ -64,41 +69,58 @@ export const EditorModeSwitch = ({ document.addEventListener('keydown', keydown, { capture: true }); return () => document.removeEventListener('keydown', keydown, { capture: true }); - }, [currentMode, pageId, t, togglePageMode, trash]); + }, [currentMode, isPublic, pageId, t, togglePageMode, trash]); const onSwitchToPageMode = useCallback(() => { - if (currentMode === 'page') { + if (currentMode === 'page' || isPublic) { return; } switchToPageMode(pageId); toast(t['com.affine.toastMessage.pageMode']()); - }, [currentMode, pageId, switchToPageMode, t]); + }, [currentMode, isPublic, pageId, switchToPageMode, t]); + const onSwitchToEdgelessMode = useCallback(() => { - if (currentMode === 'edgeless') { + if (currentMode === 'edgeless' || isPublic) { return; } switchToEdgelessMode(pageId); toast(t['com.affine.toastMessage.edgelessMode']()); - }, [currentMode, pageId, switchToEdgelessMode, t]); + }, [currentMode, isPublic, pageId, switchToEdgelessMode, t]); + + const shouldHide = useCallback( + (mode: PageMode) => + (trash && currentMode !== mode) || (isPublic && publicMode !== mode), + [currentMode, isPublic, publicMode, trash] + ); + + const shouldActive = useCallback( + (mode: PageMode) => (isPublic ? false : currentMode === mode), + [currentMode, isPublic] + ); return ( - }> + } + options={{ + hidden: isPublic || trash, + }} + > diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx index 48d6edf5ab..ea0287e157 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx @@ -1,5 +1,6 @@ import { toast } from '@affine/component'; import { WorkspaceSubPath } from '@affine/env/workspace'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useBlockSuiteWorkspaceHelper } from '@toeverything/hooks/use-block-suite-workspace-helper'; import { initEmptyPage } from '@toeverything/infra/blocksuite'; import { useAtomValue, useSetAtom } from 'jotai'; @@ -33,7 +34,7 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => { const createEdgelessAndOpen = useCallback(() => { return createPageAndOpen('edgeless'); }, [createPageAndOpen]); - const importFileAndOpen = useCallback(async () => { + const importFileAndOpen = useAsyncCallback(async () => { const { showImportModal } = await import('@blocksuite/blocks'); const onSuccess = (pageIds: string[], isWorkspaceFile: boolean) => { toast( diff --git a/packages/frontend/core/src/components/bookmark.tsx b/packages/frontend/core/src/components/bookmark.tsx index 6836eecd5c..0792a71ae7 100644 --- a/packages/frontend/core/src/components/bookmark.tsx +++ b/packages/frontend/core/src/components/bookmark.tsx @@ -1,10 +1,10 @@ -import { MenuItem, PureMenu } from '@affine/component'; -import { MuiClickAwayListener } from '@affine/component'; import type { SerializedBlock } from '@blocksuite/blocks'; import type { BaseBlockModel } from '@blocksuite/store'; import type { Page } from '@blocksuite/store'; import type { VEditor } from '@blocksuite/virgo'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { Menu, MenuItem } from '@toeverything/components/menu'; +import { useEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; type ShortcutMap = { [key: string]: (e: KeyboardEvent, page: Page) => void; @@ -121,60 +121,6 @@ export type BookmarkProps = { export const Bookmark = ({ page }: BookmarkProps) => { const [anchor, setAnchor] = useState(null); - const [selectedOption, setSelectedOption] = useState( - menuOptions[0].id - ); - const shortcutMap = useMemo( - () => ({ - ArrowUp: () => { - const curIndex = menuOptions.findIndex( - ({ id }) => id === selectedOption - ); - if (menuOptions[curIndex - 1]) { - setSelectedOption(menuOptions[curIndex - 1].id); - } else if (curIndex === -1) { - setSelectedOption(menuOptions[0].id); - } else { - setSelectedOption(menuOptions[menuOptions.length - 1].id); - } - }, - ArrowDown: () => { - const curIndex = menuOptions.findIndex( - ({ id }) => id === selectedOption - ); - if (curIndex !== -1 && menuOptions[curIndex + 1]) { - setSelectedOption(menuOptions[curIndex + 1].id); - } else { - setSelectedOption(menuOptions[0].id); - } - }, - Enter: () => - handleEnter({ - page, - selectedOption, - callback: () => { - setAnchor(null); - }, - }), - Escape: () => { - setAnchor(null); - }, - }), - [page, selectedOption] - ); - const onKeydown = useCallback( - (e: KeyboardEvent) => { - const shortcut = shortcutMap[e.key]; - if (shortcut) { - e.stopPropagation(); - e.preventDefault(); - shortcut(e, page); - } else { - setAnchor(null); - } - }, - [page, shortcutMap] - ); useEffect(() => { const disposer = page.slots.pasted.on(pastedBlocks => { @@ -189,56 +135,35 @@ export const Bookmark = ({ page }: BookmarkProps) => { return () => { disposer.dispose(); }; - }, [onKeydown, page, shortcutMap]); + }, [page]); - useEffect(() => { - if (anchor) { - document.addEventListener('keydown', onKeydown, { capture: true }); - } else { - // reset status and remove event - setSelectedOption(menuOptions[0].id); - document.removeEventListener('keydown', onKeydown, { capture: true }); - } + const portalContainer = anchor?.startContainer.parentElement; - return () => { - document.removeEventListener('keydown', onKeydown, { capture: true }); - }; - }, [anchor, onKeydown]); - - return anchor ? ( - { - setAnchor(null); - setSelectedOption(''); - }} - > -
- - {menuOptions.map(({ id, label }) => { - return ( - { - handleEnter({ - page, - selectedOption: id, - callback: () => { - setAnchor(null); - }, - }); - }} - disableHover={true} - onMouseEnter={() => { - setSelectedOption(id); - }} - > - {label} - - ); - })} - -
-
- ) : null; + return anchor && portalContainer + ? createPortal( + !e && setAnchor(null), + }} + items={menuOptions.map(({ id, label }) => ( + + handleEnter({ + page, + selectedOption: id, + callback: () => setAnchor(null), + }) + } + > + {label} + + ))} + > + + , + portalContainer + ) + : null; }; diff --git a/packages/frontend/core/src/components/cloud/login-card.tsx b/packages/frontend/core/src/components/cloud/login-card.tsx index bb5107fe9f..747139f5c8 100644 --- a/packages/frontend/core/src/components/cloud/login-card.tsx +++ b/packages/frontend/core/src/components/cloud/login-card.tsx @@ -1,6 +1,7 @@ import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { CloudWorkspaceIcon } from '@blocksuite/icons'; import { Avatar } from '@toeverything/components/avatar'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useCurrentLoginStatus } from '../../hooks/affine/use-current-login-status'; import { useCurrentUser } from '../../hooks/affine/use-current-user'; @@ -10,16 +11,16 @@ import { StyledSignInButton } from '../pure/footer/styles'; export const LoginCard = () => { const t = useAFFiNEI18N(); const loginStatus = useCurrentLoginStatus(); + + const onSignInClick = useAsyncCallback(async () => { + await signInCloud(); + }, []); + if (loginStatus === 'authenticated') { return ; } return ( - { - signInCloud().catch(console.error); - }} - > +
{' '} diff --git a/packages/frontend/core/src/components/cloud/share-header-left-item/index.tsx b/packages/frontend/core/src/components/cloud/share-header-left-item/index.tsx new file mode 100644 index 0000000000..7a674c2ff1 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-left-item/index.tsx @@ -0,0 +1,26 @@ +import { Logo1Icon } from '@blocksuite/icons'; + +import { useCurrentLoginStatus } from '../../../hooks/affine/use-current-login-status'; +import * as styles from './styles.css'; +import { PublishPageUserAvatar } from './user-avatar'; + +const ShareHeaderLeftItem = () => { + const loginStatus = useCurrentLoginStatus(); + if (loginStatus === 'authenticated') { + return ; + } + + return ( +
+ + + ); +}; + +export default ShareHeaderLeftItem; diff --git a/packages/frontend/core/src/components/cloud/share-header-left-item/styles.css.ts b/packages/frontend/core/src/components/cloud/share-header-left-item/styles.css.ts new file mode 100644 index 0000000000..3000c5d257 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-left-item/styles.css.ts @@ -0,0 +1,15 @@ +import { style } from '@vanilla-extract/css'; + +export const iconWrapper = style({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + fontSize: '24px', + cursor: 'pointer', + color: 'var(--affine-text-primary-color)', + selectors: { + '&:visited': { + color: 'var(--affine-text-primary-color)', + }, + }, +}); diff --git a/packages/frontend/core/src/components/cloud/share-header-left-item/user-avatar.tsx b/packages/frontend/core/src/components/cloud/share-header-left-item/user-avatar.tsx new file mode 100644 index 0000000000..43558bdd03 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-left-item/user-avatar.tsx @@ -0,0 +1,45 @@ +import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { SignOutIcon } from '@blocksuite/icons'; +import { Avatar } from '@toeverything/components/avatar'; +import { Menu, MenuIcon, MenuItem } from '@toeverything/components/menu'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; +import { useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; + +import { useCurrentUser } from '../../../hooks/affine/use-current-user'; +import { signOutCloud } from '../../../utils/cloud-utils'; +import * as styles from './styles.css'; + +export const PublishPageUserAvatar = () => { + const user = useCurrentUser(); + const t = useAFFiNEI18N(); + const location = useLocation(); + + const handleSignOut = useAsyncCallback(async () => { + await signOutCloud({ callbackUrl: location.pathname }); + }, [location.pathname]); + + const menuItem = useMemo(() => { + return ( + + + + } + data-testid="share-page-sign-out-option" + onClick={handleSignOut} + > + {t['com.affine.workspace.cloud.account.logout']()} + + ); + }, [handleSignOut, t]); + + return ( + +
+ +
+
+ ); +}; diff --git a/packages/frontend/core/src/components/cloud/share-header-right-item/authenticated-item.tsx b/packages/frontend/core/src/components/cloud/share-header-right-item/authenticated-item.tsx new file mode 100644 index 0000000000..f927723365 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-right-item/authenticated-item.tsx @@ -0,0 +1,30 @@ +import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { Button } from '@toeverything/components/button'; + +import { useCurrentUser } from '../../../hooks/affine/use-current-user'; +import { useMembers } from '../../../hooks/affine/use-members'; +import { useNavigateHelper } from '../../../hooks/use-navigate-helper'; +import type { ShareHeaderRightItemProps } from '.'; + +export const AuthenticatedItem = ({ ...props }: ShareHeaderRightItemProps) => { + const { workspaceId, pageId } = props; + const user = useCurrentUser(); + const members = useMembers(workspaceId, 0); + const isMember = members.some(m => m.id === user.id); + const t = useAFFiNEI18N(); + const { jumpToPage } = useNavigateHelper(); + + if (isMember) { + return ( + + ); + } + + return null; +}; diff --git a/packages/frontend/core/src/components/cloud/share-header-right-item/index.tsx b/packages/frontend/core/src/components/cloud/share-header-right-item/index.tsx new file mode 100644 index 0000000000..564b657917 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-right-item/index.tsx @@ -0,0 +1,18 @@ +import { useCurrentLoginStatus } from '../../../hooks/affine/use-current-login-status'; +import { AuthenticatedItem } from './authenticated-item'; + +export type ShareHeaderRightItemProps = { + workspaceId: string; + pageId: string; +}; + +const ShareHeaderRightItem = ({ ...props }: ShareHeaderRightItemProps) => { + const loginStatus = useCurrentLoginStatus(); + if (loginStatus === 'authenticated') { + return ; + } + // TODO: Add TOC + return null; +}; + +export default ShareHeaderRightItem; diff --git a/packages/frontend/core/src/components/cloud/share-header-right-item/styles.css.ts b/packages/frontend/core/src/components/cloud/share-header-right-item/styles.css.ts new file mode 100644 index 0000000000..3000c5d257 --- /dev/null +++ b/packages/frontend/core/src/components/cloud/share-header-right-item/styles.css.ts @@ -0,0 +1,15 @@ +import { style } from '@vanilla-extract/css'; + +export const iconWrapper = style({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + fontSize: '24px', + cursor: 'pointer', + color: 'var(--affine-text-primary-color)', + selectors: { + '&:visited': { + color: 'var(--affine-text-primary-color)', + }, + }, +}); diff --git a/packages/frontend/core/src/components/page-detail-editor.tsx b/packages/frontend/core/src/components/page-detail-editor.tsx index 084843a2bc..8447ca0d73 100644 --- a/packages/frontend/core/src/components/page-detail-editor.tsx +++ b/packages/frontend/core/src/components/page-detail-editor.tsx @@ -31,7 +31,7 @@ import { import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels'; import { useLocation } from 'react-router-dom'; -import { pageSettingFamily } from '../atoms'; +import { type PageMode, pageSettingFamily } from '../atoms'; import { fontStyleOptions } from '../atoms/settings'; import { useAppSettingHelper } from '../hooks/affine/use-app-setting-helper'; import { useBlockSuiteMetaHelper } from '../hooks/affine/use-block-suite-meta-helper'; @@ -50,6 +50,7 @@ export type OnLoadEditor = (page: Page, editor: EditorContainer) => () => void; export interface PageDetailEditorProps { isPublic?: boolean; + publishMode?: PageMode; workspace: Workspace; pageId: string; onLoad?: OnLoadEditor; @@ -91,6 +92,7 @@ const EditorWrapper = memo(function EditorWrapper({ pageId, onLoad, isPublic, + publishMode, }: PageDetailEditorProps) { const page = useBlockSuiteWorkspacePage(workspace, pageId); if (!page) { @@ -105,7 +107,16 @@ const EditorWrapper = memo(function EditorWrapper({ const pageSettingAtom = pageSettingFamily(pageId); const pageSetting = useAtomValue(pageSettingAtom); - const currentMode = pageSetting?.mode ?? 'page'; + + const mode = useMemo(() => { + const currentMode = pageSetting.mode; + const shareMode = publishMode || currentMode; + + if (isPublic) { + return shareMode; + } + return currentMode; + }, [isPublic, publishMode, pageSetting.mode]); const { appSettings } = useAppSettingHelper(); @@ -120,13 +131,16 @@ const EditorWrapper = memo(function EditorWrapper({ const setEditorMode = useCallback( (mode: 'page' | 'edgeless') => { + if (isPublic) { + return; + } if (mode === 'edgeless') { switchToEdgelessMode(pageId); } else { switchToPageMode(pageId); } }, - [switchToEdgelessMode, switchToPageMode, pageId] + [isPublic, switchToEdgelessMode, pageId, switchToPageMode] ); const [editor, setEditor] = useState(); @@ -191,7 +205,7 @@ const EditorWrapper = memo(function EditorWrapper({ '--affine-font-family': value, } as CSSProperties } - mode={isPublic ? 'page' : currentMode} + mode={mode} page={page} onModeChange={setEditorMode} defaultSelectedBlockId={blockId} @@ -275,7 +289,7 @@ const LayoutPanel = memo(function LayoutPanel( className={depth === 0 ? editorContainer : undefined} > { label = label.replace(contentMatchedWithoutSubtitle, ''); } - const originalScore = commandScore(label, search); + // use to remove double quotes from a string until this issue is fixed + // https://github.com/pacocoursey/cmdk/issues/189 + const escapedSearch = removeDoubleQuotes(search) || ''; + const originalScore = commandScore(label, escapedSearch); // hack to make the page title result always before the content result // if the command has matched the title but not the subtitle, diff --git a/packages/frontend/core/src/components/pure/cmdk/main.css.ts b/packages/frontend/core/src/components/pure/cmdk/main.css.ts index 9086ea1ce0..fc23684cb1 100644 --- a/packages/frontend/core/src/components/pure/cmdk/main.css.ts +++ b/packages/frontend/core/src/components/pure/cmdk/main.css.ts @@ -129,6 +129,7 @@ globalStyle(`${root} [cmdk-list]`, { height: 'min(330px, calc(var(--cmdk-list-height) + 8px))', padding: '0 0 8px 6px', scrollbarGutter: 'stable', + scrollPaddingBlock: '12px', }); globalStyle(`${root} [cmdk-list]:not([data-opening])`, { diff --git a/packages/frontend/core/src/components/pure/cmdk/main.tsx b/packages/frontend/core/src/components/pure/cmdk/main.tsx index 0f6523b688..4252265658 100644 --- a/packages/frontend/core/src/components/pure/cmdk/main.tsx +++ b/packages/frontend/core/src/components/pure/cmdk/main.tsx @@ -2,6 +2,7 @@ import { Command } from '@affine/cmdk'; import { formatDate } from '@affine/component/page-list'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import type { PageMeta } from '@blocksuite/store'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import type { CommandCategory } from '@toeverything/infra/command'; import clsx from 'clsx'; import { useAtom } from 'jotai'; @@ -11,6 +12,7 @@ import { cmdkQueryAtom, cmdkValueAtom, customCommandFilter, + removeDoubleQuotes, useCMDKCommandGroups, } from './data'; import { HighlightLabel } from './highlight'; @@ -55,6 +57,19 @@ const QuickSearchGroup = ({ const t = useAFFiNEI18N(); const i18nkey = categoryToI18nKey[category]; const [query, setQuery] = useAtom(cmdkQueryAtom); + + const onCommendSelect = useAsyncCallback( + async (command: CMDKCommand) => { + try { + await command.run(); + } finally { + setQuery(''); + onOpenChange?.(false); + } + }, + [setQuery, onOpenChange] + ); + return ( {commands.map(command => { @@ -64,15 +79,15 @@ const QuickSearchGroup = ({ title: command.label, } : command.label; + + // use to remove double quotes from a string until this issue is fixed + // https://github.com/pacocoursey/cmdk/issues/189 + const escapeValue = removeDoubleQuotes(command.value); return ( { - command.run(); - setQuery(''); - onOpenChange?.(false); - }} - value={command.value} + onSelect={() => onCommendSelect(command)} + value={escapeValue} data-is-danger={ command.id === 'editor:page-move-to-trash' || command.id === 'editor:edgeless-move-to-trash' diff --git a/packages/frontend/core/src/components/pure/header/index.tsx b/packages/frontend/core/src/components/pure/header/index.tsx index 90997094ed..ac1633582c 100644 --- a/packages/frontend/core/src/components/pure/header/index.tsx +++ b/packages/frontend/core/src/components/pure/header/index.tsx @@ -10,7 +10,6 @@ import type { ReactNode } from 'react'; import { forwardRef, useRef } from 'react'; import * as style from './style.css'; -import { TopTip } from './top-tip'; import { WindowsAppControls } from './windows-app-controls'; interface HeaderPros { @@ -49,61 +48,58 @@ export const Header = forwardRef(function Header( const open = useAtomValue(appSidebarOpenAtom); const appSidebarFloating = useAtomValue(appSidebarFloatingAtom); return ( - <> - +
-
-
- -
-
-
-
{left}
+
+
-
- {center} -
-
-
-
- {isWindowsDesktop ? : null} -
-
-
-
{right}
-
+
+
{left}
- +
+ {center} +
+
+
+
+ {isWindowsDesktop ? : null} +
+
+
+
{right}
+
+
+
); }); diff --git a/packages/frontend/core/src/components/pure/header/top-tip.tsx b/packages/frontend/core/src/components/pure/header/top-tip.tsx deleted file mode 100644 index 7490198670..0000000000 --- a/packages/frontend/core/src/components/pure/header/top-tip.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { BrowserWarning } from '@affine/component/affine-banner'; -import { DownloadTips } from '@affine/component/affine-banner'; -import { Trans } from '@affine/i18n'; -import { useAFFiNEI18N } from '@affine/i18n/hooks'; -import { useAtom } from 'jotai'; -import { useEffect, useState } from 'react'; - -import { guideDownloadClientTipAtom } from '../../../atoms/guide'; - -const minimumChromeVersion = 102; - -const shouldShowWarning = () => { - if (environment.isDesktop) { - // even though desktop has compatibility issues, - // we don't want to show the warning - return false; - } - if (!environment.isBrowser) { - // disable in SSR - return false; - } - if (environment.isChrome) { - return environment.chromeVersion < minimumChromeVersion; - } else { - return !environment.isMobile; - } -}; - -const OSWarningMessage = () => { - const t = useAFFiNEI18N(); - const [notChrome, setNotChrome] = useState(false); - const [notGoodVersion, setNotGoodVersion] = useState(false); - useEffect(() => { - setNotChrome(environment.isBrowser && !environment.isChrome); - setNotGoodVersion( - environment.isBrowser && - environment.isChrome && - environment.chromeVersion < minimumChromeVersion - ); - }, []); - - if (notChrome) { - return ( - - - We recommend the Chrome browser for an optimal - experience. - - - ); - } else if (notGoodVersion) { - return {t['upgradeBrowser']()}; - } - return null; -}; -export const TopTip = () => { - const [showWarning, setShowWarning] = useState(false); - const [showDownloadTip, setShowDownloadTip] = useAtom( - guideDownloadClientTipAtom - ); - - useEffect(() => { - setShowWarning(shouldShowWarning()); - }, []); - - if (showDownloadTip && environment.isDesktop) { - return ( - { - setShowDownloadTip(false); - localStorage.setItem('affine-is-dt-hide', '1'); - }} - /> - ); - } - - return ( - } - onClose={() => { - setShowWarning(false); - }} - /> - ); -}; diff --git a/packages/frontend/core/src/components/pure/help-island/index.tsx b/packages/frontend/core/src/components/pure/help-island/index.tsx index 236888184c..714ce1514b 100644 --- a/packages/frontend/core/src/components/pure/help-island/index.tsx +++ b/packages/frontend/core/src/components/pure/help-island/index.tsx @@ -1,4 +1,3 @@ -import { MuiFade } from '@affine/component'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { CloseIcon, NewIcon, UserGuideIcon } from '@blocksuite/icons'; import { Tooltip } from '@toeverything/components/tooltip'; @@ -8,7 +7,7 @@ import { useCallback, useState } from 'react'; import { openOnboardingModalAtom, openSettingModalAtom } from '../../../atoms'; import { currentModeAtom } from '../../../atoms/mode'; -import { ShortcutsModal } from '../shortcuts-modal'; +import type { SettingProps } from '../../affine/setting-modal'; import { ContactIcon, HelpIcon, KeyboardIcon } from './icons'; import { StyledAnimateWrapper, @@ -36,113 +35,106 @@ export const HelpIsland = ({ const [spread, setShowSpread] = useState(false); const t = useAFFiNEI18N(); - const [openShortCut, setOpenShortCut] = useState(false); + const openSettingModal = useCallback( + (tab: SettingProps['activeTab']) => { + setShowSpread(false); - const openAbout = useCallback(() => { - setShowSpread(false); - - setOpenSettingModalAtom({ - open: true, - activeTab: 'about', - workspaceId: null, - }); - }, [setOpenSettingModalAtom]); + setOpenSettingModalAtom({ + open: true, + activeTab: tab, + workspaceId: null, + }); + }, + [setOpenSettingModalAtom] + ); + const openAbout = useCallback( + () => openSettingModal('about'), + [openSettingModal] + ); + const openShortcuts = useCallback( + () => openSettingModal('shortcuts'), + [openSettingModal] + ); return ( - <> - { - setShowSpread(!spread); - }} - inEdgelessPage={mode === 'edgeless'} + { + setShowSpread(!spread); + }} + inEdgelessPage={mode === 'edgeless'} + > + - - {showList.includes('whatNew') && ( - + { + window.open(runtimeConfig.changelogUrl, '_blank'); + }} > - { - window.open(runtimeConfig.changelogUrl, '_blank'); - }} - > - - - - )} - {showList.includes('contact') && ( - + + + )} + {showList.includes('contact') && ( + + - - - - - )} - {showList.includes('shortcuts') && ( - + + + )} + {showList.includes('shortcuts') && ( + + - { - setShowSpread(false); - setOpenShortCut(true); - }} - > - - - - )} - {showList.includes('guide') && ( - + + + )} + {showList.includes('guide') && ( + + { + setShowSpread(false); + setOpenOnboarding(true); + }} > - { - setShowSpread(false); - setOpenOnboarding(true); - }} - > - - - - )} - + + + + )} + + {spread ? ( + + + + ) : ( - - - - - - - - - + + - - - setOpenShortCut(false)} - /> - + + )} + ); }; diff --git a/packages/frontend/core/src/components/pure/help-island/style.ts b/packages/frontend/core/src/components/pure/help-island/style.ts index f7dab69a56..90795b4961 100644 --- a/packages/frontend/core/src/components/pure/help-island/style.ts +++ b/packages/frontend/core/src/components/pure/help-island/style.ts @@ -11,16 +11,16 @@ export const StyledIsland = styled('div')<{ boxShadow: spread ? 'var(--affine-menu-shadow)' : inEdgelessPage - ? 'var(--affine-menu-shadow)' - : 'unset', + ? 'var(--affine-menu-shadow)' + : 'unset', padding: '0 4px 44px', borderRadius: '10px', background: spread ? 'var(--affine-background-overlay-panel-color)' : 'var(--affine-background-primary-color)', ':hover': { - background: spread ? null : 'var(--affine-white)', - boxShadow: spread ? null : 'var(--affine-menu-shadow)', + background: spread ? undefined : 'var(--affine-white)', + boxShadow: spread ? undefined : 'var(--affine-menu-shadow)', }, '::after': { content: '""', @@ -73,7 +73,7 @@ export const StyledTriggerWrapper = styled('div')<{ ...displayFlex('center', 'center'), ...positionAbsolute({ left: '4px', bottom: '4px' }), ':hover': { - backgroundColor: spread ? 'var(--affine-hover-color)' : null, + backgroundColor: spread ? 'var(--affine-hover-color)' : undefined, }, }; }); diff --git a/packages/frontend/core/src/components/pure/shortcuts-modal/icons.tsx b/packages/frontend/core/src/components/pure/shortcuts-modal/icons.tsx deleted file mode 100644 index 13eb2d3cea..0000000000 --- a/packages/frontend/core/src/components/pure/shortcuts-modal/icons.tsx +++ /dev/null @@ -1,27 +0,0 @@ -export const CloseIcon = () => { - return ( - - - - ); -}; - -export const KeyboardIcon = () => { - return ( - - - - ); -}; diff --git a/packages/frontend/core/src/components/pure/shortcuts-modal/index.tsx b/packages/frontend/core/src/components/pure/shortcuts-modal/index.tsx deleted file mode 100644 index 4cb03d8319..0000000000 --- a/packages/frontend/core/src/components/pure/shortcuts-modal/index.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { MuiClickAwayListener, MuiSlide } from '@affine/component'; -import { useAFFiNEI18N } from '@affine/i18n/hooks'; -import { CloseIcon } from '@blocksuite/icons'; -import { IconButton } from '@toeverything/components/button'; - -import { - type ShortcutsInfo, - useEdgelessShortcuts, - useGeneralShortcuts, - useMarkdownShortcuts, - usePageShortcuts, -} from '../../../hooks/affine/use-shortcuts'; -import { KeyboardIcon } from './icons'; -import * as styles from './style.css'; - -type ModalProps = { - open: boolean; - onClose: () => void; -}; - -const ShortcutsPanel = ({ - shortcutsInfo, -}: { - shortcutsInfo: ShortcutsInfo; -}) => { - return ( - <> -
{shortcutsInfo.title}
- - {Object.entries(shortcutsInfo.shortcuts).map(([title, shortcuts]) => { - return ( -
- {title} -
- {shortcuts.map(key => { - return ( - - {key} - - ); - })} -
-
- ); - })} - - ); -}; - -export const ShortcutsModal = ({ open, onClose }: ModalProps) => { - const t = useAFFiNEI18N(); - - const markdownShortcutsInfo = useMarkdownShortcuts(); - const pageShortcutsInfo = usePageShortcuts(); - const edgelessShortcutsInfo = useEdgelessShortcuts(); - const generalShortcutsInfo = useGeneralShortcuts(); - - return ( - -
- { - onClose(); - }} - > -
-
-
- - {t['Shortcuts']()} -
- - { - onClose(); - }} - icon={} - /> -
- - - - -
-
-
-
- ); -}; diff --git a/packages/frontend/core/src/components/pure/shortcuts-modal/style.css.ts b/packages/frontend/core/src/components/pure/shortcuts-modal/style.css.ts deleted file mode 100644 index 1f3b633c60..0000000000 --- a/packages/frontend/core/src/components/pure/shortcuts-modal/style.css.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { globalStyle, style } from '@vanilla-extract/css'; - -export const shortcutsModal = style({ - width: '288px', - height: '74vh', - paddingBottom: '28px', - backgroundColor: 'var(--affine-white)', - boxShadow: 'var(--affine-popover-shadow)', - borderRadius: `var(--affine-popover-radius)`, - overflow: 'auto', - position: 'fixed', - right: '12px', - top: '0', - bottom: '0', - margin: 'auto', - zIndex: 'var(--affine-z-index-modal)', -}); -// export const shortcutsModal = style({ -// color: 'var(--affine-text-primary-color)', -// fontWeight: '500', -// fontSize: 'var(--affine-font-sm)', -// height: '44px', -// display: 'flex', -// justifyContent: 'center', -// alignItems: 'center', -// svg: { -// width: '20px', -// marginRight: '14px', -// color: 'var(--affine-primary-color)', -// }, -// }); -export const title = style({ - color: 'var(--affine-text-primary-color)', - fontWeight: '500', - fontSize: 'var(--affine-font-sm)', - height: '44px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', -}); - -globalStyle(`${title} svg`, { - width: '20px', - marginRight: '14px', - color: 'var(--affine-primary-color)', -}); - -export const subtitle = style({ - fontWeight: '500', - fontSize: 'var(--affine-font-sm)', - height: '34px', - lineHeight: '36px', - marginTop: '28px', - padding: '0 16px', -}); -export const modalHeader = style({ - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - paddingTop: '8px 4px 0 4px', - width: '100%', - padding: '8px 16px 0 16px', - position: 'sticky', - left: '0', - top: '0', - background: 'var(--affine-white)', - transition: 'background-color 0.5s', -}); - -export const listItem = style({ - height: '34px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - fontSize: 'var(--affine-font-sm)', - padding: '0 16px', -}); -export const keyContainer = style({ - display: 'flex', -}); - -export const key = style({ - selectors: { - '&:not(:last-child)::after': { - content: '+', - margin: '0 4px', - }, - }, -}); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/collections/collections-list.tsx b/packages/frontend/core/src/components/pure/workspace-slider-bar/collections/collections-list.tsx index 50941ba37b..c369cdd551 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/collections/collections-list.tsx +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/collections/collections-list.tsx @@ -18,8 +18,9 @@ import type { DragEndEvent } from '@dnd-kit/core'; import { useDroppable } from '@dnd-kit/core'; import * as Collapsible from '@radix-ui/react-collapsible'; import { IconButton } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useBlockSuitePageMeta } from '@toeverything/hooks/use-block-suite-page-meta'; -import { useCallback, useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; import { useLocation } from 'react-router-dom'; import { collectionsCRUDAtom } from '../../../../atoms/collections'; @@ -80,9 +81,9 @@ const CollectionRenderer = ({ () => new Set(collection.allowList), [collection.allowList] ); - const removeFromAllowList = useCallback( - (id: string) => { - return setting.updateCollection({ + const removeFromAllowList = useAsyncCallback( + async (id: string) => { + await setting.updateCollection({ ...collection, allowList: collection.allowList?.filter(v => v != id), }); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx b/packages/frontend/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx index 919677db5d..92e04e86b8 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx @@ -1,8 +1,8 @@ import { PlusIcon } from '@blocksuite/icons'; import type { Workspace } from '@blocksuite/store'; import { IconButton } from '@toeverything/components/button'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { usePageMetaHelper } from '@toeverything/hooks/use-block-suite-page-meta'; -import { useCallback } from 'react'; import { usePageHelper } from '../../../blocksuite/block-suite-page-list/utils'; @@ -13,7 +13,7 @@ type AddFavouriteButtonProps = { export const AddFavouriteButton = ({ workspace }: AddFavouriteButtonProps) => { const { createPage } = usePageHelper(workspace); const { setPageMeta } = usePageMetaHelper(workspace); - const handleAddFavorite = useCallback(async () => { + const handleAddFavorite = useAsyncCallback(async () => { const page = createPage(); await page.waitForLoaded(); setPageMeta(page.id, { favorite: true }); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/shared-styles.ts b/packages/frontend/core/src/components/pure/workspace-slider-bar/shared-styles.ts deleted file mode 100644 index 7b7f6c6f3c..0000000000 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/shared-styles.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { alpha, displayFlex, styled, textEllipsis } from '@affine/component'; - -export const StyledListItem = styled('div')<{ - active?: boolean; - disabled?: boolean; -}>(({ active, disabled }) => { - return { - height: '32px', - color: active - ? 'var(--affine-primary-color)' - : 'var(--affine-text-primary-color)', - paddingLeft: '2px', - paddingRight: '2px', - borderRadius: '8px', - cursor: 'pointer', - marginBottom: '4px', - position: 'relative', - flexShrink: 0, - userSelect: 'none', - ...displayFlex('flex-start', 'stretch'), - ...(disabled - ? { - cursor: 'not-allowed', - color: 'var(--affine-border-color)', - } - : {}), - - 'a > svg, div > svg': { - fontSize: '20px', - marginLeft: '14px', - marginRight: '12px', - color: active - ? 'var(--affine-primary-color)' - : 'var(--affine-icon-color)', - }, - ':hover:not([disabled])': { - backgroundColor: 'var(--affine-hover-color)', - }, - }; -}); - -export const StyledCollapseButton = styled('button')<{ - collapse: boolean; - show?: boolean; -}>(({ collapse, show = true }) => { - return { - width: '16px', - height: '100%', - ...displayFlex('center', 'center'), - fontSize: '16px', - position: 'absolute', - left: '0', - top: '0', - bottom: '0', - margin: 'auto', - color: 'var(--affine-icon-color)', - opacity: '.6', - transition: 'opacity .15s ease-in-out', - display: show ? 'flex' : 'none', - svg: { - transform: `rotate(${collapse ? '0' : '-90'}deg)`, - }, - ':hover': { - opacity: '1', - }, - ':focus-visible': { - outline: '-webkit-focus-ring-color auto 1px', - }, - }; -}); - -export const StyledCollapseItem = styled('div')<{ - disable?: boolean; - active?: boolean; - isOver?: boolean; - textWrap?: boolean; -}>(({ disable = false, active = false, isOver, textWrap = false }) => { - return { - width: '100%', - lineHeight: '1.5', - minHeight: '32px', - borderRadius: '8px', - ...displayFlex('flex-start', 'center'), - paddingRight: '2px', - position: 'relative', - color: disable - ? 'var(--affine-text-disable-color)' - : active - ? 'var(--affine-primary-color)' - : 'var(--affine-text-primary-color)', - cursor: disable ? 'not-allowed' : 'pointer', - background: isOver ? alpha('var(--affine-primary-color)', 0.06) : '', - userSelect: 'none', - ...(textWrap - ? { - wordBreak: 'break-word', - whiteSpace: 'pre-wrap', - } - : {}), - span: { - flexGrow: '1', - textAlign: 'left', - ...textEllipsis(1), - }, - '> svg': { - fontSize: '20px', - marginRight: '8px', - flexShrink: '0', - color: active - ? 'var(--affine-primary-color)' - : 'var(--affine-icon-color)', - }, - - ':hover': disable - ? {} - : { - backgroundColor: 'var(--affine-hover-color)', - '.operation-button': { - visibility: 'visible', - }, - }, - }; -}); - -export const StyledRouteNavigationWrapper = styled('div')({ - height: '32px', - width: '80px', - marginRight: '16px', - ...displayFlex('space-between', 'center'), -}); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/style.ts b/packages/frontend/core/src/components/pure/workspace-slider-bar/style.ts deleted file mode 100644 index 6b95478b50..0000000000 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/style.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { displayFlex, styled, textEllipsis } from '@affine/component'; -import { Link } from '@mui/material'; -import { baseTheme } from '@toeverything/theme'; - -export const StyledSliderBarInnerWrapper = styled('div')(() => { - return { - flexGrow: 1, - margin: '0 2px', - position: 'relative', - height: 'calc(100% - 52px * 2)', - display: 'flex', - flexDirection: 'column', - }; -}); - -export const StyledLink = styled(Link)(() => { - return { - flexGrow: 1, - textAlign: 'left', - color: 'inherit', - ...displayFlex('flex-start', 'center'), - ':visited': { - color: 'inherit', - }, - overflow: 'hidden', - div: { - wordBreak: 'break-all', - wordWrap: 'break-word', - whiteSpace: 'nowrap', - ...textEllipsis(1), - }, - userDrag: 'none', - userSelect: 'none', - appRegion: 'no-drag', - WebkitUserSelect: 'none', - WebkitUserDrag: 'none', - WebkitAppRegion: 'no-drag', - }; -}); -export const StyledNewPageButton = styled('button')(() => { - return { - width: '100%', - height: '52px', - ...displayFlex('flex-start', 'center'), - padding: '0 16px', - svg: { - fontSize: '20px', - color: 'var(--affine-icon-color)', - marginRight: '12px', - }, - ':hover': { - color: 'var(--affine-primary-color)', - svg: { - color: 'var(--affine-primary-color)', - }, - }, - }; -}); -export const StyledSliderModalBackground = styled('div')<{ active: boolean }>(({ - active, -}) => { - return { - transition: 'opacity .15s', - pointerEvents: active ? 'auto' : 'none', - opacity: active ? 1 : 0, - position: 'fixed', - top: 0, - left: 0, - right: active ? 0 : '100%', - bottom: 0, - zIndex: parseInt(baseTheme.zIndexModal) - 1, - background: 'var(--affine-background-modal-color)', - }; -}); - -export const StyledScrollWrapper = styled('div')<{ - showTopBorder: boolean; -}>(({ showTopBorder }) => { - return { - maxHeight: '50%', - overflowY: 'auto', - borderTop: '1px solid', - borderColor: showTopBorder ? 'var(--affine-border-color)' : 'transparent', - }; -}); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/index.tsx b/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/index.tsx index e1045d593f..b5a4524051 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/index.tsx +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/index.tsx @@ -25,7 +25,7 @@ const SignInItem = () => { const t = useAFFiNEI18N(); - const onClickSignIn = useCallback(async () => { + const onClickSignIn = useCallback(() => { if (!runtimeConfig.enableCloud) { setDisableCloudOpen(true); } else { @@ -76,7 +76,7 @@ export const UserWithWorkspaceList = ({ onEventEnd?.(); }, [onEventEnd, setOpenCreateWorkspaceModal]); - const onAddWorkspace = useCallback(async () => { + const onAddWorkspace = useCallback(() => { setOpenCreateWorkspaceModal('add'); onEventEnd?.(); }, [onEventEnd, setOpenCreateWorkspaceModal]); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/workspace-list/index.tsx b/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/workspace-list/index.tsx index be17d2dcf0..9d065ec449 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/workspace-list/index.tsx +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/user-with-workspace-list/workspace-list/index.tsx @@ -193,7 +193,7 @@ export const AFFiNEWorkspaceList = ({ onEventEnd?.(); }, [onEventEnd, setOpenCreateWorkspaceModal]); - const onAddWorkspace = useCallback(async () => { + const onAddWorkspace = useCallback(() => { setOpenCreateWorkspaceModal('add'); onEventEnd?.(); }, [onEventEnd, setOpenCreateWorkspaceModal]); diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/index.tsx b/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/index.tsx index d7829bea30..223a30b02c 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/index.tsx +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/index.tsx @@ -1,6 +1,11 @@ import { WorkspaceFlavour } from '@affine/env/workspace'; +import { + type SyncEngineStatus, + SyncEngineStep, +} from '@affine/workspace/providers'; import { CloudWorkspaceIcon, + InformationFillDuotoneIcon, LocalWorkspaceIcon, NoNetworkIcon, UnsyncIcon, @@ -9,16 +14,17 @@ import { Avatar } from '@toeverything/components/avatar'; import { Tooltip } from '@toeverything/components/tooltip'; import { useBlockSuiteWorkspaceAvatarUrl } from '@toeverything/hooks/use-block-suite-workspace-avatar-url'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; -import { atom, useSetAtom } from 'jotai'; +import { debounce } from 'lodash-es'; import { forwardRef, type HTMLAttributes, - type MouseEvent, useCallback, + useEffect, useMemo, + useState, } from 'react'; -import { useDatasourceSync } from '../../../../hooks/use-datasource-sync'; +import { useCurrentSyncEngine } from '../../../../hooks/current/use-current-sync-engine'; import { useSystemOnline } from '../../../../hooks/use-system-online'; import type { AllWorkspace } from '../../../../shared'; import { Loading } from './loading-icon'; @@ -29,8 +35,6 @@ import { StyledWorkspaceStatus, } from './styles'; -const hoverAtom = atom(false); - // FIXME: // 1. Remove mui style // 2. Refactor the code to improve readability @@ -64,7 +68,11 @@ const UnSyncWorkspaceStatus = () => { const LocalWorkspaceStatus = () => { return ( <> - + {!environment.isDesktop ? ( + + ) : ( + + )} Local ); @@ -86,63 +94,57 @@ const WorkspaceStatus = ({ }) => { const isOnline = useSystemOnline(); - // todo: finish display sync status - const [forceSyncStatus, startForceSync] = useDatasourceSync( - currentWorkspace.blockSuiteWorkspace - ); + const [syncEngineStatus, setSyncEngineStatus] = + useState(null); - const setIsHovered = useSetAtom(hoverAtom); + const syncEngine = useCurrentSyncEngine(); + + useEffect(() => { + setSyncEngineStatus(syncEngine?.status ?? null); + const disposable = syncEngine?.onStatusChange.on( + debounce(status => { + setSyncEngineStatus(status); + }, 500) + ); + return () => { + disposable?.dispose(); + }; + }, [syncEngine]); const content = useMemo(() => { + // TODO: add i18n if (currentWorkspace.flavour === WorkspaceFlavour.LOCAL) { + if (!environment.isDesktop) { + return 'This is a local demo workspace.'; + } return 'Saved locally'; } if (!isOnline) { return 'Disconnected, please check your network connection'; } - switch (forceSyncStatus.type) { - case 'syncing': - return 'Syncing with AFFiNE Cloud'; - case 'error': - return 'Sync failed due to server issues, please try again later.'; - default: - return 'Sync with AFFiNE Cloud'; + if (!syncEngineStatus || syncEngineStatus.step === SyncEngineStep.Syncing) { + return 'Syncing with AFFiNE Cloud'; } - }, [currentWorkspace.flavour, forceSyncStatus.type, isOnline]); + if (syncEngineStatus.retrying) { + return 'Sync disconnected due to unexpected issues, reconnecting.'; + } + return 'Synced with AFFiNE Cloud'; + }, [currentWorkspace.flavour, isOnline, syncEngineStatus]); const CloudWorkspaceSyncStatus = useCallback(() => { - if (forceSyncStatus.type === 'syncing') { + if (!syncEngineStatus || syncEngineStatus.step === SyncEngineStep.Syncing) { return SyncingWorkspaceStatus(); - } else if (forceSyncStatus.type === 'error') { + } else if (syncEngineStatus.retrying) { return UnSyncWorkspaceStatus(); } else { return CloudWorkspaceStatus(); } - }, [forceSyncStatus.type]); + }, [syncEngineStatus]); - const handleClick = useCallback( - (e: MouseEvent) => { - e.stopPropagation(); - if ( - currentWorkspace.flavour === WorkspaceFlavour.LOCAL || - forceSyncStatus.type === 'syncing' - ) { - return; - } - startForceSync(); - }, - [currentWorkspace.flavour, forceSyncStatus.type, startForceSync] - ); return (
- { - setIsHovered(true); - }} - onMouseLeave={() => setIsHovered(false)} - onClick={handleClick} - > + {currentWorkspace.flavour === WorkspaceFlavour.AFFINE_CLOUD ? ( !isOnline ? ( diff --git a/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/styles.ts b/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/styles.ts index a510341dfb..45f2f0b924 100644 --- a/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/styles.ts +++ b/packages/frontend/core/src/components/pure/workspace-slider-bar/workspace-card/styles.ts @@ -44,11 +44,9 @@ export const StyledWorkspaceStatus = styled('div')(() => { svg: { color: 'var(--affine-icon-color)', fontSize: 'var(--affine-font-base)', - }, - ':hover': { - cursor: 'pointer', - borderRadius: '4px', - background: 'var(--affine-hover-color)', + '&[data-warning-color="true"]': { + color: 'var(--affine-error-color)', + }, }, }; }); diff --git a/packages/frontend/core/src/components/root-app-sidebar/index.tsx b/packages/frontend/core/src/components/root-app-sidebar/index.tsx index 1fd0d46d64..c5367a1530 100644 --- a/packages/frontend/core/src/components/root-app-sidebar/index.tsx +++ b/packages/frontend/core/src/components/root-app-sidebar/index.tsx @@ -1,6 +1,7 @@ import { AnimatedDeleteIcon } from '@affine/component'; import { AddPageButton, + AppDownloadButton, AppSidebar, appSidebarOpenAtom, AppUpdaterButton, @@ -18,6 +19,7 @@ import { FolderIcon, SettingsIcon } from '@blocksuite/icons'; import type { Page } from '@blocksuite/store'; import { useDroppable } from '@dnd-kit/core'; import { Menu } from '@toeverything/components/menu'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useAtom, useAtomValue } from 'jotai'; import type { HTMLAttributes, ReactElement } from 'react'; import { forwardRef, useCallback, useEffect, useMemo } from 'react'; @@ -107,7 +109,7 @@ export const RootAppSidebar = ({ ); const generalShortcutsInfo = useGeneralShortcuts(); - const onClickNewPage = useCallback(async () => { + const onClickNewPage = useAsyncCallback(async () => { const page = createPage(); await page.waitForLoaded(); openPage(page.id); @@ -265,7 +267,7 @@ export const RootAppSidebar = ({ )} - {environment.isDesktop && } + {environment.isDesktop ? : }
diff --git a/packages/frontend/core/src/components/share-header.tsx b/packages/frontend/core/src/components/share-header.tsx new file mode 100644 index 0000000000..20f6c6ab64 --- /dev/null +++ b/packages/frontend/core/src/components/share-header.tsx @@ -0,0 +1,44 @@ +import type { Workspace } from '@blocksuite/store'; +import { useSetAtom } from 'jotai/react'; + +import type { PageMode } from '../atoms'; +import { appHeaderAtom, mainContainerAtom } from '../atoms/element'; +import { useWorkspace } from '../hooks/use-workspace'; +import { BlockSuiteHeaderTitle } from './blocksuite/block-suite-header-title'; +import ShareHeaderLeftItem from './cloud/share-header-left-item'; +import ShareHeaderRightItem from './cloud/share-header-right-item'; +import { Header } from './pure/header'; + +export function ShareHeader({ + workspace, + pageId, + publishMode, +}: { + workspace: Workspace; + pageId: string; + publishMode: PageMode; +}) { + const setAppHeader = useSetAtom(appHeaderAtom); + + const currentWorkspace = useWorkspace(workspace.id); + + return ( +
} + center={ + + } + right={ + + } + bottomBorder + /> + ); +} diff --git a/packages/frontend/core/src/components/share-page-not-found-error.css.ts b/packages/frontend/core/src/components/share-page-not-found-error.css.ts new file mode 100644 index 0000000000..bfd01d03f4 --- /dev/null +++ b/packages/frontend/core/src/components/share-page-not-found-error.css.ts @@ -0,0 +1,15 @@ +import { style } from '@vanilla-extract/css'; + +export const iconWrapper = style({ + position: 'absolute', + top: '16px', + left: '16px', + fontSize: '24px', + cursor: 'pointer', + color: 'var(--affine-text-primary-color)', + selectors: { + '&:visited': { + color: 'var(--affine-text-primary-color)', + }, + }, +}); diff --git a/packages/frontend/core/src/components/top-tip.tsx b/packages/frontend/core/src/components/top-tip.tsx new file mode 100644 index 0000000000..9a609380b7 --- /dev/null +++ b/packages/frontend/core/src/components/top-tip.tsx @@ -0,0 +1,122 @@ +import { BrowserWarning } from '@affine/component/affine-banner'; +import { LocalDemoTips } from '@affine/component/affine-banner'; +import { + type AffineOfficialWorkspace, + WorkspaceFlavour, +} from '@affine/env/workspace'; +import { Trans } from '@affine/i18n'; +import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import { useSetAtom } from 'jotai'; +import { useCallback, useState } from 'react'; + +import { authAtom } from '../atoms'; +import { useCurrentLoginStatus } from '../hooks/affine/use-current-login-status'; +import { useOnTransformWorkspace } from '../hooks/root/use-on-transform-workspace'; +import { EnableAffineCloudModal } from './affine/enable-affine-cloud-modal'; + +const minimumChromeVersion = 106; + +const shouldShowWarning = (() => { + if (environment.isDesktop) { + // even though desktop has compatibility issues, + // we don't want to show the warning + return false; + } + if (!environment.isBrowser) { + // disable in SSR + return false; + } + if (environment.isChrome) { + return environment.chromeVersion < minimumChromeVersion; + } else { + return !environment.isMobile; + } +})(); + +const OSWarningMessage = () => { + const t = useAFFiNEI18N(); + const notChrome = environment.isBrowser && !environment.isChrome; + const notGoodVersion = + environment.isBrowser && + environment.isChrome && + environment.chromeVersion < minimumChromeVersion; + + if (notChrome) { + return ( + + + We recommend the Chrome browser for an optimal + experience. + + + ); + } else if (notGoodVersion) { + return {t['upgradeBrowser']()}; + } + return null; +}; + +export const TopTip = ({ + workspace, +}: { + workspace: AffineOfficialWorkspace; +}) => { + const loginStatus = useCurrentLoginStatus(); + const isLoggedIn = loginStatus === 'authenticated'; + + const [showWarning, setShowWarning] = useState(shouldShowWarning); + const [showLocalDemoTips, setShowLocalDemoTips] = useState(true); + const [open, setOpen] = useState(false); + + const setAuthModal = useSetAtom(authAtom); + const onLogin = useCallback(() => { + setAuthModal({ openModal: true, state: 'signIn' }); + }, [setAuthModal]); + + const onTransformWorkspace = useOnTransformWorkspace(); + const handleConfirm = useCallback(() => { + if (workspace.flavour !== WorkspaceFlavour.LOCAL) { + return; + } + onTransformWorkspace( + WorkspaceFlavour.LOCAL, + WorkspaceFlavour.AFFINE_CLOUD, + workspace + ); + setOpen(false); + }, [onTransformWorkspace, workspace]); + + if ( + showLocalDemoTips && + !environment.isDesktop && + workspace.flavour === WorkspaceFlavour.LOCAL + ) { + return ( + <> + setOpen(true)} + onClose={() => { + setShowLocalDemoTips(false); + }} + /> + + + ); + } + + return ( + } + onClose={() => { + setShowWarning(false); + }} + /> + ); +}; diff --git a/packages/frontend/core/src/components/workspace-header.tsx b/packages/frontend/core/src/components/workspace-header.tsx index de7e5c3eb1..18d15026e1 100644 --- a/packages/frontend/core/src/components/workspace-header.tsx +++ b/packages/frontend/core/src/components/workspace-header.tsx @@ -5,7 +5,7 @@ import { useCollectionManager, } from '@affine/component/page-list'; import { Unreachable } from '@affine/env/constant'; -import type { Collection } from '@affine/env/filter'; +import type { Collection, Filter } from '@affine/env/filter'; import type { WorkspaceFlavour, WorkspaceHeaderProps, @@ -13,6 +13,7 @@ import type { import { WorkspaceSubPath } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { DeleteIcon } from '@blocksuite/icons'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useSetAtom } from 'jotai/react'; import { useCallback } from 'react'; @@ -28,6 +29,7 @@ import { filterContainerStyle } from './filter-container.css'; import { Header } from './pure/header'; import { PluginHeader } from './pure/plugin-header'; import { WorkspaceModeFilterTab } from './pure/workspace-mode-filter-tab'; +import { TopTip } from './top-tip'; import * as styles from './workspace-header.css'; const FilterContainer = ({ workspaceId }: { workspaceId: string }) => { @@ -44,6 +46,17 @@ const FilterContainer = ({ workspaceId }: { workspaceId: string }) => { }, [setting, navigateHelper, workspaceId] ); + + const onFilterChange = useAsyncCallback( + async (filterList: Filter[]) => { + await setting.updateCollection({ + ...setting.currentCollection, + filterList, + }); + }, + [setting] + ); + if (!setting.isDefault || !setting.currentCollection.filterList.length) { return null; } @@ -54,12 +67,7 @@ const FilterContainer = ({ workspaceId }: { workspaceId: string }) => { { - return setting.updateCollection({ - ...setting.currentCollection, - filterList, - }); - }} + onChange={onFilterChange} />
@@ -154,23 +162,26 @@ export function WorkspaceHeader({ ) : null; return ( -
- } - right={ -
- {sharePageModal} - -
- } - bottomBorder - /> + <> +
+ } + right={ +
+ {sharePageModal} + +
+ } + bottomBorder + /> + + ); } diff --git a/packages/frontend/core/src/components/workspace-upgrade/upgrade-hooks.ts b/packages/frontend/core/src/components/workspace-upgrade/upgrade-hooks.ts index a0e6e1201c..47d3976b5a 100644 --- a/packages/frontend/core/src/components/workspace-upgrade/upgrade-hooks.ts +++ b/packages/frontend/core/src/components/workspace-upgrade/upgrade-hooks.ts @@ -1,85 +1,122 @@ -import type { - AffineSocketIOProvider, - LocalIndexedDBBackgroundProvider, - SQLiteProvider, -} from '@affine/env/workspace'; -import { assertExists } from '@blocksuite/global/utils'; -import { forceUpgradePages } from '@toeverything/infra/blocksuite'; -import { useCallback, useMemo, useState } from 'react'; -import { syncDataSourceFromDoc, syncDocFromDataSource } from 'y-provider'; +import { WorkspaceFlavour } from '@affine/env/workspace'; +import type { RootWorkspaceMetadata } from '@affine/workspace/atom'; +import { getOrCreateWorkspace } from '@affine/workspace/manager'; +import type { Workspace } from '@blocksuite/store'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; +import { getCurrentStore } from '@toeverything/infra/atom'; +import type { MigrationPoint } from '@toeverything/infra/blocksuite'; +import { + migrateLocalBlobStorage, + migrateWorkspace, +} from '@toeverything/infra/blocksuite'; +import { nanoid } from 'nanoid'; +import { useState } from 'react'; +import { applyUpdate, Doc as YDoc, encodeStateAsUpdate } from 'yjs'; +import { WorkspaceAdapters } from '../../adapters/workspace'; +import { useCurrentSyncEngine } from '../../hooks/current/use-current-sync-engine'; import { useCurrentWorkspace } from '../../hooks/current/use-current-workspace'; export type UpgradeState = 'pending' | 'upgrading' | 'done' | 'error'; -export function useUpgradeWorkspace() { +function applyDoc(target: YDoc, result: YDoc) { + applyUpdate(target, encodeStateAsUpdate(result)); + for (const targetSubDoc of target.subdocs.values()) { + const resultSubDocs = Array.from(result.subdocs.values()); + const resultSubDoc = resultSubDocs.find( + item => item.guid === targetSubDoc.guid + ); + if (resultSubDoc) { + applyDoc(targetSubDoc, resultSubDoc); + } + } +} + +export function useUpgradeWorkspace(migration: MigrationPoint) { const [state, setState] = useState('pending'); const [error, setError] = useState(null); + const [newWorkspaceId, setNewWorkspaceId] = useState(null); const [workspace] = useCurrentWorkspace(); - const providers = workspace.blockSuiteWorkspace.providers; - const remoteProvider: AffineSocketIOProvider | undefined = useMemo(() => { - return providers.find( - (provider): provider is AffineSocketIOProvider => - provider.flavour === 'affine-socket-io' - ); - }, [providers]); - const localProvider = useMemo(() => { - const sqliteProvider = providers.find( - (provider): provider is SQLiteProvider => provider.flavour === 'sqlite' - ); - const indexedDbProvider = providers.find( - (provider): provider is LocalIndexedDBBackgroundProvider => - provider.flavour === 'local-indexeddb-background' - ); - const provider = sqliteProvider || indexedDbProvider; - assertExists(provider, 'no local provider'); - return provider; - }, [providers]); + const syncEngine = useCurrentSyncEngine(); + const rootStore = getCurrentStore(); - const upgradeWorkspace = useCallback(() => { + const upgradeWorkspace = useAsyncCallback(async () => { setState('upgrading'); setError(null); + try { + // Migration need to wait for root doc and all subdocs loaded. + await syncEngine?.waitForSynced(); - (async () => { - await syncDocFromDataSource( - workspace.blockSuiteWorkspace.doc, - localProvider.datasource - ); - if (remoteProvider) { - await syncDocFromDataSource( - workspace.blockSuiteWorkspace.doc, - remoteProvider.datasource - ); - } - - await forceUpgradePages({ - getCurrentRootDoc: async () => workspace.blockSuiteWorkspace.doc, - getSchema: () => workspace.blockSuiteWorkspace.schema, + // Clone a new doc to prevent change events. + const clonedDoc = new YDoc({ + guid: workspace.blockSuiteWorkspace.doc.guid, }); - await syncDataSourceFromDoc( - workspace.blockSuiteWorkspace.doc, - localProvider.datasource - ); - if (remoteProvider) { - await syncDataSourceFromDoc( - workspace.blockSuiteWorkspace.doc, - remoteProvider.datasource + applyDoc(clonedDoc, workspace.blockSuiteWorkspace.doc); + const schema = workspace.blockSuiteWorkspace.schema; + let newWorkspace: Workspace | null = null; + + const resultDoc = await migrateWorkspace(migration, { + doc: clonedDoc, + schema, + createWorkspace: () => { + // Migrate to subdoc version need to create a new workspace. + // It will only happened for old local workspace. + newWorkspace = getOrCreateWorkspace(nanoid(), WorkspaceFlavour.LOCAL); + return Promise.resolve(newWorkspace); + }, + }); + + if (newWorkspace) { + const localMetaString = + localStorage.getItem('jotai-workspaces') ?? '[]'; + const localMetadataList = JSON.parse( + localMetaString + ) as RootWorkspaceMetadata[]; + const currentLocalMetadata = localMetadataList.find( + item => item.id === workspace.id ); + const flavour = currentLocalMetadata?.flavour ?? WorkspaceFlavour.LOCAL; + + // Legacy logic moved from `setup.ts`. + // It works well before, should be refactor or remove in the future. + const adapter = WorkspaceAdapters[flavour]; + const newId = await adapter.CRUD.create(newWorkspace); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(newId); + await rootStore.get(workspaceAtom); // Trigger provider sync to persist data. + + await adapter.CRUD.delete(workspace.blockSuiteWorkspace); + await migrateLocalBlobStorage(workspace.id, newId); + setNewWorkspaceId(newId); + + const index = localMetadataList.findIndex( + meta => meta.id === workspace.id + ); + localMetadataList[index] = { + ...currentLocalMetadata, + id: newId, + flavour, + }; + localStorage.setItem( + 'jotai-workspaces', + JSON.stringify(localMetadataList) + ); + localStorage.setItem('last_workspace_id', newId); + localStorage.removeItem('last_page_id'); + } else { + applyDoc(workspace.blockSuiteWorkspace.doc, resultDoc); } + await syncEngine?.waitForSynced(); + setState('done'); - })().catch((e: any) => { + } catch (e: any) { console.error(e); setError(e); setState('error'); - }); - }, [ - localProvider.datasource, - remoteProvider, - workspace.blockSuiteWorkspace.doc, - workspace.blockSuiteWorkspace.schema, - ]); + } + }, [rootStore, workspace, syncEngine, migration]); - return [state, error, upgradeWorkspace] as const; + return [state, error, upgradeWorkspace, newWorkspaceId] as const; } diff --git a/packages/frontend/core/src/components/workspace-upgrade/upgrade.tsx b/packages/frontend/core/src/components/workspace-upgrade/upgrade.tsx index 9022985156..ff2afad539 100644 --- a/packages/frontend/core/src/components/workspace-upgrade/upgrade.tsx +++ b/packages/frontend/core/src/components/workspace-upgrade/upgrade.tsx @@ -1,8 +1,10 @@ import { AffineShapeIcon } from '@affine/component/page-list'; // TODO: import from page-list temporarily, need to defined common svg icon/images management. import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { Button } from '@toeverything/components/button'; +import type { MigrationPoint } from '@toeverything/infra/blocksuite'; import { useCallback, useMemo } from 'react'; +import { pathGenerator } from '../../shared'; import * as styles from './upgrade.css'; import { type UpgradeState, useUpgradeWorkspace } from './upgrade-hooks'; import { ArrowCircleIcon, HeartBreakIcon } from './upgrade-icon'; @@ -32,11 +34,18 @@ function UpgradeIcon({ upgradeState }: { upgradeState: UpgradeState }) { ); } +interface WorkspaceUpgradeProps { + migration: MigrationPoint; +} + /** * TODO: Help info is not implemented yet. */ -export const WorkspaceUpgrade = function MigrationFallback() { - const [upgradeState, , upgradeWorkspace] = useUpgradeWorkspace(); +export const WorkspaceUpgrade = function WorkspaceUpgrade( + props: WorkspaceUpgradeProps +) { + const [upgradeState, , upgradeWorkspace, newWorkspaceId] = + useUpgradeWorkspace(props.migration); const t = useAFFiNEI18N(); const refreshPage = useCallback(() => { @@ -45,6 +54,12 @@ export const WorkspaceUpgrade = function MigrationFallback() { const onButtonClick = useMemo(() => { if (upgradeState === 'done') { + if (newWorkspaceId) { + return () => { + window.location.replace(pathGenerator.all(newWorkspaceId)); + }; + } + return refreshPage; } @@ -53,7 +68,7 @@ export const WorkspaceUpgrade = function MigrationFallback() { } return undefined; - }, [upgradeState, upgradeWorkspace, refreshPage]); + }, [upgradeState, upgradeWorkspace, refreshPage, newWorkspaceId]); return (
diff --git a/packages/frontend/core/src/hooks/affine/use-current-user.ts b/packages/frontend/core/src/hooks/affine/use-current-user.ts index a20bf6650e..94b4b967a2 100644 --- a/packages/frontend/core/src/hooks/affine/use-current-user.ts +++ b/packages/frontend/core/src/hooks/affine/use-current-user.ts @@ -2,7 +2,7 @@ import { type User } from '@affine/component/auth-components'; import type { DefaultSession, Session } from 'next-auth'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { getSession, useSession } from 'next-auth/react'; -import { useEffect, useReducer } from 'react'; +import { useEffect, useMemo, useReducer } from 'react'; import { SessionFetchErrorRightAfterLoginOrSignUp } from '../../unexpected-application-state/errors'; @@ -60,7 +60,7 @@ export function useCurrentUser(): CheckedUser { // login succeed but the session request failed then. // also need a error boundary to handle this error. throw new SessionFetchErrorRightAfterLoginOrSignUp( - 'First session should not be null', + 'Fetching session failed', () => { getSession() .then(session => { @@ -97,12 +97,14 @@ export function useCurrentUser(): CheckedUser { const user = session.user; - return { - id: user.id, - name: user.name, - email: user.email, - image: user.image, - hasPassword: user?.hasPassword ?? false, - update, - }; + return useMemo(() => { + return { + id: user.id, + name: user.name, + email: user.email, + image: user.image, + hasPassword: user?.hasPassword ?? false, + update, + }; + }, [user, update]); } diff --git a/packages/frontend/core/src/hooks/affine/use-is-shared-page.ts b/packages/frontend/core/src/hooks/affine/use-is-shared-page.ts index 5f8cba129c..f581a87ded 100644 --- a/packages/frontend/core/src/hooks/affine/use-is-shared-page.ts +++ b/packages/frontend/core/src/hooks/affine/use-is-shared-page.ts @@ -1,57 +1,193 @@ +import { pushNotificationAtom } from '@affine/component/notification-center'; import { - getWorkspaceSharedPagesQuery, - revokePageMutation, - sharePageMutation, + getWorkspacePublicPagesQuery, + PublicPageMode, + publishPageMutation, + revokePublicPageMutation, } from '@affine/graphql'; +import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useMutation, useQuery } from '@affine/workspace/affine/gql'; +import { useSetAtom } from 'jotai'; import { useCallback, useMemo } from 'react'; +import type { PageMode } from '../../atoms'; + +type NoParametersKeys = { + [K in keyof T]: T[K] extends () => any ? K : never; +}[keyof T]; + +type i18nKey = NoParametersKeys>; + +type NotificationKey = + | 'enableSuccessTitle' + | 'enableSuccessMessage' + | 'enableErrorTitle' + | 'enableErrorMessage' + | 'changeSuccessTitle' + | 'changeErrorTitle' + | 'changeErrorMessage' + | 'disableSuccessTitle' + | 'disableSuccessMessage' + | 'disableErrorTitle' + | 'disableErrorMessage'; + +const notificationToI18nKey: Record = { + enableSuccessTitle: + 'com.affine.share-menu.create-public-link.notification.success.title', + enableSuccessMessage: + 'com.affine.share-menu.create-public-link.notification.success.message', + enableErrorTitle: + 'com.affine.share-menu.create-public-link.notification.fail.title', + enableErrorMessage: + 'com.affine.share-menu.create-public-link.notification.fail.message', + changeSuccessTitle: + 'com.affine.share-menu.confirm-modify-mode.notification.success.title', + changeErrorTitle: + 'com.affine.share-menu.confirm-modify-mode.notification.fail.title', + changeErrorMessage: + 'com.affine.share-menu.confirm-modify-mode.notification.fail.message', + disableSuccessTitle: + 'com.affine.share-menu.disable-publish-link.notification.success.title', + disableSuccessMessage: + 'com.affine.share-menu.disable-publish-link.notification.success.message', + disableErrorTitle: + 'com.affine.share-menu.disable-publish-link.notification.fail.title', + disableErrorMessage: + 'com.affine.share-menu.disable-publish-link.notification.fail.message', +}; + export function useIsSharedPage( workspaceId: string, pageId: string -): [isSharedPage: boolean, setSharedPage: (enable: boolean) => void] { +): { + isSharedPage: boolean; + changeShare: (mode: PageMode) => void; + disableShare: () => void; + currentShareMode: PageMode; + enableShare: (mode: PageMode) => void; +} { + const t = useAFFiNEI18N(); + const pushNotification = useSetAtom(pushNotificationAtom); const { data, mutate } = useQuery({ - query: getWorkspaceSharedPagesQuery, + query: getWorkspacePublicPagesQuery, variables: { workspaceId, }, }); + const { trigger: enableSharePage } = useMutation({ - mutation: sharePageMutation, + mutation: publishPageMutation, }); const { trigger: disableSharePage } = useMutation({ - mutation: revokePageMutation, + mutation: revokePublicPageMutation, }); - return [ - useMemo( - () => data.workspace.sharedPages.some(id => id === pageId), - [data.workspace.sharedPages, pageId] - ), - useCallback( - (enable: boolean) => { - // todo: push notification - if (enable) { - enableSharePage({ - workspaceId, - pageId, - }) - .then(() => { - return mutate(); - }) - .catch(console.error); - } else { - disableSharePage({ - workspaceId, - pageId, - }) - .then(() => { - return mutate(); - }) - .catch(console.error); - } - mutate().catch(console.error); - }, - [disableSharePage, enableSharePage, mutate, pageId, workspaceId] - ), - ]; + + const [isSharedPage, currentShareMode] = useMemo(() => { + const publicPage = data?.workspace.publicPages.find( + publicPage => publicPage.id === pageId + ); + const isPageShared = !!publicPage; + + const currentShareMode: PageMode = + publicPage?.mode === PublicPageMode.Edgeless ? 'edgeless' : 'page'; + + return [isPageShared, currentShareMode]; + }, [data?.workspace.publicPages, pageId]); + + const enableShare = useCallback( + (mode: PageMode) => { + const publishMode = + mode === 'edgeless' ? PublicPageMode.Edgeless : PublicPageMode.Page; + + enableSharePage({ workspaceId, pageId, mode: publishMode }) + .then(() => { + pushNotification({ + title: t[notificationToI18nKey['enableSuccessTitle']](), + message: t[notificationToI18nKey['enableSuccessMessage']](), + type: 'success', + theme: 'default', + }); + return mutate(); + }) + .catch(e => { + pushNotification({ + title: t[notificationToI18nKey['enableErrorTitle']](), + message: t[notificationToI18nKey['enableErrorMessage']](), + type: 'error', + }); + console.error(e); + }); + }, + [enableSharePage, mutate, pageId, pushNotification, t, workspaceId] + ); + + const changeShare = useCallback( + (mode: PageMode) => { + const publishMode = + mode === 'edgeless' ? PublicPageMode.Edgeless : PublicPageMode.Page; + + enableSharePage({ workspaceId, pageId, mode: publishMode }) + .then(() => { + pushNotification({ + title: t[notificationToI18nKey['changeSuccessTitle']](), + message: t[ + 'com.affine.share-menu.confirm-modify-mode.notification.success.message' + ]({ + preMode: + publishMode === PublicPageMode.Edgeless + ? t['Page']() + : t['Edgeless'](), + currentMode: + publishMode === PublicPageMode.Edgeless + ? t['Edgeless']() + : t['Page'](), + }), + type: 'success', + theme: 'default', + }); + return mutate(); + }) + .catch(e => { + pushNotification({ + title: t[notificationToI18nKey['changeErrorTitle']](), + message: t[notificationToI18nKey['changeErrorMessage']](), + type: 'error', + }); + console.error(e); + }); + }, + [enableSharePage, mutate, pageId, pushNotification, t, workspaceId] + ); + + const disableShare = useCallback(() => { + disableSharePage({ workspaceId, pageId }) + .then(() => { + pushNotification({ + title: t[notificationToI18nKey['disableSuccessTitle']](), + message: t[notificationToI18nKey['disableSuccessMessage']](), + type: 'success', + theme: 'default', + }); + return mutate(); + }) + .catch(e => { + pushNotification({ + title: t[notificationToI18nKey['disableErrorTitle']](), + message: t[notificationToI18nKey['disableErrorMessage']](), + type: 'error', + }); + console.error(e); + }); + }, [disableSharePage, mutate, pageId, pushNotification, t, workspaceId]); + + return useMemo( + () => ({ + isSharedPage, + currentShareMode, + enableShare, + disableShare, + changeShare, + }), + [isSharedPage, currentShareMode, enableShare, disableShare, changeShare] + ); } diff --git a/packages/frontend/core/src/hooks/affine/use-language-helper.ts b/packages/frontend/core/src/hooks/affine/use-language-helper.ts index 442ee0393d..9ddfca62f7 100644 --- a/packages/frontend/core/src/hooks/affine/use-language-helper.ts +++ b/packages/frontend/core/src/hooks/affine/use-language-helper.ts @@ -1,5 +1,6 @@ import { LOCALES, useI18N } from '@affine/i18n'; -import { useCallback, useMemo } from 'react'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; +import { useMemo } from 'react'; export function useLanguageHelper() { const i18n = useI18N(); @@ -16,9 +17,9 @@ export function useLanguageHelper() { })), [] ); - const onLanguageChange = useCallback( - (event: string) => { - i18n.changeLanguage(event); + const onLanguageChange = useAsyncCallback( + async (event: string) => { + await i18n.changeLanguage(event); }, [i18n] ); diff --git a/packages/frontend/core/src/hooks/affine/use-register-blocksuite-editor-commands.tsx b/packages/frontend/core/src/hooks/affine/use-register-blocksuite-editor-commands.tsx index 886383aabd..d7f6cd5134 100644 --- a/packages/frontend/core/src/hooks/affine/use-register-blocksuite-editor-commands.tsx +++ b/packages/frontend/core/src/hooks/affine/use-register-blocksuite-editor-commands.tsx @@ -117,8 +117,8 @@ export function useRegisterBlocksuiteEditorCommands( category: `editor:${mode}`, icon: mode === 'page' ? : , label: t['Export to PDF'](), - run() { - exportHandler('pdf'); + async run() { + await exportHandler('pdf'); }, }) ); @@ -130,8 +130,8 @@ export function useRegisterBlocksuiteEditorCommands( category: `editor:${mode}`, icon: mode === 'page' ? : , label: t['Export to HTML'](), - run() { - exportHandler('html'); + async run() { + await exportHandler('html'); }, }) ); @@ -143,8 +143,8 @@ export function useRegisterBlocksuiteEditorCommands( category: `editor:${mode}`, icon: mode === 'page' ? : , label: t['Export to PNG'](), - run() { - exportHandler('png'); + async run() { + await exportHandler('png'); }, }) ); @@ -156,8 +156,8 @@ export function useRegisterBlocksuiteEditorCommands( category: `editor:${mode}`, icon: mode === 'page' ? : , label: t['Export to Markdown'](), - run() { - exportHandler('markdown'); + async run() { + await exportHandler('markdown'); }, }) ); diff --git a/packages/frontend/core/src/hooks/current/use-current-sync-engine.ts b/packages/frontend/core/src/hooks/current/use-current-sync-engine.ts new file mode 100644 index 0000000000..2fd2fcdac0 --- /dev/null +++ b/packages/frontend/core/src/hooks/current/use-current-sync-engine.ts @@ -0,0 +1,33 @@ +import type { SyncEngine, SyncEngineStatus } from '@affine/workspace/providers'; +import { useEffect, useState } from 'react'; + +import { useCurrentWorkspace } from './use-current-workspace'; + +export function useCurrentSyncEngine(): SyncEngine | undefined { + const [workspace] = useCurrentWorkspace(); + // FIXME: This is a hack to get the sync engine, we need refactor this in the future. + const syncEngine = ( + workspace.blockSuiteWorkspace.providers[0] as { engine?: SyncEngine } + )?.engine; + + return syncEngine; +} + +export function useCurrentSyncEngineStatus(): SyncEngineStatus | undefined { + const syncEngine = useCurrentSyncEngine(); + const [status, setStatus] = useState(); + + useEffect(() => { + if (syncEngine) { + setStatus(syncEngine.status); + return syncEngine.onStatusChange.on(status => { + setStatus(status); + }).dispose; + } else { + setStatus(undefined); + } + return; + }, [syncEngine]); + + return status; +} diff --git a/packages/frontend/core/src/hooks/root/use-on-transform-workspace.ts b/packages/frontend/core/src/hooks/root/use-on-transform-workspace.ts index 6810cc5294..496b66759a 100644 --- a/packages/frontend/core/src/hooks/root/use-on-transform-workspace.ts +++ b/packages/frontend/core/src/hooks/root/use-on-transform-workspace.ts @@ -7,10 +7,10 @@ import { rootWorkspacesMetadataAtom, workspaceAdaptersAtom, } from '@affine/workspace/atom'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { currentPageIdAtom } from '@toeverything/infra/atom'; import { WorkspaceVersion } from '@toeverything/infra/blocksuite'; import { useAtomValue, useSetAtom } from 'jotai'; -import { useCallback } from 'react'; import { openSettingModalAtom } from '../../atoms'; import { useNavigateHelper } from '../use-navigate-helper'; @@ -24,7 +24,7 @@ export function useOnTransformWorkspace() { const currentPageId = useAtomValue(currentPageIdAtom); const pushNotification = useSetAtom(pushNotificationAtom); - return useCallback( + return useAsyncCallback( async ( from: From, to: To, diff --git a/packages/frontend/core/src/hooks/use-datasource-sync.ts b/packages/frontend/core/src/hooks/use-datasource-sync.ts deleted file mode 100644 index 7bb2e9b545..0000000000 --- a/packages/frontend/core/src/hooks/use-datasource-sync.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { pushNotificationAtom } from '@affine/component/notification-center'; -import type { - AffineSocketIOProvider, - LocalIndexedDBBackgroundProvider, - SQLiteProvider, -} from '@affine/env/workspace'; -import { assertExists } from '@blocksuite/global/utils'; -import type { Workspace } from '@blocksuite/store'; -import { useSetAtom } from 'jotai'; -import { startTransition, useCallback, useMemo, useState } from 'react'; -import { type Status, syncDataSource } from 'y-provider'; - -export function useDatasourceSync(workspace: Workspace) { - const [status, setStatus] = useState({ - type: 'idle', - }); - const pushNotification = useSetAtom(pushNotificationAtom); - const providers = workspace.providers; - const remoteProvider: AffineSocketIOProvider | undefined = useMemo(() => { - return providers.find( - (provider): provider is AffineSocketIOProvider => - provider.flavour === 'affine-socket-io' - ); - }, [providers]); - const localProvider = useMemo(() => { - const sqliteProvider = providers.find( - (provider): provider is SQLiteProvider => provider.flavour === 'sqlite' - ); - const indexedDbProvider = providers.find( - (provider): provider is LocalIndexedDBBackgroundProvider => - provider.flavour === 'local-indexeddb-background' - ); - const provider = sqliteProvider || indexedDbProvider; - assertExists(provider, 'no local provider'); - return provider; - }, [providers]); - return [ - status, - useCallback(() => { - if (!remoteProvider) { - return; - } - startTransition(() => { - setStatus({ - type: 'syncing', - }); - }); - syncDataSource( - () => [ - workspace.doc.guid, - ...[...workspace.doc.subdocs].map(doc => doc.guid), - ], - remoteProvider.datasource, - localProvider.datasource - ) - .then(async () => { - // by default, the syncing status will show for 2.4s - setTimeout(() => { - startTransition(() => { - setStatus({ - type: 'synced', - }); - pushNotification({ - title: 'Synced successfully', - type: 'success', - }); - }); - }, 2400); - }) - .catch(error => { - startTransition(() => { - setStatus({ - type: 'error', - error, - }); - pushNotification({ - title: 'Unable to Sync', - message: 'Server error, please try again later.', - type: 'error', - }); - }); - }); - }, [ - remoteProvider, - localProvider.datasource, - workspace.doc.guid, - workspace.doc.subdocs, - pushNotification, - ]), - ] as const; -} diff --git a/packages/frontend/core/src/hooks/use-subscription.ts b/packages/frontend/core/src/hooks/use-subscription.ts index e2d7d50b12..bdc254c71d 100644 --- a/packages/frontend/core/src/hooks/use-subscription.ts +++ b/packages/frontend/core/src/hooks/use-subscription.ts @@ -1,6 +1,6 @@ import { type SubscriptionQuery, subscriptionQuery } from '@affine/graphql'; import { useQuery } from '@affine/workspace/affine/gql'; -import { useCallback } from 'react'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; export type Subscription = NonNullable< NonNullable['subscription'] @@ -16,9 +16,9 @@ export const useUserSubscription = () => { query: subscriptionQuery, }); - const set: SubscriptionMutator = useCallback( - (update?: Partial) => { - mutate(prev => { + const set: SubscriptionMutator = useAsyncCallback( + async (update?: Partial) => { + await mutate(prev => { if (!update || !prev?.currentUser?.subscription) { return; } diff --git a/packages/frontend/core/src/hooks/use-workspaces.ts b/packages/frontend/core/src/hooks/use-workspaces.ts index c47d77f73d..1d6cf40092 100644 --- a/packages/frontend/core/src/hooks/use-workspaces.ts +++ b/packages/frontend/core/src/hooks/use-workspaces.ts @@ -2,10 +2,7 @@ import { DebugLogger } from '@affine/debug'; import { WorkspaceFlavour } from '@affine/env/workspace'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; import { saveWorkspaceToLocalStorage } from '@affine/workspace/local/crud'; -import { - getOrCreateWorkspace, - globalBlockSuiteSchema, -} from '@affine/workspace/manager'; +import { getOrCreateWorkspace } from '@affine/workspace/manager'; import { getWorkspace } from '@toeverything/infra/__internal__/workspace'; import { getCurrentStore } from '@toeverything/infra/atom'; import { @@ -76,7 +73,6 @@ export function useAppHelper() { WorkspaceFlavour.LOCAL ); await buildShowcaseWorkspace(blockSuiteWorkspace, { - schema: globalBlockSuiteSchema, store: getCurrentStore(), atoms: { pageMode: setPageModeAtom, diff --git a/packages/frontend/core/src/index.tsx b/packages/frontend/core/src/index.tsx index c75e392975..3667442d56 100644 --- a/packages/frontend/core/src/index.tsx +++ b/packages/frontend/core/src/index.tsx @@ -1,3 +1,6 @@ +import './polyfill/ses-lockdown'; +import './polyfill/intl-segmenter'; + import { WorkspaceFallback } from '@affine/component/workspace'; import { assertExists } from '@blocksuite/global/utils'; import { getCurrentStore } from '@toeverything/infra/atom'; @@ -36,4 +39,6 @@ async function main() { ); } -await main(); +main().catch(err => { + console.error('Failed to bootstrap app', err); +}); diff --git a/packages/frontend/core/src/layouts/workspace-layout.tsx b/packages/frontend/core/src/layouts/workspace-layout.tsx index 94017fb8e1..12bbf066a6 100644 --- a/packages/frontend/core/src/layouts/workspace-layout.tsx +++ b/packages/frontend/core/src/layouts/workspace-layout.tsx @@ -14,8 +14,8 @@ import { } from '@affine/component/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; +import { getBlobEngine } from '@affine/workspace/manager'; import { assertExists } from '@blocksuite/global/utils'; -import type { Page } from '@blocksuite/store'; import type { DragEndEvent } from '@dnd-kit/core'; import { DndContext, @@ -27,8 +27,8 @@ import { useSensors, } from '@dnd-kit/core'; import { useBlockSuitePageMeta } from '@toeverything/hooks/use-block-suite-page-meta'; -import { loadPage } from '@toeverything/hooks/use-block-suite-workspace-page'; import { currentWorkspaceIdAtom } from '@toeverything/infra/atom'; +import type { MigrationPoint } from '@toeverything/infra/blocksuite'; import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import type { PropsWithChildren, ReactNode } from 'react'; import { lazy, Suspense, useCallback, useEffect, useState } from 'react'; @@ -114,36 +114,47 @@ export const CurrentWorkspaceContext = ({ }; type WorkspaceLayoutProps = { - incompatible?: boolean; + migration?: MigrationPoint; }; -// fix https://github.com/toeverything/AFFiNE/issues/4825 -function useLoadWorkspacePages() { +const useSyncWorkspaceBlob = () => { + // temporary solution for sync blob + const [currentWorkspace] = useCurrentWorkspace(); - const pageMetas = useBlockSuitePageMeta(currentWorkspace.blockSuiteWorkspace); + useEffect(() => { - if (currentWorkspace) { - const timer = setTimeout(() => { - const pageIds = pageMetas.map(meta => meta.id); - const pages = pageIds - .map(id => currentWorkspace.blockSuiteWorkspace.getPage(id)) - .filter((p): p is Page => !!p); - pages.forEach(page => { - loadPage(page, -10); + const blobEngine = getBlobEngine(currentWorkspace.blockSuiteWorkspace); + let stopped = false; + function sync() { + if (stopped) { + return; + } + + blobEngine + ?.sync() + .catch(error => { + console.error('sync blob error', error); + }) + .finally(() => { + // sync every 1 minute + setTimeout(sync, 60000); }); - }, 10 * 1000); // load pages after 10s - return () => { - clearTimeout(timer); - }; } - return; - }, [currentWorkspace, pageMetas]); -} + + // after currentWorkspace changed, wait 1 second to start sync + setTimeout(sync, 1000); + + return () => { + stopped = true; + }; + }, [currentWorkspace]); +}; export const WorkspaceLayout = function WorkspacesSuspense({ children, - incompatible = false, + migration, }: PropsWithChildren) { + useSyncWorkspaceBlob(); return ( @@ -153,7 +164,7 @@ export const WorkspaceLayout = function WorkspacesSuspense({ }> - + {children} @@ -164,7 +175,7 @@ export const WorkspaceLayout = function WorkspacesSuspense({ export const WorkspaceLayoutInner = ({ children, - incompatible = false, + migration, }: PropsWithChildren) => { const [currentWorkspace] = useCurrentWorkspace(); const { openPage } = useNavigateHelper(); @@ -254,8 +265,6 @@ export const WorkspaceLayoutInner = ({ const inTrashPage = pageMeta?.trash ?? false; const setMainContainer = useSetAtom(mainContainerAtom); - useLoadWorkspacePages(); - return ( <> {/* This DndContext is used for drag page from all-pages list into a folder in sidebar */} @@ -289,7 +298,11 @@ export const WorkspaceLayoutInner = ({ padding={appSettings.clientBorder} inTrashPage={inTrashPage} > - {incompatible ? : children} + {migration ? ( + + ) : ( + children + )} diff --git a/packages/frontend/core/src/pages/404.tsx b/packages/frontend/core/src/pages/404.tsx index 4afdc78a52..e569f1a09e 100644 --- a/packages/frontend/core/src/pages/404.tsx +++ b/packages/frontend/core/src/pages/404.tsx @@ -1,4 +1,5 @@ import { NotFoundPage } from '@affine/component/not-found-page'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { useSession } from 'next-auth/react'; import type { ReactElement } from 'react'; @@ -22,7 +23,7 @@ export const Component = (): ReactElement => { setOpen(true); }, [setOpen]); - const onConfirmSignOut = useCallback(async () => { + const onConfirmSignOut = useAsyncCallback(async () => { setOpen(false); await signOutCloud({ callbackUrl: '/signIn', diff --git a/packages/frontend/core/src/pages/share/detail-page.tsx b/packages/frontend/core/src/pages/share/detail-page.tsx index ab9bb26a58..0776f83237 100644 --- a/packages/frontend/core/src/pages/share/detail-page.tsx +++ b/packages/frontend/core/src/pages/share/detail-page.tsx @@ -1,8 +1,9 @@ import { MainContainer } from '@affine/component/workspace'; import { DebugLogger } from '@affine/debug'; import { WorkspaceFlavour } from '@affine/env/workspace'; +import type { CloudDoc } from '@affine/workspace/affine/download'; +import { downloadBinaryFromCloud } from '@affine/workspace/affine/download'; import { getOrCreateWorkspace } from '@affine/workspace/manager'; -import { downloadBinaryFromCloud } from '@affine/workspace/providers'; import { assertExists } from '@blocksuite/global/utils'; import type { Page } from '@blocksuite/store'; import { noop } from 'foxact/noop'; @@ -18,12 +19,25 @@ import { import { applyUpdate } from 'yjs'; import { PageDetailEditor } from '../../adapters/shared'; +import type { PageMode } from '../../atoms'; import { AppContainer } from '../../components/affine/app-container'; +import { ShareHeader } from '../../components/share-header'; import { SharePageNotFoundError } from '../../components/share-page-not-found-error'; -function assertArrayBuffer(value: unknown): asserts value is ArrayBuffer { - if (!(value instanceof ArrayBuffer)) { - throw new Error('value is not ArrayBuffer'); +type LoaderData = { + page: Page; + publishMode: PageMode; +}; + +function assertDownloadResponse( + value: CloudDoc | null +): asserts value is CloudDoc { + if ( + !value || + !((value as CloudDoc).arrayBuffer instanceof ArrayBuffer) || + typeof (value as CloudDoc).publishMode !== 'string' + ) { + throw new Error('value is not a valid download response'); } } @@ -41,33 +55,42 @@ export const loader: LoaderFunction = async ({ params }) => { ); // download root workspace { - const buffer = await downloadBinaryFromCloud(workspaceId, workspaceId); - assertArrayBuffer(buffer); - applyUpdate(workspace.doc, new Uint8Array(buffer)); + const response = await downloadBinaryFromCloud(workspaceId, workspaceId); + assertDownloadResponse(response); + const { arrayBuffer } = response; + applyUpdate(workspace.doc, new Uint8Array(arrayBuffer)); } const page = workspace.getPage(pageId); assertExists(page, 'cannot find page'); // download page - { - const buffer = await downloadBinaryFromCloud( - workspaceId, - page.spaceDoc.guid - ); - assertArrayBuffer(buffer); - applyUpdate(page.spaceDoc, new Uint8Array(buffer)); - } + + const response = await downloadBinaryFromCloud( + workspaceId, + page.spaceDoc.guid + ); + assertDownloadResponse(response); + const { arrayBuffer, publishMode } = response; + + applyUpdate(page.spaceDoc, new Uint8Array(arrayBuffer)); + logger.info('workspace', workspace); workspace.awarenessStore.setReadonly(page, true); - return page; + return { page, publishMode }; }; export const Component = (): ReactElement => { - const page = useLoaderData() as Page; + const { page, publishMode } = useLoaderData() as LoaderData; return ( + noop, [])} diff --git a/packages/frontend/core/src/pages/workspace/all-page.css.ts b/packages/frontend/core/src/pages/workspace/all-page.css.ts index 31761789af..32ecc9f4c4 100644 --- a/packages/frontend/core/src/pages/workspace/all-page.css.ts +++ b/packages/frontend/core/src/pages/workspace/all-page.css.ts @@ -65,4 +65,5 @@ export const newPageButtonLabel = style({ export const headerCreateNewButtonHidden = style({ opacity: 0, + pointerEvents: 'none', }); diff --git a/packages/frontend/core/src/pages/workspace/collection.tsx b/packages/frontend/core/src/pages/workspace/collection.tsx index 5f37de1ed8..ef2f330d6f 100644 --- a/packages/frontend/core/src/pages/workspace/collection.tsx +++ b/packages/frontend/core/src/pages/workspace/collection.tsx @@ -14,6 +14,7 @@ import { PageIcon, ViewLayersIcon, } from '@blocksuite/icons'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { getCurrentStore } from '@toeverything/infra/atom'; import { useAtomValue } from 'jotai'; import { useSetAtom } from 'jotai'; @@ -92,11 +93,13 @@ export const Component = function CollectionPage() { const Placeholder = ({ collection }: { collection: Collection }) => { const { updateCollection } = useCollectionManager(collectionsCRUDAtom); const { node, open } = useEditCollection(useAllPageListConfig()); - const openPageEdit = useCallback(() => { - open({ ...collection }, 'page').then(updateCollection); + const openPageEdit = useAsyncCallback(async () => { + const ret = await open({ ...collection }, 'page'); + await updateCollection(ret); }, [open, collection, updateCollection]); - const openRuleEdit = useCallback(() => { - open({ ...collection }, 'rule').then(updateCollection); + const openRuleEdit = useAsyncCallback(async () => { + const ret = await open({ ...collection }, 'rule'); + await updateCollection(ret); }, [collection, open, updateCollection]); const [showTips, setShowTips] = useState(false); useEffect(() => { diff --git a/packages/frontend/core/src/pages/workspace/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page.tsx index 2507bc066a..e9111cc833 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page.tsx @@ -5,20 +5,18 @@ import { } from '@affine/component/page-list'; import { WorkspaceSubPath } from '@affine/env/workspace'; import { globalBlockSuiteSchema } from '@affine/workspace/manager'; +import { SyncEngineStep } from '@affine/workspace/providers'; import type { EditorContainer } from '@blocksuite/editor'; import { assertExists } from '@blocksuite/global/utils'; import type { Page } from '@blocksuite/store'; import { contentLayoutAtom, currentPageIdAtom, - currentWorkspaceAtom, currentWorkspaceIdAtom, - getCurrentStore, } from '@toeverything/infra/atom'; import { useAtomValue, useSetAtom } from 'jotai'; -import { type ReactElement, useCallback } from 'react'; -import type { LoaderFunction } from 'react-router-dom'; -import { redirect } from 'react-router-dom'; +import { type ReactElement, useCallback, useEffect, useState } from 'react'; +import { type LoaderFunction, useParams } from 'react-router-dom'; import type { Map as YMap } from 'yjs'; import { getUIAdapter } from '../../adapters/workspace'; @@ -28,6 +26,7 @@ import { currentModeAtom } from '../../atoms/mode'; import { AffineErrorBoundary } from '../../components/affine/affine-error-boundary'; import { WorkspaceHeader } from '../../components/workspace-header'; import { useRegisterBlocksuiteEditorCommands } from '../../hooks/affine/use-register-blocksuite-editor-commands'; +import { useCurrentSyncEngineStatus } from '../../hooks/current/use-current-sync-engine'; import { useCurrentWorkspace } from '../../hooks/current/use-current-workspace'; import { useNavigateHelper } from '../../hooks/use-navigate-helper'; import { performanceRenderLogger } from '../../shared'; @@ -108,47 +107,114 @@ const DetailPageImpl = (): ReactElement => { export const DetailPage = (): ReactElement => { const [currentWorkspace] = useCurrentWorkspace(); + const currentSyncEngineStatus = useCurrentSyncEngineStatus(); const currentPageId = useAtomValue(currentPageIdAtom); - const page = currentPageId - ? currentWorkspace.blockSuiteWorkspace.getPage(currentPageId) - : null; + const [page, setPage] = useState(null); + const [pageLoaded, setPageLoaded] = useState(false); - if (!currentPageId || !page) { + // load page by current page id + useEffect(() => { + if (!currentPageId) { + setPage(null); + return; + } + + const exists = currentWorkspace.blockSuiteWorkspace.getPage(currentPageId); + + if (exists) { + setPage(exists); + return; + } + + const dispose = currentWorkspace.blockSuiteWorkspace.slots.pagesUpdated.on( + () => { + const exists = + currentWorkspace.blockSuiteWorkspace.getPage(currentPageId); + + if (exists) { + setPage(exists); + } + } + ); + + return dispose.dispose; + }, [currentPageId, currentWorkspace]); + + const navigate = useNavigateHelper(); + + // if sync engine has been synced and the page is null, wait 1s and jump to 404 page. + useEffect(() => { + if (currentSyncEngineStatus?.step === SyncEngineStep.Synced && !page) { + const timeout = setTimeout(() => { + navigate.jumpTo404(); + }, 1000); + return () => { + clearTimeout(timeout); + }; + } + return; + }, [currentSyncEngineStatus, navigate, page]); + + // wait for page to be loaded + useEffect(() => { + if (page) { + if (!page.isEmpty) { + setPageLoaded(true); + } else { + setPageLoaded(false); + // call waitForLoaded to trigger load + page + .load(() => {}) + .catch(() => { + // do nothing + }); + return page.slots.ready.on(() => { + setPageLoaded(true); + }).dispose; + } + } else { + setPageLoaded(false); + } + return; + }, [page]); + + if (!currentPageId || !page || !pageLoaded) { return ; } + + if (page.meta.jumpOnce) { + currentWorkspace.blockSuiteWorkspace.setPageMeta(page.id, { + jumpOnce: false, + }); + } + return ; }; -export const loader: LoaderFunction = async args => { - const rootStore = getCurrentStore(); - rootStore.set(contentLayoutAtom, 'editor'); - if (args.params.workspaceId) { - localStorage.setItem('last_workspace_id', args.params.workspaceId); - rootStore.set(currentWorkspaceIdAtom, args.params.workspaceId); - } - const currentWorkspace = await rootStore.get(currentWorkspaceAtom); - if (args.params.pageId) { - const pageId = args.params.pageId; - localStorage.setItem('last_page_id', pageId); - const page = currentWorkspace.getPage(pageId); - if (!page) { - return redirect('/404'); - } - if (page.meta.jumpOnce) { - currentWorkspace.setPageMeta(page.id, { - jumpOnce: false, - }); - } - rootStore.set(currentPageIdAtom, pageId); - } else { - return redirect('/404'); - } +export const loader: LoaderFunction = async () => { return null; }; export const Component = () => { performanceRenderLogger.info('DetailPage'); + const setContentLayout = useSetAtom(contentLayoutAtom); + const setCurrentWorkspaceId = useSetAtom(currentWorkspaceIdAtom); + const setCurrentPageId = useSetAtom(currentPageIdAtom); + const params = useParams(); + + useEffect(() => { + setContentLayout('editor'); + if (params.workspaceId) { + localStorage.setItem('last_workspace_id', params.workspaceId); + setCurrentWorkspaceId(params.workspaceId); + } + if (params.pageId) { + localStorage.setItem('last_page_id', params.pageId); + setCurrentPageId(params.pageId); + } + }, [params, setContentLayout, setCurrentPageId, setCurrentWorkspaceId]); + return ( diff --git a/packages/frontend/core/src/pages/workspace/index.tsx b/packages/frontend/core/src/pages/workspace/index.tsx index 29a2097252..ee96ec9516 100644 --- a/packages/frontend/core/src/pages/workspace/index.tsx +++ b/packages/frontend/core/src/pages/workspace/index.tsx @@ -1,4 +1,3 @@ -import { WorkspaceFlavour } from '@affine/env/workspace'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import { @@ -6,15 +5,22 @@ import { currentWorkspaceIdAtom, getCurrentStore, } from '@toeverything/infra/atom'; -import { guidCompatibilityFix } from '@toeverything/infra/blocksuite'; -import type { ReactElement } from 'react'; +import type { MigrationPoint } from '@toeverything/infra/blocksuite'; +import { + checkWorkspaceCompatibility, + guidCompatibilityFix, +} from '@toeverything/infra/blocksuite'; +import { useSetAtom } from 'jotai'; +import { type ReactElement, useEffect } from 'react'; import { type LoaderFunction, Outlet, redirect, useLoaderData, + useParams, } from 'react-router-dom'; +import { AffineErrorBoundary } from '../../components/affine/affine-error-boundary'; import { WorkspaceLayout } from '../../layouts/workspace-layout'; import { performanceLogger, performanceRenderLogger } from '../../shared'; @@ -24,6 +30,12 @@ export const loader: LoaderFunction = async args => { workspaceLoaderLogger.info('start'); const rootStore = getCurrentStore(); + + if (args.params.workspaceId) { + localStorage.setItem('last_workspace_id', args.params.workspaceId); + rootStore.set(currentWorkspaceIdAtom, args.params.workspaceId); + } + const meta = await rootStore.get(rootWorkspacesMetadataAtom); workspaceLoaderLogger.info('meta loaded'); @@ -31,44 +43,40 @@ export const loader: LoaderFunction = async args => { if (!currentMetadata) { return redirect('/404'); } - if (args.params.workspaceId) { - localStorage.setItem('last_workspace_id', args.params.workspaceId); - rootStore.set(currentWorkspaceIdAtom, args.params.workspaceId); - } + if (!args.params.pageId) { rootStore.set(currentPageIdAtom, null); } - if (currentMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD) { - const [workspaceAtom] = getBlockSuiteWorkspaceAtom(currentMetadata.id); - workspaceLoaderLogger.info('get cloud workspace atom'); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(currentMetadata.id); + workspaceLoaderLogger.info('get cloud workspace atom'); - const workspace = await rootStore.get(workspaceAtom); - return (() => { - guidCompatibilityFix(workspace.doc); - const blockVersions = workspace.meta.blockVersions; - if (!blockVersions) { - return true; - } - for (const [flavour, schema] of workspace.schema.flavourSchemaMap) { - if (blockVersions[flavour] !== schema.version) { - return true; - } - } - return false; - })(); - } + const workspace = await rootStore.get(workspaceAtom); + workspaceLoaderLogger.info('workspace loaded'); - workspaceLoaderLogger.info('done'); - return null; + guidCompatibilityFix(workspace.doc); + return checkWorkspaceCompatibility(workspace); }; export const Component = (): ReactElement => { performanceRenderLogger.info('WorkspaceLayout'); - const incompatible = useLoaderData(); + const setCurrentWorkspaceId = useSetAtom(currentWorkspaceIdAtom); + + const params = useParams(); + + useEffect(() => { + if (params.workspaceId) { + localStorage.setItem('last_workspace_id', params.workspaceId); + setCurrentWorkspaceId(params.workspaceId); + } + }, [params, setCurrentWorkspaceId]); + + const migration = useLoaderData() as MigrationPoint | undefined; return ( - - - + + + + + ); }; diff --git a/packages/frontend/core/src/polyfill/ses.ts b/packages/frontend/core/src/polyfill/ses-lockdown.ts similarity index 100% rename from packages/frontend/core/src/polyfill/ses.ts rename to packages/frontend/core/src/polyfill/ses-lockdown.ts diff --git a/packages/frontend/core/src/providers/modal-provider.tsx b/packages/frontend/core/src/providers/modal-provider.tsx index 6a9daa7488..3c805bae9c 100644 --- a/packages/frontend/core/src/providers/modal-provider.tsx +++ b/packages/frontend/core/src/providers/modal-provider.tsx @@ -1,5 +1,6 @@ import { WorkspaceSubPath } from '@affine/env/workspace'; import { assertExists } from '@blocksuite/global/utils'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useAtom } from 'jotai'; import type { ReactElement } from 'react'; import { lazy, Suspense, useCallback } from 'react'; @@ -154,13 +155,10 @@ export const SignOutConfirmModal = () => { const { jumpToIndex } = useNavigateHelper(); const [open, setOpen] = useAtom(openSignOutModalAtom); - const onConfirm = useCallback(async () => { + const onConfirm = useAsyncCallback(async () => { setOpen(false); - signOutCloud() - .then(() => { - jumpToIndex(); - }) - .catch(console.error); + await signOutCloud(); + jumpToIndex(); }, [jumpToIndex, setOpen]); return ( diff --git a/packages/frontend/core/src/providers/session-provider.tsx b/packages/frontend/core/src/providers/session-provider.tsx index b1ef1b0328..1135fa6468 100644 --- a/packages/frontend/core/src/providers/session-provider.tsx +++ b/packages/frontend/core/src/providers/session-provider.tsx @@ -3,6 +3,7 @@ import '@toeverything/hooks/use-affine-ipc-renderer'; import { pushNotificationAtom } from '@affine/component/notification-center'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { refreshRootMetadataAtom } from '@affine/workspace/atom'; +import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks'; import { useAtom, useSetAtom } from 'jotai'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { SessionProvider, useSession } from 'next-auth/react'; @@ -24,6 +25,12 @@ const SessionDefence = (props: PropsWithChildren) => { const refreshMetadata = useSetAtom(refreshRootMetadataAtom); const onceSignedInEvents = useOnceSignedInEvents(); const t = useAFFiNEI18N(); + + const refreshAfterSignedInEvents = useAsyncCallback(async () => { + await onceSignedInEvents(); + refreshMetadata(); + }, [onceSignedInEvents, refreshMetadata]); + useEffect(() => { if (sessionInAtom !== session && session.status === 'authenticated') { setSession(session); @@ -35,11 +42,7 @@ const SessionDefence = (props: PropsWithChildren) => { prevSession.current?.status === 'unauthenticated' && session.status === 'authenticated' ) { - startTransition(() => { - onceSignedInEvents().then(() => { - refreshMetadata(); - }); - }); + startTransition(() => refreshAfterSignedInEvents()); pushNotification({ title: t['com.affine.auth.has.signed'](), message: t['com.affine.auth.has.signed.message'](), @@ -57,9 +60,8 @@ const SessionDefence = (props: PropsWithChildren) => { sessionInAtom, prevSession, setSession, - onceSignedInEvents, pushNotification, - refreshMetadata, + refreshAfterSignedInEvents, t, ]); return props.children; diff --git a/packages/frontend/electron/forge.config.mjs b/packages/frontend/electron/forge.config.mjs index 6a01e66ae8..9e9e2d7978 100644 --- a/packages/frontend/electron/forge.config.mjs +++ b/packages/frontend/electron/forge.config.mjs @@ -122,8 +122,10 @@ export default { schemes: [productName.toLowerCase()], }, ], + asar: true, }, makers, + plugins: [{ name: '@electron-forge/plugin-auto-unpack-natives', config: {} }], hooks: { readPackageJson: async (_, packageJson) => { // we want different package name for canary build diff --git a/packages/frontend/electron/package.json b/packages/frontend/electron/package.json index 9f275855e1..a844b4e763 100644 --- a/packages/frontend/electron/package.json +++ b/packages/frontend/electron/package.json @@ -1,7 +1,7 @@ { "name": "@affine/electron", "private": true, - "version": "0.10.2", + "version": "0.10.3-canary.2", "author": "toeverything", "repository": { "url": "https://github.com/toeverything/AFFiNE", @@ -32,38 +32,39 @@ "@affine/sdk": "workspace:*", "@affine/templates": "workspace:*", "@affine/vue-hello-world-plugin": "workspace:*", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", - "@electron-forge/cli": "^6.4.2", - "@electron-forge/core": "^6.4.2", - "@electron-forge/core-utils": "^6.4.2", - "@electron-forge/maker-deb": "^6.4.2", - "@electron-forge/maker-dmg": "^6.4.2", - "@electron-forge/maker-squirrel": "^6.4.2", - "@electron-forge/maker-zip": "^6.4.2", - "@electron-forge/shared-types": "^6.4.2", - "@electron/remote": "2.0.12", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", + "@electron-forge/cli": "^7.1.0", + "@electron-forge/core": "^7.1.0", + "@electron-forge/core-utils": "^7.1.0", + "@electron-forge/maker-deb": "^7.1.0", + "@electron-forge/maker-dmg": "^7.1.0", + "@electron-forge/maker-squirrel": "^7.1.0", + "@electron-forge/maker-zip": "^7.1.0", + "@electron-forge/plugin-auto-unpack-natives": "^7.1.0", + "@electron-forge/shared-types": "^7.1.0", + "@electron/remote": "2.1.0", "@reforged/maker-appimage": "^3.3.1", "@toeverything/infra": "workspace:*", - "@types/uuid": "^9.0.5", - "builder-util-runtime": "^9.2.1", + "@types/uuid": "^9.0.7", + "builder-util-runtime": "^9.2.3", "cross-env": "^7.0.3", - "electron": "^27.0.0", - "electron-log": "^5.0.0", + "electron": "^27.1.0", + "electron-log": "^5.0.1", "electron-squirrel-startup": "1.0.0", "electron-window-state": "^5.0.3", - "esbuild": "^0.19.4", + "esbuild": "^0.19.7", "fs-extra": "^11.1.1", "glob": "^10.3.10", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "lodash-es": "^4.17.21", "rxjs": "^7.8.1", "semver": "^7.5.4", "tinykeys": "^2.1.0", "ts-node": "^10.9.1", - "undici": "^5.26.3", + "undici": "^5.27.2", "uuid": "^9.0.1", "vitest": "0.34.6", "which": "^4.0.0", @@ -73,8 +74,8 @@ "async-call-rpc": "^6.3.1", "electron-updater": "^6.1.5", "link-preview-js": "^3.0.5", - "nanoid": "^5.0.1", - "yjs": "^13.6.8" + "nanoid": "^5.0.3", + "yjs": "^13.6.10" }, "build": { "protocols": [ diff --git a/packages/frontend/electron/scripts/build-layers.ts b/packages/frontend/electron/scripts/build-layers.ts index 9b7ca95e16..efee8c1ba3 100644 --- a/packages/frontend/electron/scripts/build-layers.ts +++ b/packages/frontend/electron/scripts/build-layers.ts @@ -11,9 +11,8 @@ async function buildLayers() { }; if (process.env.BUILD_TYPE_OVERRIDE) { - define[ - 'process.env.BUILD_TYPE_OVERRIDE' - ] = `"${process.env.BUILD_TYPE_OVERRIDE}"`; + define['process.env.BUILD_TYPE_OVERRIDE'] = + `"${process.env.BUILD_TYPE_OVERRIDE}"`; } await esbuild.build({ diff --git a/packages/frontend/electron/scripts/macos-arm64-output-check.ts b/packages/frontend/electron/scripts/macos-arm64-output-check.ts index 5158559fe3..307bf790fc 100644 --- a/packages/frontend/electron/scripts/macos-arm64-output-check.ts +++ b/packages/frontend/electron/scripts/macos-arm64-output-check.ts @@ -1,26 +1,15 @@ -import { readdir } from 'node:fs/promises'; +import fs from 'node:fs'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; const outputRoot = fileURLToPath( new URL( - '../out/canary/AFFiNE-canary-darwin-arm64/AFFiNE-canary.app/Contents/Resources/app', + '../out/canary/AFFiNE-canary-darwin-arm64/AFFiNE-canary.app/Contents/Resources', import.meta.url ) ); -const outputList = [ - ['dist', ['main.js', 'helper.js', 'preload.js', 'affine.darwin-arm64.node']], -] as [entry: string, expected: string[]][]; - -await Promise.all( - outputList.map(async ([entry, output]) => { - const files = await readdir(`${outputRoot}/${entry}`); - output.forEach(file => { - if (!files.includes(file)) { - throw new Error(`File ${entry}/${file} not found`); - } - }); - }) -); +// todo: use asar package to check contents +fs.existsSync(path.resolve(outputRoot, 'app.asar')); console.log('Output check passed'); diff --git a/packages/frontend/electron/src/helper/db/migration.ts b/packages/frontend/electron/src/helper/db/migration.ts index 8673a5d869..d6cb90f199 100644 --- a/packages/frontend/electron/src/helper/db/migration.ts +++ b/packages/frontend/electron/src/helper/db/migration.ts @@ -77,10 +77,7 @@ export const migrateToLatest = async ( ); }; await downloadBinary(rootDoc, true); - const result = await forceUpgradePages({ - getSchema: () => schema, - getCurrentRootDoc: () => Promise.resolve(rootDoc), - }); + const result = await forceUpgradePages(rootDoc, schema); equal(result, true, 'migrateWorkspace should return boolean value'); const uploadBinary = async (doc: YDoc, isRoot: boolean) => { await connection.replaceUpdates(doc.guid, [ diff --git a/packages/frontend/electron/src/helper/workspace/handlers.ts b/packages/frontend/electron/src/helper/workspace/handlers.ts index 52c4a0f400..07f62f1212 100644 --- a/packages/frontend/electron/src/helper/workspace/handlers.ts +++ b/packages/frontend/electron/src/helper/workspace/handlers.ts @@ -8,7 +8,9 @@ import type { WorkspaceMeta } from '../type'; import { getDeletedWorkspacesBasePath, getWorkspaceBasePath, + getWorkspaceDBPath, getWorkspaceMeta, + getWorkspaceMetaPath, getWorkspacesBasePath, } from './meta'; import { workspaceSubjects } from './subjects'; @@ -53,6 +55,34 @@ export async function deleteWorkspace(id: string) { } } +export async function cloneWorkspace(id: string, newId: string) { + const dbPath = await getWorkspaceDBPath(id); + const newBasePath = await getWorkspaceBasePath(newId); + const newDbPath = await getWorkspaceDBPath(newId); + const metaPath = await getWorkspaceMetaPath(newId); + // check if new workspace dir exists + if ( + await fs + .access(newBasePath) + .then(() => true) + .catch(() => false) + ) { + throw new Error(`workspace ${newId} already exists`); + } + + try { + await fs.ensureDir(newBasePath); + const meta = { + id: newId, + mainDBPath: newDbPath, + }; + await fs.writeJSON(metaPath, meta); + await fs.copy(dbPath, newDbPath); + } catch (error) { + logger.error('cloneWorkspace', error); + } +} + export async function storeWorkspaceMeta( workspaceId: string, meta: Partial diff --git a/packages/frontend/electron/src/helper/workspace/index.ts b/packages/frontend/electron/src/helper/workspace/index.ts index 6acf6944f6..5d7a4dd2fb 100644 --- a/packages/frontend/electron/src/helper/workspace/index.ts +++ b/packages/frontend/electron/src/helper/workspace/index.ts @@ -1,5 +1,5 @@ import type { MainEventRegister, WorkspaceMeta } from '../type'; -import { deleteWorkspace, listWorkspaces } from './handlers'; +import { cloneWorkspace, deleteWorkspace, listWorkspaces } from './handlers'; import { getWorkspaceMeta } from './meta'; import { workspaceSubjects } from './subjects'; @@ -23,4 +23,5 @@ export const workspaceHandlers = { getMeta: async (id: string) => { return getWorkspaceMeta(id); }, + clone: async (id: string, newId: string) => cloneWorkspace(id, newId), }; diff --git a/packages/frontend/electron/src/main/main-window.ts b/packages/frontend/electron/src/main/main-window.ts index 633c8e5f62..9aeeb5e3e7 100644 --- a/packages/frontend/electron/src/main/main-window.ts +++ b/packages/frontend/electron/src/main/main-window.ts @@ -36,8 +36,8 @@ async function createWindow() { titleBarStyle: isMacOS() ? 'hiddenInset' : isWindows() - ? 'hidden' - : 'default', + ? 'hidden' + : 'default', trafficLightPosition: { x: 20, y: 16 }, x: mainWindowState.x, y: mainWindowState.y, diff --git a/packages/frontend/graphql/package.json b/packages/frontend/graphql/package.json index a78fe74204..43255f567d 100644 --- a/packages/frontend/graphql/package.json +++ b/packages/frontend/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@affine/graphql", - "version": "0.10.2", + "version": "0.10.3-canary.2", "description": "Autogenerated GraphQL client for affine.pro", "license": "MIT", "type": "module", @@ -15,6 +15,7 @@ "@graphql-codegen/typescript": "^4.0.1", "@graphql-codegen/typescript-operations": "^4.0.1", "@types/lodash-es": "^4.17.9", + "lodash": "^4.17.21", "lodash-es": "^4.17.21", "prettier": "^3.0.3", "vitest": "0.34.6" diff --git a/packages/frontend/graphql/src/fetcher.ts b/packages/frontend/graphql/src/fetcher.ts index b660c0581c..4015f96e74 100644 --- a/packages/frontend/graphql/src/fetcher.ts +++ b/packages/frontend/graphql/src/fetcher.ts @@ -20,8 +20,8 @@ export type _QueryVariables = Q['id'] extends Queries['name'] ? Extract['variables'] : Q['id'] extends Mutations['name'] - ? Extract['variables'] - : undefined; + ? Extract['variables'] + : undefined; export type QueryVariables = _QueryVariables extends | never diff --git a/packages/frontend/graphql/src/graphql/get-workspace-public-pages.gql b/packages/frontend/graphql/src/graphql/get-workspace-public-pages.gql new file mode 100644 index 0000000000..fcfd7fc6e7 --- /dev/null +++ b/packages/frontend/graphql/src/graphql/get-workspace-public-pages.gql @@ -0,0 +1,8 @@ +query getWorkspacePublicPages($workspaceId: String!) { + workspace(id: $workspaceId) { + publicPages { + id + mode + } + } +} diff --git a/packages/frontend/graphql/src/graphql/get-workspace-shared-pages.gql b/packages/frontend/graphql/src/graphql/get-workspace-shared-pages.gql deleted file mode 100644 index 3d94e0a739..0000000000 --- a/packages/frontend/graphql/src/graphql/get-workspace-shared-pages.gql +++ /dev/null @@ -1,5 +0,0 @@ -query getWorkspaceSharedPages($workspaceId: String!) { - workspace(id: $workspaceId) { - sharedPages - } -} diff --git a/packages/frontend/graphql/src/graphql/index.ts b/packages/frontend/graphql/src/graphql/index.ts index 5de29e1419..4fd2c04148 100644 --- a/packages/frontend/graphql/src/graphql/index.ts +++ b/packages/frontend/graphql/src/graphql/index.ts @@ -320,15 +320,18 @@ query getWorkspacePublicById($id: String!) { }`, }; -export const getWorkspaceSharedPagesQuery = { - id: 'getWorkspaceSharedPagesQuery' as const, - operationName: 'getWorkspaceSharedPages', +export const getWorkspacePublicPagesQuery = { + id: 'getWorkspacePublicPagesQuery' as const, + operationName: 'getWorkspacePublicPages', definitionName: 'workspace', containsFile: false, query: ` -query getWorkspaceSharedPages($workspaceId: String!) { +query getWorkspacePublicPages($workspaceId: String!) { workspace(id: $workspaceId) { - sharedPages + publicPages { + id + mode + } } }`, }; @@ -428,6 +431,20 @@ query prices { }`, }; +export const publishPageMutation = { + id: 'publishPageMutation' as const, + operationName: 'publishPage', + definitionName: 'publishPage', + containsFile: false, + query: ` +mutation publishPage($workspaceId: String!, $pageId: String!, $mode: PublicPageMode = Page) { + publishPage(workspaceId: $workspaceId, pageId: $pageId, mode: $mode) { + id + mode + } +}`, +}; + export const removeAvatarMutation = { id: 'removeAvatarMutation' as const, operationName: 'removeAvatar', @@ -469,14 +486,18 @@ mutation revokeMemberPermission($workspaceId: String!, $userId: String!) { }`, }; -export const revokePageMutation = { - id: 'revokePageMutation' as const, - operationName: 'revokePage', - definitionName: 'revokePage', +export const revokePublicPageMutation = { + id: 'revokePublicPageMutation' as const, + operationName: 'revokePublicPage', + definitionName: 'revokePublicPage', containsFile: false, query: ` -mutation revokePage($workspaceId: String!, $pageId: String!) { - revokePage(workspaceId: $workspaceId, pageId: $pageId) +mutation revokePublicPage($workspaceId: String!, $pageId: String!) { + revokePublicPage(workspaceId: $workspaceId, pageId: $pageId) { + id + mode + public + } }`, }; @@ -537,17 +558,6 @@ mutation setWorkspacePublicById($id: ID!, $public: Boolean!) { }`, }; -export const sharePageMutation = { - id: 'sharePageMutation' as const, - operationName: 'sharePage', - definitionName: 'sharePage', - containsFile: false, - query: ` -mutation sharePage($workspaceId: String!, $pageId: String!) { - sharePage(workspaceId: $workspaceId, pageId: $pageId) -}`, -}; - export const signInMutation = { id: 'signInMutation' as const, operationName: 'signIn', diff --git a/packages/frontend/graphql/src/graphql/public-page.gql b/packages/frontend/graphql/src/graphql/public-page.gql new file mode 100644 index 0000000000..7074bc153a --- /dev/null +++ b/packages/frontend/graphql/src/graphql/public-page.gql @@ -0,0 +1,10 @@ +mutation publishPage( + $workspaceId: String! + $pageId: String! + $mode: PublicPageMode = Page +) { + publishPage(workspaceId: $workspaceId, pageId: $pageId, mode: $mode) { + id + mode + } +} diff --git a/packages/frontend/graphql/src/graphql/revoke-page.gql b/packages/frontend/graphql/src/graphql/revoke-page.gql deleted file mode 100644 index df8de2aba0..0000000000 --- a/packages/frontend/graphql/src/graphql/revoke-page.gql +++ /dev/null @@ -1,3 +0,0 @@ -mutation revokePage($workspaceId: String!, $pageId: String!) { - revokePage(workspaceId: $workspaceId, pageId: $pageId) -} diff --git a/packages/frontend/graphql/src/graphql/revoke-public-page.gql b/packages/frontend/graphql/src/graphql/revoke-public-page.gql new file mode 100644 index 0000000000..1515b3d501 --- /dev/null +++ b/packages/frontend/graphql/src/graphql/revoke-public-page.gql @@ -0,0 +1,7 @@ +mutation revokePublicPage($workspaceId: String!, $pageId: String!) { + revokePublicPage(workspaceId: $workspaceId, pageId: $pageId) { + id + mode + public + } +} diff --git a/packages/frontend/graphql/src/graphql/share-page.gql b/packages/frontend/graphql/src/graphql/share-page.gql deleted file mode 100644 index 26a4259412..0000000000 --- a/packages/frontend/graphql/src/graphql/share-page.gql +++ /dev/null @@ -1,3 +0,0 @@ -mutation sharePage($workspaceId: String!, $pageId: String!) { - sharePage(workspaceId: $workspaceId, pageId: $pageId) -} diff --git a/packages/frontend/graphql/src/schema.ts b/packages/frontend/graphql/src/schema.ts index f026ab0f8d..99b6282ca3 100644 --- a/packages/frontend/graphql/src/schema.ts +++ b/packages/frontend/graphql/src/schema.ts @@ -340,13 +340,20 @@ export type GetWorkspacePublicByIdQuery = { workspace: { __typename?: 'WorkspaceType'; public: boolean }; }; -export type GetWorkspaceSharedPagesQueryVariables = Exact<{ +export type GetWorkspacePublicPagesQueryVariables = Exact<{ workspaceId: Scalars['String']['input']; }>; -export type GetWorkspaceSharedPagesQuery = { +export type GetWorkspacePublicPagesQuery = { __typename?: 'Query'; - workspace: { __typename?: 'WorkspaceType'; sharedPages: Array }; + workspace: { + __typename?: 'WorkspaceType'; + publicPages: Array<{ + __typename?: 'WorkspacePage'; + id: string; + mode: PublicPageMode; + }>; + }; }; export type GetWorkspaceQueryVariables = Exact<{ @@ -422,6 +429,21 @@ export type PricesQuery = { }>; }; +export type PublishPageMutationVariables = Exact<{ + workspaceId: Scalars['String']['input']; + pageId: Scalars['String']['input']; + mode?: InputMaybe; +}>; + +export type PublishPageMutation = { + __typename?: 'Mutation'; + publishPage: { + __typename?: 'WorkspacePage'; + id: string; + mode: PublicPageMode; + }; +}; + export type RemoveAvatarMutationVariables = Exact<{ [key: string]: never }>; export type RemoveAvatarMutation = { @@ -455,14 +477,19 @@ export type RevokeMemberPermissionMutation = { revoke: boolean; }; -export type RevokePageMutationVariables = Exact<{ +export type RevokePublicPageMutationVariables = Exact<{ workspaceId: Scalars['String']['input']; pageId: Scalars['String']['input']; }>; -export type RevokePageMutation = { +export type RevokePublicPageMutation = { __typename?: 'Mutation'; - revokePage: boolean; + revokePublicPage: { + __typename?: 'WorkspacePage'; + id: string; + mode: PublicPageMode; + public: boolean; + }; }; export type SendChangeEmailMutationVariables = Exact<{ @@ -516,13 +543,6 @@ export type SetWorkspacePublicByIdMutation = { updateWorkspace: { __typename?: 'WorkspaceType'; id: string }; }; -export type SharePageMutationVariables = Exact<{ - workspaceId: Scalars['String']['input']; - pageId: Scalars['String']['input']; -}>; - -export type SharePageMutation = { __typename?: 'Mutation'; sharePage: boolean }; - export type SignInMutationVariables = Exact<{ email: Scalars['String']['input']; password: Scalars['String']['input']; @@ -683,9 +703,9 @@ export type Queries = response: GetWorkspacePublicByIdQuery; } | { - name: 'getWorkspaceSharedPagesQuery'; - variables: GetWorkspaceSharedPagesQueryVariables; - response: GetWorkspaceSharedPagesQuery; + name: 'getWorkspacePublicPagesQuery'; + variables: GetWorkspacePublicPagesQueryVariables; + response: GetWorkspacePublicPagesQuery; } | { name: 'getWorkspaceQuery'; @@ -774,6 +794,11 @@ export type Mutations = variables: LeaveWorkspaceMutationVariables; response: LeaveWorkspaceMutation; } + | { + name: 'publishPageMutation'; + variables: PublishPageMutationVariables; + response: PublishPageMutation; + } | { name: 'removeAvatarMutation'; variables: RemoveAvatarMutationVariables; @@ -790,9 +815,9 @@ export type Mutations = response: RevokeMemberPermissionMutation; } | { - name: 'revokePageMutation'; - variables: RevokePageMutationVariables; - response: RevokePageMutation; + name: 'revokePublicPageMutation'; + variables: RevokePublicPageMutationVariables; + response: RevokePublicPageMutation; } | { name: 'sendChangeEmailMutation'; @@ -819,11 +844,6 @@ export type Mutations = variables: SetWorkspacePublicByIdMutationVariables; response: SetWorkspacePublicByIdMutation; } - | { - name: 'sharePageMutation'; - variables: SharePageMutationVariables; - response: SharePageMutation; - } | { name: 'signInMutation'; variables: SignInMutationVariables; diff --git a/packages/frontend/hooks/package.json b/packages/frontend/hooks/package.json index 00db893403..38cee5bcc9 100644 --- a/packages/frontend/hooks/package.json +++ b/packages/frontend/hooks/package.json @@ -8,7 +8,7 @@ "dependencies": { "foxact": "^0.2.20", "image-blob-reduce": "^4.1.0", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "lodash.debounce": "^4.0.8", "p-queue": "^7.4.1", "react": "18.2.0", @@ -18,12 +18,12 @@ "devDependencies": { "@affine/debug": "workspace:*", "@affine/env": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@testing-library/react": "^14.0.0", "@types/image-blob-reduce": "^4.1.3", "@types/lodash.debounce": "^4.0.7", @@ -36,7 +36,6 @@ "@blocksuite/blocks": "*", "@blocksuite/editor": "*", "@blocksuite/global": "*", - "@blocksuite/lit": "*", "@blocksuite/store": "*", "y-provider": "workspace:*" }, @@ -56,9 +55,6 @@ "@blocksuite/global": { "optional": true }, - "@blocksuite/lit": { - "optional": true - }, "@blocksuite/store": { "optional": true }, @@ -66,5 +62,5 @@ "optional": true } }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/hooks/src/affine-async-hooks.ts b/packages/frontend/hooks/src/affine-async-hooks.ts new file mode 100644 index 0000000000..2c31c5f7cc --- /dev/null +++ b/packages/frontend/hooks/src/affine-async-hooks.ts @@ -0,0 +1,29 @@ +import React from 'react'; + +export type AsyncErrorHandler = (error: Error) => void; + +/** + * App should provide a global error handler for async callback in the root. + */ +export const AsyncCallbackContext = React.createContext( + e => { + console.error(e); + } +); + +/** + * Translate async function to sync function and handle error automatically. + * Only accept void function, return data here is meaningless. + */ +export function useAsyncCallback( + callback: (...args: T) => Promise, + deps: any[] +): (...args: T) => void { + const handleAsyncError = React.useContext(AsyncCallbackContext); + return React.useCallback( + (...args: any) => { + callback(...args).catch(e => handleAsyncError(e)); + }, + [...deps] // eslint-disable-line react-hooks/exhaustive-deps + ); +} diff --git a/packages/frontend/i18n/package.json b/packages/frontend/i18n/package.json index 302bcbc053..4d1c8a165c 100644 --- a/packages/frontend/i18n/package.json +++ b/packages/frontend/i18n/package.json @@ -31,11 +31,10 @@ "react-i18next": "^13.3.0" }, "devDependencies": { - "@types/node": "^18.18.5", "@types/prettier": "^3.0.0", "prettier": "^3.0.3", "ts-node": "^10.9.1", "typescript": "^5.2.2" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/i18n/src/index.ts b/packages/frontend/i18n/src/index.ts index 19f1ceeccc..c6988d6098 100644 --- a/packages/frontend/i18n/src/index.ts +++ b/packages/frontend/i18n/src/index.ts @@ -2,6 +2,7 @@ import type { i18n, Resource } from 'i18next'; import i18next from 'i18next'; import { I18nextProvider, + type I18nextProviderProps, initReactI18next, Trans, useTranslation as useRootTranslation, @@ -66,8 +67,9 @@ const standardizeLocale = (language: string) => { return fallbackLng; }; -export const createI18n = () => { - const i18n = i18next.createInstance(); +export const createI18n = (): I18nextProviderProps['i18n'] => { + // @ts-expect-error ts bug + const i18n: I18nextProviderProps['i18n'] = i18next.createInstance(); i18n .use(initReactI18next) .init({ diff --git a/packages/frontend/i18n/src/resources/de.json b/packages/frontend/i18n/src/resources/de.json index 753767f9fb..936a138f07 100644 --- a/packages/frontend/i18n/src/resources/de.json +++ b/packages/frontend/i18n/src/resources/de.json @@ -1,317 +1,226 @@ { + "404 - Page Not Found": "404 - Seite nicht gefunden", + "AFFiNE Cloud": "AFFiNE Cloud", + "AFFiNE Community": "AFFiNE Community", + "About AFFiNE": "Über AFFiNE", "Access level": "Zugriffsberechtigung", - "Add a subpage inside": "Unterseite hinzufügen", + "Add Filter": "Filter hinzufügen", "Add Workspace": "Workspace hinzufügen", "Add Workspace Hint": "Auswählen, was du schon hast", + "Add a subpage inside": "Unterseite hinzufügen", + "Add to Favorites": "Zu Favoriten hinzufügen", + "Add to favorites": "Zu Favoriten hinzufügen", + "Added Successfully": "Erfolgreich hinzugefügt", + "Added to Favorites": "Zu Favoriten hinzugefügt", "All changes are saved locally": "Alle Änderungen sind lokal gespeichert", "All data has been stored in the cloud": "Alle Daten wurden in der Cloud gespeichert.", + "All pages": "Alle Seiten", + "App Version": "App Version", + "Available Offline": "Offline verfügbar", + "Back Home": "Zurück zum Start", "Back to Quick Search": "Zurück zur Schnellsuche", + "Body text": "Haupttext", + "Bold": "Fett", + "Cancel": "Abbrechen", "Change avatar hint": "Avatar von allen Mitgliedern ändern.", "Change workspace name hint": "Name von allen Mitgliedern ändern.", "Check Our Docs": "Sieh dir unsere Dokumentation an", + "Check for updates": "Nach Updates suchen", + "Check for updates automatically": "Automatisch nach Updates suchen", + "Cloud Workspace": "Cloud Workspace", "Cloud Workspace Description": "Alle Daten werden synchronisiert und zu dem AffiNE account <1>{{email}} gespeichert", + "Code block": "Code-Block", "Collaboration": "Zusammenarbeit", "Collaboration Description": "Für die Zusammenarbeit mit anderen Nutzern werden die AFFiNE Cloud Services benötigt.", - "com.affine.aboutAFFiNE.autoCheckUpdate.title": "Automatisch nach Updates suchen", - "com.affine.aboutAFFiNE.changelog.title": "Erfahre was neu ist!", - "com.affine.aboutAFFiNE.checkUpdate.description": "Neue Version ist verfügbar", - "com.affine.aboutAFFiNE.checkUpdate.title": "Nach Updates suchen", - "com.affine.aboutAFFiNE.contact.community": "AFFiNE Community", - "com.affine.aboutAFFiNE.contact.title": "Kontaktiere uns", - "com.affine.aboutAFFiNE.contact.website": "Offizielle Webseite", - "com.affine.aboutAFFiNE.legal.privacy": "Datenschutz", - "com.affine.aboutAFFiNE.legal.tos": "Nutzungsbedingungen", - "com.affine.aboutAFFiNE.subtitle": "Information über AFFiNE", - "com.affine.aboutAFFiNE.title": "Über AFFiNE", - "com.affine.aboutAFFiNE.version.app": "App Version", - "com.affine.aboutAFFiNE.version.title": "Version", - "com.affine.appearanceSettings.color.title": "Farb Schema", - "com.affine.appearanceSettings.date.title": "Datum", - "com.affine.appearanceSettings.dateFormat.title": "Datumsformat", - "com.affine.appearanceSettings.font.title": "Schriftart", - "com.affine.appearanceSettings.theme.title": "Thema", - "com.affine.appUpdater.downloading": "Herunterladen", - "com.affine.appUpdater.installUpdate": "Neustart zum Installieren des Updates", - "com.affine.appUpdater.openDownloadPage": "Download-Seite öffnen", - "com.affine.appUpdater.updateAvailable": "Update verfügbar", - "com.affine.appUpdater.whatsNew": "Erfahre was neu ist!", - "com.affine.backButton": "Zurück zum Start", - "com.affine.banner.content": "Dir gefällt die Demo? <1>Lade den AFFiNE Client herunter, um das volle Potenzial zu entdecken.", - "com.affine.brand.affineCloud": "AFFiNE Cloud", - "com.affine.cloudTempDisable.description": "Wir aktualisieren den AFFiNE Cloud Service und er ist vorübergehend auf dem Client nicht verfügbar. Wenn du auf dem Laufenden bleiben und über die Verfügbarkeit informiert werden möchtest, kannst du das <1>AFFiNE Cloud Anmeldeformular ausfüllen.", - "com.affine.cloudTempDisable.title": "Die AFFiNE Cloud wird gerade aufgerüstet.", - "com.affine.collection-bar.action.tooltip.delete": "Löschen", - "com.affine.collection-bar.action.tooltip.edit": "Bearbeiten", - "com.affine.confirmModal.button.cancel": "Abbrechen", - "com.affine.currentYear": "Aktuelles Jahr", - "com.affine.deleteLeaveWorkspace.leave": "Workspace verlassen", - "com.affine.draw_with_a_blank_whiteboard": "Zeichnen mit einem leeren Whiteboard", - "com.affine.earlier": "Früher", - "com.affine.editCollection.button.cancel": "Abbrechen", - "com.affine.editCollection.button.create": "Erstellen", - "com.affine.editCollection.save": "Speichern", - "com.affine.enableAffineCloudModal.button.cancel": "Abbrechen", - "com.affine.export.error.message": "Bitte versuche es später wieder.", - "com.affine.export.success.title": "Erfolgreich exportiert", - "com.affine.favoritePageOperation.add": "Zu Favoriten hinzufügen", - "com.affine.favoritePageOperation.remove": "Von Favoriten entfernen", - "com.affine.filter": "Filter", - "com.affine.filter.after": "danach", - "com.affine.filter.before": "bevor", - "com.affine.filter.false": "falsch", - "com.affine.filter.is": "ist", - "com.affine.filter.is empty": "ist leer", - "com.affine.filter.is not empty": "ist nicht leer", - "com.affine.filter.is-favourited": "Favorisiert", - "com.affine.filter.true": "wahr", - "com.affine.header.option.add-tag": "Tag hinzufügen", - "com.affine.header.option.duplicate": "Duplizieren", - "com.affine.helpIsland.contactUs": "Kontaktiere uns", - "com.affine.helpIsland.gettingStarted": "Erste Schritte", - "com.affine.helpIsland.helpAndFeedback": "Hilfe und Feedback", - "com.affine.import_file": "Markdown/Notion Unterstützung", - "com.affine.inviteModal.button.cancel": "Abbrechen", - "com.affine.keyboardShortcuts.bodyText": "Haupttext", - "com.affine.keyboardShortcuts.bold": "Fett", - "com.affine.keyboardShortcuts.cancel": "Abbrechen", - "com.affine.keyboardShortcuts.codeBlock": "Code-Block", - "com.affine.keyboardShortcuts.divider": "Trenner", - "com.affine.keyboardShortcuts.goBack": "Zurück gehen", - "com.affine.keyboardShortcuts.goForward": "Vorwärts gehen", - "com.affine.keyboardShortcuts.hand": "Hand", - "com.affine.keyboardShortcuts.heading": "Überschrift {{number}}", - "com.affine.keyboardShortcuts.image": "Bild", - "com.affine.keyboardShortcuts.increaseIndent": "Einzug vergrößern", - "com.affine.keyboardShortcuts.inlineCode": "Inline-Code", - "com.affine.keyboardShortcuts.italic": "Kursiv", - "com.affine.keyboardShortcuts.link": "Hyperlink (mit ausgewähltem Text)", - "com.affine.keyboardShortcuts.newPage": "Neue Seite", - "com.affine.keyboardShortcuts.pen": "Stift (bald verfügbar)", - "com.affine.keyboardShortcuts.quickSearch": "Schnelle Suche", - "com.affine.keyboardShortcuts.redo": "Wiederholen", - "com.affine.keyboardShortcuts.reduceIndent": "Einzug verringern", - "com.affine.keyboardShortcuts.select": "Auswählen", - "com.affine.keyboardShortcuts.selectAll": "Alle auswählen", - "com.affine.keyboardShortcuts.shape": "Form", - "com.affine.keyboardShortcuts.strikethrough": "Durchgestrichen", - "com.affine.keyboardShortcuts.text": "Text (bald verfügbar)", - "com.affine.keyboardShortcuts.title": "Tastaturkürzel", - "com.affine.keyboardShortcuts.underline": "Unterstreichen", - "com.affine.keyboardShortcuts.undo": "Rückgängig", - "com.affine.last30Days": "Letzten 30 Tage", - "com.affine.last7Days": "Letzten 7 Tage", - "com.affine.lastMonth": "Letzter Monat", - "com.affine.lastWeek": "Letzte Woche", - "com.affine.lastYear": "Letztes Jahr", - "com.affine.moveToTrash.confirmModal.description": "{{title}} wird in den Papierkorb verschoben", - "com.affine.moveToTrash.confirmModal.title": "Seite löschen?", - "com.affine.moveToTrash.title": "In Papierkorb verschieben", - "com.affine.nameWorkspace.button.cancel": "Abbrechen", - "com.affine.nameWorkspace.button.create": "Erstellen", - "com.affine.nameWorkspace.description": "Ein Workspace ist dein virtueller Raum zum Erfassen, Gestalten und Planen, ob allein oder gemeinsam im Team.", - "com.affine.nameWorkspace.placeholder": "Name vom Workspace ändern", - "com.affine.nameWorkspace.title": "Workspace benennen", - "com.affine.new_edgeless": "Neuer Edgeless", - "com.affine.new_import": "Importieren", - "com.affine.notFoundPage.backButton": "Zurück zum Start", - "com.affine.notFoundPage.title": "404 - Seite nicht gefunden", - "com.affine.onboarding.title1": "Hyperfusion von Whiteboard und Dokumenten", - "com.affine.onboarding.title2": "Intuitive und robuste, blockbasierte Bearbeitung", - "com.affine.onboarding.videoDescription1": "Wechsle mühelos zwischen dem Seitenmodus für die strukturierte Dokumentenerstellung und dem Whiteboard-Modus für den Ausdruck kreativer Ideen in freier Form.", - "com.affine.onboarding.videoDescription2": "Verwende eine modulare Schnittstelle, um strukturierte Dokumente zu erstellen, indem du Textblöcke, Bilder und andere Inhalte einfach per Drag-and-drop anordnen kannst.", - "com.affine.openPageOperation.newTab": "In neuem Tab öffnen", - "com.affine.pageMode.all": "Alle", - "com.affine.pageMode.edgeless": "Edgeless", - "com.affine.pageMode.page": "Seite", - "com.affine.publicLinkDisableModal.button.cancel": "Abbrechen", - "com.affine.publicLinkDisableModal.button.disable": "Deaktivieren", - "com.affine.publicLinkDisableModal.description": "Wenn du diesen öffentlichen Link deaktivierst, können andere Personen mit diesem Link nicht mehr auf diese Seite zugreifen.", - "com.affine.publicLinkDisableModal.title": "Öffentlichen Link deaktivieren ?", - "com.affine.rootAppSidebar.favorites": "Favoriten", - "com.affine.rootAppSidebar.others": "Andere", - "com.affine.setDBLocation.button.customize": "Anpassen", - "com.affine.setDBLocation.button.defaultLocation": "Standard-Speicherort", - "com.affine.setDBLocation.description": "Wähle den Ort, an dem du deinen Workspace erstellen möchten. Die Daten vom Workspace werden standardmäßig lokal gespeichert.", - "com.affine.setDBLocation.title": "Datenbankstandort festlegen", - "com.affine.setDBLocation.tooltip.defaultLocation": "Standardmäßig wird unter {{location}} gespeichert.", - "com.affine.setSyncingMode.button.continue": "Fortfahren", - "com.affine.setSyncingMode.cloud": "Geräteübergreifende Synchronisierung mit AFFiNE Cloud", - "com.affine.setSyncingMode.deviceOnly": "Nur auf dem aktuellen Gerät verwenden", - "com.affine.setSyncingMode.title.added": "Erfolgreich hinzugefügt", - "com.affine.setSyncingMode.title.created": "Erfolgreich erstellt", - "com.affine.settings.remove-workspace": "Workspace entfernen", - "com.affine.settingSidebar.settings.general": "Generelles", - "com.affine.settingSidebar.settings.workspace": "Workspace", - "com.affine.settingSidebar.title": "Einstellungen", - "com.affine.shortcutsTitle.edgeless": "Edgeless", - "com.affine.shortcutsTitle.general": "Generelles", - "com.affine.shortcutsTitle.markdownSyntax": "Markdown Syntax", - "com.affine.shortcutsTitle.page": "Seite", - "com.affine.sidebarSwitch.collapse": "Seitenleiste einklappen", - "com.affine.sidebarSwitch.expand": "Seitenleiste ausklappen", - "com.affine.themeSettings.dark": "dunkel", - "com.affine.themeSettings.light": "hell", - "com.affine.themeSettings.system": "system", - "com.affine.toastMessage.addedFavorites": "Zu Favoriten hinzugefügt", - "com.affine.toastMessage.edgelessMode": "Edgeless-Modus", - "com.affine.toastMessage.movedTrash": "In Papierkorb verschoben", - "com.affine.toastMessage.pageMode": "Seitenmodus", - "com.affine.toastMessage.permanentlyDeleted": "Dauerhaft gelöscht", - "com.affine.toastMessage.removedFavorites": "Von Favoriten entfernt", - "com.affine.toastMessage.restored": "{{title}} wiederhergestellt", - "com.affine.toastMessage.successfullyDeleted": "Erfolgreich gelöscht", - "com.affine.today": "Heute", - "com.affine.trashOperation.delete": "Löschen", - "com.affine.trashOperation.delete.description": "Das Löschen kann nicht rückgängig gemacht werden. Fortfahren?", - "com.affine.trashOperation.delete.title": "Dauerhaft löschen", - "com.affine.trashOperation.deletePermanently": "Dauerhaft löschen", - "com.affine.trashOperation.restoreIt": "Wiederherstellen", - "com.affine.workspace.cannot-delete": "Du kannst den letzten Workspace nicht löschen", - "com.affine.workspaceDelete.button.cancel": "Abbrechen", - "com.affine.workspaceDelete.button.delete": "Löschen", - "com.affine.workspaceDelete.description": "Workspace <1>{{workspace}} wird gelöscht und der Inhalt wird verloren sein. Dies kann nicht rückgängig gemacht werden.", - "com.affine.workspaceDelete.description2": "Das Löschen von <1>{{workspace}} wird sowohl lokale als auch Daten in der Cloud löschen. Dies kann nicht rückgängig gemacht werden.", - "com.affine.workspaceDelete.placeholder": "Bitte zur Bestätigung den Workspace-Namen eingeben", - "com.affine.workspaceDelete.title": "Workspace löschen", - "com.affine.workspaceLeave.button.cancel": "Abbrechen", - "com.affine.workspaceLeave.button.leave": "Verlassen", - "com.affine.workspaceLeave.description": "Nach dem Verlassen hast du keinen Zugriff mehr auf die Inhalte dieses Workspaces.", - "com.affine.workspaceSubPath.all": "Alle Seiten", - "com.affine.workspaceSubPath.trash": "Papierkorb", - "com.affine.workspaceType.cloud": "Cloud Workspace", - "com.affine.workspaceType.joined": "Workspace beigetreten", - "com.affine.workspaceType.local": "Lokaler Workspace", - "com.affine.workspaceType.offline": "Offline verfügbar", - "com.affine.write_with_a_blank_page": "Schreibe mit einer leeren Seite", - "com.affine.yesterday": "Gestern", + "Collapse sidebar": "Seitenleiste einklappen", "Confirm": "Bestätigen", "Connector": "Verbindung (bald verfügbar)", + "Contact Us": "Kontaktiere uns", + "Contact with us": "Kontaktiere uns", + "Continue": "Fortfahren", "Continue with Google": "Mit Google fortfahren", "Convert to ": "Konvertiere zu", "Copied link to clipboard": "Link in die Zwischenablage kopiert", "Copy": "Kopieren", "Copy Link": "Link kopieren", - "core": "Core", "Create": "Erstellen", "Create Or Import": "Erstellen oder importieren", "Create Shared Link Description": "Erstelle einen Link, den du leicht mit jedem teilen kannst.", "Create your own workspace": "Eigenen Workspace erstellen", "Created": "Erstellt", + "Created Successfully": "Erfolgreich erstellt", "Created with": "Erstellt mit", - "Data sync mode": "Daten-Sync Modus", + "Customize": "Anpassen", "DB_FILE_ALREADY_LOADED": "Datenbankdatei bereits geladen", "DB_FILE_INVALID": "Ungültige Datenbankdatei", "DB_FILE_PATH_INVALID": "Pfad der Datenbankdatei ungültig", + "Data sync mode": "Daten-Sync Modus", + "Date": "Datum", + "Date Format": "Datumsformat", + "Default Location": "Standard-Speicherort", + "Default db location hint": "Standardmäßig wird unter {{location}} gespeichert.", "Delete": "Löschen", "Delete Member?": "Mitglied löschen?", + "Delete Workspace": "Workspace löschen", + "Delete Workspace Description": "Workspace <1>{{workspace}} wird gelöscht und der Inhalt wird verloren sein. Dies kann nicht rückgängig gemacht werden.", + "Delete Workspace Description2": "Das Löschen von <1>{{workspace}} wird sowohl lokale als auch Daten in der Cloud löschen. Dies kann nicht rückgängig gemacht werden.", "Delete Workspace Label Hint": "Wenn dieser Workspace gelöscht wird, wird sein gesamter Inhalt für alle Benutzer dauerhaft gelöscht. Niemand wird in der Lage sein, den Inhalt dieses Workspaces wiederherzustellen.", "Delete Workspace placeholder": "Bitte gib als Bestätigung \"Delete\" ein", + "Delete page?": "Seite löschen?", + "Delete permanently": "Dauerhaft löschen", "Disable": "Deaktivieren", "Disable Public Link": "Öffentlichen Link deaktivieren", + "Disable Public Link ?": "Öffentlichen Link deaktivieren ?", + "Disable Public Link Description": "Wenn du diesen öffentlichen Link deaktivierst, können andere Personen mit diesem Link nicht mehr auf diese Seite zugreifen.", "Disable Public Sharing": "Öffentliche Freigabe deaktivieren", + "Discover what's new": "Erfahre was neu ist!", + "Discover what's new!": "Erfahre was neu ist!", + "Divider": "Trenner", "Download all data": "Alle Daten herunterladen", "Download core data": "Core Daten herunterladen", "Download data": "{{CoreOrAll}} Daten herunterladen", "Download data Description1": "Es verbraucht mehr Speicherplatz auf deinem Gerät.", "Download data Description2": "Es verbraucht nur wenig Speicherplatz auf deinem Gerät.", + "Edgeless": "Edgeless", "Edit": "Bearbeiten", "Edit Filter": "Filter bearbeiten", - "emptyAllPages": "Dieser Workspace ist leer. Erstelle eine Seite, um sie zu bearbeiten.", - "emptyFavorite": "Klicke auf \"Zu Favoriten hinzufügen\" und die Seite wird hier erscheinen", - "emptySharedPages": "Freigegebene Seiten werden hier angezeigt.", - "emptyTrash": "Klicke auf \"In Papierkorb verschieben\" und die Seite wird hier erscheinen.", "Enable": "Aktivieren", "Enable AFFiNE Cloud": "AFFiNE Cloud aktivieren", "Enable AFFiNE Cloud Description": "Falls aktiviert, werden die Daten in diesem Workspace via der AFFiNE Cloud gesichert und synchronisiert.", "Enabled success": "Aktivierung erfolgreich", "Exclude from filter": "Von Filter ausschließen", + "Expand sidebar": "Seitenleiste ausklappen", "Export": "Exportieren", "Export AFFiNE backup file": "AFFiNE-Backup als Datei exportieren", "Export Description": "Du kannst alle Workspace Daten zur Sicherung exportieren, und die exportierten Daten können wieder importiert werden.", "Export Shared Pages Description": "Laden eine statische Kopie dieser Seite herunter, um sie mit anderen zu teilen.", + "Export Workspace": "Das Exportieren von Workspace <1>{{workspace}} kommt bald", + "Export failed": "Export fehlgeschlagen", "Export success": "Export erfolgreich", "Export to HTML": "Zu HTML exportieren", "Export to Markdown": "Zu Markdown exportieren", "Export to PDF": "Zu PDF exportieren", "Export to PNG": "Zu PNG exportieren", - "Export Workspace": "Das Exportieren von Workspace <1>{{workspace}} kommt bald", + "FILE_ALREADY_EXISTS": "Datei existiert bereits", "Failed to publish workspace": "Workspace Veröffentlichung fehlgeschlagen", - "Favorite": "Favorit", + "Favorite": "Favorisieren", "Favorite pages for easy access": "Favoriten-Seiten für schnellen Zugriff", "Favorited": "Favorisiert", - "FILE_ALREADY_EXISTS": "Datei existiert bereits", + "Favorites": "Favoriten", + "Filters": "Filter", "Find 0 result": "0 Ergebnisse gefunden", "Find results": "{{number}} Ergebnis(se) gefunden", + "Font Style": "Schriftart", "Force Sign Out": "Abmeldung erwingen", + "General": "Generelles", "Get in touch!": "Kontaktiere uns!", "Get in touch! Join our communities": "Nimm teil! Treten Sie unseren Communities bei.", "Get in touch! Join our communities.": "Bleib mit uns in Kontakt und trete unseren Communitys bei!", + "Go Back": "Zurück gehen", + "Go Forward": "Vorwärts gehen", "Got it": "Verstanden", + "Group": "Gruppieren", + "Hand": "Hand", + "Heading": "Überschrift {{number}}", + "Help and Feedback": "Hilfe und Feedback", "How is AFFiNE Alpha different?": "Worin unterscheidet sich AFFiNE Alpha?", + "Image": "Bild", "Import": "Importieren", + "Increase indent": "Einzug vergrößern", "Info": "Info", + "Inline code": "Inline-Code", + "Invitation sent": "Einladung gesendet", "Invite": "Einladen", "Invite Members": "Mitglieder einladen", "Invite placeholder": "E-Mails durchsuchen (Unterstützt nur Gmail)", - "is a Cloud Workspace": "ist ein Cloud Workspace.", - "is a Local Workspace": "ist ein lokaler Workspace.", "It takes up little space on your device": "Es nimmt nur wenig Platz auf deinem Gerät ein.", "It takes up little space on your device.": "Es verbraucht nur wenig Speicherplatz auf deinem Gerät.", "It takes up more space on your device": "Es verbraucht mehr Speicherplatz auf deinem Gerät.", "It takes up more space on your device.": "Es verbraucht mehr Speicherplatz auf deinem Gerät.", + "Italic": "Kursiv", + "Joined Workspace": "Workspace beigetreten", "Jump to": "Springe zu", + "Keyboard Shortcuts": "Tastaturkürzel", + "Leave": "Verlassen", + "Leave Workspace": "Workspace verlassen", + "Leave Workspace Description": "Nach dem Verlassen hast du keinen Zugriff mehr auf die Inhalte dieses Workspaces.", + "Link": "Hyperlink (mit ausgewähltem Text)", "Loading": "Lade...", + "Local Workspace": "Lokaler Workspace", "Local Workspace Description": "Alle Daten sind auf dem aktuellen Gerät gespeichert. Du kannst AFFiNE Cloud für diesen Workspace aktivieren, um deine Daten mit der Cloud zu synchronisieren.", - "login success": "Login erfolgreich", + "Markdown Syntax": "Markdown Syntax", "Member": "Mitglied", "Member has been removed": "{{name}} wurde entfernt", "Members": "Mitglieder", - "mobile device": "Sieht aus, als ob du ein mobiles Gerät nutzt.", - "mobile device description": "Wir arbeiten noch an der Unterstützung für mobile Geräte und empfehlen dir, ein Desktop-Gerät zu verwenden.", "Move folder": "Ordner verschieben", "Move folder hint": "Neuen Speicherort auswählen.", "Move folder success": "Ordnerverschiebung erfolgreich", "Move page to": "Seite verschieben nach...", "Move page to...": "Seite verschieben nach...", "Move to": "Verschieben zu", + "Move to Trash": "In Papierkorb verschieben", "Moved to Trash": "In Papierkorb verschoben", "My Workspaces": "Meine Workspaces", + "Name Your Workspace": "Workspace benennen", "Navigation Path": "Navigationspfad", "New Keyword Page": "Neue '{{query}}' Seite", "New Page": "Neue Seite", "New Workspace": "Neuer Workspace", + "New version is ready": "Neue Version ist verfügbar", "No item": "Kein Inhalt", "Non-Gmail": "Nur Gmail wird unterstützt", "Not now": "Vielleicht später", + "Note": "Notiz", + "Official Website": "Offizielle Webseite", + "Open Workspace Settings": "Workspace Einstellungen öffnen", "Open folder": "Ordner öffnen", "Open folder hint": "Prüfe, wo sich der Speicherordner befindet.", - "Open Workspace Settings": "Workspace Einstellungen öffnen", + "Open in new tab": "In neuem Tab öffnen", "Organize pages to build knowledge": "Seiten organisieren, um Wissen aufzubauen", "Owner": "Besitzer", + "Page": "Seite", "Paper": "Papier", + "Pen": "Stift (bald verfügbar)", "Pending": "Ausstehend", + "Permanently deleted": "Dauerhaft gelöscht", "Pivots": "Pivots", + "Placeholder of delete workspace": "Bitte zur Bestätigung den Workspace-Namen eingeben", "Please make sure you are online": "Bitte stelle sicher, dass du online bist", + "Privacy": "Datenschutz", "Publish": "Veröffentlichen", "Publish to web": "Im Web veröffentlichen", "Published Description": "Der aktuelle Workspace wurde im Web veröffentlicht, jeder mit dem Link kann den Inhalt sehen.", "Published to Web": "Im Web veröffentlicht", "Publishing": "Für das Veröffentlichen im Web werden die AFFiNE Cloud Services benötigt.", "Publishing Description": "Nach der Veröffentlichung im Web kann jeder den Inhalt dieses Workspaces über den Link einsehen.", + "Quick Search": "Schnelle Suche", "Quick search": "Schnelle Suche", "Quick search placeholder": "Schnelle Suche...", "Quick search placeholder2": "Suche in {{workspace}}", + "RFP": "Seiten können frei zu Pivots hinzugefügt/entfernt werden und bleiben über \"Alle Seiten\" zugänglich.", "Recent": "Neueste", - "recommendBrowser": "Wir empfehlen den <1>Chrome Browser für die beste Nutzererfahrung.", + "Redo": "Wiederholen", + "Reduce indent": "Einzug verringern", "Remove from Pivots": "Von Pivots entfernen", + "Remove from favorites": "Von Favoriten entfernen", "Remove from workspace": "Vom Workspace entfernen", + "Remove photo": "Foto entfernen", + "Removed from Favorites": "Von Favoriten entfernt", + "Removed successfully": "Erfolgreich entfernt", "Rename": "Umbenennen", "Restart Install Client Update": "Neustart zum Installieren des Updates", + "Restore it": "Wiederherstellen", "Retain cached cloud data": "Zwischengespeicherte Cloud-Daten behalten", "Retain local cached data": "Lokale, zwischengespeicherte Daten beibehalten", - "RFP": "Seiten können frei zu Pivots hinzugefügt/entfernt werden und bleiben über \"Alle Seiten\" zugänglich.", + "Save": "Speichern", "Saved then enable AFFiNE Cloud": "Alle Änderungen werden lokal gespeichert. Klicke hier, um AFFiNE Cloud zu aktivieren.", + "Select": "Auswählen", + "Select All": "Alle auswählen", + "Set a Workspace name": "Name vom Workspace ändern", + "Set database location": "Datenbankstandort festlegen", "Set up an AFFiNE account to sync data": "Für das Synchronisieren wird ein AFFiNE Account benötigt", + "Settings": "Einstellungen", + "Shape": "Form", "Share Menu Public Workspace Description1": "Laden andere ein, dem Workspace beizutreten oder veröffentliche ihn im Internet.", "Share Menu Public Workspace Description2": "Der aktuelle Workspace wurde im Internet als öffentlicher Workspace veröffentlicht.", "Share with link": "Mit Link teilen", @@ -326,30 +235,117 @@ "Skip": "Überspringen", "Stay logged out": "Abgemeldet bleiben", "Sticky": "Haftnotiz (bald verfügbar)", - "still designed": "(Diese Seite ist noch im Aufbau.)", "Stop publishing": "Veröffentlichen stoppen", + "Storage": "Speicher", "Storage Folder": "Speicherordner", + "Strikethrough": "Durchgestrichen", + "Successfully deleted": "Erfolgreich gelöscht", + "Successfully enabled AFFiNE Cloud": "AFFiNE Cloud erfolgreich aktiviert", + "Successfully joined!": "Erfolgreich beigetreten!", "Sync": "Sync", + "Sync across devices with AFFiNE Cloud": "Geräteübergreifende Synchronisierung mit AFFiNE Cloud", "Synced with AFFiNE Cloud": "Synchronisiert mit AFFiNE Cloud", "Tags": "Tags", + "Terms of Use": "Nutzungsbedingungen", + "Text": "Text (bald verfügbar)", + "Theme": "Thema", "Title": "Titel", + "Trash": "Papierkorb", + "TrashButtonGroupDescription": "Das Löschen kann nicht rückgängig gemacht werden. Fortfahren?", + "TrashButtonGroupTitle": "Dauerhaft löschen", "UNKNOWN_ERROR": "Unbekannter Fehler", + "Underline": "Unterstreichen", + "Undo": "Rückgängig", + "Ungroup": "Gruppierung aufheben", "Untitled": "Unbenannt", "Update Available": "Update verfügbar", "Update workspace name success": "Update vom Workspace-Namen erfolgreich", "Updated": "Aktualisiert", - "upgradeBrowser": "Bitte aktualisiere auf die neueste Chrome-Version, um eine optimale Nutzererfahrung zu gewährleisten.", "Upload": "Hochladen", + "Use on current device only": "Nur auf dem aktuellen Gerät verwenden", "Users": "Benutzer", + "Version": "Version", "View Navigation Path": "Navigationspfad ansehen", + "Visit Workspace": "Workspace besuchen", "Wait for Sync": "Warte auf Sync", - "will delete member": "wird Mitglied löschen", "Workspace Avatar": "Workspace Avatar", "Workspace Icon": "Workspace Icon", "Workspace Name": "Workspace Name", "Workspace Not Found": "Workspace nicht gefunden", "Workspace Owner": "Workspace-Besitzer", + "Workspace Profile": "Workspace Profil", "Workspace Settings": "Workspace Einstellungen", + "Workspace Settings with name": "{{name}}s Einstellungen", "Workspace Type": "Workspace Typ", - "You cannot delete the last workspace": "Du kannst den letzten Workspace nicht löschen" + "Workspace database storage description": "Wähle den Ort, an dem du deinen Workspace erstellen möchten. Die Daten vom Workspace werden standardmäßig lokal gespeichert.", + "Workspace description": "Ein Workspace ist dein virtueller Raum zum Erfassen, Gestalten und Planen, ob allein oder gemeinsam im Team.", + "You cannot delete the last workspace": "Du kannst den letzten Workspace nicht löschen", + "all": "Alle", + "com.affine.banner.content": "Dir gefällt die Demo? <1>Lade den AFFiNE Client herunter, um das volle Potenzial zu entdecken.", + "com.affine.cloudTempDisable.description": "Wir aktualisieren den AFFiNE Cloud Service und er ist vorübergehend auf dem Client nicht verfügbar. Wenn du auf dem Laufenden bleiben und über die Verfügbarkeit informiert werden möchtest, kannst du das <1>AFFiNE Cloud Anmeldeformular ausfüllen.", + "com.affine.cloudTempDisable.title": "Die AFFiNE Cloud wird gerade aufgerüstet.", + "com.affine.collection-bar.action.tooltip.delete": "Löschen", + "com.affine.collection-bar.action.tooltip.edit": "Bearbeiten", + "com.affine.currentYear": "Aktuelles Jahr", + "com.affine.draw_with_a_blank_whiteboard": "Zeichnen mit einem leeren Whiteboard", + "com.affine.earlier": "Früher", + "com.affine.edgelessMode": "Edgeless-Modus", + "com.affine.export.error.message": "Bitte versuche es später wieder.", + "com.affine.export.success.title": "Erfolgreich exportiert", + "com.affine.filter": "Filter", + "com.affine.filter.after": "danach", + "com.affine.filter.before": "bevor", + "com.affine.filter.false": "falsch", + "com.affine.filter.is": "ist", + "com.affine.filter.is empty": "ist leer", + "com.affine.filter.is not empty": "ist nicht leer", + "com.affine.filter.is-favourited": "Favorisiert", + "com.affine.filter.true": "wahr", + "com.affine.header.option.add-tag": "Tag hinzufügen", + "com.affine.header.option.duplicate": "Duplizieren", + "com.affine.helpIsland.gettingStarted": "Erste Schritte", + "com.affine.import_file": "Markdown/Notion Unterstützung", + "com.affine.last30Days": "Letzten 30 Tage", + "com.affine.last7Days": "Letzten 7 Tage", + "com.affine.lastMonth": "Letzter Monat", + "com.affine.lastWeek": "Letzte Woche", + "com.affine.lastYear": "Letztes Jahr", + "com.affine.new_edgeless": "Neuer Edgeless", + "com.affine.new_import": "Importieren", + "com.affine.onboarding.title1": "Hyperfusion von Whiteboard und Dokumenten", + "com.affine.onboarding.title2": "Intuitive und robuste, blockbasierte Bearbeitung", + "com.affine.onboarding.videoDescription1": "Wechsle mühelos zwischen dem Seitenmodus für die strukturierte Dokumentenerstellung und dem Whiteboard-Modus für den Ausdruck kreativer Ideen in freier Form.", + "com.affine.onboarding.videoDescription2": "Verwende eine modulare Schnittstelle, um strukturierte Dokumente zu erstellen, indem du Textblöcke, Bilder und andere Inhalte einfach per Drag-and-drop anordnen kannst.", + "com.affine.pageMode": "Seitenmodus", + "com.affine.settings.about.message": "Information über AFFiNE", + "com.affine.settings.remove-workspace": "Workspace entfernen", + "com.affine.settings.workspace": "Workspace", + "com.affine.today": "Heute", + "com.affine.updater.downloading": "Herunterladen", + "com.affine.updater.open-download-page": "Download-Seite öffnen", + "com.affine.updater.restart-to-update": "Neustart zum Installieren des Updates", + "com.affine.updater.update-available": "Update verfügbar", + "com.affine.workspace.cannot-delete": "Du kannst den letzten Workspace nicht löschen", + "com.affine.write_with_a_blank_page": "Schreibe mit einer leeren Seite", + "com.affine.yesterday": "Gestern", + "core": "Core", + "dark": "dunkel", + "emptyAllPages": "Dieser Workspace ist leer. Erstelle eine Seite, um sie zu bearbeiten.", + "emptyFavorite": "Klicke auf \"Zu Favoriten hinzufügen\" und die Seite wird hier erscheinen", + "emptySharedPages": "Freigegebene Seiten werden hier angezeigt.", + "emptyTrash": "Klicke auf \"In Papierkorb verschieben\" und die Seite wird hier erscheinen.", + "is a Cloud Workspace": "ist ein Cloud Workspace.", + "is a Local Workspace": "ist ein lokaler Workspace.", + "light": "hell", + "login success": "Login erfolgreich", + "mobile device": "Sieht aus, als ob du ein mobiles Gerät nutzt.", + "mobile device description": "Wir arbeiten noch an der Unterstützung für mobile Geräte und empfehlen dir, ein Desktop-Gerät zu verwenden.", + "others": "Andere", + "recommendBrowser": "Wir empfehlen den <1>Chrome Browser für die beste Nutzererfahrung.", + "restored": "{{title}} wiederhergestellt", + "still designed": "(Diese Seite ist noch im Aufbau.)", + "system": "system", + "upgradeBrowser": "Bitte aktualisiere auf die neueste Chrome-Version, um eine optimale Nutzererfahrung zu gewährleisten.", + "will be moved to Trash": "{{title}} wird in den Papierkorb verschoben", + "will delete member": "wird Mitglied löschen" } diff --git a/packages/frontend/i18n/src/resources/en.json b/packages/frontend/i18n/src/resources/en.json index bc73c4fdf4..8bfeed413e 100644 --- a/packages/frontend/i18n/src/resources/en.json +++ b/packages/frontend/i18n/src/resources/en.json @@ -1,17 +1,343 @@ { + "404 - Page Not Found": "404 - Page Not Found", + "404.back": "Back to My Content", + "404.hint": "Sorry, you do not have access or this content does not exist...", + "404.signOut": "Sign in to another account", + "AFFiNE Cloud": "AFFiNE Cloud", + "AFFiNE Community": "AFFiNE Community", + "About AFFiNE": "About AFFiNE", "Access level": "Access level", - "Add a subpage inside": "Add a subpage inside", + "Actions": "Actions", + "Add Filter": "Add Filter", "Add Workspace": "Add Workspace", "Add Workspace Hint": "Select the existed database file", + "Add a subpage inside": "Add a subpage inside", + "Add to Favorites": "Add to Favourites", + "Add to favorites": "Add to favourites", + "Added Successfully": "Added Successfully", + "Added to Favorites": "Added to Favourites", "All changes are saved locally": "All changes are saved locally", "All data has been stored in the cloud": "All data has been stored in the cloud. ", + "All pages": "All pages", + "App Version": "App Version", + "Appearance Settings": "Appearance Settings", + "Append to Daily Note": "Append to Daily Note", + "Available Offline": "Available Offline", + "Back Home": "Back Home", "Back to Quick Search": "Back to Quick Search", + "Back to all": "Back to all", + "Body text": "Body text", + "Bold": "Bold", + "Cancel": "Cancel", "Change avatar hint": "New avatar will be shown for everyone.", "Change workspace name hint": "New name will be shown for everyone.", + "Changelog description": "View the AFFiNE Changelog.", + "Check Keyboard Shortcuts quickly": "Check Keyboard Shortcuts quickly", "Check Our Docs": "Check Our Docs", + "Check for updates": "Check for updates", + "Check for updates automatically": "Check for updates automatically", + "Choose your font style": "Choose your font style", + "Click to replace photo": "Click to replace photo", + "Client Border Style": "Client Border Style", + "Cloud Workspace": "Cloud Workspace", "Cloud Workspace Description": "All data will be synchronised and saved to the AFFiNE account <1>{{email}}", + "Code block": "Code block", "Collaboration": "Collaboration", "Collaboration Description": "Collaborating with other members requires AFFiNE Cloud service.", + "Collapse sidebar": "Collapse sidebar", + "Collections": "Collections", + "Communities": "Communities", + "Confirm": "Confirm", + "Connector": "Connector", + "Contact Us": "Contact us", + "Contact with us": "Contact Us", + "Continue": "Continue", + "Continue with Google": "Continue with Google", + "Convert to ": "Convert to ", + "Copied link to clipboard": "Copied link to clipboard", + "Copy": "Copy", + "Copy Link": "Copy Link", + "Create": "Create", + "Create Or Import": "Create or Import", + "Create Shared Link Description": "Create a link you can easily share with anyone.", + "Create a collection": "Create a collection", + "Create your own workspace": "Create your own workspace", + "Created": "Created", + "Created Successfully": "Created Successfully", + "Created with": "Created with", + "Curve Connector": "Curve Connector", + "Customize": "Customise", + "Customize your AFFiNE Appearance": "Customise your AFFiNE Appearance", + "DB_FILE_ALREADY_LOADED": "Database file already loaded", + "DB_FILE_INVALID": "Invalid Database file", + "DB_FILE_MIGRATION_FAILED": "Database file migration failed", + "DB_FILE_PATH_INVALID": "Database file path invalid", + "Data sync mode": "Data sync mode", + "Date": "Date", + "Date Format": "Date Format", + "Default Location": "Default Location", + "Default db location hint": "By default will be saved to {{location}}", + "Delete": "Delete", + "Delete Member?": "Delete Member?", + "Delete Workspace": "Delete Workspace", + "Delete Workspace Description": "Deleting <1>{{workspace}} cannot be undone, please proceed with caution. All contents will be lost.", + "Delete Workspace Description2": "Deleting <1>{{workspace}} will delete both local and cloud data, this operation cannot be undone, please proceed with caution.", + "Delete Workspace Label Hint": "After deleting this Workspace, you will permanently delete all of its content for everyone. No one will be able to recover the content of this Workspace.", + "Delete Workspace placeholder": "Please type “Delete” to confirm", + "Delete page?": "Delete page?", + "Delete permanently": "Delete permanently", + "Disable": "Disable", + "Disable Public Link": "Disable Public Link", + "Disable Public Link ?": "Disable Public Link ?", + "Disable Public Link Description": "Disabling this public link will prevent anyone with the link from accessing this page.", + "Disable Public Sharing": "Disable Public Sharing", + "Discover what's new": "Discover what's new", + "Discover what's new!": "Discover what's new!", + "Display Language": "Display Language", + "Divider": "Divider", + "Download all data": "Download all data", + "Download core data": "Download core data", + "Download data": "Download {{CoreOrAll}} data", + "Download data Description1": "It takes up more space on your device.", + "Download data Description2": "It takes up little space on your device.", + "Download updates automatically": "Download updates automatically", + "Early Access Stage": "Early Access Stage", + "Edgeless": "Edgeless", + "Edit": "Edit", + "Edit Filter": "Edit Filter", + "Editor Version": "Editor Version", + "Elbowed Connector": "Elbowed Connector", + "Enable": "Enable", + "Enable AFFiNE Cloud": "Enable AFFiNE Cloud", + "Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronised via AFFiNE Cloud.", + "Enable cloud hint": "The following functions rely on AFFiNE Cloud. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", + "Enabled success": "Enabled success", + "Exclude from filter": "Exclude from filter", + "Expand sidebar": "Expand sidebar", + "Expand/Collapse Sidebar": "Expand/Collapse Sidebar", + "Export": "Export", + "Export AFFiNE backup file": "Export AFFiNE backup file", + "Export Description": "You can export the entire Workspace data for backup, and the exported data can be re-imported.", + "Export Shared Pages Description": "Download a static copy of your page to share with others.", + "Export Workspace": "Export Workspace <1>{{workspace}} is coming soon", + "Export failed": "Export failed", + "Export success": "Export success", + "Export to HTML": "Export to HTML", + "Export to Markdown": "Export to Markdown", + "Export to PDF": "Export to PDF", + "Export to PNG": "Export to PNG", + "FILE_ALREADY_EXISTS": "File already exists", + "Failed to publish workspace": "Failed to publish workspace", + "Favorite": "Favourite", + "Favorite pages for easy access": "Favourite pages for easy access", + "Favorited": "Favourited", + "Favorites": "Favourites", + "Filters": "Filters", + "Find 0 result": "Found 0 results", + "Find results": "Found {{number}} result(s)", + "Font Style": "Font Style", + "Force Sign Out": "Force Sign Out", + "Full width Layout": "Full width Layout", + "General": "General", + "Get in touch!": "Get in touch!", + "Get in touch! Join our communities": "Get in touch! Join our communities.", + "Get in touch! Join our communities.": "Get in touch! Join our communities.", + "Go Back": "Go Back", + "Go Forward": "Go Forward", + "Got it": "Got it", + "Group": "Group", + "Group as Database": "Group as Database", + "Hand": "Hand", + "Heading": "Heading {{number}}", + "Help and Feedback": "Help and Feedback", + "How is AFFiNE Alpha different?": "How is AFFiNE Alpha different?", + "Image": "Image", + "Import": "Import", + "Increase indent": "Increase indent", + "Info": "Info", + "Info of legal": "Legal Info", + "Inline code": "Inline code", + "Invitation sent": "Invitation sent", + "Invitation sent hint": "Invited members have been notified with email to join this Workspace.", + "Invite": "Invite", + "Invite Members": "Invite Members", + "Invite Members Message": "Invited members will collaborate with you in current Workspace", + "Invite placeholder": "Search mail (Gmail support only)", + "It takes up little space on your device": "It takes up little space on your device.", + "It takes up little space on your device.": "It takes up little space on your device.", + "It takes up more space on your device": "It takes up more space on your device.", + "It takes up more space on your device.": "It takes up more space on your device.", + "Italic": "Italic", + "Joined Workspace": "Joined Workspace", + "Jump to": "Jump to", + "Keyboard Shortcuts": "Keyboard shortcuts", + "Leave": "Leave", + "Leave Workspace": "Leave Workspace", + "Leave Workspace Description": "After you leave, you will no longer be able to access the contents of this workspace.", + "Leave Workspace hint": "After you leave, you will not be able to access content within this workspace.", + "Link": "Hyperlink (with selected text)", + "Loading": "Loading...", + "Loading All Workspaces": "Loading All Workspaces", + "Local": "Local", + "Local Workspace": "Local Workspace", + "Local Workspace Description": "All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", + "Markdown Syntax": "Markdown Syntax", + "Member": "Member", + "Member has been removed": "{{name}} has been removed", + "Members": "Members", + "Members hint": "Manage members here, invite new member by email.", + "Move Down": "Move Down", + "Move Up": "Move Up", + "Move folder": "Move folder", + "Move folder hint": "Select a new storage location.", + "Move folder success": "Move folder success", + "Move page to": "Move page to...", + "Move page to...": "Move page to...", + "Move to": "Move to", + "Move to Trash": "Move to Trash", + "Moved to Trash": "Moved to Trash", + "My Workspaces": "My Workspaces", + "Name Your Workspace": "Name Your Workspace", + "NativeTitleBar": "Native Titlebar", + "Navigation Path": "Navigation Path", + "New Keyword Page": "New '{{query}}' page", + "New Page": "New Page", + "New Workspace": "New Workspace", + "New version is ready": "New version is ready", + "No item": "No item", + "Non-Gmail": "Non-Gmail is not supported", + "None yet": "None yet", + "Not now": "Not now", + "Note": "Note", + "Official Website": "Official Website", + "Open Workspace Settings": "Open Workspace Settings", + "Open folder": "Open folder", + "Open folder hint": "Check the where the storage folder is located.", + "Open in new tab": "Open in new tab", + "Organize pages to build knowledge": "Organise pages to build knowledge", + "Owner": "Owner", + "Page": "Page", + "Paper": "Paper", + "Pen": "Pen", + "Pending": "Pending", + "Permanently deleted": "Permanently deleted", + "Pivots": "Pivots", + "Placeholder of delete workspace": "Please type workspace name to confirm", + "Please make sure you are online": "Please make sure you are online", + "Privacy": "Privacy", + "Publish": "Publish", + "Publish to web": "Publish to web", + "Published Description": " The current workspace has been published to the web, everyone can view the contents of this workspace through the link.", + "Published hint": "Visitors can view the contents through the provided link.", + "Published to Web": "Published to Web", + "Publishing": "Publishing to web requires AFFiNE Cloud service.", + "Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.", + "Quick Search": "Quick Search", + "Quick search": "Quick search", + "Quick search placeholder": "Quick Search...", + "Quick search placeholder2": "Search in {{workspace}}", + "RFP": "Pages can be freely added/removed from pivots, remaining accessible from \"All Pages\".", + "Recent": "Recent", + "Redo": "Redo", + "Reduce indent": "Reduce indent", + "Remove from Pivots": "Remove from Pivots", + "Remove from favorites": "Remove from favourites", + "Remove from workspace": "Remove from workspace", + "Remove photo": "Remove photo", + "Remove special filter": "Remove special filter", + "Removed from Favorites": "Removed from Favourites", + "Removed successfully": "Removed successfully", + "Rename": "Rename", + "Restart Install Client Update": "Restart to install update", + "Restore it": "Restore it", + "Retain cached cloud data": "Retain cached cloud data", + "Retain local cached data": "Retain local cached data", + "Save": "Save", + "Save As New Collection": "Save As New Collection", + "Save as New Collection": "Save as New Collection", + "Saved then enable AFFiNE Cloud": "All changes are saved locally, click to enable AFFiNE Cloud.", + "Select": "Select", + "Select All": "Select All", + "Set a Workspace name": "Set a Workspace name", + "Set database location": "Set database location", + "Set up an AFFiNE account to sync data": "Set up an AFFiNE account to sync data", + "Settings": "Settings", + "Shape": "Shape", + "Share Menu Public Workspace Description1": "Invite others to join the Workspace or publish it to web.", + "Share Menu Public Workspace Description2": "Current workspace has been published to the web as a public workspace.", + "Share with link": "Share with link", + "Shared Pages": "Shared Pages", + "Shared Pages Description": "Sharing page publicly requires AFFiNE Cloud service.", + "Shared Pages In Public Workspace Description": "The entire Workspace is published on the web and can be edited via <1>Workspace Settings.", + "Shortcuts": "Shortcuts", + "Sidebar": "Sidebar", + "Sign in": "Sign in AFFiNE Cloud", + "Sign in and Enable": "Sign in and Enable", + "Sign out": "Sign out", + "Sign out description": "Signing out will cause the unsynchronised content to be lost.", + "Skip": "Skip", + "Start Week On Monday": "Start Week On Monday", + "Stay logged out": "Stay logged out", + "Sticky": "Sticky", + "Stop publishing": "Stop publishing", + "Storage": "Storage", + "Storage Folder": "Storage Folder", + "Storage and Export": "Storage and Export", + "Straight Connector": "Straight Connector", + "Strikethrough": "Strikethrough", + "Successfully deleted": "Successfully deleted", + "Successfully enabled AFFiNE Cloud": "Successfully enabled AFFiNE Cloud", + "Successfully joined!": "Successfully joined!", + "Switch": "Switch", + "Sync": "Sync", + "Sync across devices with AFFiNE Cloud": "Sync across devices with AFFiNE Cloud", + "Synced with AFFiNE Cloud": "Synced with AFFiNE Cloud", + "Tags": "Tags", + "Terms of Use": "Terms of Use", + "Text": "Text", + "Theme": "Theme", + "Title": "Title", + "Trash": "Trash", + "TrashButtonGroupDescription": "Once deleted, you can't undo this action. Do you confirm?", + "TrashButtonGroupTitle": "Permanently delete", + "UNKNOWN_ERROR": "Unknown error", + "Underline": "Underline", + "Undo": "Undo", + "Ungroup": "Ungroup", + "Unpin": "Unpin", + "Unpublished hint": "Once published to the web, visitors can view the contents through the provided link.", + "Untitled": "Untitled", + "Untitled Collection": "Untitled Collection", + "Update Available": "Update available", + "Update Collection": "Update Collection", + "Update workspace name success": "Update workspace name success", + "Updated": "Updated", + "Upload": "Upload", + "Use on current device only": "Use on current device only", + "Users": "Users", + "Version": "Version", + "View Navigation Path": "View Navigation Path", + "Visit Workspace": "Visit Workspace", + "Wait for Sync": "Wait for Sync", + "Window frame style": "Window frame style", + "Workspace Avatar": "Workspace Avatar", + "Workspace Icon": "Workspace Icon", + "Workspace Name": "Workspace Name", + "Workspace Not Found": "Workspace Not Found", + "Workspace Owner": "Workspace Owner", + "Workspace Profile": "Workspace Profile", + "Workspace Settings": "Workspace Settings", + "Workspace Settings with name": "{{name}}'s Settings", + "Workspace Type": "Workspace Type", + "Workspace database storage description": "Select where you want to create your workspace. The data of workspace is saved locally by default.", + "Workspace description": "A workspace is your virtual space to capture, create and plan as just one person or together as a team.", + "Workspace saved locally": "{{name}} is saved locally", + "You cannot delete the last workspace": "You cannot delete the last workspace", + "Zoom in": "Zoom in", + "Zoom out": "Zoom out", + "Zoom to 100%": "Zoom to 100%", + "Zoom to fit": "Zoom to fit", + "all": "all", "com.affine.aboutAFFiNE.autoCheckUpdate.description": "Automatically check for new updates periodically.", "com.affine.aboutAFFiNE.autoCheckUpdate.title": "Check for updates automatically", "com.affine.aboutAFFiNE.autoDownloadUpdate.description": "Automatically download updates (to this device).", @@ -32,6 +358,12 @@ "com.affine.aboutAFFiNE.version.app": "App Version", "com.affine.aboutAFFiNE.version.editor.title": "Editor Version", "com.affine.aboutAFFiNE.version.title": "Version", + "com.affine.all-pages.header": "All Pages", + "com.affine.appUpdater.downloading": "Downloading", + "com.affine.appUpdater.installUpdate": "Restart to install update", + "com.affine.appUpdater.openDownloadPage": "Open download page", + "com.affine.appUpdater.updateAvailable": "Update available", + "com.affine.appUpdater.whatsNew": "Discover what's new!", "com.affine.appearanceSettings.clientBorder.description": "Customise the appearance of the client.", "com.affine.appearanceSettings.clientBorder.title": "Client Border Style", "com.affine.appearanceSettings.color.description": "Choose your colour mode", @@ -41,9 +373,9 @@ "com.affine.appearanceSettings.dateFormat.title": "Date Format", "com.affine.appearanceSettings.font.description": "Choose your font style", "com.affine.appearanceSettings.font.title": "Font Style", + "com.affine.appearanceSettings.fontStyle.mono": "Mono", "com.affine.appearanceSettings.fontStyle.sans": "Sans", "com.affine.appearanceSettings.fontStyle.serif": "Serif", - "com.affine.appearanceSettings.fontStyle.mono": "Mono", "com.affine.appearanceSettings.fullWidth.description": "Maximum display of content within a page.", "com.affine.appearanceSettings.fullWidth.title": "Full width Layout", "com.affine.appearanceSettings.language.description": "Select the language for the interface.", @@ -58,15 +390,10 @@ "com.affine.appearanceSettings.title": "Appearance Settings", "com.affine.appearanceSettings.translucentUI.description": "Use transparency effect on the sidebar.", "com.affine.appearanceSettings.translucentUI.title": "Translucent UI on the sidebar", + "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Native Titlebar", "com.affine.appearanceSettings.windowFrame.description": "Customise appearance of Windows Client.", "com.affine.appearanceSettings.windowFrame.frameless": "Frameless", - "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Native Titlebar", "com.affine.appearanceSettings.windowFrame.title": "Window frame style", - "com.affine.appUpdater.downloading": "Downloading", - "com.affine.appUpdater.installUpdate": "Restart to install update", - "com.affine.appUpdater.openDownloadPage": "Open download page", - "com.affine.appUpdater.updateAvailable": "Update available", - "com.affine.appUpdater.whatsNew": "Discover what's new!", "com.affine.auth.change.email.message": "Your current email is {{email}}. We’ll send a temporary verification link to this email.", "com.affine.auth.change.email.page.subtitle": "Please enter your new email address below. We will send a verification link to this email address to complete the process.", "com.affine.auth.change.email.page.success.subtitle": "Congratulations! You have successfully updated the email address associated with your AFFiNE Cloud account.", @@ -74,7 +401,6 @@ "com.affine.auth.change.email.page.title": "Change email address", "com.affine.auth.create.count": "Create Account", "com.affine.auth.desktop.signing.in": "Signing in...", - "com.affine.auth.desktop.signing.in.message": "Signing in with account <1>", "com.affine.auth.forget": "Forgot password", "com.affine.auth.has.signed": "Signed in", "com.affine.auth.has.signed.message": "You have been signed in, start to sync your data with AFFiNE Cloud!", @@ -86,8 +412,8 @@ "com.affine.auth.page.sent.email.subtitle": "Please set a password of 8-20 characters with both letters and numbers to continue signing up with ", "com.affine.auth.page.sent.email.title": "Welcome to AFFiNE Cloud, you are almost there!", "com.affine.auth.password": "Password", - "com.affine.auth.password.set-failed": "Set Password Failed", "com.affine.auth.password.error": "Invalid password", + "com.affine.auth.password.set-failed": "Set Password Failed", "com.affine.auth.reset.password": "Reset Password", "com.affine.auth.reset.password.message": "You will receive an email with a link to reset your password. Please check your inbox.", "com.affine.auth.reset.password.page.success": "Password reset successful", @@ -109,6 +435,10 @@ "com.affine.auth.set.password.placeholder": "Set a password at least 8 letters long", "com.affine.auth.set.password.placeholder.confirm": "Confirm password", "com.affine.auth.set.password.save": "Save Password", + "com.affine.auth.sign-out.confirm-modal.cancel": "Cancel", + "com.affine.auth.sign-out.confirm-modal.confirm": "Sign Out", + "com.affine.auth.sign-out.confirm-modal.description": "After signing out, the Cloud Workspaces associated with this account will be removed from the current device, and signing in again will add them back.", + "com.affine.auth.sign-out.confirm-modal.title": "Sign out?", "com.affine.auth.sign.auth.code.error.hint": "Wrong code, please try again", "com.affine.auth.sign.auth.code.message": "If you haven't received the email, please check your spam folder.", "com.affine.auth.sign.auth.code.message.password": "Or <1>sign in with password instead.", @@ -142,32 +472,113 @@ "com.affine.brand.affineCloud": "AFFiNE Cloud", "com.affine.cloudTempDisable.description": "We are upgrading the AFFiNE Cloud service and it is temporarily unavailable on the client side. If you wish to stay updated on the progress and be notified on availability, you can fill out the <1>AFFiNE Cloud Signup.", "com.affine.cloudTempDisable.title": "AFFiNE Cloud is upgrading now.", + "com.affine.cmdk.affine.category.affine.collections": "Collections", + "com.affine.cmdk.affine.category.affine.creation": "Create", + "com.affine.cmdk.affine.category.affine.edgeless": "Edgeless", + "com.affine.cmdk.affine.category.affine.general": "General", + "com.affine.cmdk.affine.category.affine.help": "Help", + "com.affine.cmdk.affine.category.affine.layout": "Layout Controls", + "com.affine.cmdk.affine.category.affine.navigation": "Navigation", + "com.affine.cmdk.affine.category.affine.pages": "Pages", + "com.affine.cmdk.affine.category.affine.recent": "Recent", + "com.affine.cmdk.affine.category.affine.settings": "Settings", + "com.affine.cmdk.affine.category.affine.updates": "Updates", + "com.affine.cmdk.affine.category.editor.edgeless": "Edgeless Commands", + "com.affine.cmdk.affine.category.editor.insert-object": "Insert Object", + "com.affine.cmdk.affine.category.editor.page": "Page Commands", + "com.affine.cmdk.affine.client-border-style.to": "Change Client Border Style to", + "com.affine.cmdk.affine.color-mode.to": "Change Colour Mode to", + "com.affine.cmdk.affine.color-scheme.to": "Change Colour Scheme to", + "com.affine.cmdk.affine.contact-us": "Contact Us", + "com.affine.cmdk.affine.create-new-edgeless-as": "New \"{{keyWord}}\" Edgeless", + "com.affine.cmdk.affine.create-new-page-as": "New \"{{keyWord}}\" Page", + "com.affine.cmdk.affine.display-language.to": "Change Display Language to", + "com.affine.cmdk.affine.editor.add-to-favourites": "Add to Favourites", + "com.affine.cmdk.affine.editor.edgeless.presentation-start": "Start Presentation", + "com.affine.cmdk.affine.editor.remove-from-favourites": "Remove from Favourites", + "com.affine.cmdk.affine.editor.restore-from-trash": "Restore from Trash", + "com.affine.cmdk.affine.font-style.to": "Change Font Style to", + "com.affine.cmdk.affine.full-width-layout.to": "Change Full Width Layout to", + "com.affine.cmdk.affine.getting-started": "Getting Started", + "com.affine.cmdk.affine.import-workspace": "Import Workspace", + "com.affine.cmdk.affine.left-sidebar.collapse": "Collapse Left Sidebar", + "com.affine.cmdk.affine.left-sidebar.expand": "Expand Left Sidebar", + "com.affine.cmdk.affine.navigation.goto-all-pages": "Go to All Pages", + "com.affine.cmdk.affine.navigation.goto-edgeless-list": "Go to Edgeless List", + "com.affine.cmdk.affine.navigation.goto-page-list": "Go to Page List", + "com.affine.cmdk.affine.navigation.goto-trash": "Go to Trash", + "com.affine.cmdk.affine.navigation.goto-workspace": "Go to Workspace", + "com.affine.cmdk.affine.navigation.open-settings": "Go to Settings", + "com.affine.cmdk.affine.new-edgeless-page": "New Edgeless", + "com.affine.cmdk.affine.new-page": "New Page", + "com.affine.cmdk.affine.new-workspace": "New Workspace", + "com.affine.cmdk.affine.noise-background-on-the-sidebar.to": "Change Noise Background On The Sidebar to", + "com.affine.cmdk.affine.restart-to-upgrade": "Restart to Upgrade", + "com.affine.cmdk.affine.switch-state.off": "OFF", + "com.affine.cmdk.affine.switch-state.on": "ON", + "com.affine.cmdk.affine.translucent-ui-on-the-sidebar.to": "Change Translucent UI On The Sidebar to", + "com.affine.cmdk.affine.whats-new": "What's New", + "com.affine.cmdk.placeholder": "Type a command or search anything...", "com.affine.collection-bar.action.tooltip.delete": "Delete", "com.affine.collection-bar.action.tooltip.edit": "Edit", "com.affine.collection-bar.action.tooltip.pin": "Pin to Sidebar", "com.affine.collection-bar.action.tooltip.unpin": "Unpin", + "com.affine.collection.addPage.alreadyExists": "Page already exists", + "com.affine.collection.addPage.success": "Added successfully", + "com.affine.collection.addPages": "Add Pages", + "com.affine.collection.addPages.tips": "<0>Add pages: You can freely select pages and add them to the collection.", + "com.affine.collection.addRules": "Add Rules", + "com.affine.collection.addRules.tips": "<0>Add rules: Rules are based on filtering. After adding rules, pages that meet the requirements will be automatically added to the current collection.", + "com.affine.collection.allCollections": "All Collections", + "com.affine.collection.emptyCollection": "Empty Collection", + "com.affine.collection.emptyCollectionDescription": "Collection is a smart folder where you can manually add pages or automatically add pages through rules.", + "com.affine.collection.helpInfo": "HELP INFO", + "com.affine.collection.menu.edit": "Edit Collection", + "com.affine.collection.menu.rename": "Rename", "com.affine.collectionBar.backToAll": "Back to all", + "com.affine.collections.header": "Collections", "com.affine.confirmModal.button.cancel": "Cancel", + "com.affine.currentYear": "Current Year", "com.affine.deleteLeaveWorkspace.description": "Delete workspace from this device and optionally delete all data.", "com.affine.deleteLeaveWorkspace.leave": "Leave Workspace", "com.affine.deleteLeaveWorkspace.leaveDescription": "After you leave, you will not be able to access content within this workspace.", "com.affine.draw_with_a_blank_whiteboard": "Draw with a blank whiteboard", "com.affine.earlier": "Earlier", - "com.affine.editCollection.pages": "Pages", - "com.affine.editCollection.pages.clear": "Clear selected", - "com.affine.editCollection.search.placeholder": "Search page...", - "com.affine.editCollection.rules.tips": "Pages that meet the rules will be added to the current collection <2>{{highlight}}", - "com.affine.editCollection.rules.tips.highlight": "automatically", - "com.affine.editCollection.rules": "Rules", + "com.affine.edgelessMode": "Edgeless Mode", "com.affine.editCollection.button.cancel": "Cancel", "com.affine.editCollection.button.create": "Create", + "com.affine.editCollection.createCollection": "Create Collection", "com.affine.editCollection.filters": "Filters", + "com.affine.editCollection.pages": "Pages", + "com.affine.editCollection.pages.clear": "Clear selected", + "com.affine.editCollection.renameCollection": "Rename Collection", + "com.affine.editCollection.rules": "Rules", + "com.affine.editCollection.rules.countTips": "Selected <1>{{selectedCount}}, filtered <3>{{filteredCount}}", + "com.affine.editCollection.rules.countTips.more": "Showing <1>{{count}} pages.", + "com.affine.editCollection.rules.countTips.one": "Showing <1>{{count}} page.", + "com.affine.editCollection.rules.countTips.zero": "Showing <1>{{count}} pages.", + "com.affine.editCollection.rules.empty.noResults": "No Results", + "com.affine.editCollection.rules.empty.noResults.tips": "No pages meet the filtering rules", + "com.affine.editCollection.rules.empty.noRules": "No Rules", + "com.affine.editCollection.rules.empty.noRules.tips": "Please <1>add rules to save this collection or switch to <3>Pages, use manual selection mode", + "com.affine.editCollection.rules.include.add": "Add selected page", + "com.affine.editCollection.rules.include.is": "is", + "com.affine.editCollection.rules.include.page": "Page", + "com.affine.editCollection.rules.include.tips": "“Selected pages” refers to manually adding pages rather than automatically adding them through rule matching. You can manually add pages through the “Add selected pages” option or by dragging and dropping.", + "com.affine.editCollection.rules.include.tipsTitle": "What is \"Selected pages\"?", + "com.affine.editCollection.rules.include.title": "Selected pages", + "com.affine.editCollection.rules.preview": "Preview", + "com.affine.editCollection.rules.reset": "Reset", + "com.affine.editCollection.rules.tips": "Pages that meet the rules will be added to the current collection <2>{{highlight}}", + "com.affine.editCollection.rules.tips.highlight": "automatically", "com.affine.editCollection.save": "Save", "com.affine.editCollection.saveCollection": "Save as New Collection", - "com.affine.editCollection.createCollection": "Create Collection", - "com.affine.editCollection.renameCollection": "Rename Collection", + "com.affine.editCollection.search.placeholder": "Search page...", "com.affine.editCollection.untitledCollection": "Untitled Collection", "com.affine.editCollection.updateCollection": "Update Collection", + "com.affine.editCollectionName.createTips": "Collection is a smart folder where you can manually add pages or automatically add pages through rules.", + "com.affine.editCollectionName.name": "Name", + "com.affine.editCollectionName.name.placeholder": "Collection Name", "com.affine.editorModeSwitch.tooltip": "Switch", "com.affine.emptyDesc": "There's no page here yet", "com.affine.enableAffineCloudModal.button.cancel": "Cancel", @@ -238,9 +649,9 @@ "com.affine.keyboardShortcuts.switch": "Switch", "com.affine.keyboardShortcuts.text": "Text", "com.affine.keyboardShortcuts.title": "Keyboard shortcuts", + "com.affine.keyboardShortcuts.unGroup": "Ungroup", "com.affine.keyboardShortcuts.underline": "Underline", "com.affine.keyboardShortcuts.undo": "Undo", - "com.affine.keyboardShortcuts.unGroup": "Ungroup", "com.affine.keyboardShortcuts.zoomIn": "Zoom in", "com.affine.keyboardShortcuts.zoomOut": "Zoom out", "com.affine.keyboardShortcuts.zoomTo100": "Zoom to 100%", @@ -250,12 +661,12 @@ "com.affine.lastMonth": "Last month", "com.affine.lastWeek": "Last week", "com.affine.lastYear": "Last year", - "com.affine.moreThan30Days": "Older than a month", "com.affine.loading": "Loading...", + "com.affine.moreThan30Days": "Older than a month", "com.affine.moveToTrash.confirmModal.description": "{{title}} will be moved to Trash", + "com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} pages will be moved to Trash", "com.affine.moveToTrash.confirmModal.title": "Delete page?", "com.affine.moveToTrash.confirmModal.title.multiple": "Delete {{ number }} pages?", - "com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} pages will be moved to Trash", "com.affine.moveToTrash.title": "Move to Trash", "com.affine.nameWorkspace.button.cancel": "Cancel", "com.affine.nameWorkspace.button.create": "Create", @@ -271,9 +682,103 @@ "com.affine.onboarding.videoDescription1": "Easily switch between Page mode for structured document creation and Whiteboard mode for the freeform visual expression of creative ideas.", "com.affine.onboarding.videoDescription2": "Create structured documents with ease, using a modular interface to drag and drop blocks of text, images, and other content.", "com.affine.openPageOperation.newTab": "Open in new tab", + "com.affine.other-page.nav.affine-community": "AFFiNE Community", + "com.affine.other-page.nav.blog": "Blog", + "com.affine.other-page.nav.contact-us": "Contact Us", + "com.affine.other-page.nav.download-app": "Download App", + "com.affine.other-page.nav.official-website": "Official Website", + "com.affine.other-page.nav.open-affine": "Open AFFiNE", + "com.affine.page.group-header.clear": "Clear Selection", + "com.affine.page.group-header.select-all": "Select All", + "com.affine.page.toolbar.selected": "<0>{{count}} selected", + "com.affine.page.toolbar.selected_one": "<0>{{count}} page selected", + "com.affine.page.toolbar.selected_others": "<0>{{count}} page(s) selected", + "com.affine.pageMode": "Page Mode", "com.affine.pageMode.all": "all", "com.affine.pageMode.edgeless": "Edgeless", "com.affine.pageMode.page": "Page", + "com.affine.payment.benefit-1": "Unlimited local workspaces", + "com.affine.payment.benefit-2": "Unlimited login devices", + "com.affine.payment.benefit-3": "Unlimited blocks", + "com.affine.payment.benefit-4": "{{capacity}} of Cloud Storage", + "com.affine.payment.benefit-5": "{{capacity}} of maximum file size", + "com.affine.payment.benefit-6": "Number of members per Workspace ≤ {{capacity}}", + "com.affine.payment.billing-setting.cancel-subscription": "Cancel Subscription", + "com.affine.payment.billing-setting.cancel-subscription.description": "Subscription cancelled, your pro account will expire on {{cancelDate}}", + "com.affine.payment.billing-setting.change-plan": "Change Plan", + "com.affine.payment.billing-setting.current-plan": "Current Plan", + "com.affine.payment.billing-setting.current-plan.description": "You are currently on the <1>{{planName}} plan.", + "com.affine.payment.billing-setting.current-plan.description.monthly": "You are currently on the monthly <1>{{planName}} plan.", + "com.affine.payment.billing-setting.current-plan.description.yearly": "You are currently on the yearly <1>{{planName}} plan.", + "com.affine.payment.billing-setting.expiration-date": "Expiration Date", + "com.affine.payment.billing-setting.expiration-date.description": "Your subscription is valid until {{expirationDate}}", + "com.affine.payment.billing-setting.history": "Billing history", + "com.affine.payment.billing-setting.information": "Information", + "com.affine.payment.billing-setting.month": "month", + "com.affine.payment.billing-setting.no-invoice": "There are no invoices to display.", + "com.affine.payment.billing-setting.paid": "Paid", + "com.affine.payment.billing-setting.payment-method": "Payment Method", + "com.affine.payment.billing-setting.payment-method.description": "Provided by Stripe.", + "com.affine.payment.billing-setting.renew-date": "Renew Date", + "com.affine.payment.billing-setting.renew-date.description": "Next billing date: {{renewDate}}", + "com.affine.payment.billing-setting.resume-subscription": "Resume", + "com.affine.payment.billing-setting.subtitle": "Manage your billing information and invoices.", + "com.affine.payment.billing-setting.title": "Billing", + "com.affine.payment.billing-setting.update": "Update", + "com.affine.payment.billing-setting.upgrade": "Upgrade", + "com.affine.payment.billing-setting.view-invoice": "View Invoice", + "com.affine.payment.billing-setting.year": "year", + "com.affine.payment.buy-pro": "Buy Pro", + "com.affine.payment.change-to": "Change to {{to}} Billing", + "com.affine.payment.contact-sales": "Contact Sales", + "com.affine.payment.current-plan": "Current Plan", + "com.affine.payment.disable-payment.description": "This is a special testing(Canary) version of AFFiNE. Account upgrades are not supported in this version. If you want to experience the full service, please download the stable version from our website.", + "com.affine.payment.disable-payment.title": "Account Upgrade Unavailable", + "com.affine.payment.discount-amount": "{{amount}}% off", + "com.affine.payment.downgrade": "Downgrade", + "com.affine.payment.downgraded-tooltip": "You have successfully downgraded. After the current billing period ends, your account will automatically switch to the Free plan.", + "com.affine.payment.dynamic-benefit-1": "Best team workspace for collaboration and knowledge distilling.", + "com.affine.payment.dynamic-benefit-2": "Focusing on what really matters with team project management and automation.", + "com.affine.payment.dynamic-benefit-3": "Pay for seats, fits all team size.", + "com.affine.payment.dynamic-benefit-4": "Solutions & best practices for dedicated needs.", + "com.affine.payment.dynamic-benefit-5": "Embedable & interrogations with IT support.", + "com.affine.payment.member.description": "Manage members here. {{planName}} Users can invite up to {{memberLimit}}", + "com.affine.payment.member.description.go-upgrade": "go upgrade", + "com.affine.payment.modal.change.cancel": "Cancel", + "com.affine.payment.modal.change.confirm": "Change", + "com.affine.payment.modal.change.title": "Change your subscription", + "com.affine.payment.modal.downgrade.cancel": "Cancel Subscription", + "com.affine.payment.modal.downgrade.caption": "You can still use AFFiNE Cloud Pro until the end of this billing period :)", + "com.affine.payment.modal.downgrade.confirm": "Keep AFFiNE Cloud Pro", + "com.affine.payment.modal.downgrade.content": "We're sorry to see you go, but we're always working to improve, and your feedback is welcome. We hope to see you return in the future.", + "com.affine.payment.modal.downgrade.title": "Are you sure?", + "com.affine.payment.modal.resume.cancel": "Cancel", + "com.affine.payment.modal.resume.confirm": "Confirm", + "com.affine.payment.modal.resume.content": "Are you sure you want to resume the subscription for your pro account? This means your payment method will be charged automatically at the end of each billing cycle, starting from the next billing cycle.", + "com.affine.payment.modal.resume.title": "Resume Auto-Renewal?", + "com.affine.payment.plans-error-retry": "Refresh", + "com.affine.payment.plans-error-tip": "Unable to load Pricing plans, please check your network. ", + "com.affine.payment.price-description.per-month": "per month", + "com.affine.payment.recurring-monthly": "monthly", + "com.affine.payment.recurring-yearly": "yearly", + "com.affine.payment.resume": "Resume", + "com.affine.payment.resume-renewal": "Resume Auto-renewal", + "com.affine.payment.see-all-plans": "See all plans", + "com.affine.payment.sign-up-free": "Sign up free", + "com.affine.payment.subscription.exist": "You already have a subscription.", + "com.affine.payment.subscription.go-to-subscribe": "Subscribe AFFiNE", + "com.affine.payment.subtitle-active": "You are currently on the {{currentPlan}} plan. If you have any questions, please contact our <3>customer support.", + "com.affine.payment.subtitle-canceled": "You are currently on the {{plan}} plan. After the current billing period ends, your account will automatically switch to the Free plan.", + "com.affine.payment.subtitle-not-signed-in": "This is the Pricing plans of AFFiNE Cloud. You can sign up or sign in to your account first.", + "com.affine.payment.tag-tooltips": "See all plans", + "com.affine.payment.title": "Pricing Plans", + "com.affine.payment.updated-notify-msg": "You have changed your plan to {{plan}} billing.", + "com.affine.payment.updated-notify-msg.cancel-subscription": "No further charges will be made starting from the next billing cycle.", + "com.affine.payment.updated-notify-title": "Subscription updated", + "com.affine.payment.upgrade": "Upgrade", + "com.affine.payment.upgrade-success-page.support": "If you have any questions, please contact our <1> customer support.", + "com.affine.payment.upgrade-success-page.text": "Congratulations! Your AFFiNE account has been successfully upgraded to a Pro account.", + "com.affine.payment.upgrade-success-page.title": "Upgrade Successful!", "com.affine.publicLinkDisableModal.button.cancel": "Cancel", "com.affine.publicLinkDisableModal.button.disable": "Disable", "com.affine.publicLinkDisableModal.description": "Disabling this public link will prevent anyone with the link from accessing this page.", @@ -281,6 +786,10 @@ "com.affine.rootAppSidebar.collections": "Collections", "com.affine.rootAppSidebar.favorites": "Favourites", "com.affine.rootAppSidebar.others": "Others", + "com.affine.selectPage.empty": "Empty", + "com.affine.selectPage.empty.tips": "No page titles contain <1>{{search}}", + "com.affine.selectPage.selected": "Selected", + "com.affine.selectPage.title": "Add include page", "com.affine.setDBLocation.button.customize": "Customise", "com.affine.setDBLocation.button.defaultLocation": "Default Location", "com.affine.setDBLocation.description": "Select where you want to create your workspace. The data of workspace is saved locally by default.", @@ -297,12 +806,26 @@ "com.affine.setting.account.message": "Your personal information", "com.affine.setting.sign.message": "Sync with AFFiNE Cloud", "com.affine.setting.sign.out.message": "Securely sign out of your account.", + "com.affine.settingSidebar.settings.general": "General", + "com.affine.settingSidebar.settings.workspace": "Workspace", + "com.affine.settingSidebar.title": "Settings", + "com.affine.settings.about.message": "Information about AFFiNE", + "com.affine.settings.about.update.check.message": "Automatically check for new updates periodically.", + "com.affine.settings.about.update.download.message": "Automatically download updates (to this device).", "com.affine.settings.appearance": "Appearance", + "com.affine.settings.appearance.border-style-description": "Customise the appearance of the client.", + "com.affine.settings.appearance.date-format-description": "Customise your date style.", + "com.affine.settings.appearance.full-width-description": "Maximum display of content within a page.", + "com.affine.settings.appearance.language-description": "Select the language for the interface.", + "com.affine.settings.appearance.start-week-description": "By default, the week starts on Sunday.", + "com.affine.settings.appearance.window-frame-description": "Customise appearance of Windows Client.", "com.affine.settings.auto-check-description": "If enabled, it will automatically check for new versions at regular intervals.", "com.affine.settings.auto-download-description": " If enabled, new versions will be automatically downloaded to the current device.", "com.affine.settings.email": "Email", "com.affine.settings.email.action": "Change Email", "com.affine.settings.member-tooltip": "Enable AFFiNE Cloud to collaborate with others", + "com.affine.settings.noise-style": "Noise background on the sidebar", + "com.affine.settings.noise-style-description": "Use background noise effect on the sidebar.", "com.affine.settings.password": "Password", "com.affine.settings.password.action.change": "Change password", "com.affine.settings.password.action.set": "Set password", @@ -312,41 +835,60 @@ "com.affine.settings.profile.name": "Display Name", "com.affine.settings.profile.placeholder": "Input account name", "com.affine.settings.remove-workspace": "Remove Workspace", + "com.affine.settings.remove-workspace-description": "Remove Workspace from this device and optionally delete all data.", "com.affine.settings.sign": "Sign in / Sign up", "com.affine.settings.storage.db-location.change-hint": "Click to move storage location.", "com.affine.settings.storage.description": "Check or change storage location", "com.affine.settings.storage.description-alt": "Check or change storage location. Click path to edit location.", "com.affine.settings.suggestion": "Need more customization options? Tell us in the community.", + "com.affine.settings.translucent-style": "Translucent UI on the sidebar", + "com.affine.settings.translucent-style-description": "Use transparency effect on the sidebar.", + "com.affine.settings.workspace": "Workspace", "com.affine.settings.workspace.description": "You can view current workspace's information here.", "com.affine.settings.workspace.not-owner": "Only an owner can edit the the Workspace avatar and name.Changes will be shown for everyone.", "com.affine.settings.workspace.publish-tooltip": "Enable AFFiNE Cloud to publish this Workspace", "com.affine.settings.workspace.storage.tip": "Click to move storage location.", - "com.affine.settingSidebar.settings.general": "General", - "com.affine.settingSidebar.settings.workspace": "Workspace", - "com.affine.settingSidebar.title": "Settings", "com.affine.share-menu.EnableCloudDescription": "Sharing page requires AFFiNE Cloud.", - "com.affine.share-menu.shareButton": "Share", - "com.affine.share-menu.sharedButton": "Shared", - "com.affine.share-menu.SharedPage": "Shared Page", "com.affine.share-menu.ShareMode": "Share mode", "com.affine.share-menu.SharePage": "Share Page", "com.affine.share-menu.ShareViaExport": "Share via Export", "com.affine.share-menu.ShareViaExportDescription": "Download a static copy of your page to share with others.", "com.affine.share-menu.ShareWithLink": "Share with link", "com.affine.share-menu.ShareWithLinkDescription": "Create a link you can easily share with anyone. The visitors will open your page in the form od a document", + "com.affine.share-menu.SharedPage": "Shared Page", + "com.affine.share-menu.confirm-modify-mode.notification.fail.message": "Please try again later.", + "com.affine.share-menu.confirm-modify-mode.notification.fail.title": "Failed to modify", + "com.affine.share-menu.confirm-modify-mode.notification.success.message": "You have changed the public link from {{preMode}} Mode to {{currentMode}} Mode.", + "com.affine.share-menu.confirm-modify-mode.notification.success.title": "Modified successfully", + "com.affine.share-menu.copy-private-link": "Copy Private Link", + "com.affine.share-menu.create-public-link.notification.fail.message": "Please try again later.", + "com.affine.share-menu.create-public-link.notification.fail.title": "Failed to create public link", + "com.affine.share-menu.create-public-link.notification.success.message": "You can share this document with link.", + "com.affine.share-menu.create-public-link.notification.success.title": "Public link created", + "com.affine.share-menu.disable-publish-link.notification.fail.message": "Please try again later.", + "com.affine.share-menu.disable-publish-link.notification.fail.title": "Failed to disable public link", + "com.affine.share-menu.disable-publish-link.notification.success.message": "This page is no longer shared publicly.", + "com.affine.share-menu.disable-publish-link.notification.success.title": "Public link disabled", + "com.affine.share-menu.publish-to-web": "Publish to Web", + "com.affine.share-menu.publish-to-web.description": "Let anyone with a link view a read-only version of this page.", + "com.affine.share-menu.share-privately": "Share Privately", + "com.affine.share-menu.share-privately.description": "Only members of this Workspace can open this link.", + "com.affine.share-menu.shareButton": "Share", + "com.affine.share-menu.sharedButton": "Shared", "com.affine.shortcutsTitle.edgeless": "Edgeless", "com.affine.shortcutsTitle.general": "General", "com.affine.shortcutsTitle.markdownSyntax": "Markdown Syntax", "com.affine.shortcutsTitle.page": "Page", "com.affine.sidebarSwitch.collapse": "Collapse sidebar", "com.affine.sidebarSwitch.expand": "Expand sidebar", + "com.affine.storage.change-plan": "Change", "com.affine.storage.disabled.hint": "AFFiNE Cloud is currently in early access phase and is not supported for upgrading, please be patient and wait for our pricing plan.", "com.affine.storage.extend.hint": "The usage has reached its maximum capacity, AFFiNE Cloud is currently in early access phase and is not supported for upgrading, please be patient and wait for our pricing plan. ", "com.affine.storage.extend.link": "To get more information click here.", + "com.affine.storage.maximum-tips": "You have reached the maximum capacity limit for your current account", + "com.affine.storage.plan": "Plan", "com.affine.storage.title": "AFFiNE Cloud Storage", "com.affine.storage.upgrade": "Upgrade", - "com.affine.storage.change-plan": "Change", - "com.affine.storage.plan": "Plan", "com.affine.storage.used.hint": "Space used", "com.affine.themeSettings.dark": "Dark", "com.affine.themeSettings.light": "Light", @@ -366,6 +908,17 @@ "com.affine.trashOperation.deleteDescription": "Once deleted, you can't undo this action. Do you confirm?", "com.affine.trashOperation.deletePermanently": "Delete permanently", "com.affine.trashOperation.restoreIt": "Restore it", + "com.affine.updater.downloading": "Downloading", + "com.affine.updater.open-download-page": "Open download page", + "com.affine.updater.restart-to-update": "Restart to install update", + "com.affine.updater.update-available": "Update available", + "com.affine.upgrade.button-text.done": "Refresh Current Page", + "com.affine.upgrade.button-text.error": "Data Upgrade Error", + "com.affine.upgrade.button-text.pending": "Upgrade Workspace Data", + "com.affine.upgrade.button-text.upgrading": "Upgrading", + "com.affine.upgrade.tips.done": "After upgrading the workspace data, please refresh the page to see the changes.", + "com.affine.upgrade.tips.error": "We encountered some errors while upgrading the workspace data.", + "com.affine.upgrade.tips.normal": "To ensure compatibility with the updated AFFiNE client, please upgrade your data by clicking the \"Upgrade Workspace Data\" button below.", "com.affine.workspace.cannot-delete": "You cannot delete the last workspace", "com.affine.workspace.cloud": "Cloud Workspaces", "com.affine.workspace.cloud.account.logout": "Sign Out", @@ -373,6 +926,7 @@ "com.affine.workspace.cloud.auth": "Sign up/ Sign in", "com.affine.workspace.cloud.description": "Sync with AFFiNE Cloud", "com.affine.workspace.cloud.join": "Join Workspace", + "com.affine.workspace.cloud.sync": "Cloud sync", "com.affine.workspace.local": "Local Workspaces", "com.affine.workspace.local.import": "Import Workspace", "com.affine.workspaceDelete.button.cancel": "Cancel", @@ -384,406 +938,39 @@ "com.affine.workspaceLeave.button.cancel": "Cancel", "com.affine.workspaceLeave.button.leave": "Leave", "com.affine.workspaceLeave.description": "After you leave, you will no longer be able to access the contents of this workspace.", + "com.affine.workspaceList.addWorkspace.create": "Create Workspace", + "com.affine.workspaceList.workspaceListType.cloud": "Cloud Sync", + "com.affine.workspaceList.workspaceListType.local": "Local Storage", "com.affine.workspaceSubPath.all": "All pages", "com.affine.workspaceSubPath.trash": "Trash", + "com.affine.workspaceSubPath.trash.empty-description": "Deleted pages will appear here.", "com.affine.workspaceType.cloud": "Cloud Workspace", "com.affine.workspaceType.joined": "Joined Workspace", "com.affine.workspaceType.local": "Local Workspace", "com.affine.workspaceType.offline": "Available Offline", "com.affine.write_with_a_blank_page": "Write with a blank page", "com.affine.yesterday": "Yesterday", - "com.affine.all-pages.header": "All Pages", - "com.affine.collections.header": "Collections", - "com.affine.page.group-header.select-all": "Select All", - "com.affine.page.group-header.clear": "Clear Selection", - "com.affine.page.toolbar.selected": "<0>{{count}} selected", - "com.affine.collection.allCollections": "All Collections", - "com.affine.collection.emptyCollection": "Empty Collection", - "com.affine.collection.emptyCollectionDescription": "Collection is a smart folder where you can manually add pages or automatically add pages through rules.", - "com.affine.collection.addPages": "Add Pages", - "com.affine.collection.addPages.tips": "<0>Add pages: You can freely select pages and add them to the collection.", - "com.affine.collection.addRules": "Add Rules", - "com.affine.collection.addRules.tips": "<0>Add rules: Rules are based on filtering. After adding rules, pages that meet the requirements will be automatically added to the current collection.", - "com.affine.collection.helpInfo": "HELP INFO", - "com.affine.editCollectionName.name": "Name", - "com.affine.editCollectionName.name.placeholder": "Collection Name", - "com.affine.editCollectionName.createTips": "Collection is a smart folder where you can manually add pages or automatically add pages through rules.", - "com.affine.editCollection.rules.include.title": "Selected pages", - "com.affine.editCollection.rules.include.page": "Page", - "com.affine.editCollection.rules.include.is": "is", - "com.affine.editCollection.rules.include.add": "Add selected page", - "com.affine.editCollection.rules.include.tipsTitle": "What is \"Selected pages\"?", - "com.affine.editCollection.rules.include.tips": "“Selected pages” refers to manually adding pages rather than automatically adding them through rule matching. You can manually add pages through the “Add selected pages” option or by dragging and dropping.", - "com.affine.editCollection.rules.preview": "Preview", - "com.affine.editCollection.rules.reset": "Reset", - "com.affine.editCollection.rules.countTips": "Selected <1>{{selectedCount}}, filtered <3>{{filteredCount}}", - "com.affine.editCollection.rules.empty.noRules": "No Rules", - "com.affine.editCollection.rules.empty.noRules.tips": "Please <1>add rules to save this collection or switch to <3>Pages, use manual selection mode", - "com.affine.editCollection.rules.empty.noResults": "No Results", - "com.affine.editCollection.rules.empty.noResults.tips": "No pages meet the filtering rules", - "com.affine.selectPage.title": "Add include page", - "com.affine.selectPage.selected": "Selected", - "com.affine.selectPage.empty": "Empty", - "com.affine.selectPage.empty.tips": "No page titles contain <1>{{search}}", - "com.affine.collection.addPage.alreadyExists": "Page already exists", - "com.affine.collection.addPage.success": "Added successfully", - "Confirm": "Confirm", - "Connector": "Connector", - "Continue with Google": "Continue with Google", - "Convert to ": "Convert to ", - "Copied link to clipboard": "Copied link to clipboard", - "Copy": "Copy", - "Copy Link": "Copy Link", "core": "core", - "Create": "Create", - "Create a collection": "Create a collection", - "Create Or Import": "Create or Import", - "Create Shared Link Description": "Create a link you can easily share with anyone.", - "Create your own workspace": "Create your own workspace", - "Created": "Created", - "Created with": "Created with", - "Data sync mode": "Data sync mode", - "DB_FILE_ALREADY_LOADED": "Database file already loaded", - "DB_FILE_INVALID": "Invalid Database file", - "DB_FILE_MIGRATION_FAILED": "Database file migration failed", - "DB_FILE_PATH_INVALID": "Database file path invalid", - "Delete": "Delete", - "Delete Member?": "Delete Member?", - "Delete Workspace Label Hint": "After deleting this Workspace, you will permanently delete all of its content for everyone. No one will be able to recover the content of this Workspace.", - "Delete Workspace placeholder": "Please type “Delete” to confirm", - "Disable": "Disable", - "Disable Public Link": "Disable Public Link", - "Disable Public Sharing": "Disable Public Sharing", - "Download all data": "Download all data", - "Download core data": "Download core data", - "Download data": "Download {{CoreOrAll}} data", - "Download data Description1": "It takes up more space on your device.", - "Download data Description2": "It takes up little space on your device.", - "Early Access Stage": "Early Access Stage", - "Edgeless": "Edgeless", - "Edit": "Edit", - "com.affine.collection.menu.edit": "Edit Collection", - "com.affine.collection.menu.rename": "Rename", + "dark": "Dark", "emptyAllPages": "Click on the <1>$t(New Page) button to create your first page.", "emptyAllPagesClient": "Click on the <1>$t(New Page) button Or press <3>{{shortcut}} to create your first page.", "emptyFavorite": "Click Add to Favourites and the page will appear here.", "emptySharedPages": "Shared pages will appear here.", "emptyTrash": "Click Add to Trash and the page will appear here.", - "Enable": "Enable", - "Enable AFFiNE Cloud": "Enable AFFiNE Cloud", - "Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronised via AFFiNE Cloud.", - "Enable cloud hint": "The following functions rely on AFFiNE Cloud. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", - "Enabled success": "Enabled success", - "Exclude from filter": "Exclude from filter", - "Export": "Export", - "Export AFFiNE backup file": "Export AFFiNE backup file", - "Export Description": "You can export the entire Workspace data for backup, and the exported data can be re-imported.", - "Export Shared Pages Description": "Download a static copy of your page to share with others.", - "Export success": "Export success", - "Export failed": "Export failed", - "Export to HTML": "Export to HTML", - "Export to Markdown": "Export to Markdown", - "Export to PDF": "Export to PDF", - "Export to PNG": "Export to PNG", - "Export Workspace": "Export Workspace <1>{{workspace}} is coming soon", - "Failed to publish workspace": "Failed to publish workspace", - "Favorite": "Favourite", - "Favorite pages for easy access": "Favourite pages for easy access", - "Favorited": "Favourited", - "FILE_ALREADY_EXISTS": "File already exists", - "Find 0 result": "Found 0 results", - "Find results": "Found {{number}} result(s)", - "Force Sign Out": "Force Sign Out", - "Get in touch!": "Get in touch!", - "Get in touch! Join our communities": "Get in touch! Join our communities.", - "Get in touch! Join our communities.": "Get in touch! Join our communities.", - "Got it": "Got it", - "How is AFFiNE Alpha different?": "How is AFFiNE Alpha different?", - "Import": "Import", - "Info": "Info", - "Invitation sent": "Invitation sent", - "Invitation sent hint": "Invited members have been notified with email to join this Workspace.", - "Invite": "Invite", - "Invite Members": "Invite Members", - "Invite Members Message": "Invited members will collaborate with you in current Workspace", - "Invite placeholder": "Search mail (Gmail support only)", + "frameless": "Frameless", "invited you to join": "invited you to join", "is a Cloud Workspace": "is a Cloud Workspace.", "is a Local Workspace": "is a Local Workspace.", - "It takes up little space on your device": "It takes up little space on your device.", - "It takes up little space on your device.": "It takes up little space on your device.", - "It takes up more space on your device": "It takes up more space on your device.", - "It takes up more space on your device.": "It takes up more space on your device.", - "Jump to": "Jump to", - "Leave": "Leave", - "Loading": "Loading...", - "Local Workspace Description": "All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", + "light": "Light", "login success": "Login success", - "Member": "Member", - "Member has been removed": "{{name}} has been removed", - "Members": "Members", - "Members hint": "Manage members here, invite new member by email.", "mobile device": "Looks like you are browsing on a mobile device.", "mobile device description": "We are still working on mobile support and recommend you use a desktop device.", - "Move folder": "Move folder", - "Move folder hint": "Select a new storage location.", - "Move folder success": "Move folder success", - "Move page to": "Move page to...", - "Move page to...": "Move page to...", - "Move to": "Move to", - "Moved to Trash": "Moved to Trash", - "My Workspaces": "My Workspaces", - "Navigation Path": "Navigation Path", - "New Keyword Page": "New '{{query}}' page", - "New Page": "New Page", - "New Workspace": "New Workspace", - "No item": "No item", - "Non-Gmail": "Non-Gmail is not supported", - "None yet": "None yet", - "Not now": "Not now", - "Open folder": "Open folder", - "Open folder hint": "Check the where the storage folder is located.", - "Open Workspace Settings": "Open Workspace Settings", - "Organize pages to build knowledge": "Organise pages to build knowledge", - "Owner": "Owner", - "Paper": "Paper", - "Pending": "Pending", - "Pivots": "Pivots", - "Please make sure you are online": "Please make sure you are online", - "Publish": "Publish", - "Publish to web": "Publish to web", - "Published Description": " The current workspace has been published to the web, everyone can view the contents of this workspace through the link.", - "Published hint": "Visitors can view the contents through the provided link.", - "Published to Web": "Published to Web", - "Publishing": "Publishing to web requires AFFiNE Cloud service.", - "Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.", - "Quick search": "Quick search", - "Quick search placeholder": "Quick Search...", - "Quick search placeholder2": "Search in {{workspace}}", - "Recent": "Recent", + "others": "Others", "recommendBrowser": " We recommend the <1>Chrome browser for optimal experience.", - "Remove from Pivots": "Remove from Pivots", - "Remove from workspace": "Remove from workspace", - "Remove special filter": "Remove special filter", - "Rename": "Rename", - "Restart Install Client Update": "Restart to install update", - "Retain cached cloud data": "Retain cached cloud data", - "Retain local cached data": "Retain local cached data", - "RFP": "Pages can be freely added/removed from pivots, remaining accessible from \"All Pages\".", - "Saved then enable AFFiNE Cloud": "All changes are saved locally, click to enable AFFiNE Cloud.", - "Set up an AFFiNE account to sync data": "Set up an AFFiNE account to sync data", - "Share Menu Public Workspace Description1": "Invite others to join the Workspace or publish it to web.", - "Share Menu Public Workspace Description2": "Current workspace has been published to the web as a public workspace.", - "Share with link": "Share with link", - "Shared Pages": "Shared Pages", - "Shared Pages Description": "Sharing page publicly requires AFFiNE Cloud service.", - "Shared Pages In Public Workspace Description": "The entire Workspace is published on the web and can be edited via <1>Workspace Settings.", - "Shortcuts": "Shortcuts", - "Sign in": "Sign in AFFiNE Cloud", - "Sign in and Enable": "Sign in and Enable", - "Sign out": "Sign out", - "Sign out description": "Signing out will cause the unsynchronised content to be lost.", - "Skip": "Skip", - "Stay logged out": "Stay logged out", - "Sticky": "Sticky", + "restored": "{{title}} restored", "still designed": "(This page is still being designed.)", - "Stop publishing": "Stop publishing", - "Storage": "Storage", - "Storage and Export": "Storage and Export", - "Storage Folder": "Storage Folder", - "Successfully deleted": "Successfully deleted", - "Successfully joined!": "Successfully joined!", - "Switch": "Switch", - "Sync": "Sync", - "Synced with AFFiNE Cloud": "Synced with AFFiNE Cloud", - "Tags": "Tags", - "Title": "Title", - "UNKNOWN_ERROR": "Unknown error", - "Unpin": "Unpin", - "Unpublished hint": "Once published to the web, visitors can view the contents through the provided link.", - "Untitled": "Untitled", - "Update Available": "Update available", - "Update workspace name success": "Update workspace name success", - "Updated": "Updated", - "Actions": "Actions", + "system": "System", "upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.", - "Upload": "Upload", - "Users": "Users", - "View Navigation Path": "View Navigation Path", - "Visit Workspace": "Visit Workspace", - "Wait for Sync": "Wait for Sync", - "will delete member": "will delete member", - "Workspace Avatar": "Workspace Avatar", - "Workspace Icon": "Workspace Icon", - "Workspace Name": "Workspace Name", - "Workspace Not Found": "Workspace Not Found", - "Workspace Owner": "Workspace Owner", - "Workspace Profile": "Workspace Profile", - "Workspace saved locally": "{{name}} is saved locally", - "Workspace Settings": "Workspace Settings", - "Workspace Settings with name": "{{name}}'s Settings", - "Workspace Type": "Workspace Type", - "You cannot delete the last workspace": "You cannot delete the last workspace", - "Click to replace photo": "Click to replace photo", - "Remove photo": "Remove photo", - "Removed successfully": "Removed successfully", - "Successfully enabled AFFiNE Cloud": "Successfully enabled AFFiNE Cloud", - "404.hint": "Sorry, you do not have access or this content does not exist...", - "404.back": "Back to My Content", - "404.signOut": "Sign in to another account", - "com.affine.workspaceList.addWorkspace.create": "Create Workspace", - "com.affine.workspaceList.workspaceListType.local": "Local Storage", - "com.affine.workspaceList.workspaceListType.cloud": "Cloud Sync", - "Local": "Local", - "com.affine.cmdk.placeholder": "Type a command or search anything...", - "com.affine.cmdk.affine.new-page": "New Page", - "com.affine.cmdk.affine.new-edgeless-page": "New Edgeless", - "com.affine.cmdk.affine.new-workspace": "New Workspace", - "com.affine.cmdk.affine.create-new-page-as": "New \"{{keyWord}}\" Page", - "com.affine.cmdk.affine.create-new-edgeless-as": "New \"{{keyWord}}\" Edgeless", - "com.affine.cmdk.affine.color-mode.to": "Change Colour Mode to", - "com.affine.cmdk.affine.left-sidebar.expand": "Expand Left Sidebar", - "com.affine.cmdk.affine.left-sidebar.collapse": "Collapse Left Sidebar", - "com.affine.cmdk.affine.navigation.goto-all-pages": "Go to All Pages", - "com.affine.cmdk.affine.navigation.open-settings": "Go to Settings", - "com.affine.cmdk.affine.navigation.goto-trash": "Go to Trash", - "com.affine.cmdk.affine.category.affine.recent": "Recent", - "com.affine.cmdk.affine.category.affine.navigation": "Navigation", - "com.affine.cmdk.affine.category.affine.pages": "Pages", - "com.affine.cmdk.affine.category.affine.creation": "Create", - "com.affine.cmdk.affine.category.affine.settings": "Settings", - "com.affine.cmdk.affine.category.affine.layout": "Layout Controls", - "com.affine.cmdk.affine.category.affine.help": "Help", - "com.affine.cmdk.affine.category.affine.updates": "Updates", - "com.affine.cmdk.affine.category.affine.general": "General", - "com.affine.cmdk.affine.category.editor.insert-object": "Insert Object", - "com.affine.cmdk.affine.category.editor.page": "Page Commands", - "com.affine.cmdk.affine.category.editor.edgeless": "Edgeless Commands", - "com.affine.cmdk.affine.editor.edgeless.presentation-start": "Start Presentation", - "com.affine.cmdk.affine.navigation.goto-page-list": "Go to Page List", - "com.affine.cmdk.affine.navigation.goto-edgeless-list": "Go to Edgeless List", - "com.affine.cmdk.affine.navigation.goto-workspace": "Go to Workspace", - "com.affine.cmdk.affine.category.affine.edgeless": "Edgeless", - "com.affine.cmdk.affine.category.affine.collections": "Collections", - "com.affine.cmdk.affine.import-workspace": "Import Workspace", - "com.affine.cmdk.affine.editor.add-to-favourites": "Add to Favourites", - "com.affine.cmdk.affine.editor.remove-from-favourites": "Remove from Favourites", - "com.affine.cmdk.affine.editor.restore-from-trash": "Restore from Trash", - "com.affine.cmdk.affine.font-style.to": "Change Font Style to", - "com.affine.cmdk.affine.display-language.to": "Change Display Language to", - "com.affine.cmdk.affine.client-border-style.to": "Change Client Border Style to", - "com.affine.cmdk.affine.full-width-layout.to": "Change Full Width Layout to", - "com.affine.cmdk.affine.noise-background-on-the-sidebar.to": "Change Noise Background On The Sidebar to", - "com.affine.cmdk.affine.translucent-ui-on-the-sidebar.to": "Change Translucent UI On The Sidebar to", - "com.affine.cmdk.affine.whats-new": "What's New", - "com.affine.cmdk.affine.getting-started": "Getting Started", - "com.affine.cmdk.affine.contact-us": "Contact Us", - "com.affine.cmdk.affine.restart-to-upgrade": "Restart to Upgrade", - "com.affine.payment.disable-payment.title": "Account Upgrade Unavailable", - "com.affine.payment.disable-payment.description": "This is a special testing(Canary) version of AFFiNE. Account upgrades are not supported in this version. If you want to experience the full service, please download the stable version from our website.", - "com.affine.share-menu.publish-to-web": "Publish to Web", - "com.affine.share-menu.publish-to-web.description": "Let anyone with a link view a read-only version of this page.", - "com.affine.share-menu.share-privately": "Share Privately", - "com.affine.share-menu.share-privately.description": "Only members of this Workspace can open this link.", - "com.affine.share-menu.copy-private-link": "Copy Private Link", - "com.affine.auth.sign-out.confirm-modal.title": "Sign out?", - "com.affine.auth.sign-out.confirm-modal.description": "After signing out, the Cloud Workspaces associated with this account will be removed from the current device, and signing in again will add them back.", - "com.affine.auth.sign-out.confirm-modal.cancel": "Cancel", - "com.affine.auth.sign-out.confirm-modal.confirm": "Sign Out", - "com.affine.payment.recurring-yearly": "yearly", - "com.affine.payment.recurring-monthly": "monthly", - "com.affine.payment.title": "Pricing Plans", - "com.affine.payment.subtitle-not-signed-in": "This is the Pricing plans of AFFiNE Cloud. You can sign up or sign in to your account first.", - "com.affine.payment.subtitle-active": "You are currently on the {{currentPlan}} plan. If you have any questions, please contact our <3>customer support.", - "com.affine.payment.subtitle-canceled": "You are currently on the {{plan}} plan. After the current billing period ends, your account will automatically switch to the Free plan.", - "com.affine.payment.discount-amount": "{{amount}}% off", - "com.affine.payment.sign-up-free": "Sign up free", - "com.affine.payment.buy-pro": "Buy Pro", - "com.affine.payment.current-plan": "Current Plan", - "com.affine.payment.downgrade": "Downgrade", - "com.affine.payment.upgrade": "Upgrade", - "com.affine.payment.downgraded-tooltip": "You have successfully downgraded. After the current billing period ends, your account will automatically switch to the Free plan.", - "com.affine.payment.contact-sales": "Contact Sales", - "com.affine.payment.change-to": "Change to {{to}} Billing", - "com.affine.payment.resume": "Resume", - "com.affine.payment.resume-renewal": "Resume Auto-renewal", - "com.affine.payment.benefit-1": "Unlimited local workspaces", - "com.affine.payment.benefit-2": "Unlimited login devices", - "com.affine.payment.benefit-3": "Unlimited blocks", - "com.affine.payment.benefit-4": "{{capacity}} of Cloud Storage", - "com.affine.payment.benefit-5": "{{capacity}} of maximum file size", - "com.affine.payment.benefit-6": "Number of members per Workspace ≤ {{capacity}}", - "com.affine.payment.dynamic-benefit-1": "Best team workspace for collaboration and knowledge distilling.", - "com.affine.payment.dynamic-benefit-2": "Focusing on what really matters with team project management and automation.", - "com.affine.payment.dynamic-benefit-3": "Pay for seats, fits all team size.", - "com.affine.payment.dynamic-benefit-4": "Solutions & best practices for dedicated needs.", - "com.affine.payment.dynamic-benefit-5": "Embedable & interrogations with IT support.", - "com.affine.payment.see-all-plans": "See all plans", - "com.affine.payment.modal.resume.title": "Resume Auto-Renewal?", - "com.affine.payment.modal.resume.content": "Are you sure you want to resume the subscription for your pro account? This means your payment method will be charged automatically at the end of each billing cycle, starting from the next billing cycle.", - "com.affine.payment.modal.resume.cancel": "Cancel", - "com.affine.payment.modal.resume.confirm": "Confirm", - "com.affine.payment.modal.downgrade.title": "Are you sure?", - "com.affine.payment.modal.downgrade.content": "We're sorry to see you go, but we're always working to improve, and your feedback is welcome. We hope to see you return in the future.", - "com.affine.payment.modal.downgrade.caption": "You can still use AFFiNE Cloud Pro until the end of this billing period :)", - "com.affine.payment.modal.downgrade.cancel": "Cancel Subscription", - "com.affine.payment.modal.downgrade.confirm": "Keep AFFiNE Cloud Pro", - "com.affine.payment.modal.change.title": "Change your subscription", - "com.affine.payment.modal.change.content": "You are changing your <0>from subscription to <1>to subscription. This change will take effect in the next billing cycle, with an effective date of <2>due.", - "com.affine.payment.modal.change.cancel": "Cancel", - "com.affine.payment.modal.change.confirm": "Change", - "com.affine.payment.updated-notify-title": "Subscription updated", - "com.affine.payment.updated-notify-msg": "You have changed your plan to {{plan}} billing.", - "com.affine.payment.updated-notify-msg.cancel-subscription": "No further charges will be made starting from the next billing cycle.", - "com.affine.payment.plans-error-tip": "Unable to load Pricing plans, please check your network. ", - "com.affine.payment.plans-error-retry": "Refresh", - "com.affine.storage.maximum-tips": "You have reached the maximum capacity limit for your current account", - "com.affine.payment.tag-tooltips": "See all plans", - "com.affine.payment.billing-setting.title": "Billing", - "com.affine.payment.billing-setting.subtitle": "Manage your billing information and invoices.", - "com.affine.payment.billing-setting.information": "Information", - "com.affine.payment.billing-setting.history": "Billing history", - "com.affine.payment.billing-setting.current-plan": "Current Plan", - "com.affine.payment.billing-setting.current-plan.description": "You are currently on the <1>{{planName}} plan.", - "com.affine.payment.billing-setting.current-plan.description.monthly": "You are currently on the monthly <1>{{planName}} plan.", - "com.affine.payment.billing-setting.current-plan.description.yearly": "You are currently on the yearly <1>{{planName}} plan.", - "com.affine.payment.billing-setting.month": "month", - "com.affine.payment.billing-setting.year": "year", - "com.affine.payment.billing-setting.payment-method": "Payment Method", - "com.affine.payment.billing-setting.payment-method.description": "Provided by Stripe.", - "com.affine.payment.billing-setting.renew-date": "Renew Date", - "com.affine.payment.billing-setting.renew-date.description": "Next billing date: {{renewDate}}", - "com.affine.payment.billing-setting.expiration-date": "Expiration Date", - "com.affine.payment.billing-setting.expiration-date.description": "Your subscription is valid until {{expirationDate}}", - "com.affine.payment.billing-setting.cancel-subscription": "Cancel Subscription", - "com.affine.payment.billing-setting.cancel-subscription.description": "Subscription cancelled, your pro account will expire on {{cancelDate}}", - "com.affine.payment.billing-setting.upgrade": "Upgrade", - "com.affine.payment.billing-setting.update": "Update", - "com.affine.payment.billing-setting.change-plan": "Change Plan", - "com.affine.payment.billing-setting.resume-subscription": "Resume", - "com.affine.payment.billing-setting.no-invoice": "There are no invoices to display.", - "com.affine.payment.billing-setting.paid": "Paid", - "com.affine.payment.billing-setting.view-invoice": "View Invoice", - "com.affine.payment.upgrade-success-page.title": "Upgrade Successful!", - "com.affine.payment.upgrade-success-page.text": "Congratulations! Your AFFiNE account has been successfully upgraded to a Pro account.", - "com.affine.payment.upgrade-success-page.support": "If you have any questions, please contact our <1> customer support.", - "com.affine.payment.subscription.exist": "You already have a subscription.", - "com.affine.payment.subscription.go-to-subscribe": "Subscribe AFFiNE", - "com.affine.other-page.nav.official-website": "Official Website", - "com.affine.other-page.nav.affine-community": "AFFiNE Community", - "com.affine.other-page.nav.blog": "Blog", - "com.affine.other-page.nav.contact-us": "Contact us", - "com.affine.other-page.nav.download-app": "Download App", - "com.affine.other-page.nav.open-affine": "Open AFFiNE", - "com.affine.payment.member.description": "Manage members here. {{planName}} Users can invite up to {{memberLimit}}", - "com.affine.cmdk.affine.switch-state.on": "ON", - "com.affine.cmdk.affine.switch-state.off": "OFF", - "com.affine.upgrade.button-text.pending": "Upgrade Workspace Data", - "com.affine.upgrade.button-text.upgrading": "Upgrading", - "com.affine.upgrade.button-text.done": "Refresh Current Page", - "com.affine.upgrade.button-text.error": "Data Upgrade Error", - "com.affine.upgrade.tips.normal": "To ensure compatibility with the updated AFFiNE client, please upgrade your data by clicking the \"Upgrade Workspace Data\" button below.", - "com.affine.upgrade.tips.done": "After upgrading the workspace data, please refresh the page to see the changes.", - "com.affine.upgrade.tips.error": "We encountered some errors while upgrading the workspace data.", - "com.affine.workspaceSubPath.trash.empty-description": "Deleted pages will appear here." + "will be moved to Trash": "{{title}} will be moved to Trash", + "will delete member": "will delete member" } diff --git a/packages/frontend/i18n/src/resources/es.json b/packages/frontend/i18n/src/resources/es.json new file mode 100644 index 0000000000..5147d84424 --- /dev/null +++ b/packages/frontend/i18n/src/resources/es.json @@ -0,0 +1,350 @@ +{ + "404 - Page Not Found": "Error 404 - Página no encontrada", + "404.back": "Volver a Mi Contenido", + "404.hint": "Lo sentimos, no tienes acceso o este contenido no existe...", + "404.signOut": "Iniciar sesión con otra cuenta", + "AFFiNE Cloud": "Affine Cloud", + "AFFiNE Community": "Comunidad de AFFiNE", + "About AFFiNE": "Sobre AFFiNE", + "Access level": "Nivel de permisos", + "Add Filter": "Agregar Filtro", + "Add Workspace": "Añadir Espacio de trabajo", + "Add Workspace Hint": "Seleccionar un archivo de base de datos ya existente ", + "Add a subpage inside": "Añadir subpágina", + "Add to Favorites": "Añadir a Favoritos", + "Add to favorites": "Añadir a favoritos", + "Added Successfully": "Añadido exitosamente ", + "Added to Favorites": "Añadido a Favoritos", + "All changes are saved locally": "Todos los cambios se guardaron localmente", + "All data has been stored in the cloud": "Todos los datos han sido almacenados en la nube.", + "All pages": "Todas las páginas ", + "App Version": "Versión de la aplicación", + "Appearance Settings": "Ajustes de Apariencia", + "Append to Daily Note": "Añadir a la nota diaria ", + "Available Offline": "Disponible Offline", + "Back Home": "Volver al inicio", + "Back to Quick Search": "Volver a la barra de búsqueda", + "Body text": "Cuerpo del texto", + "Bold": "Negrita", + "Cancel": "Cancelar", + "Change avatar hint": "El nuevo avatar se mostrará para todos", + "Change workspace name hint": "El nuevo nombre se mostrará para todos", + "Changelog description": "Ver el registro de cambios de AFFiNE", + "Check Keyboard Shortcuts quickly": "Revisar las teclas de acceso rápido", + "Check Our Docs": "Revisa nuestra documentación", + "Check for updates": "Comprobar nuevas actualizaciones", + "Check for updates automatically": "Comprobar nuevas actualizaciones automáticamente", + "Choose your font style": "Elegir estilo de fuente", + "Click to replace photo": "Click para reemplazar foto", + "Client Border Style": "Estilo de borde del cliente", + "Cloud Workspace": "Espacio de trabajo en la nube", + "Cloud Workspace Description": "Todos los datos se sincronizarán y guardarán en la cuenta de AFFINE <1>{{email}}", + "Code block": "Bloque de código", + "Collaboration": "Colaboración", + "Collaboration Description": "Colaborar con otros miembros requiere AFFINE Cloud", + "Collapse sidebar": "Ocultar panel lateral.", + "Collections": "Colecciones", + "Communities": "Comunidades", + "Confirm": "Confirmar", + "Connector": "Conector", + "Contact Us": "Contáctanos", + "Contact with us": "Contáctanos", + "Continue": "Continuar", + "Continue with Google": "Iniciar sesión con Google", + "Convert to ": "Convertir a", + "Copied link to clipboard": "Enlace copiado al portapapeles", + "Copy": "Copiar", + "Copy Link": "Copiar enlace", + "Create": "Crear", + "Create Or Import": "Crear o importar", + "Create Shared Link Description": "Crea un enlace que puedes compartir fácilmente con cualquiera.", + "Create a collection": "Crear una colección", + "Create your own workspace": "Crear tu propio espacio de trabajo", + "Created": "Creado", + "Created Successfully": "Creado exitosamente", + "Created with": "Creado con", + "Curve Connector": "Conector Curvo", + "Customize": "Personalizar", + "Customize your AFFiNE Appearance": "Personalizar la apariencia de AFFiNE", + "DB_FILE_ALREADY_LOADED": "Archivo de base de datos cargado", + "DB_FILE_INVALID": "Archivo de base de datos inválido", + "DB_FILE_MIGRATION_FAILED": "Migración de archivo de base de datos fallida", + "DB_FILE_PATH_INVALID": "Ruta de archivo de base de datos inválida", + "Data sync mode": "Modo de sincronización de datos", + "Date": "Fecha", + "Date Format": "Formato de fecha", + "Default Location": "Ubicación predeterminada", + "Default db location hint": "Por defecto se guardará en {{location}}", + "Delete": "Eliminar", + "Delete Member?": "¿Eliminar Miembro?", + "Delete Workspace": "Eliminar Espacio de trabajo", + "Delete Workspace Description": "Borrar <1>{{workspace}} no se puede deshacer, procede con cuidado. Todo su contenido se borrará.", + "Delete Workspace Description2": "Borrar <1>{{workspace}} borrará tanto los datos locales como en la nube, esta operación no se puede deshacer, procede con cuidado.", + "Delete Workspace Label Hint": "Al borrar este espacio de trabajo, se borrará su contenido de forma permanente para todos. Nadie será capaz de recuperar su contenido.", + "Delete Workspace placeholder": "Por favor escribe \"Delete\" para confirmar", + "Delete page?": "¿Eliminar página?", + "Delete permanently": "Eliminar permanentemente ", + "Disable": "Desactivar", + "Disable Public Link": "Deshabilitar enlace público", + "Disable Public Link ?": "¿Deshabilitar enlace público?", + "Disable Public Link Description": "Desabilitar este enlace público impedirá que cualquier persona con el enlace pueda acceder a la página.", + "Disable Public Sharing": "Dejar de compartir al público", + "Discover what's new": "Descubre que hay de nuevo.", + "Discover what's new!": "¡Descubre las novedades!", + "Display Language": "Idioma", + "Divider": "Divisor", + "Download all data": "Descargar todos los datos", + "Download data Description1": "Ocupará más espacio en tu dispositivo", + "Download data Description2": "Ocupará menos espacio en tu dispositivo", + "Download updates automatically": "Descargar actualizaciones automáticamente ", + "Early Access Stage": "Etapa de acceso anticipado", + "Edgeless": "Sin bordes", + "Edit": "Editar", + "Edit Filter": "Editar Filtro", + "Editor Version": "Versión del Editor", + "Elbowed Connector": "Conector de codo", + "Enable": "Activar", + "Enable AFFiNE Cloud": "Activar AFFINE Cloud", + "Enable AFFiNE Cloud Description": "Si se activa, los datos de este espació de trabajo se respaldarán y sincronizarán a Affine Cloud.", + "Enable cloud hint": "Las siguientes funciones dependen de AFFiNE Cloud. Todos los datos se guardan en este dispositivo. Puedes habilitar AFFiNE Cloud para este espacio de trabajo para sincronizar los datos con la nube.", + "Enabled success": "Activado correctamente", + "Exclude from filter": "Excluir del filtro", + "Expand sidebar": "Expandir sidebar", + "Expand/Collapse Sidebar": "Expandir/Reducir Barra lateral", + "Export": "Exportar", + "Export AFFiNE backup file": "Exportar archivo de respaldo de AFFiNE", + "Export Description": "Puedes exportar el espacio de trabajo completo como respaldo, y los datos exportados pueden ser re-importados", + "Export Shared Pages Description": "Descarga una copia estática de tu página para compartirla con otros.", + "Export Workspace": "Exportar espacio de trabajo <1>{{workspace}} llegará pronto", + "Export failed": "Exportación fallida", + "Export success": "Exportación correcta", + "Export to HTML": "Exportar a HTML", + "Export to Markdown": "Exportar a Markdown", + "Export to PDF": "Exportar a PDF", + "Export to PNG": "Exportar a PNG", + "FILE_ALREADY_EXISTS": "Ya existe un archivo con ese nombre", + "Failed to publish workspace": "Publicación de espacio de trabajo fallida", + "Favorite": "Favorito", + "Favorited": "Añadido a favoritos", + "Favorites": "Favoritos", + "Filters": "Filtros", + "Find 0 result": "Se encontraron 0 resultados", + "Find results": "Se encontró {{number}} resultado(s)", + "Font Style": "Estilo de fuente", + "Force Sign Out": "Forzar cierre de sesión", + "Full width Layout": "Diseño ancho", + "General": "General", + "Get in touch!": "¡Contactar!", + "Get in touch! Join our communities": "¡Contáctanos! Únete a nuestras comunidades.", + "Get in touch! Join our communities.": "¡Contáctanos! Únete a nuestras comunidades.", + "Go Back": "Volver", + "Go Forward": "Ir adelante", + "Got it": "Entendido", + "Group": "Grupo", + "Group as Database": "Grupo como base de datos", + "Hand": "Mano", + "Heading": "Encabezado {{number}}", + "Help and Feedback": "Ayuda y comentarios", + "How is AFFiNE Alpha different?": "Cuan diferente es AFFiNE Alpha?", + "Image": "Imagen", + "Import": "Importar", + "Increase indent": "Aumentar sangria", + "Info": "Información", + "Info of legal": "Información legal", + "Inline code": "Código de una línea", + "Invitation sent": "Invitación enviada", + "Invitation sent hint": "Los miembros invitados han sido notificados a su email para unirse a este Espacio de trabajo", + "Invite": "Invitar", + "Invite Members": "Invitar a Miembros", + "Invite Members Message": "Los miembros invitados podrán colaborar contigo en este Espacio de trabajo", + "Invite placeholder": "Buscar mail (Soporte sólo para Gmail)", + "It takes up little space on your device": "Ocupará menos espacio en tu dispositivo.", + "It takes up little space on your device.": "Ocupará menos espacio en tu dispositivo.", + "It takes up more space on your device": "Ocupará más espacio en tu dispositivo", + "It takes up more space on your device.": "Ocupará más espacio en tu dispositivo", + "Italic": "Itálica", + "Jump to": "Ir a", + "Keyboard Shortcuts": "Atajos de teclado", + "Leave": "Abandonar", + "Leave Workspace": "Abandonar Espacio de trabajo", + "Leave Workspace Description": "Al abandonar, perderás el acceso al contenido de este espacio de trabajo", + "Leave Workspace hint": "Al abandonar, perderás el acceso al contenido dentro del espacio de trabajo", + "Link": "Hipervínculo (con texto seleccionado)", + "Loading": "Cargando...", + "Loading All Workspaces": "Cargando todos los espacios de trabajo", + "Local": "Local", + "Local Workspace": "Espacio de trabajo local", + "Local Workspace Description": "Todos los datos se guardan en este dispositivo. Puedes habilitar AFFiNE Cloud para este espacio de trabajo para sincronizar los datos con la nube.", + "Markdown Syntax": "Sintaxis Markdown", + "Member": "Miembro", + "Member has been removed": "{{name}} ha sido eliminado", + "Members": "Miembros", + "Members hint": "Administra los miembros aquí, invita un nuevo miembro por email.", + "Move Down": "Mover hacia abajo", + "Move Up": "Mover hacia arriba", + "Move folder": "Mover carpeta", + "Move folder hint": "Selecciona una nueva ruta de almacenamiento.", + "Move page to": "Mover página a...", + "Move page to...": "Mover página a...", + "Move to": "Mover a", + "Move to Trash": "Mover a la Papelera", + "Moved to Trash": "Movido a la Papelera", + "My Workspaces": "Mis Espacios de trabajo", + "Name Your Workspace": "Nombra tu Espacio de trabajo", + "NativeTitleBar": "Barra de título nativa", + "Navigation Path": "Ruta de navegación", + "New Keyword Page": "Nueva '{{query}}' página", + "New Page": "Nueva Página", + "New Workspace": "Nuevo Espacio de trabajo", + "New version is ready": "Nueva versión disponible", + "No item": "Sin elementos", + "Non-Gmail": "Externo a Gmail no soportado", + "None yet": "Ninguna todavía", + "Not now": "No ahora", + "Note": "Nota", + "Official Website": "Página web oficial", + "Open Workspace Settings": "Abrir ajustes del Espacio de trabajo", + "Open folder": "Abrir carpeta", + "Open folder hint": "Verificar dónde está la carpeta de almacenamiento", + "Open in new tab": "Abrir en nueva pestaña", + "Organize pages to build knowledge": "Organiza tus páginas para construir conocimiento", + "Owner": "Propietario", + "Page": "Página", + "Paper": "Papel", + "Pen": "Pluma (próximamente)", + "Pending": "Pendiente", + "Permanently deleted": "Eliminado permanentemente", + "Pivots": "Pivotes", + "Placeholder of delete workspace": "Escribe el nombre del espacio de trabajo para confirmar", + "Please make sure you are online": "Por favor, asegúrese de estar en línea", + "Privacy": "Privacidad", + "Publish": "Publicar", + "Publish to web": "Publicar en la web", + "Published Description": "El espacio de trabajo ha sido publicado en la web, cualquiera puede ver sus contenidos por medio del enlace.", + "Published hint": "Los visitantes pueden ver los contenidos por medio del enlace proporcionado.", + "Published to Web": "Publicado en la Web", + "Publishing": "Publicar a la web require AFFiNE Cloud.", + "Publishing Description": "Al publicar a la web, cualquiera puede ver el contenido de este espacio de trabajo por medio del enlace.", + "Quick Search": "Búsqueda rápida", + "Quick search": "Búsqueda rápida", + "Quick search placeholder": "Búsqueda rápida...", + "Quick search placeholder2": "Busca en {{workspace}}", + "RFP": "Las páginas pueden ser libremente añadidas/removidas de los pivotes, manteniéndose accesibles desde \"Todas las páginas\".", + "Recent": "Reciente", + "Redo": "Rehacer", + "Reduce indent": "Reducir sangria", + "Remove from Pivots": "Remover de los Pivotes.", + "Remove from favorites": "Quitar de favoritos", + "Remove from workspace": "Eliminar del Espacio de trabajo", + "Remove photo": "Quitar foto", + "Remove special filter": "Quitar filtro especial", + "Removed from Favorites": "Removido de Favoritos", + "Removed successfully": "Eliminado exitosamente", + "Rename": "Renombrar", + "Restart Install Client Update": "Reiniciar para instalar la actualización", + "Restore it": "Restaurar", + "Retain cached cloud data": "Mantener datos almacenados en caché de la nube", + "Retain local cached data": "Mantener datos alamacenados en caché locales", + "Save": "Guardar", + "Save As New Collection": "Guardar como nueva colección", + "Save as New Collection": "Guardar como nueva colección", + "Saved then enable AFFiNE Cloud": "Todos los cambias se guardaron localmente, click para habilitar AFFiNE Cloud.", + "Select": "Seleccionar", + "Select All": "Seleccionar todo", + "Set a Workspace name": "Fijar nombre de Espacio de trabajo", + "Set database location": "Fijar ubicación de base de datos", + "Set up an AFFiNE account to sync data": "Crear una cuenta de AFFiNE para sincronizar los datos", + "Settings": "Ajustes", + "Shape": "Forma", + "Share Menu Public Workspace Description1": "Invita a otros a unirse al Espacio de trabajo o publicalo a la web", + "Share Menu Public Workspace Description2": "El espacio de trabajo ha sido publicado a la web como un espacio de trabajo público.", + "Share with link": "Compartir con enlace", + "Shared Pages": "Páginas compartidas", + "Shared Pages Description": "Compartir la página al público requiere AFFiNE Cloud.", + "Shared Pages In Public Workspace Description": "El espacio de trabajo completo es publicado en la web y puede ser editado mediante <1>Ajustes de Espacio de trabajo", + "Shortcuts": "Atajos", + "Sidebar": "Barra lateral", + "Sign in": "Iniciar sesión en AFFiNE Cloud", + "Sign in and Enable": "Iniciar sesión y habilitar", + "Sign out": "Cerrar sesión", + "Sign out description": "Cerrar sesión causará que los datos no sincronizados se pierdan.", + "Skip": "Saltar", + "Start Week On Monday": "Iniciar semana en Lunes", + "Stay logged out": "Mantener sesión cerrada", + "Sticky": "Pegajosa", + "Storage": "Almacenamiento", + "Storage Folder": "Carpeta de Almacenamiento", + "Straight Connector": "Conector recto", + "Strikethrough": "Tachado", + "Successfully deleted": "Eliminado exitosamente", + "Successfully enabled AFFiNE Cloud": "AFFiNE Cloud ha sido activado exitosamente", + "Sync": "Sincronizar", + "Sync across devices with AFFiNE Cloud": "Sincronizar dispositivos con AFFiNE Cloud", + "Synced with AFFiNE Cloud": "Sincronizado con AFFiNE Cloud", + "Tags": "Etiquetas", + "Terms of Use": "Términos de uso", + "Text": "Texto", + "Theme": "Tema", + "Title": "Título", + "Trash": "Papelera de reciclaje", + "TrashButtonGroupDescription": "Una vez borrado, no podrás rehacerlo. Confirmas?", + "TrashButtonGroupTitle": "Borrar permanentemente ", + "UNKNOWN_ERROR": "Error desconocido", + "Underline": "Subrayado ", + "Undo": "Deshacer", + "Ungroup": "Desagrupar", + "Unpin": "Desprender", + "Unpublished hint": "Una vez publicado en la web, los visitantes podrán ver los contenidos por medio del enlace proporcionado.", + "Untitled": "Sin título", + "Untitled Collection": "Colección sin título", + "Update Available": "Actualización disponible", + "Update Collection": "Actualizar colección", + "Updated": "Actualizado", + "Upload": "Subir", + "Use on current device only": "Usar sólo en este dispositivo", + "Users": "Usuarios", + "Version": "Versión", + "View Navigation Path": "Ver ruta de navegación", + "Visit Workspace": "Visitar Espacio de trabajo", + "Wait for Sync": "Esperando sincronización", + "Window frame style": "Estilo de borde de ventana", + "Workspace Avatar": "Avatar de Espacio de trabajo", + "Workspace Icon": "Icono del Espacio de trabajo", + "Workspace Name": "Nombre del Espacio de trabajo", + "Workspace Not Found": "Espacio de trabajo no encontrado", + "Workspace Owner": "Propietario del Espacio de trabajo", + "Workspace Profile": "Perfil de Espacio de trabajo", + "Workspace Settings": "Ajustes del Espacio de trabajo", + "Workspace Settings with name": "Ajustes de {{name}}", + "Workspace Type": "Tipo de Espacio de trabajo", + "all": "todos", + "com.affine.cloudTempDisable.title": "AFFiNE Cloud se está actualizando ahora.", + "com.affine.filter": "Filtro", + "com.affine.filter.after": "después", + "com.affine.filter.before": "antes", + "com.affine.filter.false": "falso", + "com.affine.filter.is": "és", + "com.affine.helpIsland.gettingStarted": "Comenzar ahora.", + "com.affine.settings.appearance.start-week-description": "Por defecto, la semana empieza el domingo.", + "com.affine.settings.remove-workspace": "Eliminar Espacio de trabajo", + "com.affine.settings.workspace": "Espacio de trabajo", + "com.affine.updater.downloading": "Descargando", + "com.affine.updater.restart-to-update": "Reiniciar para instalar la actualización", + "com.affine.updater.update-available": "Actualización disponible", + "emptyFavorite": "Haga click en Añadir a favoritos y la página aparecerá aquí.", + "emptySharedPages": "Las páginas compartidas aparecerán aquí.", + "emptyTrash": "Haga click para añadir a la Basura y la página aparecerá aquí.", + "is a Local Workspace": "Es una espacio de trabajo local", + "light": "Claro", + "login success": "Acceso exitoso", + "mobile device": "Parece que estás navegando desde un móvil.", + "mobile device description": "Aún estamos trabajando en la versión móvil, recomendamos usar la versión de escritorio, ", + "others": "Otros", + "recommendBrowser": "Recomendamos el navegador de <1>Chrome<1> para una experiencia más optima.", + "restored": "{{tittle}} restablecido", + "still designed": "(Está página aún se esta diseñando)", + "system": "Sistema", + "upgradeBrowser": "Por favor actuliza a la ultoma versión de Chrome para tener la mejor experiencia.", + "will be moved to Trash": "{{title}} se movera al bote de basura", + "will delete member": "Se eliminará el miembro" +} diff --git a/packages/frontend/i18n/src/resources/fr.json b/packages/frontend/i18n/src/resources/fr.json index adbf58f471..8461eee118 100644 --- a/packages/frontend/i18n/src/resources/fr.json +++ b/packages/frontend/i18n/src/resources/fr.json @@ -1,28 +1,354 @@ { + "404 - Page Not Found": "Erreur 404 - Page non trouvée", + "404.back": "Retour vers Mon Contenu", + "404.hint": "Désolé, vous n'avez pas accès à ce contenu, ou celui-ci n'existe pas…", + "404.signOut": "Se connecter à un autre compte", + "AFFiNE Cloud": "AFFiNE Cloud", + "AFFiNE Community": "Communauté AFFiNE", + "About AFFiNE": "À propos d'AFFiNE", "Access level": "Permissions", - "Add a subpage inside": "Ajouter une sous-page à l'intérieur ", + "Actions": "Action", + "Add Filter": "Ajouter un filtre", "Add Workspace": "Ajouter un nouvel espace de travail", "Add Workspace Hint": "Sélectionnez le fichier de la base de données déjà existant", + "Add a subpage inside": "Ajouter une sous-page à l'intérieur ", + "Add to Favorites": "Ajouter aux Favoris", + "Add to favorites": "Ajouter aux favoris", + "Added Successfully": "Ajouté avec succès", + "Added to Favorites": "Ajouté aux favoris ", "All changes are saved locally": "Les changements sont sauvegardés localement", "All data has been stored in the cloud": "Toutes les données ont été sauvegardées dans le cloud.", + "All pages": "Toutes les pages", + "App Version": "Version", + "Appearance Settings": "Paramètres d'apparence", + "Append to Daily Note": "Ajouter à la note journalière", + "Available Offline": "Disponible hors ligne", + "Back Home": "Retour à l'accueil", "Back to Quick Search": "Retourner à la Recherche Rapide", + "Back to all": "Retour à tous", + "Body text": "Corps du texte", + "Bold": "Gras", + "Cancel": "Annuler ", "Change avatar hint": "Le nouvel avatar s'affichera pour tout le monde.", "Change workspace name hint": "Le nouveau nom s'affichera pour tout le monde.", + "Changelog description": "Voir le journal des modifications d'AFFiNE", + "Check Keyboard Shortcuts quickly": "Regarder rapidement les raccourcis clavier", "Check Our Docs": "Consultez notre documentation", + "Check for updates": "Vérifier pour les mises à jour", + "Check for updates automatically": "Vérifier automatiquement les mises à jours", + "Choose your font style": "Choisissez votre police de caractères", + "Click to replace photo": "Cliquez pour remplacer la photo", + "Client Border Style": "Style de bordure de l'application", + "Cloud Workspace": "Espace de travail distant", "Cloud Workspace Description": "Toutes les données vont être synchronisées et sauvegardées sur le compte AFFiNE <1>{{email}}", + "Code block": "Bloc de code", "Collaboration": "Collaboration", "Collaboration Description": "La collaboration avec d'autres membres nécessite AFFiNE Cloud.", + "Collapse sidebar": "Rabattre la barre latérale", + "Collections": "Collections", + "Communities": "Communautés", + "Confirm": "Confirmer", + "Connector": "Connecteur (bientôt disponible) ", + "Contact Us": "Contactez-nous ", + "Contact with us": "Contactez-nous", + "Continue": "Continuer", + "Continue with Google": "Se connecter avec Google ", + "Convert to ": "Convertir en ", + "Copied link to clipboard": "Lien copié dans le presse-papier", + "Copy": "Copier", + "Copy Link": "Copier le lien", + "Create": "Créer ", + "Create Or Import": "Créer ou importer", + "Create Shared Link Description": "Créez un lien que vous pouvez facilement partager avec n'importe qui.", + "Create a collection": "Créer un collection", + "Create your own workspace": "Créer votre propre espace de travail", + "Created": "Objet créé ", + "Created Successfully": "Créé avec succès", + "Created with": "Créé avec", + "Curve Connector": "Connecteur arrondi", + "Customize": "Parcourir", + "Customize your AFFiNE Appearance": "Personnalisez l'apparence de votre AFFiNE", + "DB_FILE_ALREADY_LOADED": "Le fichier de base de données a déjà été chargé", + "DB_FILE_INVALID": "Fichier de base de données invalide", + "DB_FILE_MIGRATION_FAILED": "La migration du fichier de base de données a échoué", + "DB_FILE_PATH_INVALID": "Le chemin d'accès du fichier de base de données est invalide", + "Data sync mode": "Mode de synchronisation des données", + "Date": "Date", + "Date Format": "Format de date", + "Default Location": "Emplacement par défaut", + "Default db location hint": "Par défaut, elle sera enregistrée sous {{location}}", + "Delete": "Supprimer objet ", + "Delete Member?": "Supprimer le membre ?", + "Delete Workspace": "Supprimer l'espace de travail", + "Delete Workspace Description": "Attention, la suppression de <1>{{workspace}} est irréversible. Le contenu sera perdu.", + "Delete Workspace Description2": "La suppression de <1>{{workspace}} aura pour effet de supprimer les données locales et les données dans le cloud. Attention, cette opération est irréversible.", + "Delete Workspace Label Hint": "Après la suppression de cet espace de travail, vous supprimerez de manière permanente tout le contenu de tous les utilisateurs. En aucun cas le contenu de cet espace de travail ne pourra être restauré.", + "Delete Workspace placeholder": "Veuillez écrire \"Delete\" pour confirmer", + "Delete page?": "Supprimer la page ?", + "Delete permanently": "Supprimer définitivement", + "Disable": "Désactiver", + "Disable Public Link": "Désactiver le lien public", + "Disable Public Link ?": "Désactiver le lien public ?", + "Disable Public Link Description": "Désactiver ce lien public empêchera à quiconque avec le lien d’accéder à cette page.", + "Disable Public Sharing": "Désactiver le Partage Public ", + "Discover what's new": "Découvrez les nouveautés", + "Discover what's new!": "Découvrez les nouveautés !", + "Display Language": "Langue d'affichage", + "Divider": "Séparateur", + "Download all data": "Télécharger toutes les données", + "Download core data": "Télécharger les données principales", + "Download data": "Télécharger les données {{CoreOrAll}}", + "Download data Description1": "Cela prend davantage d’espace sur votre appareil.", + "Download data Description2": "Cela prend peu d’espace sur votre appareil.", + "Download updates automatically": "Télécharger les mises à jour automatiquement", + "Early Access Stage": "Accès anticipé", + "Edgeless": "Mode sans bords", + "Edit": "Éditer", + "Edit Filter": "Editer le filtre", + "Editor Version": "Mode Édition", + "Elbowed Connector": "Connecteur coudé", + "Enable": "Activer", + "Enable AFFiNE Cloud": "Activer AFFiNE Cloud", + "Enable AFFiNE Cloud Description": "Si cette option est activée, les données de cet espace de travail seront sauvegardées et synchronisées via AFFiNE Cloud.", + "Enable cloud hint": "Les fonctions suivantes nécessitent AFFiNE Cloud. Toutes les données sont actuellement stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour cet espace de travail afin de le garder synchronisé avec le Cloud.", + "Enabled success": "Activation réussie", + "Exclude from filter": "Exclure du filtre", + "Expand sidebar": "Agrandir la barre latérale", + "Expand/Collapse Sidebar": "Agrandir/Rabattre la barre latérale", + "Export": "Exporter ", + "Export AFFiNE backup file": "Exporter un fichier de sauvegarde AFFiNE", + "Export Description": "Vous pouvez exporter l'intégralité des données de l'espace de travail à titre de sauvegarde ; les données ainsi exportées peuvent être réimportées.", + "Export Shared Pages Description": "Télécharger une copie de la version actuelle pour la partager avec les autres.", + "Export Workspace": "L'exportation de l'espace de travail <1>{{workspace}} sera bientôt disponible.", + "Export failed": "L'exportation à échouer", + "Export success": "Exporté avec succès", + "Export to HTML": "Exporter en HTML", + "Export to Markdown": "Exporter en Markdown", + "Export to PDF": "Exporter en PDF", + "Export to PNG": "Exporter en PNG", + "FILE_ALREADY_EXISTS": "Fichier déjà existant", + "Failed to publish workspace": "La publication de l'espace de travail a échoué", + "Favorite": "Favori", + "Favorite pages for easy access": "Pages favorites pour un accès rapide", + "Favorited": "Ajouté aux favoris", + "Favorites": "Favoris ", + "Filters": "Filtres", + "Find 0 result": "Aucun résultat trouvé ", + "Find results": "{{number}} résultats trouvés", + "Font Style": "Police de caractères", + "Force Sign Out": "Forcer la déconnexion", + "Full width Layout": "Disposition en pleine largeur", + "General": "Général", + "Get in touch!": "Contactez-nous ! ", + "Get in touch! Join our communities": "Contactez-nous ! Rejoignez nos communautés.", + "Get in touch! Join our communities.": "Contactez-nous ! Rejoignez nos communautés.", + "Go Back": "Retour en arrière", + "Go Forward": "Retour en avant", + "Got it": "Compris", + "Group": "Grouper", + "Group as Database": "Grouper comme une base de donnée", + "Hand": "Main", + "Heading": "Titre {{number}}", + "Help and Feedback": "Aide et feedbacks", + "How is AFFiNE Alpha different?": "Quelles sont les différences avec AFFiNE Alpha ?", + "Image": "Image", + "Import": "Importer ", + "Increase indent": "Augmenter l'indentation", + "Info": "Information", + "Info of legal": "Mentions légales", + "Inline code": "Code inline", + "Invitation sent": "Invitation envoyée", + "Invitation sent hint": "Les membres invités ont été informés par e-mail pour rejoindre cet espace de travail.", + "Invite": "Inviter", + "Invite Members": "Inviter des membres", + "Invite Members Message": "Les membres invités collaboreront avec vous dans l'espace de travail actuel", + "Invite placeholder": "Rechercher une adresse mail (compatible uniquement avec Gmail)", + "It takes up little space on your device": "Prend peu d’espace sur l'appareil.", + "It takes up little space on your device.": "Prend peu d’espace sur l'appareil.", + "It takes up more space on your device": "Prend davantage d’espace sur l'appareil.", + "It takes up more space on your device.": "Cela prend davantage d’espace sur votre appareil.", + "Italic": "Italique", + "Joined Workspace": "L'espace de travail a été rejoint", + "Jump to": "Passer à ", + "Keyboard Shortcuts": "Raccourcis clavier", + "Leave": "Quitter", + "Leave Workspace": "Quitter l'espace de travail", + "Leave Workspace Description": "Une fois quitté, vous ne pourrez plus accéder au contenu de cet espace de travail.", + "Leave Workspace hint": "Une fois quitté, vous ne pourrez plus accéder au contenu à l'intérieur de cet espace de travail.", + "Link": "Lien hypertexte (avec le texte sélectionné)", + "Loading": "Chargement...", + "Loading All Workspaces": "Chargement de tous les espaces de travail", + "Local": "Local", + "Local Workspace": "Espace de travail local", + "Local Workspace Description": "Toutes les données sont stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour garder les données de cet espace de travail synchronisé dans le cloud.", + "Markdown Syntax": "Syntaxe Markdown", + "Member": "Membre", + "Member has been removed": "{{name}} a été supprimé", + "Members": "Membres", + "Members hint": "Gérez les membres ici, invitez des nouveaux membres par e-mail.", + "Move Down": "Descendre", + "Move Up": "Remonter", + "Move folder": "Déplacer le dossier", + "Move folder hint": "Sélectionnez le nouveau chemin d'accès pour le stockage ", + "Move folder success": "Le déplacement du fichier a été réalisé avec succès", + "Move page to": "Déplacer la page vers ...", + "Move page to...": "Déplacer la page vers ...", + "Move to": "Déplacer vers", + "Move to Trash": "Déplacer à la corbeille", + "Moved to Trash": "Déplacé dans la corbeille ", + "My Workspaces": "Mes espaces de travail", + "Name Your Workspace": "Nommer l'espace de travail", + "NativeTitleBar": "Barre de titre", + "Navigation Path": "Chemin d'accès", + "New Keyword Page": "Nouvelle page '{{query}}'", + "New Page": "Nouvelle page", + "New Workspace": "Nouvel espace de travail ", + "New version is ready": "Nouvelle version disponible", + "No item": "Aucun objet ", + "Non-Gmail": "Seul Gmail est supporté", + "None yet": "Aucun pour l'instant", + "Not now": "Pas maintenant", + "Note": "Note", + "Official Website": "Site officiel ", + "Open Workspace Settings": "Ouvrir les paramètres de l'espace de travail", + "Open folder": "Ouvrir le dossier", + "Open folder hint": "Vérifiez l'emplacement du dossier de stockage.", + "Open in new tab": "Ouvrir dans un nouvel onglet", + "Organize pages to build knowledge": "Organisez vos pages pour construire l'entièreté de votre savoir", + "Owner": "Propriétaire", + "Page": "Page", + "Paper": "Papier", + "Pen": "Stylo", + "Pending": "En attente", + "Permanently deleted": "Supprimé définitivement ", + "Pivots": "Arborescence", + "Placeholder of delete workspace": "Entrez le nom de l'espace de travail pour confirmer", + "Please make sure you are online": "Vérifiez que vous êtes bien en ligne", + "Privacy": "Confidentialité", + "Publish": "Publier", + "Publish to web": "Publier sur internet", + "Published Description": "L'espace de travail actuel a été publié sur Internet. Toute personne disposant du lien peut consulter le contenu.", + "Published hint": "Les visiteurs peuvent prévisualiser le contenu via le lien fourni.", + "Published to Web": "Publié sur Internet", + "Publishing": "Publier sur le web nécessite le service AFFiNE Cloud.", + "Publishing Description": "Après avoir publié sur le net, toute personne disposant du lien pourra consulter le contenu.", + "Quick Search": "Recherche rapide", + "Quick search": "Recherche rapide", + "Quick search placeholder": "Recherche Rapide ...", + "Quick search placeholder2": "Rechercher dans {{workspace}}", + "RFP": "Les pages peuvent librement être rajoutées/retirées de l'arborescence, tout en restant accessible depuis \"Toutes les pages\".", + "Recent": "Récent", + "Redo": "Rétablir", + "Reduce indent": "Réduire l'indentation du texte", + "Remove from Pivots": "Retirer de l'Arborescence", + "Remove from favorites": "Retirer des favoris", + "Remove from workspace": "Retirer de l'espace de travail", + "Remove photo": "Supprimer la photo", + "Remove special filter": "Retirer le filtre spécial", + "Removed from Favorites": "Retiré des Favoris ", + "Removed successfully": "Supprimer avec succès", + "Rename": "Renommer", + "Restart Install Client Update": "Redémarrez pour installer la mise à jour", + "Restore it": "Restaurer ", + "Retain cached cloud data": "Conserver les données mises en cache dans le cloud", + "Retain local cached data": "Conserver les données du cache local", + "Save": "Enregistrer", + "Save As New Collection": "Enregistrer en tant que nouvelle collection", + "Save as New Collection": "Enregistrer en tant que nouvelle collection", + "Saved then enable AFFiNE Cloud": "Toutes les modifications sont sauvegardées localement, cliquez ici pour activer la sauvegarde AFFiNE Cloud", + "Select": "Sélectionner ", + "Select All": "Tout Sélectionnner", + "Set a Workspace name": "Définir un nom pour l'espace de travail", + "Set database location": "Définir l'emplacement de la base de données", + "Set up an AFFiNE account to sync data": "Configurer un compte AFFiNE pour synchroniser les données", + "Settings": "Paramètres", + "Shape": "Forme", + "Share Menu Public Workspace Description1": "Invitez d'autres personnes à rejoindre cet espace de travail ou publiez-le sur internet.", + "Share Menu Public Workspace Description2": "L'espace de travail actuel a été publié sur le web en tant qu'espace de travail public.", + "Share with link": "Partager un lien", + "Shared Pages": "Pages partagées", + "Shared Pages Description": "Le service de partage de page public nécessite AFFiNE Cloud.", + "Shared Pages In Public Workspace Description": "L'intégralité de cet espace de travail a été publiée sur internet et peut être modifiée via les <1>Paramètres de l'espace de travail.", + "Shortcuts": "Raccourcis", + "Sidebar": "Barre latérale", + "Sign in": "Se connecter à AFFiNE Cloud", + "Sign in and Enable": "Se connecter et activer", + "Sign out": "Se déconnecter", + "Sign out description": "Se déconnecter provoquera la perte du contenu non synchronisé.", + "Skip": "Passer", + "Start Week On Monday": "Commencer la semaine le lundi", + "Stay logged out": "Rester déconnecté", + "Sticky": "Post-it", + "Stop publishing": "Arrêter de publier", + "Storage": "Stockage", + "Storage Folder": "Dossier du stockage ", + "Storage and Export": "Stockage et Exportation", + "Straight Connector": "Connecteur droit", + "Strikethrough": "Barrer", + "Successfully deleted": "Supprimé avec succès", + "Successfully enabled AFFiNE Cloud": "Activation d'AFFINE Cloud avec succès.", + "Successfully joined!": "Rejoint avec succès !", + "Switch": "Changer", + "Sync": "Synchroniser", + "Sync across devices with AFFiNE Cloud": "Synchroniser parmi plusieurs appareils avec AFFiNE Cloud", + "Synced with AFFiNE Cloud": "Synchronisé avec AFFiNE Cloud", + "Tags": "Tags", + "Terms of Use": "Conditions générales d'utilisation", + "Text": "Texte ", + "Theme": "Thème", + "Title": "Titre ", + "Trash": "Corbeille ", + "TrashButtonGroupDescription": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ", + "TrashButtonGroupTitle": "Supprimer définitivement", + "UNKNOWN_ERROR": "Erreur inconnue", + "Underline": "Souligner ", + "Undo": "Annuler", + "Ungroup": "Dégrouper", + "Unpin": "Désépingler", + "Unpublished hint": "Une fois publié sur internet, les visiteurs peuvent voir le contenu via le lien fourni.", + "Untitled": "Sans titre", + "Untitled Collection": "Collection sans titre", + "Update Available": "Mise à jour disponible", + "Update Collection": "Mettre à jour la collection", + "Update workspace name success": "L'espace de travail à été renommé avec succès", + "Updated": "Mis à jour", + "Upload": "Uploader ", + "Use on current device only": "Utiliser seulement sur l'appareil actuel", + "Users": "Utilisateur", + "Version": "Version", + "View Navigation Path": "Voir le Chemin d'Accès", + "Visit Workspace": "Visiter l'espace de travail", + "Wait for Sync": "Attendez la synchronisation", + "Window frame style": "Style de fenêtre", + "Workspace Avatar": "Avatar de l'espace de travail", + "Workspace Icon": "Icône espace de travail", + "Workspace Name": "Nom de l'espace de travail", + "Workspace Not Found": "L'epace de travail n'a pas été trouvé", + "Workspace Owner": "Propriétaire de l’espace de travail ", + "Workspace Profile": "Profil de l'Espace de travail", + "Workspace Settings": "Paramètres de l'espace de travail", + "Workspace Settings with name": "Paramètres de {{name}}", + "Workspace Type": "Type de l'espace de travail", + "Workspace database storage description": "Sélectionnez l'endroit où vous souhaitez créer votre espace de travail. Les données de l'espace de travail sont enregistrées localement par défaut.", + "Workspace description": "Un espace de travail est votre espace virtuel pour capturer, créer et planifier aussi bien seul qu'en équipe.", + "Workspace saved locally": "{{name}} est sauvegardé localement", + "You cannot delete the last workspace": "Vous ne pouvez pas supprimer le dernier Espace de travail", + "Zoom in": "Agrandir", + "Zoom out": "Rétrécir", + "Zoom to 100%": "Zoom à 100%", + "Zoom to fit": "Zoom à l'échelle", + "all": "tout", "com.affine.aboutAFFiNE.autoCheckUpdate.description": "Vérifiez automatiquement pour de nouvelles mises à jour régulièrement.", "com.affine.aboutAFFiNE.autoCheckUpdate.title": "Vérifier automatiquement les mises à jours", "com.affine.aboutAFFiNE.autoDownloadUpdate.description": "Télécharger les mises à jour automatiquement (pour cet appareil)", "com.affine.aboutAFFiNE.autoDownloadUpdate.title": "Télécharger les mises à jour automatiquement", "com.affine.aboutAFFiNE.changelog.description": "Voir le journal des modifications d'AFFiNE", - "com.affine.aboutAFFiNE.changelog.title": "Découvrez les nouveautés", + "com.affine.aboutAFFiNE.changelog.title": "Découvrez les nouveautés !", "com.affine.aboutAFFiNE.checkUpdate.description": "Nouvelle version disponible", "com.affine.aboutAFFiNE.checkUpdate.title": "Vérifier pour les mises à jour", "com.affine.aboutAFFiNE.community.title": "Communautés", "com.affine.aboutAFFiNE.contact.community": "Communauté AFFiNE", - "com.affine.aboutAFFiNE.contact.title": "Contactez-nous", + "com.affine.aboutAFFiNE.contact.title": "Contactez-nous ", "com.affine.aboutAFFiNE.contact.website": "Site officiel ", "com.affine.aboutAFFiNE.legal.privacy": "Confidentialité", "com.affine.aboutAFFiNE.legal.title": "Mentions légales", @@ -32,6 +358,12 @@ "com.affine.aboutAFFiNE.version.app": "Version", "com.affine.aboutAFFiNE.version.editor.title": "Mode Édition", "com.affine.aboutAFFiNE.version.title": "Version", + "com.affine.all-pages.header": "Toutes les pages", + "com.affine.appUpdater.downloading": "Téléchargement en cours", + "com.affine.appUpdater.installUpdate": "Redémarrez pour installer la mise à jour", + "com.affine.appUpdater.openDownloadPage": "Ouvrir la page de téléchargement", + "com.affine.appUpdater.updateAvailable": "Mise à jour disponible", + "com.affine.appUpdater.whatsNew": "Découvrez les nouveautés !", "com.affine.appearanceSettings.clientBorder.description": "Personnalisez l'apparence de l'application ", "com.affine.appearanceSettings.clientBorder.title": "Style de bordure de l'application", "com.affine.appearanceSettings.color.description": "Choisissez votre thème de couleur", @@ -41,6 +373,9 @@ "com.affine.appearanceSettings.dateFormat.title": "Format de date", "com.affine.appearanceSettings.font.description": "Choisissez votre police de caractères", "com.affine.appearanceSettings.font.title": "Police de caractères", + "com.affine.appearanceSettings.fontStyle.mono": "Mono", + "com.affine.appearanceSettings.fontStyle.sans": "Sans", + "com.affine.appearanceSettings.fontStyle.serif": "Sérif", "com.affine.appearanceSettings.fullWidth.description": "Afficher un maximum de contenu sur la page", "com.affine.appearanceSettings.fullWidth.title": "Disposition en pleine largeur", "com.affine.appearanceSettings.language.description": "Modifier la langue de l'interface", @@ -55,44 +390,203 @@ "com.affine.appearanceSettings.title": "Paramètres d'apparence", "com.affine.appearanceSettings.translucentUI.description": "Utiliser l'effet translucide sur la barre latérale", "com.affine.appearanceSettings.translucentUI.title": "UI translucide sur la barre latérale", + "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Barre native", "com.affine.appearanceSettings.windowFrame.description": "Personnalisez l'apparence de l'application Windows", "com.affine.appearanceSettings.windowFrame.frameless": "Sans Bords", - "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Barre native", "com.affine.appearanceSettings.windowFrame.title": "Style de fenêtre", - "com.affine.appUpdater.downloading": "Téléchargement en cours", - "com.affine.appUpdater.installUpdate": "Redémarrez pour installer la mise à jour", - "com.affine.appUpdater.openDownloadPage": "Ouvrir la page de téléchargement", - "com.affine.appUpdater.updateAvailable": "Mise à jour disponible", - "com.affine.appUpdater.whatsNew": "Découvrez les nouveautés !", + "com.affine.auth.change.email.message": "Votre email actuel est {{email}}. Nous enverrons un lien de vérification temporaire à cette addresse.", + "com.affine.auth.change.email.page.subtitle": "Rentrez votre nouvelle adresse mail en dessous. Nous enverrons un lien de vérification à cette adresse mail pour compléter le processus", + "com.affine.auth.change.email.page.success.subtitle": "Félicitation ! Vous avez réussi à mettre à jour votre adresse mail associé avec votre compte AFFiNE cloud ", + "com.affine.auth.change.email.page.success.title": "Adresse mail mise à jour !", + "com.affine.auth.change.email.page.title": "Changer votre adresse mail", + "com.affine.auth.create.count": "Créer un compte ", + "com.affine.auth.desktop.signing.in": "Connexion...", + "com.affine.auth.forget": "Mot de passe oublié", + "com.affine.auth.has.signed": "S'est connecté ! ", + "com.affine.auth.has.signed.message": "Vous êtes connecté, commencez à synchroniser vos données avec AFFINE Cloud!", + "com.affine.auth.later": "Plus tard", + "com.affine.auth.open.affine": "Ouvrir AFFiNE", + "com.affine.auth.open.affine.download-app": "Télécharger l'application", + "com.affine.auth.open.affine.prompt": "Ouverture de l'application <1>AFFiNE ", + "com.affine.auth.open.affine.try-again": "Veuillez réessayer", + "com.affine.auth.page.sent.email.subtitle": "Merci de rentrer un mot de passe de 8-20 caractères avec des lettres et des numéros pour continuer à vous créer un compte", + "com.affine.auth.page.sent.email.title": "Bienvenu au AFFiNE Cloud, vous êtes presque là !", + "com.affine.auth.password": "Mot de passe", + "com.affine.auth.password.error": "Mot de passe invalide", + "com.affine.auth.reset.password": "Réinitialiser le mot de passe", + "com.affine.auth.reset.password.message": "Vous allez recevoir un mail avec un lien pour réinitialiser votre mot de passe. Merci de vérifier votre boite de réception", + "com.affine.auth.reset.password.page.success": "Mot de passe réinitialisé avec succès", + "com.affine.auth.reset.password.page.title": "Réinitialiser votre mot de passe AFFiNE Cloud", + "com.affine.auth.send.change.email.link": "Envoyer un lien de vérification", + "com.affine.auth.send.reset.password.link": "Envoyer un lien de réinitialisation", + "com.affine.auth.send.set.password.link": "Envoyer un lien pour définir votre mot de passe", + "com.affine.auth.sent": "Envoyé", + "com.affine.auth.sent.change.email.hint": "Le lien de vérification a été envoyé", + "com.affine.auth.sent.change.password.hint": "Le lien de réinitialisation de mot de passe a été envoyé", + "com.affine.auth.sent.reset.password.success.message": "Votre mot de passe a été changé ! Vous pouvez à nouveau vous connecter à AFFiNE Cloud avec votre nouveau mot de passe ! ", + "com.affine.auth.sent.set.password.hint": "Le lien pour définir votre mot de passe à été envoyé", + "com.affine.auth.sent.set.password.success.message": "Votre mot de passe est enregistré! Vous pouvez vous connecter sur AFFINE Cloud avec votre email et votre mot de passe!", + "com.affine.auth.set.email.save": "Enregistrer le mail", + "com.affine.auth.set.password": "Définir le mot de passe", + "com.affine.auth.set.password.message": "Merci de rentrer un mot de passe de 8-20 caractères avec des lettres et des numéros pour continuer à vous créer un compte", + "com.affine.auth.set.password.page.success": "Mot de passe définit avec succès", + "com.affine.auth.set.password.page.title": "Définir votre mot de passe pour AFFiNE Cloud", + "com.affine.auth.set.password.placeholder": "Définissez un mot de passe d'au moins 8 caractères", + "com.affine.auth.set.password.placeholder.confirm": "Confirmer votre mot de passe", + "com.affine.auth.set.password.save": "Enregistrer votre mot de passe", + "com.affine.auth.sign-out.confirm-modal.cancel": "Annuler", + "com.affine.auth.sign-out.confirm-modal.confirm": "Déconnexion", + "com.affine.auth.sign-out.confirm-modal.description": "Après s'être déconnecté, tous les espaces en ligne associés au compte ne seront plus accessibles depuis cet appareil. Une reconnexion les rendrons de nouveau accessible. ", + "com.affine.auth.sign-out.confirm-modal.title": "Se déconnecter ?", + "com.affine.auth.sign.auth.code.error.hint": "Mauvais code, essayez à nouveau ", + "com.affine.auth.sign.auth.code.message": "Si vous n'avez pas reçu de mail, merci de vérifier votre dossier indésirable.", + "com.affine.auth.sign.auth.code.message.password": "Si vous n'avez pas reçu de mail, merci de vérifier votre dossier indésirable. Ou <1>connectez-vous avec votre mot de passe.", + "com.affine.auth.sign.auth.code.on.resend.hint": "Envoyer le code à nouveau", + "com.affine.auth.sign.auth.code.resend.hint": "Renvoyer le code", + "com.affine.auth.sign.condition": "Conditions générales d'utilisation", + "com.affine.auth.sign.email.continue": "Se connecter avec une adresse mail", + "com.affine.auth.sign.email.error": "Email invalide", + "com.affine.auth.sign.email.placeholder": "Rentrer à nouveau votre adresse mail", + "com.affine.auth.sign.in": "Se connecter", + "com.affine.auth.sign.in.sent.email.subtitle": "Confirmer votre Email", + "com.affine.auth.sign.message": "En cliquant sur \"Continuer avec Google/Email\" ci-dessus, vous reconnaissez que vous acceptez les <1>Conditions générales d'utilisation et la <3>Politique de confidentialité d'AFFiNE.", + "com.affine.auth.sign.no.access.hint": "AFFiNE Cloud est en accès anticipé. Consultez ce lien pour en savoir plus sur les avantages de devenir un des Early Supporter d'AFFiNE Cloud :", + "com.affine.auth.sign.no.access.link": "AFFiNE Cloud est en accès anticipé", + "com.affine.auth.sign.no.access.wait": "Merci d'attendre pour la sortie publique", + "com.affine.auth.sign.policy": "Politique de confidentialité", + "com.affine.auth.sign.sent.email.message.end": "Vous pouvez cliquer sur le lien pour créer un compte automatiquement", + "com.affine.auth.sign.sent.email.message.start": "Un mail avec un lien magique vous a été envoyé", + "com.affine.auth.sign.up": "S'inscrire", + "com.affine.auth.sign.up.sent.email.subtitle": "Créer votre compte ", + "com.affine.auth.sign.up.success.subtitle": "L'application s'ouvrira ou redirigera automatiquement vers la version Web. Si vous rencontrez des problèmes, vous pouvez également cliquer sur le bouton ci-dessous pour ouvrir manuellement l'application AFFiNE.", + "com.affine.auth.sign.up.success.title": "Votre compte a été créé et vous êtes maintenant connecté !", + "com.affine.auth.signed.success.subtitle": "Vous avez réussi à vous connecter ! L'application s'ouvrira ou redirigera automatiquement vers la version Web. Si vous rencontrez des problèmes, vous pouvez également cliquer sur le bouton ci-dessous pour ouvrir manuellement l'application AFFiNE.", + "com.affine.auth.signed.success.title": "Vous y êtes presque ! ", + "com.affine.auth.toast.message.failed": "Erreur serveur, veuillez réessayer plus tard.", + "com.affine.auth.toast.message.signed-in": "Vous êtes maintenant connecté, commencez la synchronisation de vos données avec AFFiNE Cloud ! ", + "com.affine.auth.toast.title.failed": "Impossible de vous connecter ", + "com.affine.auth.toast.title.signed-in": "Connecté", "com.affine.backButton": "Retour à l'accueil", "com.affine.banner.content": "La démo vous plait ? <1> Télécharger le client AFFiNE pour une expérience complète.", "com.affine.brand.affineCloud": "AFFiNE Cloud", "com.affine.cloudTempDisable.description": "Nous mettons à jour le service AFFiNE Cloud et celui-ci est temporairement indisponible côté client. Si vous souhaitez rester informé des avancements et être informé de la disponibilité du projet, vous pouvez remplir l'<1>inscription au AFFiNE Cloud.", "com.affine.cloudTempDisable.title": "AFFiNE Cloud est actuellement en cours de mise à jour.", + "com.affine.cmdk.affine.category.affine.collections": "Collections", + "com.affine.cmdk.affine.category.affine.creation": "Créer ", + "com.affine.cmdk.affine.category.affine.edgeless": "Mode sans bords", + "com.affine.cmdk.affine.category.affine.general": "Général ", + "com.affine.cmdk.affine.category.affine.help": "Aide", + "com.affine.cmdk.affine.category.affine.layout": "Paramètre de disposition", + "com.affine.cmdk.affine.category.affine.navigation": "Navigation", + "com.affine.cmdk.affine.category.affine.pages": "Pages", + "com.affine.cmdk.affine.category.affine.recent": "Récent", + "com.affine.cmdk.affine.category.affine.settings": "Paramètres", + "com.affine.cmdk.affine.category.affine.updates": "Mises à jour", + "com.affine.cmdk.affine.category.editor.edgeless": "Paramètres du mode sans bord", + "com.affine.cmdk.affine.category.editor.insert-object": "Insérer un objet", + "com.affine.cmdk.affine.category.editor.page": "Commandes des pages", + "com.affine.cmdk.affine.client-border-style.to": "Changer le style de bordure de l'application pour", + "com.affine.cmdk.affine.color-mode.to": "Changer le monde couleur pour", + "com.affine.cmdk.affine.color-scheme.to": "Changer le thème de couleur pour", + "com.affine.cmdk.affine.contact-us": "Nous contacter", + "com.affine.cmdk.affine.create-new-edgeless-as": "Créer une nouvelle page sans bord sous :", + "com.affine.cmdk.affine.create-new-page-as": "Créer une nouvelle page sous : ", + "com.affine.cmdk.affine.display-language.to": "Changer la langue d'affichage pour", + "com.affine.cmdk.affine.editor.add-to-favourites": "Ajouter aux Favoris", + "com.affine.cmdk.affine.editor.edgeless.presentation-start": "Commencer la Présentation", + "com.affine.cmdk.affine.editor.remove-from-favourites": "Retirer des favoris", + "com.affine.cmdk.affine.editor.restore-from-trash": "Restaurer de la corbeille", + "com.affine.cmdk.affine.font-style.to": "Changer la police de caractère pour", + "com.affine.cmdk.affine.full-width-layout.to": "Changer la disposition en pleine largeur pour", + "com.affine.cmdk.affine.getting-started": "Commencer", + "com.affine.cmdk.affine.import-workspace": "Importer un espace de travail", + "com.affine.cmdk.affine.left-sidebar.collapse": "Rabattre la barre latérale de gauche", + "com.affine.cmdk.affine.left-sidebar.expand": "Agrandir la barre latérale de gauche", + "com.affine.cmdk.affine.navigation.goto-all-pages": "Aller à toutes les pages", + "com.affine.cmdk.affine.navigation.goto-edgeless-list": "Aller à la liste des pages sans bords", + "com.affine.cmdk.affine.navigation.goto-page-list": "Aller à la liste de Page", + "com.affine.cmdk.affine.navigation.goto-trash": "Aller à la corbeille", + "com.affine.cmdk.affine.navigation.goto-workspace": "Aller à l'espace de travail", + "com.affine.cmdk.affine.navigation.open-settings": "Aller à l'espace de travail", + "com.affine.cmdk.affine.new-edgeless-page": "Nouvelle page sans bords", + "com.affine.cmdk.affine.new-page": "Nouvelle page", + "com.affine.cmdk.affine.new-workspace": "Nouvel espace de travail ", + "com.affine.cmdk.affine.noise-background-on-the-sidebar.to": "Changer le bruit d'arrière-plan de la barre latérale pour", + "com.affine.cmdk.affine.restart-to-upgrade": "Redémarrer pour mettre à jour", + "com.affine.cmdk.affine.switch-state.off": "ÉTEINT", + "com.affine.cmdk.affine.switch-state.on": "ALLUMÉ", + "com.affine.cmdk.affine.translucent-ui-on-the-sidebar.to": "Changer l'UI translucide sur la barre latérale pour", + "com.affine.cmdk.affine.whats-new": "Nouveautés", + "com.affine.cmdk.placeholder": "Écrivez une commande ou recherchez ce que vous voulez...", "com.affine.collection-bar.action.tooltip.delete": "Supprimer", "com.affine.collection-bar.action.tooltip.edit": "Éditer", "com.affine.collection-bar.action.tooltip.pin": "Épingler à la barre latérale", "com.affine.collection-bar.action.tooltip.unpin": "Désépingler", + "com.affine.collection.addPage.alreadyExists": "Page déjà existante", + "com.affine.collection.addPage.success": "Ajouté avec succès", + "com.affine.collection.addPages": "Ajouter des pages", + "com.affine.collection.addPages.tips": "<0>Ajouter des Pages : Vous pouvez librement choisir des pages et les ajouter à la collection. ", + "com.affine.collection.addRules": "Ajouter des règles ", + "com.affine.collection.addRules.tips": "<0>Ajouter des règles : Les règles utilise le filtrage. Après avoir ajouté des règles, les pages qui rencontrent les conditions seront automatiquement ajoutées à la collection actuelle", + "com.affine.collection.allCollections": "Toutes les collections", + "com.affine.collection.emptyCollection": "Collections vides", + "com.affine.collection.emptyCollectionDescription": "Les collections sont des dossiers intelligent avec lesquels vous pouvez manuellement ajouter des pages ou l'automatiser avec des règles ", + "com.affine.collection.helpInfo": "AIDE INFO", + "com.affine.collection.menu.edit": "Modifier les collections", + "com.affine.collection.menu.rename": "Renommer", "com.affine.collectionBar.backToAll": "Retour à tous", - "com.affine.confirmModal.button.cancel": "Annuler", + "com.affine.collections.header": "Collections", + "com.affine.confirmModal.button.cancel": "Annuler ", "com.affine.currentYear": "Année en cours", - "com.affine.deleteLeaveWorkspace.description": "Supprimer l'espace de travail de cet appareil et éventuellement supprimer toutes les données.\n\n", + "com.affine.deleteLeaveWorkspace.description": "Supprimer l'espace de travail de cet appareil et éventuellement supprimer toutes les données.", "com.affine.deleteLeaveWorkspace.leave": "Quitter l'espace de travail", + "com.affine.deleteLeaveWorkspace.leaveDescription": "Une fois quitté, vous ne pourrez plus accéder au contenu à l'intérieur de cet espace de travail.", "com.affine.draw_with_a_blank_whiteboard": "Dessiner sur un tableau blanc", "com.affine.earlier": "Récemment", - "com.affine.editCollection.button.cancel": "Annuler", - "com.affine.editCollection.button.create": "Créer", + "com.affine.edgelessMode": "Mode sans bords", + "com.affine.editCollection.button.cancel": "Annuler ", + "com.affine.editCollection.button.create": "Créer ", + "com.affine.editCollection.createCollection": "Créer des collections", + "com.affine.editCollection.filters": "Filtres", + "com.affine.editCollection.pages": "Pages", + "com.affine.editCollection.pages.clear": "Effacer la sélection", + "com.affine.editCollection.renameCollection": "Renommer la Collection", + "com.affine.editCollection.rules": "Règles", + "com.affine.editCollection.rules.countTips": "Sélectionnés <1>{{selectedCount}}, filtrés <3>{{filteredCount}}\n ", + "com.affine.editCollection.rules.countTips.more": "Affichage de <1>{{count}} pages.", + "com.affine.editCollection.rules.countTips.one": "Affichage de <1>{{count}} page.", + "com.affine.editCollection.rules.countTips.zero": "Affichage de <1>{{count}} pages.", + "com.affine.editCollection.rules.empty.noResults": "Pas de résultats", + "com.affine.editCollection.rules.empty.noResults.tips": "Aucunes pages ne répond aux règles de filtres", + "com.affine.editCollection.rules.empty.noRules": "Pas de règles", + "com.affine.editCollection.rules.empty.noRules.tips": "Veuillez <1>ajouter des règles pour enregistrer cette collection ou passer à <3>Pages, utiliser le mode de sélection manuelle", + "com.affine.editCollection.rules.include.add": "Ajouter les pages sélectionnées ", + "com.affine.editCollection.rules.include.is": "est", + "com.affine.editCollection.rules.include.page": "Page", + "com.affine.editCollection.rules.include.tipsTitle": "Qu'est-ce que \"Pages Sélectionnées\" ?", + "com.affine.editCollection.rules.include.title": "Pages Sélectionnées", + "com.affine.editCollection.rules.preview": "Aperçu", + "com.affine.editCollection.rules.reset": "Réinitialiser", + "com.affine.editCollection.rules.tips": "Les pages qui respectent ces conditions seront ajoutées à la collection actuelle <2>{{highlight}}", + "com.affine.editCollection.rules.tips.highlight": "Automatiquement", "com.affine.editCollection.save": "Enregistrer", "com.affine.editCollection.saveCollection": "Enregistrer en tant que nouvelle collection", + "com.affine.editCollection.search.placeholder": "Rechercher une page...", + "com.affine.editCollection.untitledCollection": "Collection sans titre", "com.affine.editCollection.updateCollection": "Mettre à jour la collection", + "com.affine.editCollectionName.createTips": "Les collections sont des dossiers intelligent avec lesquels vous pouvez manuellement ajouter des pages ou l'automatiser avec des règles ", + "com.affine.editCollectionName.name": "Nom", + "com.affine.editCollectionName.name.placeholder": "Nom de la Collection", "com.affine.editorModeSwitch.tooltip": "Changer", "com.affine.emptyDesc": "Il n'y a pas encore de page ici", - "com.affine.enableAffineCloudModal.button.cancel": "Annuler", + "com.affine.enableAffineCloudModal.button.cancel": "Annuler ", + "com.affine.expired.page.subtitle": "Merci de demander un nouveau lien pour réinitialiser votre mot de passe", + "com.affine.expired.page.title": "Le lien a expiré...", "com.affine.export.error.message": "Veuillez réessayer plus tard.", "com.affine.export.error.title": "Échec lors de l'exportation en raison d'une erreur inattendue", "com.affine.export.success.message": "Veuillez ouvrir le fichier de téléchargement afin de vérifier", "com.affine.export.success.title": "Exporté avec succès", - "com.affine.favoritePageOperation.add": "Ajouter aux favoris", + "com.affine.favoritePageOperation.add": "Ajouter aux Favoris", "com.affine.favoritePageOperation.remove": "Retirer des favoris", "com.affine.filter": "Filtrer", "com.affine.filter.after": "après", @@ -108,13 +602,14 @@ "com.affine.filter.is-favourited": "Est favori", "com.affine.filter.save-view": "Sauvegarder la vue", "com.affine.filter.true": "Oui", + "com.affine.filterList.button.add": "Ajouter un filtre", "com.affine.header.option.add-tag": "Ajouter des Tags", "com.affine.header.option.duplicate": "Dupliquer", "com.affine.helpIsland.contactUs": "Contactez-nous ", "com.affine.helpIsland.gettingStarted": "Commencer", "com.affine.helpIsland.helpAndFeedback": "Aide et feedbacks", "com.affine.import_file": "Support Markdown/Notion", - "com.affine.inviteModal.button.cancel": "Annuler", + "com.affine.inviteModal.button.cancel": "Annuler ", "com.affine.keyboardShortcuts.appendDailyNote": "Ajouter à la note journalière", "com.affine.keyboardShortcuts.bodyText": "Corps du texte", "com.affine.keyboardShortcuts.bold": "Gras", @@ -150,11 +645,11 @@ "com.affine.keyboardShortcuts.strikethrough": "Barrer", "com.affine.keyboardShortcuts.subtitle": "Regarder rapidement les raccourcis clavier", "com.affine.keyboardShortcuts.switch": "Changer", - "com.affine.keyboardShortcuts.text": "Texte (bientôt disponible)", + "com.affine.keyboardShortcuts.text": "Texte ", "com.affine.keyboardShortcuts.title": "Raccourcis clavier", + "com.affine.keyboardShortcuts.unGroup": "Dégrouper", "com.affine.keyboardShortcuts.underline": "Souligner ", "com.affine.keyboardShortcuts.undo": "Annuler", - "com.affine.keyboardShortcuts.unGroup": "Dégrouper", "com.affine.keyboardShortcuts.zoomIn": "Agrandir", "com.affine.keyboardShortcuts.zoomOut": "Rétrécir", "com.affine.keyboardShortcuts.zoomTo100": "Zoom à 100%", @@ -164,8 +659,12 @@ "com.affine.lastMonth": "Le mois dernier", "com.affine.lastWeek": "La semaine dernière ", "com.affine.lastYear": "L'année dernière ", + "com.affine.loading": "Chargement...", + "com.affine.moreThan30Days": "Plus d'un mois", "com.affine.moveToTrash.confirmModal.description": "{{title}} sera déplacé à la corbeille ", + "com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} pages seront déplacés à la corbeille ", "com.affine.moveToTrash.confirmModal.title": "Supprimer la page ?", + "com.affine.moveToTrash.confirmModal.title.multiple": "Supprimer {{ number }} pages ?", "com.affine.moveToTrash.title": "Déplacer à la corbeille", "com.affine.nameWorkspace.button.cancel": "Annuler ", "com.affine.nameWorkspace.button.create": "Créer ", @@ -181,13 +680,28 @@ "com.affine.onboarding.videoDescription1": "Basculez facilement entre le mode Page pour de la création de documents structurés et le mode Tableau blanc pour de l'expression visuelle libre d'idées créatives.", "com.affine.onboarding.videoDescription2": "Créez facilement des documents structurés, à l'aide d'une interface modulaire où l'on peut faire glisser et déposer des blocs de texte, des images et d'autres contenus.", "com.affine.openPageOperation.newTab": "Ouvrir dans un nouvel onglet", + "com.affine.other-page.nav.affine-community": "Communauté AFFiNE", + "com.affine.other-page.nav.blog": "Blog", + "com.affine.other-page.nav.contact-us": "Contactez-nous ", + "com.affine.other-page.nav.download-app": "Télécharger l'application", + "com.affine.other-page.nav.official-website": "Site officiel ", + "com.affine.other-page.nav.open-affine": "Ouvrir AFFiNE", + "com.affine.page.group-header.clear": "Effacer la sélection", + "com.affine.page.group-header.select-all": "Tout Sélectionnner", + "com.affine.pageMode": "Mode page", "com.affine.pageMode.all": "tout", "com.affine.pageMode.edgeless": "Mode sans bords", "com.affine.pageMode.page": "Page", + "com.affine.payment.billing-setting.history": "Historique de Facturation", + "com.affine.payment.billing-setting.information": "Information", + "com.affine.payment.billing-setting.month": "Mois", + "com.affine.payment.billing-setting.paid": "Payé", + "com.affine.payment.billing-setting.title": "Facturation", + "com.affine.payment.billing-setting.update": "Mettre à jour", "com.affine.publicLinkDisableModal.button.cancel": "Annuler ", "com.affine.publicLinkDisableModal.button.disable": "Désactiver", "com.affine.publicLinkDisableModal.description": "Désactiver ce lien public empêchera à quiconque avec le lien d’accéder à cette page.", - "com.affine.publicLinkDisableModal.title": "Désactiver le lien public ?", + "com.affine.publicLinkDisableModal.title": "Désactiver le lien public", "com.affine.rootAppSidebar.collections": "Collections", "com.affine.rootAppSidebar.favorites": "Favoris ", "com.affine.rootAppSidebar.others": "Autres", @@ -201,28 +715,81 @@ "com.affine.setSyncingMode.deviceOnly": "Utiliser seulement sur l'appareil actuel", "com.affine.setSyncingMode.title.added": "Ajouté avec succès", "com.affine.setSyncingMode.title.created": "Créé avec succès", + "com.affine.setting.account": "Paramètres du compte", + "com.affine.setting.account.delete": "Supprimer le compte", + "com.affine.setting.account.delete.message": "Supprimer définitivement ce compte et la sauvegarde des données de l'espace de travail dans AFFiNE Cloud. Cette action ne peut pas être annulée.", + "com.affine.setting.account.message": "Vos données personnelles ", + "com.affine.setting.sign.message": "Synchroniser avec AFFiNE Cloud", + "com.affine.setting.sign.out.message": "Déconnecté de manière sécurisée de votre compte", + "com.affine.settingSidebar.settings.general": "Général", + "com.affine.settingSidebar.settings.workspace": "Espace de travail", + "com.affine.settingSidebar.title": "Paramètres", + "com.affine.settings.about.message": "Information à propos de AFFiNE", + "com.affine.settings.about.update.check.message": "Vérifiez automatiquement pour de nouvelles mises à jour régulièrement.", + "com.affine.settings.about.update.download.message": "Télécharger les mises à jour automatiquement (pour cet appareil)", "com.affine.settings.appearance": "Apparence", + "com.affine.settings.appearance.border-style-description": "Personnalisez l'apparence de l'application ", + "com.affine.settings.appearance.date-format-description": "Personnalisez le style de date", + "com.affine.settings.appearance.full-width-description": "Afficher un maximum de contenu sur la page", + "com.affine.settings.appearance.language-description": "Modifier la langue de l'interface", + "com.affine.settings.appearance.start-week-description": "Par défaut, la semaine commence le dimanche", + "com.affine.settings.appearance.window-frame-description": "Personnalisez l'apparence de l'application Windows", "com.affine.settings.auto-check-description": "Si activé, l'option cherchera automatiquement pour les nouvelles versions à intervalles réguliers", "com.affine.settings.auto-download-description": "Si activé, les nouvelles versions seront automatiquement téléchargées sur l'appareil actuel", - "com.affine.settings.member-tooltip": "Activer AFFiNE Cloud pour collaborer ", + "com.affine.settings.email": "Email", + "com.affine.settings.email.action": "Changer l'Email", + "com.affine.settings.member-tooltip": "Activer AFFiNE Cloud pour collaborer avec d'autres personnes", + "com.affine.settings.noise-style": "Bruit d'arrière-plan de la barre latérale", + "com.affine.settings.noise-style-description": "Utiliser l'effet de bruit d'arrière-plan sur la barre latérale", + "com.affine.settings.password": "Mot de passe", + "com.affine.settings.password.action.change": "Changer le mot de passe", + "com.affine.settings.password.action.set": "Définir le mot de passe", + "com.affine.settings.password.message": "Définissez un mot de passe pour vous connecter à votre compte", + "com.affine.settings.profile": "Mon Profil", + "com.affine.settings.profile.message": "Votre profil de compte sera montré à tout le monde", + "com.affine.settings.profile.name": "Afficher le nom", + "com.affine.settings.profile.placeholder": "Saisir le nom du compte", "com.affine.settings.remove-workspace": "Supprimer l'espace de travail", + "com.affine.settings.remove-workspace-description": "Supprimer l'espace de travail de cet appareil et éventuellement supprimer toutes les données.\n\n", + "com.affine.settings.sign": "Se connecter / S'inscrire", "com.affine.settings.storage.db-location.change-hint": "Cliquer pour changer l'emplacement du stockage ", "com.affine.settings.storage.description": "Vérifier ou changer l'emplacement du lieu de stockage", "com.affine.settings.storage.description-alt": "Vérifier ou changer l'emplacement du lieu de stockage. Cliquer pour éditer le chemin d'accès.", "com.affine.settings.suggestion": "Besoin de plus de personnalisation ? Vous pouvez nous les proposer via la communauté.", + "com.affine.settings.translucent-style": "UI translucide sur la barre latérale", + "com.affine.settings.translucent-style-description": "Utiliser l'effet translucide sur la barre latérale", + "com.affine.settings.workspace": "Espace de travail", "com.affine.settings.workspace.description": "Vous pouvez personnaliser votre espace ici.", "com.affine.settings.workspace.not-owner": "L'icône et le nom peuvent seulement être modifiés par le propriétaire de l'Espace de groupe. Les modifications seront visibles par tous", "com.affine.settings.workspace.publish-tooltip": "Activer AFFiNE Cloud pour publier cet espace de travail en ligne", "com.affine.settings.workspace.storage.tip": "Cliquer pour changer l'emplacement du stockage ", - "com.affine.settingSidebar.settings.general": "Général", - "com.affine.settingSidebar.settings.workspace": "Espace de travail", - "com.affine.settingSidebar.title": "Paramètres", + "com.affine.share-menu.EnableCloudDescription": "Le service de partage de page public nécessite AFFiNE Cloud.", + "com.affine.share-menu.ShareMode": "Mode de partage", + "com.affine.share-menu.SharePage": "Partager la page", + "com.affine.share-menu.ShareViaExport": "Partager via Export", + "com.affine.share-menu.ShareViaExportDescription": "Télécharger une copie fixe de la version actuelle pour la partager avec les autres.", + "com.affine.share-menu.ShareWithLink": "Partager avec un lien", + "com.affine.share-menu.ShareWithLinkDescription": "Créez un lien que vous pouvez facilement partager avec tout le monde. Les visiteurs peuvent ouvrir votre page sous forme de document.", + "com.affine.share-menu.SharedPage": "Page partagée", + "com.affine.share-menu.copy-private-link": "Copier le lien privé", + "com.affine.share-menu.publish-to-web": "Publier sur internet", + "com.affine.share-menu.publish-to-web.description": "Permettre à toutes les personnes disposant du lien une version \"lecture uniquement\" de la version de la page", + "com.affine.share-menu.share-privately": "Partage privé", + "com.affine.share-menu.share-privately.description": "Seuls les membres de l'Espace de Travail peuvent ouvrir ce lien.", + "com.affine.share-menu.shareButton": "Partager", + "com.affine.share-menu.sharedButton": "Partagé", "com.affine.shortcutsTitle.edgeless": "Mode sans bords", "com.affine.shortcutsTitle.general": "Général", "com.affine.shortcutsTitle.markdownSyntax": "Syntaxe Markdown", "com.affine.shortcutsTitle.page": "Page", "com.affine.sidebarSwitch.collapse": "Rabattre la barre latérale", "com.affine.sidebarSwitch.expand": "Agrandir la barre latérale", + "com.affine.storage.disabled.hint": "AFFiNE Cloud est actuellement en phase d'accès anticipé et ne prends en charge la mise à niveau, veuillez être patient et attendre notre plan tarifaire.", + "com.affine.storage.extend.hint": "Vous avez atteint la capacité maximale de votre plan actuel, AFFiNE Cloud est actuellement en phase d'accès anticipé et ne prends en charge la mise à niveau, veuillez être patient et attendre notre plan tarifaire.", + "com.affine.storage.extend.link": "Pour avoir plus d'information, cliquez ici.", + "com.affine.storage.title": "Stockage AFFiNE Cloud", + "com.affine.storage.upgrade": "Passer à la version Pro", + "com.affine.storage.used.hint": "Espace utilisé", "com.affine.themeSettings.dark": "Sombre", "com.affine.themeSettings.light": "Clair", "com.affine.themeSettings.system": "Système", @@ -238,9 +805,23 @@ "com.affine.trashOperation.delete": "Supprimer objet ", "com.affine.trashOperation.delete.description": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ", "com.affine.trashOperation.delete.title": "Supprimer définitivement", + "com.affine.trashOperation.deleteDescription": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ", "com.affine.trashOperation.deletePermanently": "Supprimer définitivement", "com.affine.trashOperation.restoreIt": "Restaurer ", + "com.affine.updater.downloading": "Téléchargement en cours", + "com.affine.updater.open-download-page": "Ouvrir la page de téléchargement", + "com.affine.updater.restart-to-update": "Redémarrez pour installer la mise à jour", + "com.affine.updater.update-available": "Mise à jour disponible", "com.affine.workspace.cannot-delete": "Vous ne pouvez pas supprimer le dernier Espace de travail", + "com.affine.workspace.cloud": "Espaces de travail distants", + "com.affine.workspace.cloud.account.logout": "Déconnection", + "com.affine.workspace.cloud.account.settings": "Paramètres du compte", + "com.affine.workspace.cloud.auth": "S'inscrire / Se connecter", + "com.affine.workspace.cloud.description": "Synchroniser avec AFFiNE Cloud", + "com.affine.workspace.cloud.join": "Rejoindre l'espace de travail", + "com.affine.workspace.cloud.sync": "Synchronisation dans le cloud", + "com.affine.workspace.local": "Espaces de travail locaux", + "com.affine.workspace.local.import": "Importer un espace de travail", "com.affine.workspaceDelete.button.cancel": "Annuler ", "com.affine.workspaceDelete.button.delete": "Supprimer objet ", "com.affine.workspaceDelete.description": "Attention, la suppression de <1>{{workspace}} est irréversible. Le contenu sera perdu.", @@ -250,195 +831,38 @@ "com.affine.workspaceLeave.button.cancel": "Annuler ", "com.affine.workspaceLeave.button.leave": "Quitter", "com.affine.workspaceLeave.description": "Une fois quitté, vous ne pourrez plus accéder au contenu de cet espace de travail.", + "com.affine.workspaceList.addWorkspace.create": "Créer un espace de travail", + "com.affine.workspaceList.workspaceListType.cloud": "Synchronisation dans le cloud", + "com.affine.workspaceList.workspaceListType.local": "Stockage en Local", "com.affine.workspaceSubPath.all": "Toutes les pages", "com.affine.workspaceSubPath.trash": "Corbeille ", "com.affine.workspaceType.cloud": "Espace de travail distant", "com.affine.workspaceType.joined": "L'espace de travail a été rejoint", "com.affine.workspaceType.local": "Espace de travail local", "com.affine.workspaceType.offline": "Disponible hors ligne", - "com.affine.write_with_a_blank_page": "Écrire sur une nouvelle page", + "com.affine.write_with_a_blank_page": "Écrire sur une page vide", "com.affine.yesterday": "Hier", - "Confirm": "Confirmer", - "Connector": "Connecteur (bientôt disponible) ", - "Continue with Google": "Se connecter avec Google ", - "Convert to ": "Convertir en ", - "Copied link to clipboard": "Lien copié dans le presse-papier", - "Copy": "Copier", - "Copy Link": "Copier le lien", "core": "l'essentiel", - "Create": "Créer ", - "Create Or Import": "Créer ou importer", - "Create Shared Link Description": "Créez un lien que vous pouvez facilement partager avec n'importe qui.", - "Create your own workspace": "Créer votre propre espace de travail", - "Created": "Objet créé ", - "Created with": "Créé avec", - "Data sync mode": "Mode de synchronisation des données", - "DB_FILE_ALREADY_LOADED": "Le fichier de base de données a déjà été chargé", - "DB_FILE_INVALID": "Fichier de base de données invalide", - "DB_FILE_MIGRATION_FAILED": "La migration du fichier de base de données a échoué", - "DB_FILE_PATH_INVALID": "Le chemin d'accès du fichier de base de données est invalide", - "Delete": "Supprimer objet ", - "Delete Member?": "Supprimer le membre ?", - "Delete Workspace Label Hint": "Après la suppression de cet espace de travail, vous supprimerez de manière permanente tout le contenu de tous les utilisateurs. En aucun cas le contenu de cet espace de travail ne pourra être restauré.", - "Delete Workspace placeholder": "Veuillez écrire \"Delete\" pour confirmer", - "Disable": "Désactiver", - "Disable Public Link": "Désactiver le lien public", - "Disable Public Sharing": "Désactiver le Partage Public ", - "Download all data": "Télécharger toutes les données", - "Download core data": "Télécharger les données principales", - "Download data": "Télécharger les données {{CoreOrAll}}", - "Download data Description1": "Cela prend davantage d’espace sur votre appareil.", - "Download data Description2": "Cela prend peu d’espace sur votre appareil.", - "Edgeless": "Mode sans bords", - "Edit": "Éditer", - "Edit Filter": "Editer le filtre", + "dark": "Sombre", "emptyAllPages": "Cet espace de travail est vide. Créez une nouvelle page pour commencer l'édition.", "emptyAllPagesClient": "Cliquez sur le bouton <1>$t(New Page) ou bien, appuyez sur le raccourci clavier <3>{{shortcut}} afin de créer votre première page.", "emptyFavorite": "Cliquez sur Ajouter aux Favoris et la page apparaitra ici.", "emptySharedPages": "Les pages partagées apparaîtront ici", "emptyTrash": "Cliquez sur Ajouter à la corbeille et la page apparaitra ici.", - "Enable": "Activer", - "Enable AFFiNE Cloud": "Activer AFFiNE Cloud", - "Enable AFFiNE Cloud Description": "Si cette option est activée, les données de cet espace de travail seront sauvegardées et synchronisées via AFFiNE Cloud.", - "Enable cloud hint": "Les fonctions suivantes nécessitent AFFiNE Cloud. Toutes les données sont actuellement stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour cet espace de travail afin de le garder synchronisé avec le Cloud.", - "Enabled success": "Activation réussie", - "Exclude from filter": "Exclure du filtre", - "Export": "Exporter ", - "Export AFFiNE backup file": "Exporter un fichier de sauvegarde AFFiNE", - "Export Description": "Vous pouvez exporter l'intégralité des données de l'espace de travail à titre de sauvegarde ; les données ainsi exportées peuvent être réimportées.", - "Export Shared Pages Description": "Télécharger une copie de la version actuelle pour la partager avec les autres.", - "Export success": "Exporté avec succès", - "Export to HTML": "Exporter en HTML", - "Export to Markdown": "Exporter en Markdown", - "Export to PDF": "Exporter en PDF", - "Export to PNG": "Exporter en PNG", - "Export Workspace": "L'exportation de l'espace de travail <1>{{workspace}} sera bientôt disponible.", - "Failed to publish workspace": "La publication de l'espace de travail a échoué", - "Favorite": "Favori", - "Favorite pages for easy access": "Pages favorites pour un accès rapide", - "Favorited": "Ajouté aux favoris", - "FILE_ALREADY_EXISTS": "Fichier déjà existant", - "Find 0 result": "Aucun résultat trouvé ", - "Find results": "{{number}} résultats trouvés", - "Force Sign Out": "Forcer la déconnexion", - "Get in touch!": "Contactez-nous ! ", - "Get in touch! Join our communities": "Contactez-nous ! Rejoignez nos communautés.", - "Get in touch! Join our communities.": "Contactez-nous ! Rejoignez nos communautés.", - "Got it": "Compris", - "How is AFFiNE Alpha different?": "Quelles sont les différences avec AFFiNE Alpha ?", - "Import": "Importer ", - "Info": "Information", - "Invite": "Inviter", - "Invite Members": "Inviter des membres", - "Invite placeholder": "Rechercher une adresse mail (compatible uniquement avec Gmail)", + "frameless": "Sans Bords", + "invited you to join": "vous a invité à rejoindre", "is a Cloud Workspace": "est un espace de travail distant", "is a Local Workspace": "est un espace de travail local", - "It takes up little space on your device": "Prend peu d’espace sur l'appareil.", - "It takes up little space on your device.": "Prend peu d’espace sur l'appareil.", - "It takes up more space on your device": "Prend davantage d’espace sur l'appareil.", - "It takes up more space on your device.": "Cela prend davantage d’espace sur votre appareil.", - "Jump to": "Passer à ", - "Loading": "Chargement...", - "Local Workspace Description": "Toutes les données sont stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour garder les données de cet espace de travail synchronisé dans le cloud.", + "light": "Clair", "login success": "Connexion réussie", - "Member": "Membre", - "Member has been removed": "{{name}} a été supprimé", - "Members": "Membres", - "Members hint": "Gérez les membres ici, invitez des nouveaux membres par e-mail.", "mobile device": "Il semblerait que vous naviguiez sur un appareil mobile.", "mobile device description": "Nous travaillons toujours sur le support des appareils mobiles. Ainsi, nous vous recommandons d'utiliser un ordinateur.", - "Move folder": "Déplacer le dossier", - "Move folder hint": "Sélectionnez le nouveau chemin d'accès pour le stockage ", - "Move folder success": "Le déplacement du fichier a été réalisé avec succès", - "Move page to": "Déplacer la page vers ...", - "Move page to...": "Déplacer la page vers ...", - "Move to": "Déplacer vers", - "Moved to Trash": "Déplacé dans la corbeille ", - "My Workspaces": "Mes espaces de travail", - "Navigation Path": "Chemin d'accès", - "New Keyword Page": "Nouvelle page '{{query}}'", - "New Page": "Nouvelle page", - "New Workspace": "Nouvel espace de travail ", - "No item": "Aucun objet ", - "Non-Gmail": "Seul Gmail est supporté", - "None yet": "Aucun pour l'instant", - "Not now": "Pas maintenant", - "Open folder": "Ouvrir le dossier", - "Open folder hint": "Vérifiez l'emplacement du dossier de stockage.", - "Open Workspace Settings": "Ouvrir les paramètres de l'espace de travail", - "Organize pages to build knowledge": "Organisez vos pages pour construire l'entièreté de votre savoir", - "Owner": "Propriétaire", - "Paper": "Papier", - "Pending": "En attente", - "Pivots": "Arborescence", - "Please make sure you are online": "Vérifiez que vous êtes bien en ligne", - "Publish": "Publier", - "Publish to web": "Publier sur internet", - "Published Description": "L'espace de travail actuel a été publié sur Internet. Toute personne disposant du lien peut consulter le contenu.", - "Published hint": "Les visiteurs peuvent prévisualiser le contenu via le lien fourni", - "Published to Web": "Publié sur Internet", - "Publishing": "Publier sur le web nécessite le service AFFiNE Cloud.", - "Publishing Description": "Après avoir publié sur le net, toute personne disposant du lien pourra consulter le contenu.", - "Quick search": "Recherche rapide", - "Quick search placeholder": "Recherche Rapide ...", - "Quick search placeholder2": "Rechercher dans {{workspace}}", - "Recent": "Récent", + "others": "Autres", "recommendBrowser": "Pour une expérience optimale, nous vous recommandons le navigateur <1>Chrome.", - "Remove from Pivots": "Retirer de l'Arborescence", - "Remove from workspace": "Retirer de l'espace de travail", - "Remove special filter": "Retirer le filtre spécial", - "Rename": "Renommer", - "Restart Install Client Update": "Redémarrez pour installer la mise à jour", - "Retain cached cloud data": "Conserver les données mises en cache dans le cloud", - "Retain local cached data": "Conserver les données du cache local", - "RFP": "Les pages peuvent librement être rajoutées à/retirées de l'Arborescence, tout en restant accessible depuis \"Toutes les pages\".", - "Saved then enable AFFiNE Cloud": "Toutes les modifications sont sauvegardées localement, cliquez ici pour activer la sauvegarde AFFiNE Cloud", - "Set up an AFFiNE account to sync data": "Configurer un compte AFFiNE pour synchroniser les données", - "Share Menu Public Workspace Description1": "Invitez d'autres personnes à rejoindre cet espace de travail ou publiez-le sur internet.", - "Share Menu Public Workspace Description2": "L'espace de travail actuel a été publié sur le web en tant qu'espace de travail public.", - "Share with link": "Partager un lien", - "Shared Pages": "Pages partagées", - "Shared Pages Description": "Le service de partage de page public nécessite AFFiNE Cloud.", - "Shared Pages In Public Workspace Description": "L'intégralité de cet espace de travail a été publiée sur internet et peut être modifiée via les <1>Paramètres de l'espace de travail.", - "Shortcuts": "Raccourcis", - "Sign in": "Se connecter à AFFiNE Cloud", - "Sign in and Enable": "Se connecter et activer", - "Sign out": "Se déconnecter", - "Sign out description": "Se déconnecter provoquera la perte du contenu non synchronisé.", - "Skip": "Passer", - "Stay logged out": "Rester déconnecté", - "Sticky": "Post-it", + "restored": "{{title}} a été restauré ", "still designed": "(Cette page est toujours en cours de conception.)", - "Stop publishing": "Arrêter de publier", - "Storage": "Stockage", - "Storage and Export": "Stockage et Export", - "Storage Folder": "Dossier du stockage ", - "Sync": "Synchroniser", - "Synced with AFFiNE Cloud": "Synchronisé avec AFFiNE Cloud", - "Tags": "Tags", - "Title": "Titre ", - "UNKNOWN_ERROR": "Erreur inconnue", - "Unpin": "Désépingler", - "Unpublished hint": "Une fois publié sur internet, les visiteurs peuvent voir le contenu via le lien fourni.", - "Untitled": "Sans titre", - "Update Available": "Mis à jour disponible", - "Update workspace name success": "L'espace de travail à été renommé avec succès", - "Updated": "Mis à jour", + "system": "Système", "upgradeBrowser": "Veuillez installer la dernière version de Chrome pour bénéficier d'une expérience optimale.", - "Upload": "Uploader ", - "Users": "Utilisateur", - "View Navigation Path": "Voir le Chemin d'Accès", - "Wait for Sync": "Attendez la synchronisation", - "will delete member": "supprimera le membre", - "Workspace Avatar": "Avatar de l'espace de travail", - "Workspace Icon": "Icône espace de travail", - "Workspace Name": "Nom de l'espace de travail", - "Workspace Not Found": "L'epace de travail n'a pas été trouvé", - "Workspace Owner": "Propriétaire de l’espace de travail ", - "Workspace Profile": "Profil de l'Espace de travail", - "Workspace saved locally": "{{name}} est sauvegardé localement", - "Workspace Settings": "Paramètres de l'espace de travail", - "Workspace Settings with name": "Paramètres de {{name}}", - "Workspace Type": "Type de l'espace de travail", - "You cannot delete the last workspace": "Vous ne pouvez pas supprimer le dernier Espace de travail" + "will be moved to Trash": "{{title}} sera déplacé à la corbeille ", + "will delete member": "supprimera le membre" } diff --git a/packages/frontend/i18n/src/resources/index.ts b/packages/frontend/i18n/src/resources/index.ts index 9f5755e0ff..331d74ea97 100644 --- a/packages/frontend/i18n/src/resources/index.ts +++ b/packages/frontend/i18n/src/resources/index.ts @@ -3,9 +3,11 @@ // If you need to update the code, please edit `i18n/src/scripts/download.ts` inside your project. import de from './de.json'; import en from './en.json'; +import es from './es.json'; import fr from './fr.json'; import ja from './ja.json'; import ko from './ko.json'; +import pt_BR from './pt-BR.json'; import ru from './ru.json'; import zh_Hans from './zh-Hans.json'; import zh_Hant from './zh-Hant.json'; @@ -18,9 +20,19 @@ export const LOCALES = [ originalName: '한국어(대한민국)', flagEmoji: '🇰🇷', base: false, - completeRate: 0.6, + completeRate: 0.26, res: ko, }, + { + id: 1000040021, + name: 'Portuguese (Brazil)', + tag: 'pt-BR', + originalName: 'português (Brasil)', + flagEmoji: '🇧🇷', + base: false, + completeRate: 0.414, + res: pt_BR, + }, { id: 1000040001, name: 'English', @@ -28,7 +40,7 @@ export const LOCALES = [ originalName: 'English', flagEmoji: '🇬🇧', base: true, - completeRate: 0.981, + completeRate: 0.969, res: en, }, { @@ -38,7 +50,7 @@ export const LOCALES = [ originalName: '繁體中文', flagEmoji: '🇭🇰', base: false, - completeRate: 0.981, + completeRate: 0.506, res: zh_Hant, }, { @@ -48,7 +60,7 @@ export const LOCALES = [ originalName: '简体中文', flagEmoji: '🇨🇳', base: false, - completeRate: 0.905, + completeRate: 0.972, res: zh_Hans, }, { @@ -58,9 +70,19 @@ export const LOCALES = [ originalName: 'français', flagEmoji: '🇫🇷', base: false, - completeRate: 0.955, + completeRate: 0.861, res: fr, }, + { + id: 1000040008, + name: 'Spanish', + tag: 'es', + originalName: 'español', + flagEmoji: '🇪🇸', + base: false, + completeRate: 0.357, + res: es, + }, { id: 1000040009, name: 'German', @@ -68,7 +90,7 @@ export const LOCALES = [ originalName: 'Deutsch', flagEmoji: '🇩🇪', base: false, - completeRate: 0.784, + completeRate: 0.354, res: de, }, { @@ -78,7 +100,7 @@ export const LOCALES = [ originalName: 'русский', flagEmoji: '🇷🇺', base: false, - completeRate: 0.635, + completeRate: 0.445, res: ru, }, { @@ -88,7 +110,7 @@ export const LOCALES = [ originalName: '日本語', flagEmoji: '🇯🇵', base: false, - completeRate: 0.652, + completeRate: 0.279, res: ja, }, ] as const; diff --git a/packages/frontend/i18n/src/resources/ja.json b/packages/frontend/i18n/src/resources/ja.json index 51eb57ab6a..e35607f2ad 100644 --- a/packages/frontend/i18n/src/resources/ja.json +++ b/packages/frontend/i18n/src/resources/ja.json @@ -1,223 +1,144 @@ { + "404 - Page Not Found": "404 - ページが見つかりません", + "AFFiNE Cloud": "AFFiNEクラウド", + "AFFiNE Community": "AFFiNEコミュニティ", + "About AFFiNE": "AFFiNEについて", "Access level": "アクセスレベル", - "Add a subpage inside": "内部にサブページを追加", "Add Workspace": "ワークスペースの追加", "Add Workspace Hint": "既存のワークスペースを選択", + "Add a subpage inside": "内部にサブページを追加", + "Add to Favorites": "お気に入りに追加", + "Add to favorites": "お気に入りに追加する", + "Added Successfully": "正常に追加されました", + "Added to Favorites": "お気に入りに追加されました", "All changes are saved locally": "すべての変更はローカルに保存されます", "All data has been stored in the cloud": "すべてのデータはクラウドに保存されています", + "All pages": "すべてのページ", + "Available Offline": "オフラインで利用可能", + "Back Home": "ホームに戻る", "Back to Quick Search": "クイック検索に戻る", + "Body text": "本文テキスト", + "Bold": "太字", + "Cancel": "キャンセル", "Change avatar hint": "メンバー全員のアバターを変更", "Change workspace name hint": "メンバー全員の名前を変更", "Check Our Docs": "ドキュメントを確認しよう", + "Cloud Workspace": "クラウドワークスペース", "Cloud Workspace Description": "すべてのデータは、AFFiNEアカウント<1>{{email}}に同期して保存されます", + "Code block": "コードブロック", "Collaboration": "コラボレーション", "Collaboration Description": "他のメンバーとコラボレーションするにはAFFiNEクラウドサービスが必要です", - "com.affine.aboutAFFiNE.contact.community": "AFFiNEコミュニティ", - "com.affine.aboutAFFiNE.contact.website": "公式サイト", - "com.affine.aboutAFFiNE.title": "AFFiNEについて", - "com.affine.appearanceSettings.sidebar.title": "サイドバ-", - "com.affine.appUpdater.downloading": "ダウンロード中", - "com.affine.appUpdater.installUpdate": "再起動してアップデートをインストールする", - "com.affine.appUpdater.openDownloadPage": "ダウンロードページを開く", - "com.affine.appUpdater.updateAvailable": "アップデート可能", - "com.affine.appUpdater.whatsNew": "新着情報を見る", - "com.affine.backButton": "ホームに戻る", - "com.affine.banner.content": "デモをお楽しみですか?完全なエクスペリエンスを得るには<1>AFFiNEクライアントをダウンロードしてください。", - "com.affine.brand.affineCloud": "AFFiNEクラウド", - "com.affine.cloudTempDisable.description": "AFFiNEクラウドサービスのバージョンアップを行っており、クライアント側で一時的に利用できない状態になっています。進捗状況などに関する通知をご希望の方は<1>AFFiNEコミュニティにご参加ください。", - "com.affine.cloudTempDisable.title": "AFFiNEクラウドは現在アップグレード中です。", - "com.affine.confirmModal.button.cancel": "キャンセル", - "com.affine.deleteLeaveWorkspace.leave": "ワークスペースから退出", - "com.affine.editCollection.button.cancel": "キャンセル", - "com.affine.editCollection.button.create": "作成", - "com.affine.editCollection.save": "保存", - "com.affine.enableAffineCloudModal.button.cancel": "キャンセル", - "com.affine.favoritePageOperation.add": "お気に入りに追加する", - "com.affine.favoritePageOperation.remove": "お気に入りから削除", - "com.affine.helpIsland.contactUs": "お問い合わせ", - "com.affine.helpIsland.gettingStarted": "始めましょう", - "com.affine.helpIsland.helpAndFeedback": "ヘルプとフィードバック", - "com.affine.inviteModal.button.cancel": "キャンセル", - "com.affine.keyboardShortcuts.bodyText": "本文テキスト", - "com.affine.keyboardShortcuts.bold": "太字", - "com.affine.keyboardShortcuts.cancel": "キャンセル", - "com.affine.keyboardShortcuts.codeBlock": "コードブロック", - "com.affine.keyboardShortcuts.divider": "区分線", - "com.affine.keyboardShortcuts.heading": "見出し {{number}}", - "com.affine.keyboardShortcuts.increaseIndent": "インデントを増やす", - "com.affine.keyboardShortcuts.inlineCode": "インラインコード", - "com.affine.keyboardShortcuts.italic": "斜体", - "com.affine.keyboardShortcuts.link": "ハイパーリンク (選択したテキストを含む)", - "com.affine.keyboardShortcuts.newPage": "新規ページ", - "com.affine.keyboardShortcuts.pen": "ペン(近日公開)", - "com.affine.keyboardShortcuts.redo": "やり直し", - "com.affine.keyboardShortcuts.reduceIndent": "インデントを減らす", - "com.affine.keyboardShortcuts.select": "選択", - "com.affine.keyboardShortcuts.shape": "シェイプ", - "com.affine.keyboardShortcuts.strikethrough": "打ち消し線", - "com.affine.keyboardShortcuts.text": "テキスト(近日公開)", - "com.affine.keyboardShortcuts.title": "キーボードショートカット", - "com.affine.keyboardShortcuts.underline": "下線", - "com.affine.keyboardShortcuts.undo": "元に戻す", - "com.affine.moveToTrash.confirmModal.description": "{{title}}はゴミ箱に移動されます", - "com.affine.moveToTrash.confirmModal.title": "ページを削除しますか?", - "com.affine.moveToTrash.title": "ゴミ箱に移動", - "com.affine.nameWorkspace.button.cancel": "キャンセル", - "com.affine.nameWorkspace.button.create": "作成", - "com.affine.nameWorkspace.description": "ワークスペースは、一人で、あるいはチームで、創造し、計画するための仮想空間です", - "com.affine.nameWorkspace.placeholder": "ワークスペース名を設定", - "com.affine.nameWorkspace.title": "ワークスペースに名前をつける", - "com.affine.notFoundPage.backButton": "ホームに戻る", - "com.affine.notFoundPage.title": "404 - ページが見つかりません", - "com.affine.onboarding.title1": "ハイパーマージされたホワイトボードとドキュメント", - "com.affine.onboarding.title2": "直感的で堅牢なブロックベースの編集", - "com.affine.onboarding.videoDescription1": "構造化されたドキュメントを作成するためのページモードと、創造的なアイデアを自由な形式で視覚的に表現するためのホワイトボードモードを簡単に切り替えることができます", - "com.affine.onboarding.videoDescription2": "モジュール式インターフェイスを使用してテキスト、画像、その他のコンテンツのブロックをドラッグ&ドロップすることで、構造化ドキュメントを簡単に作成できます", - "com.affine.openPageOperation.newTab": "新しいタブで開く", - "com.affine.pageMode.all": "すべて", - "com.affine.pageMode.edgeless": "エッジレス", - "com.affine.pageMode.page": "ページ", - "com.affine.publicLinkDisableModal.button.cancel": "キャンセル", - "com.affine.publicLinkDisableModal.button.disable": "無効", - "com.affine.publicLinkDisableModal.description": "このパブリック リンクを無効にすると、リンクを知っている誰もがこのページにアクセスできなくなります", - "com.affine.publicLinkDisableModal.title": "パブリックリンクを無効にしますか?", - "com.affine.rootAppSidebar.favorites": "お気に入り", - "com.affine.rootAppSidebar.others": "その他", - "com.affine.setDBLocation.button.customize": "カスタマイズ", - "com.affine.setDBLocation.button.defaultLocation": "デフォルトの場所", - "com.affine.setDBLocation.description": "ワークスペースを作成する場所を選択します。ワークスペースのデータは、デフォルトでローカルに保存されます", - "com.affine.setDBLocation.title": "データベースの場所を設定", - "com.affine.setDBLocation.tooltip.defaultLocation": "デフォルトでは {{location}} に保存されます", - "com.affine.setSyncingMode.button.continue": "続行", - "com.affine.setSyncingMode.cloud": "AFFiNEクラウドでデバイス間を同期する", - "com.affine.setSyncingMode.deviceOnly": "現在の端末でのみ使用", - "com.affine.setSyncingMode.title.added": "正常に追加されました", - "com.affine.setSyncingMode.title.created": "正常に作成されました", - "com.affine.settingSidebar.settings.general": "一般", - "com.affine.settingSidebar.title": "設定", - "com.affine.shortcutsTitle.edgeless": "エッジレス", - "com.affine.shortcutsTitle.general": "一般", - "com.affine.shortcutsTitle.markdownSyntax": "Markdown構文", - "com.affine.shortcutsTitle.page": "ページ", - "com.affine.sidebarSwitch.collapse": "サイドバーを折りたたむ", - "com.affine.sidebarSwitch.expand": "サイドバーを展開", - "com.affine.themeSettings.dark": "ダーク", - "com.affine.themeSettings.light": "ライト", - "com.affine.themeSettings.system": "システム", - "com.affine.toastMessage.addedFavorites": "お気に入りに追加されました", - "com.affine.toastMessage.edgelessMode": "エッジレスモード", - "com.affine.toastMessage.movedTrash": "ゴミ箱に移動した", - "com.affine.toastMessage.pageMode": "ページモード", - "com.affine.toastMessage.permanentlyDeleted": "完全に削除されました", - "com.affine.toastMessage.removedFavorites": "お気に入りから削除しました", - "com.affine.toastMessage.restored": "{{title}}を復元しました", - "com.affine.toastMessage.successfullyDeleted": "正常に削除されました", - "com.affine.trashOperation.delete": "削除", - "com.affine.trashOperation.delete.description": "一度削除すると、この操作を元に戻すことはできません。よろしいですか?", - "com.affine.trashOperation.delete.title": "完全に削除", - "com.affine.trashOperation.deletePermanently": "完全に削除", - "com.affine.trashOperation.restoreIt": "復元", - "com.affine.workspaceDelete.button.cancel": "キャンセル", - "com.affine.workspaceDelete.button.delete": "削除", - "com.affine.workspaceDelete.description": "削除 <1>{{workspace}} は元に戻すことができません。慎重に続行してください。すべての内容が失われます", - "com.affine.workspaceDelete.description2": "<1>{{workspace}} を削除すると、ローカルデータとクラウドデータの両方が削除されます。この操作は元に戻すことができません。注意して続行してください", - "com.affine.workspaceDelete.placeholder": "確認のためにワークスペース名を入力してください", - "com.affine.workspaceDelete.title": "ワークスペースの削除", - "com.affine.workspaceLeave.button.cancel": "キャンセル", - "com.affine.workspaceLeave.button.leave": "退出", - "com.affine.workspaceLeave.description": "退会すると、このワークスペースのコンテンツにアクセスできなくなります", - "com.affine.workspaceSubPath.all": "すべてのページ", - "com.affine.workspaceSubPath.trash": "ゴミ箱", - "com.affine.workspaceType.cloud": "クラウドワークスペース", - "com.affine.workspaceType.joined": "ワークスペースに参加", - "com.affine.workspaceType.local": "ローカルワークスペース", - "com.affine.workspaceType.offline": "オフラインで利用可能", + "Collapse sidebar": "サイドバーを折りたたむ", "Confirm": "確認", "Connector": "コネクター(近日公開)", + "Contact Us": "お問い合わせ", + "Continue": "続行", "Continue with Google": "Googleでログイン", "Convert to ": "変換する", "Copied link to clipboard": "リンクをクリップボードにコピーしました", "Copy": "コピー", "Copy Link": "リンクをコピー", - "core": "主要な", "Create": "作成", "Create Or Import": "作成またはインポート", "Create Shared Link Description": "誰とでも簡単に共有できるリンクを作成します", "Create your own workspace": "独自のワークスペースを作成する", "Created": "作成日", - "Data sync mode": "データ同期モード", + "Created Successfully": "正常に作成されました", + "Customize": "カスタマイズ", "DB_FILE_ALREADY_LOADED": "データベースファイルはすでにロードされています", "DB_FILE_INVALID": "無効なデータベースファイル", "DB_FILE_PATH_INVALID": "データベースファイルのパスが無効です", + "Data sync mode": "データ同期モード", + "Default Location": "デフォルトの場所", + "Default db location hint": "デフォルトでは {{location}} に保存されます", "Delete": "削除", "Delete Member?": "メンバーを削除しますか?", + "Delete Workspace": "ワークスペースの削除", + "Delete Workspace Description": "削除 <1>{{workspace}} は元に戻すことができません。慎重に続行してください。すべての内容が失われます", + "Delete Workspace Description2": "<1>{{workspace}} を削除すると、ローカルデータとクラウドデータの両方が削除されます。この操作は元に戻すことができません。注意して続行してください", "Delete Workspace Label Hint": "このワークスペースを削除すると、すべてのユーザーのコンテンツが永久に削除されます。このワークスペースのコンテンツを復元することはできません", "Delete Workspace placeholder": "確認のため、「Delete」と入力してください", + "Delete page?": "ページを削除しますか?", + "Delete permanently": "完全に削除", "Disable": "無効", "Disable Public Link": "パブリックリンクを無効にする", + "Disable Public Link ?": "パブリックリンクを無効にしますか?", + "Disable Public Link Description": "このパブリック リンクを無効にすると、リンクを知っている誰もがこのページにアクセスできなくなります", "Disable Public Sharing": "パブリック共有を無効にする", + "Discover what's new!": "新着情報を見る", + "Divider": "区分線", "Download all data": "すべてのデータをダウンロードする", "Download core data": "主要なデータのダウンロード", "Download data": "{{CoreOrAll}} データのダウンロード", "Download data Description1": "端末の容量を大きく占有します", "Download data Description2": "端末の容量をあまり占有しません", + "Edgeless": "エッジレス", "Edit": "編集", - "emptyAllPages": "このワークスペースに何もありません。新しいページを作成して編集を開始します", - "emptyFavorite": "「お気に入りに追加」をクリックすると、ここにページが表示されます", - "emptySharedPages": "共有されたページがここに表示されます", - "emptyTrash": "「ゴミ箱に移動」をクリックすると、ここにページが表示されます", "Enable": "有効", "Enable AFFiNE Cloud": "AFFiNEクラウドを有効にする", "Enable AFFiNE Cloud Description": "有効にすると、このワークスペース内のデータがAFFiNEクラウド経由でバックアップおよび同期されます", "Enabled success": "有効化に成功", + "Expand sidebar": "サイドバーを展開", "Export": "エクスポート", "Export AFFiNE backup file": "AFFiNEバックアップファイルのエクスポート", "Export Description": "ワークスペースにあるデータ全体をバックアップ用にエクスポートしたり、エクスポートしたデータを再インポートしたりできます", "Export Shared Pages Description": "ページの静的コピーをダウンロードして、他の人と共有することができます", + "Export Workspace": "ワークスペースのエクスポート <1>{{workspace}}は近日公開予定です", "Export success": "エクスポートに成功", "Export to HTML": "HTMLにエクスポート", "Export to Markdown": "Markdownにエクスポート", - "Export Workspace": "ワークスペースのエクスポート <1>{{workspace}}は近日公開予定です", + "FILE_ALREADY_EXISTS": "ファイルが既に存在します", "Failed to publish workspace": "ワークスペースの公開に失敗しました", "Favorite": "お気に入り", "Favorite pages for easy access": "お気に入りのページへ簡単にアクセス", "Favorited": "お気に入りに追加しました", - "FILE_ALREADY_EXISTS": "ファイルが既に存在します", + "Favorites": "お気に入り", "Find 0 result": "検索結果 0 件", "Find results": "検索結果 {{number}} 件", "Force Sign Out": "強制サインアウト", + "General": "一般", "Get in touch!": "ご連絡ください!", "Get in touch! Join our communities": "連絡してください! コミュニティに参加しましょう", "Get in touch! Join our communities.": "連絡してください! コミュニティに参加しましょう", "Got it": "了解", + "Heading": "見出し {{number}}", + "Help and Feedback": "ヘルプとフィードバック", "How is AFFiNE Alpha different?": "AFFiNE Alphaはどう違うのですか?", "Import": "インポート", + "Increase indent": "インデントを増やす", + "Inline code": "インラインコード", "Invite": "招待", "Invite Members": "メンバーを招待", "Invite placeholder": "メールの検索(Gmailのみサポート)", - "is a Cloud Workspace": "はクラウドワークスペースです", - "is a Local Workspace": "はローカルワークスペースです", "It takes up little space on your device": "端末の容量をあまり占有しません", "It takes up little space on your device.": "端末の容量をあまり占有しません", "It takes up more space on your device": "端末の容量を大きく占有します", "It takes up more space on your device.": "端末の容量を大きく占有します", + "Italic": "斜体", + "Joined Workspace": "ワークスペースに参加", "Jump to": "ジャンプ先", + "Keyboard Shortcuts": "キーボードショートカット", + "Leave": "退出", + "Leave Workspace": "ワークスペースから退出", + "Leave Workspace Description": "退会すると、このワークスペースのコンテンツにアクセスできなくなります", + "Link": "ハイパーリンク (選択したテキストを含む)", "Loading": "読み込み中...", + "Local Workspace": "ローカルワークスペース", "Local Workspace Description": "すべてのデータは現在のデバイスに保存されます。このワークスペースのAFFiNEクラウドを有効にすると、クラウドとデータを同期しておくことができます", - "login success": "ログイン成功", + "Markdown Syntax": "Markdown構文", "Member": "メンバー", "Member has been removed": "{{name}}は削除されました", "Members": "メンバー", - "mobile device": "モバイル端末で閲覧しているようです", - "mobile device description": "モバイルへの対応は現在も進めており、デスクトップ端末でのご利用を推奨しています", "Move folder": "フォルダを移動", "Move folder hint": "新しい保存場所を選択", "Move folder success": "フォルダの移動に成功", "Move page to": "ページの移動...", "Move page to...": "ページの移動...", "Move to": "移動先", + "Move to Trash": "ゴミ箱に移動", "Moved to Trash": "ゴミ箱に移動した", "My Workspaces": "マイワークスペース", + "Name Your Workspace": "ワークスペースに名前をつける", "Navigation Path": "ナビゲーションパス", "New Keyword Page": "新しい「{{query}}」ページ", "New Page": "新規ページ", @@ -225,14 +146,20 @@ "No item": "項目なし", "Non-Gmail": "Gmail以外はサポートされていません", "Not now": "あとで登録する", + "Official Website": "公式サイト", + "Open Workspace Settings": "ワークスペース設定を開く", "Open folder": "フォルダを開く", "Open folder hint": "保存フォルダがどこにあるか確認してください", - "Open Workspace Settings": "ワークスペース設定を開く", + "Open in new tab": "新しいタブで開く", "Organize pages to build knowledge": "ページを整理して知識を深める", "Owner": "オーナー", + "Page": "ページ", "Paper": "用紙", + "Pen": "ペン(近日公開)", "Pending": "保留中", + "Permanently deleted": "完全に削除されました", "Pivots": "ピボット", + "Placeholder of delete workspace": "確認のためにワークスペース名を入力してください", "Please make sure you are online": "オンラインであることを確認してください", "Publish": "公開", "Publish to web": "Webに公開", @@ -243,17 +170,27 @@ "Quick search": "クイック検索", "Quick search placeholder": "クイック検索...", "Quick search placeholder2": "{{workspace}} を検索中", + "RFP": "ピボットのページは自由に追加・削除することができ、「すべてのページ」からもアクセスできます", "Recent": "最近", - "recommendBrowser": "最適な環境でご利用いただくために、<1>Chromeブラウザを推奨します", + "Redo": "やり直し", + "Reduce indent": "インデントを減らす", "Remove from Pivots": "ピボットの削除", + "Remove from favorites": "お気に入りから削除", "Remove from workspace": "ワークスペースから削除", + "Removed from Favorites": "お気に入りから削除しました", "Rename": "名前の変更", "Restart Install Client Update": "再起動してアップデートをインストールする", + "Restore it": "復元", "Retain cached cloud data": "ローカルにキャッシュされたデータを保持", "Retain local cached data": "ローカルにキャッシュされたデータを保持", - "RFP": "ピボットのページは自由に追加・削除することができ、「すべてのページ」からもアクセスできます", + "Save": "保存", "Saved then enable AFFiNE Cloud": "すべての変更はローカルに保存されます。クリックしてAFFiNEクラウドを有効にします。", + "Select": "選択", + "Set a Workspace name": "ワークスペース名を設定", + "Set database location": "データベースの場所を設定", "Set up an AFFiNE account to sync data": "データを同期するためにAFFiNEアカウントを設定する", + "Settings": "設定", + "Shape": "シェイプ", "Share Menu Public Workspace Description1": "ワークスペースへ他の人を招待したり、Webに公開することができます", "Share Menu Public Workspace Description2": "現在のワークスペースは、公開ワークスペースとしてWebに公開されています", "Share with link": "リンクを共有", @@ -261,6 +198,7 @@ "Shared Pages Description": "ページの公開にはAFFiNEクラウドサービスが必要です", "Shared Pages In Public Workspace Description": "ワークスペース全体はWeb上で公開され、<1>ワークスペース設定で編集することができます", "Shortcuts": "ショートカット", + "Sidebar": "サイドバ-", "Sign in": "AFFiNEクラウドにサインイン", "Sign in and Enable": "サインインして有効化", "Sign out": "サインアウト", @@ -268,23 +206,30 @@ "Skip": "スキップ", "Stay logged out": "ログアウト状態を維持する", "Sticky": "付箋(近日公開)", - "still designed": "(このページはまだ設計中です)", "Stop publishing": "公開をやめる", "Storage Folder": "ストレージフォルダー", + "Strikethrough": "打ち消し線", + "Successfully deleted": "正常に削除されました", "Sync": "同期", + "Sync across devices with AFFiNE Cloud": "AFFiNEクラウドでデバイス間を同期する", "Synced with AFFiNE Cloud": "AFFiNEクラウドと同期しています", + "Text": "テキスト(近日公開)", "Title": "タイトル", + "Trash": "ゴミ箱", + "TrashButtonGroupDescription": "一度削除すると、この操作を元に戻すことはできません。よろしいですか?", + "TrashButtonGroupTitle": "完全に削除", "UNKNOWN_ERROR": "未知のエラー", + "Underline": "下線", + "Undo": "元に戻す", "Untitled": "無題", "Update Available": "アップデート可能", "Update workspace name success": "ワークスペース名の更新に成功", "Updated": "更新日", - "upgradeBrowser": "快適にご利用いただくために、Chromeの最新バージョンへのアップグレードをお願いします", "Upload": "アップロード", + "Use on current device only": "現在の端末でのみ使用", "Users": "ユーザー", "View Navigation Path": "ナビゲーションパスを表示", "Wait for Sync": "同期を待つ", - "will delete member": "はメンバーを削除します", "Workspace Avatar": "ワークスペースのアバター", "Workspace Icon": "ワークスペースのアイコン", "Workspace Name": "ワークスペース名", @@ -292,5 +237,42 @@ "Workspace Owner": "ワークスペースの所有者", "Workspace Settings": "ワークスペースの設定", "Workspace Type": "ワークスペースのタイプ", - "You cannot delete the last workspace": "最後のワークスペースを削除することはできません" + "Workspace database storage description": "ワークスペースを作成する場所を選択します。ワークスペースのデータは、デフォルトでローカルに保存されます", + "Workspace description": "ワークスペースは、一人で、あるいはチームで、創造し、計画するための仮想空間です", + "You cannot delete the last workspace": "最後のワークスペースを削除することはできません", + "all": "すべて", + "com.affine.banner.content": "デモをお楽しみですか?完全なエクスペリエンスを得るには<1>AFFiNEクライアントをダウンロードしてください。", + "com.affine.cloudTempDisable.description": "AFFiNEクラウドサービスのバージョンアップを行っており、クライアント側で一時的に利用できない状態になっています。進捗状況などに関する通知をご希望の方は<1>AFFiNEコミュニティにご参加ください。", + "com.affine.cloudTempDisable.title": "AFFiNEクラウドは現在アップグレード中です。", + "com.affine.edgelessMode": "エッジレスモード", + "com.affine.helpIsland.gettingStarted": "始めましょう", + "com.affine.onboarding.title1": "ハイパーマージされたホワイトボードとドキュメント", + "com.affine.onboarding.title2": "直感的で堅牢なブロックベースの編集", + "com.affine.onboarding.videoDescription1": "構造化されたドキュメントを作成するためのページモードと、創造的なアイデアを自由な形式で視覚的に表現するためのホワイトボードモードを簡単に切り替えることができます", + "com.affine.onboarding.videoDescription2": "モジュール式インターフェイスを使用してテキスト、画像、その他のコンテンツのブロックをドラッグ&ドロップすることで、構造化ドキュメントを簡単に作成できます", + "com.affine.pageMode": "ページモード", + "com.affine.updater.downloading": "ダウンロード中", + "com.affine.updater.open-download-page": "ダウンロードページを開く", + "com.affine.updater.restart-to-update": "再起動してアップデートをインストールする", + "com.affine.updater.update-available": "アップデート可能", + "core": "主要な", + "dark": "ダーク", + "emptyAllPages": "このワークスペースに何もありません。新しいページを作成して編集を開始します", + "emptyFavorite": "「お気に入りに追加」をクリックすると、ここにページが表示されます", + "emptySharedPages": "共有されたページがここに表示されます", + "emptyTrash": "「ゴミ箱に移動」をクリックすると、ここにページが表示されます", + "is a Cloud Workspace": "はクラウドワークスペースです", + "is a Local Workspace": "はローカルワークスペースです", + "light": "ライト", + "login success": "ログイン成功", + "mobile device": "モバイル端末で閲覧しているようです", + "mobile device description": "モバイルへの対応は現在も進めており、デスクトップ端末でのご利用を推奨しています", + "others": "その他", + "recommendBrowser": "最適な環境でご利用いただくために、<1>Chromeブラウザを推奨します", + "restored": "{{title}}を復元しました", + "still designed": "(このページはまだ設計中です)", + "system": "システム", + "upgradeBrowser": "快適にご利用いただくために、Chromeの最新バージョンへのアップグレードをお願いします", + "will be moved to Trash": "{{title}}はゴミ箱に移動されます", + "will delete member": "はメンバーを削除します" } diff --git a/packages/frontend/i18n/src/resources/ko.json b/packages/frontend/i18n/src/resources/ko.json index ab705e5e22..6adc19ebc9 100644 --- a/packages/frontend/i18n/src/resources/ko.json +++ b/packages/frontend/i18n/src/resources/ko.json @@ -1,224 +1,154 @@ { + "404 - Page Not Found": "404 - 발견되지 않음", + "AFFiNE Cloud": "AFFiNE 클라우드", + "AFFiNE Community": "AFFiNE 커뮤니티", "Access level": "접근 권한", - "Add a subpage inside": "내부에서 하부 페이지 생성", "Add Workspace": "워크스페이스 추가", + "Add a subpage inside": "내부에서 하부 페이지 생성", + "Add to Favorites": "즐겨찾기에 추가", + "Add to favorites": "즐겨찾기에 추가", + "Added Successfully": "성공적으로 추가됨", + "Added to Favorites": "즐겨찾기에 추가됨", "All changes are saved locally": "모든 변경사항이 로컬에 저장 완료", "All data has been stored in the cloud": "모든 데이터가 클라우드에 저장됨", + "All pages": "모든 페이지", + "Available Offline": "오프라인 작업 가능", + "Back Home": "홈으로 돌아가기", "Back to Quick Search": "빠른 검색으로 돌아가기", + "Body text": "본문", + "Bold": "굵은 글꼴", + "Cancel": "취소", "Change avatar hint": "새로운 아바타는 모든 사람에게 공개됩니다.", "Change workspace name hint": "새로운 이름은 모든 사람에게 공개됩니다.", "Check Our Docs": "문서를 확인하세요", + "Cloud Workspace": "클라우드 워크스페이스", "Cloud Workspace Description": "모든 데이터가 AFFiNE 계정 <1>{{email}}으로 동기화 및 저장됨.", + "Code block": "코드 블록", "Collaboration": "협업", "Collaboration Description": "다른 사람과 협업하기 위해서 AFFiNE 클라우드 서비스가 필요합니다.", - "com.affine.aboutAFFiNE.contact.community": "AFFiNE 커뮤니티", - "com.affine.aboutAFFiNE.contact.website": "공식 웹사이트", - "com.affine.appUpdater.downloading": "다운로드 진행중", - "com.affine.appUpdater.installUpdate": "업데이트 하기 위해 재시작", - "com.affine.appUpdater.openDownloadPage": "다운로드 페이지 열기", - "com.affine.appUpdater.updateAvailable": "업데이트 가능", - "com.affine.appUpdater.whatsNew": "새로운 기능 탐색", - "com.affine.backButton": "홈으로 돌아가기", - "com.affine.brand.affineCloud": "AFFiNE 클라우드", - "com.affine.cloudTempDisable.title": "AFFiNE 클라우드는 현재 개선중입니다.", - "com.affine.confirmModal.button.cancel": "취소", - "com.affine.currentYear": "올해", - "com.affine.deleteLeaveWorkspace.leave": "워크스페이스 떠나기", - "com.affine.editCollection.button.cancel": "취소", - "com.affine.editCollection.button.create": "생성", - "com.affine.editCollection.save": "저장", - "com.affine.enableAffineCloudModal.button.cancel": "취소", - "com.affine.favoritePageOperation.add": "즐겨찾기에 추가", - "com.affine.favoritePageOperation.remove": "즐겨찾기에서 제거", - "com.affine.helpIsland.contactUs": "우리에게 연락하세요", - "com.affine.helpIsland.gettingStarted": "시작하기", - "com.affine.helpIsland.helpAndFeedback": "도움과 피드백", - "com.affine.import_file": "마크다운(Markdown)/노션(Notion) 지원", - "com.affine.inviteModal.button.cancel": "취소", - "com.affine.keyboardShortcuts.bodyText": "본문", - "com.affine.keyboardShortcuts.bold": "굵은 글꼴", - "com.affine.keyboardShortcuts.cancel": "취소", - "com.affine.keyboardShortcuts.codeBlock": "코드 블록", - "com.affine.keyboardShortcuts.divider": "구분자", - "com.affine.keyboardShortcuts.heading": "헤딩 {{number}}", - "com.affine.keyboardShortcuts.increaseIndent": "들여쓰기", - "com.affine.keyboardShortcuts.inlineCode": "인라인 코드", - "com.affine.keyboardShortcuts.italic": "이탤릭체", - "com.affine.keyboardShortcuts.link": "하이퍼링크 (선택된 텍스트)", - "com.affine.keyboardShortcuts.newPage": "새로운 페이지", - "com.affine.keyboardShortcuts.pen": "펜 (추가 예정)", - "com.affine.keyboardShortcuts.redo": "되돌리기", - "com.affine.keyboardShortcuts.reduceIndent": "들여쓰기 감소", - "com.affine.keyboardShortcuts.select": "선택", - "com.affine.keyboardShortcuts.shape": "모양", - "com.affine.keyboardShortcuts.strikethrough": "취소선", - "com.affine.keyboardShortcuts.title": "키보드 단축키", - "com.affine.keyboardShortcuts.underline": "밑줄", - "com.affine.keyboardShortcuts.undo": "되돌리기", - "com.affine.last30Days": "최근 30일", - "com.affine.last7Days": "최근 7일", - "com.affine.lastMonth": "지난 달", - "com.affine.lastWeek": "지난 주", - "com.affine.lastYear": "작년", - "com.affine.moveToTrash.confirmModal.title": "페이지 삭제", - "com.affine.moveToTrash.title": "휴지통으로 이동", - "com.affine.nameWorkspace.button.cancel": "취소", - "com.affine.nameWorkspace.button.create": "생성", - "com.affine.nameWorkspace.placeholder": "워크스페이스 이름 입력", - "com.affine.nameWorkspace.title": "워크스페이스 이름을 입력하세요", - "com.affine.new_edgeless": "새로운 엣지리스", - "com.affine.new_import": "불러오기", - "com.affine.notFoundPage.backButton": "홈으로 돌아가기", - "com.affine.notFoundPage.title": "404 - 발견되지 않음", - "com.affine.openPageOperation.newTab": "새로운 탭에서 열기", - "com.affine.pageMode.all": "모든", - "com.affine.pageMode.edgeless": "엣지리스", - "com.affine.pageMode.page": "페이지", - "com.affine.publicLinkDisableModal.button.cancel": "취소", - "com.affine.publicLinkDisableModal.button.disable": "비활성화", - "com.affine.publicLinkDisableModal.title": "공개 링크를 비활성화 할까요?", - "com.affine.rootAppSidebar.favorites": "즐겨찾기", - "com.affine.rootAppSidebar.others": "다른", - "com.affine.setDBLocation.button.customize": "커스터마이즈", - "com.affine.setDBLocation.button.defaultLocation": "기본 위치", - "com.affine.setDBLocation.title": "데이터베이스 위치 선택", - "com.affine.setDBLocation.tooltip.defaultLocation": "기본적으로 {{location}}에 저장됨", - "com.affine.setSyncingMode.button.continue": "계속", - "com.affine.setSyncingMode.cloud": "AFFiNE 클라우드로 장치간 동기화", - "com.affine.setSyncingMode.title.added": "성공적으로 추가됨", - "com.affine.setSyncingMode.title.created": "성공적으로 생성됨", - "com.affine.settingSidebar.settings.general": "일반", - "com.affine.settingSidebar.title": "설정", - "com.affine.shortcutsTitle.edgeless": "엣지리스", - "com.affine.shortcutsTitle.general": "일반", - "com.affine.shortcutsTitle.markdownSyntax": "마크다운 문법", - "com.affine.shortcutsTitle.page": "페이지", - "com.affine.sidebarSwitch.collapse": "사이드바 닫기", - "com.affine.sidebarSwitch.expand": "사이드바 열기", - "com.affine.themeSettings.dark": "다크", - "com.affine.themeSettings.light": "밝은", - "com.affine.themeSettings.system": "시스템", - "com.affine.toastMessage.addedFavorites": "즐겨찾기에 추가됨", - "com.affine.toastMessage.edgelessMode": "엣지리스 모드", - "com.affine.toastMessage.movedTrash": "휴지통으로 이동됨", - "com.affine.toastMessage.pageMode": "페이지 모드", - "com.affine.toastMessage.permanentlyDeleted": "영원히 삭제됨", - "com.affine.toastMessage.removedFavorites": "즐겨찾기에서 제거됨", - "com.affine.toastMessage.restored": "{{title}} 복구됨", - "com.affine.toastMessage.successfullyDeleted": "성공적으로 삭제됨", - "com.affine.today": "오늘", - "com.affine.trashOperation.delete": "삭제", - "com.affine.trashOperation.delete.title": "영원히 삭제", - "com.affine.trashOperation.deletePermanently": "영원히 삭제", - "com.affine.trashOperation.restoreIt": "복구하기", - "com.affine.workspace.cannot-delete": "마지막 워크스페이스를 삭제할 수 없습니다", - "com.affine.workspaceDelete.button.cancel": "취소", - "com.affine.workspaceDelete.button.delete": "삭제", - "com.affine.workspaceDelete.description": "<1>{{workspace}} 를 삭제하면 되돌릴 수 없으니 주의해주세요. 모든 항목을 잃게 됩니다.", - "com.affine.workspaceDelete.description2": "<1>{{workspace}}를 삭제하면 로컬과 클라우드 데이터 모두 삭제되며, 되돌릴 수 없으므로, 주의해주세요 ", - "com.affine.workspaceDelete.placeholder": "워크스페이스 이름을 입력후 확인", - "com.affine.workspaceDelete.title": "워크스페이스 삭제", - "com.affine.workspaceLeave.button.cancel": "취소", - "com.affine.workspaceLeave.button.leave": "떠나기", - "com.affine.workspaceLeave.description": "워스크페이스를 떠나게 되면 데이터에 더이상 접근할 수 없습니다.", - "com.affine.workspaceSubPath.all": "모든 페이지", - "com.affine.workspaceSubPath.trash": "휴지통", - "com.affine.workspaceType.cloud": "클라우드 워크스페이스", - "com.affine.workspaceType.joined": "참가한 워크스페이스", - "com.affine.workspaceType.local": "로컬 워크스페이스", - "com.affine.workspaceType.offline": "오프라인 작업 가능", - "com.affine.write_with_a_blank_page": "새로운 페이지로 작성", - "com.affine.yesterday": "어제", + "Collapse sidebar": "사이드바 닫기", "Confirm": "동의", + "Contact Us": "우리에게 연락하세요", + "Continue": "계속", "Continue with Google": "구글로 계속하기", "Convert to ": "전환", "Copied link to clipboard": "링크가 클립보드로 복사됨", "Copy Link": "링크 복사", - "core": "코어", "Create": "생성", "Create Or Import": "생성하거나 불러오기", "Create Shared Link Description": "다른 사람과 공유할 수 있는 링크 생성하기", "Create your own workspace": "새로운 워크스페이스 생성", "Created": "생성됨", + "Created Successfully": "성공적으로 생성됨", "Created with": "와 함께 생성됨", + "Customize": "커스터마이즈", "DB_FILE_INVALID": "유요하지 않은 데이터베이스 파일", "DB_FILE_PATH_INVALID": "데이터베이스 파일 경로가 유효하지 않음", + "Default Location": "기본 위치", + "Default db location hint": "기본적으로 {{location}}에 저장됨", "Delete": "삭제", "Delete Member?": "멤버를 삭제할까요?", + "Delete Workspace": "워크스페이스 삭제", + "Delete Workspace Description": "<1>{{workspace}} 를 삭제하면 되돌릴 수 없으니 주의해주세요. 모든 항목을 잃게 됩니다.", + "Delete Workspace Description2": "<1>{{workspace}}를 삭제하면 로컬과 클라우드 데이터 모두 삭제되며, 되돌릴 수 없으므로, 주의해주세요 ", "Delete Workspace Label Hint": "워크스페이스를 삭제하게 되면, 모든 사용자의 데이터가 영구적으로 삭제됩니다. 워크스페이스의 데이터는 아무도 복구할 수 없습니다.", "Delete Workspace placeholder": "진행하기 위해서 \"Delete\"를 입력", + "Delete page?": "페이지 삭제", + "Delete permanently": "영원히 삭제", "Disable": "비활성화", "Disable Public Link": "공개 링크 비활성화", + "Disable Public Link ?": "공개 링크를 비활성화 할까요?", "Disable Public Sharing": "공유 비활성화", + "Discover what's new!": "새로운 기능 탐색", + "Divider": "구분자", "Download all data": "모든 데이터 다운로드", "Download core data": "코어 데이터 다운로드", "Download data": "{{CoreOrAll}} 데이터 다운로드", + "Edgeless": "엣지리스", "Edit": "수정", - "emptyAllPages": "이 워크스페이스는 비어있습니다. 새로운 페이지를 생성하여 이어가세요.", - "emptySharedPages": "공유된 페이지는 여기서 확인할 수 있습니다.", "Enable": "활성화", "Enable AFFiNE Cloud": "AFFiNE 클라우드 활성화", "Enable AFFiNE Cloud Description": "만약 활성화 한다면, 워크스페이스 데이터가 AFFiNE 클라우드에 백업 및 싱크 됩니다.", "Enabled success": "활성화 성공", + "Expand sidebar": "사이드바 열기", "Export": "내보내기", "Export AFFiNE backup file": "AFFiNE 백업 파일 내보내기", "Export Description": "워크스페이스의 모든 데이터 백업을 내보내기 할 수 있으며, 내보내기 한 데이터는 다시 불러올 수 있습니다.", "Export Shared Pages Description": "다른 사람과 공유하기 위한 페이지의 정적 복사본 다운로드", + "Export Workspace": "워크스페이스 <1>{{workspace}} 내보내기는 추가될 예정입니다.", "Export success": "내보내기 ", "Export to HTML": "HTML로 내보내기", "Export to Markdown": "Markdown으로 내보내기", "Export to PDF": "PDF로 내보내기", "Export to PNG": "PNG로 내보내기", - "Export Workspace": "워크스페이스 <1>{{workspace}} 내보내기는 추가될 예정입니다.", + "FILE_ALREADY_EXISTS": "파일이 이미 존재함", "Failed to publish workspace": "워크스페이스 공개 실패", "Favorite": "즐겨찾기", "Favorite pages for easy access": "쉬운 접근을 위해 즐겨찾기에 추가", "Favorited": "즐겨찾기 됨", - "FILE_ALREADY_EXISTS": "파일이 이미 존재함", + "Favorites": "즐겨찾기", "Find 0 result": "0개 결과 발견", "Find results": "{{number}}개 결과 발견", "Force Sign Out": "강제 로그아웃", + "General": "일반", "Get in touch!": "연락하세요!", "Get in touch! Join our communities": "연락하세요! 우리의 커뮤니티에 가입하세요.", "Get in touch! Join our communities.": "연락하세요! 우리의 커뮤니티에 가입하세요.", "Got it": "확인", + "Heading": "헤딩 {{number}}", + "Help and Feedback": "도움과 피드백", "Import": "불러오기", + "Increase indent": "들여쓰기", + "Inline code": "인라인 코드", "Invite": "초대", "Invite Members": "멤버 초대", "Invite placeholder": "메일 검색 (Gmail만 지원)", - "is a Cloud Workspace": "는 클라우드 워크스페이스 입니다.", - "is a Local Workspace": "는 로컬 워크스페이스 입니다.", "It takes up little space on your device": "당신의 장치의 작은 저장공간을 사용합니다.", "It takes up little space on your device.": "당신의 장치의 작은 저장공간을 사용합니다.", "It takes up more space on your device": "당신의 장치의 많은 저장공간을 사용합니다.", "It takes up more space on your device.": "당신의 장치의 많은 저장공간을 사용합니다.", + "Italic": "이탤릭체", + "Joined Workspace": "참가한 워크스페이스", "Jump to": "이동", + "Keyboard Shortcuts": "키보드 단축키", + "Leave": "떠나기", + "Leave Workspace": "워크스페이스 떠나기", + "Leave Workspace Description": "워스크페이스를 떠나게 되면 데이터에 더이상 접근할 수 없습니다.", + "Link": "하이퍼링크 (선택된 텍스트)", "Loading": "불러오는 중...", - "login success": "로그인 성공", + "Local Workspace": "로컬 워크스페이스", + "Markdown Syntax": "마크다운 문법", "Member": "멤버", "Member has been removed": "{{name}}이 삭제됨", "Members": "멤버들", - "mobile device": "모바일 기기에서 탐색 중인 것으로 보임.", "Move folder": "폴더 이동", "Move folder hint": "새로운 저장소 위치 선택", "Move folder success": "폴더 이동 성공", "Move page to": "페이지를 이동...", "Move page to...": "페이지를 이동...", "Move to": "이동", + "Move to Trash": "휴지통으로 이동", "Moved to Trash": "휴지통으로 이동됨", "My Workspaces": "내 워크스페이스", + "Name Your Workspace": "워크스페이스 이름을 입력하세요", "New Keyword Page": "새로운 '{{query}}' 페이지", "New Page": "새로운 페이지", "New Workspace": "새로운 워크스페이스", "No item": "새로운 아이템", "Non-Gmail": "Gmail 외에는 지원되지 않습니다", "Not now": "나중에", + "Official Website": "공식 웹사이트", + "Open Workspace Settings": "워크스페이스 설정 열기", "Open folder": "폴더 열기", "Open folder hint": "저장소의 위치 확인", - "Open Workspace Settings": "워크스페이스 설정 열기", + "Open in new tab": "새로운 탭에서 열기", "Organize pages to build knowledge": "페이지를 구성하여 지식을 쌓으세요", "Owner": "소유자", + "Page": "페이지", + "Pen": "펜 (추가 예정)", + "Permanently deleted": "영원히 삭제됨", "Pivots": "피봇", + "Placeholder of delete workspace": "워크스페이스 이름을 입력후 확인", "Please make sure you are online": "온라인 인것을 확인하세요", "Publish": "공개", "Publish to web": "웹에서 공개", @@ -230,11 +160,22 @@ "Quick search placeholder": "빠른 검색...", "Quick search placeholder2": "{{workspace}}에서 검색", "Recent": "최근", + "Redo": "되돌리기", + "Reduce indent": "들여쓰기 감소", + "Remove from favorites": "즐겨찾기에서 제거", "Remove from workspace": "워크스페이스에서 삭제", + "Removed from Favorites": "즐겨찾기에서 제거됨", "Rename": "이름 변경", "Restart Install Client Update": "업데이트 하기 위해 재시작", + "Restore it": "복구하기", + "Save": "저장", "Saved then enable AFFiNE Cloud": "모든 변경사항이 로컬에 저장되었습니다, 클릭하여 AFFiNE 클라우드를 활성화 하세요.", + "Select": "선택", + "Set a Workspace name": "워크스페이스 이름 입력", + "Set database location": "데이터베이스 위치 선택", "Set up an AFFiNE account to sync data": "AFFiNE 계정을 지정하여 데이터 동기화", + "Settings": "설정", + "Shape": "모양", "Share Menu Public Workspace Description1": "다른사람을 워크스페이스로 초대하거나 웹을 통하여 공유.", "Share Menu Public Workspace Description2": "현재 워크스페이스는 웹을 통해 공유된 공유 워크스페이스입니다.", "Share with link": "링크로 공유", @@ -247,21 +188,25 @@ "Skip": "넘기기", "Stay logged out": "로그아웃 상태 유지", "Sticky": "스티키 노트 (추가 예정)", - "still designed": "(현재 페이지는 지속적으로 수정되고 있습니다.)", "Stop publishing": "공유 중지", "Storage Folder": "저장 폴더", + "Strikethrough": "취소선", + "Successfully deleted": "성공적으로 삭제됨", "Sync": "싱크", + "Sync across devices with AFFiNE Cloud": "AFFiNE 클라우드로 장치간 동기화", "Synced with AFFiNE Cloud": "AFFiNE 클라우드로 동기화됨", "Title": "제목", + "Trash": "휴지통", + "TrashButtonGroupTitle": "영원히 삭제", "UNKNOWN_ERROR": "알수 없는 에러", + "Underline": "밑줄", + "Undo": "되돌리기", "Untitled": "제목 없음", "Update Available": "업데이트 가능", "Updated": "업데이트됨", - "upgradeBrowser": "최상의 경험을 위해 크롬을 최신 버전으로 업테이트 해주세요.", "Upload": "업로드", "Users": "유저들", "Wait for Sync": "싱크 대기중", - "will delete member": "멤버를 삭제합니다", "Workspace Avatar": "워크스페이스 아바타", "Workspace Icon": "워크스페이스 아이콘", "Workspace Name": "워크스페이스 이름", @@ -269,5 +214,42 @@ "Workspace Owner": "워크스페이스 주인", "Workspace Settings": "워크스페이스 설정", "Workspace Type": "워크스페이스 종류", - "You cannot delete the last workspace": "모든" + "You cannot delete the last workspace": "모든", + "all": "모든", + "com.affine.cloudTempDisable.title": "AFFiNE 클라우드는 현재 개선중입니다.", + "com.affine.currentYear": "올해", + "com.affine.edgelessMode": "엣지리스 모드", + "com.affine.helpIsland.gettingStarted": "시작하기", + "com.affine.import_file": "마크다운(Markdown)/노션(Notion) 지원", + "com.affine.last30Days": "최근 30일", + "com.affine.last7Days": "최근 7일", + "com.affine.lastMonth": "지난 달", + "com.affine.lastWeek": "지난 주", + "com.affine.lastYear": "작년", + "com.affine.new_edgeless": "새로운 엣지리스", + "com.affine.new_import": "불러오기", + "com.affine.pageMode": "페이지 모드", + "com.affine.today": "오늘", + "com.affine.updater.downloading": "다운로드 진행중", + "com.affine.updater.open-download-page": "다운로드 페이지 열기", + "com.affine.updater.restart-to-update": "업데이트 하기 위해 재시작", + "com.affine.updater.update-available": "업데이트 가능", + "com.affine.workspace.cannot-delete": "마지막 워크스페이스를 삭제할 수 없습니다", + "com.affine.write_with_a_blank_page": "새로운 페이지로 작성", + "com.affine.yesterday": "어제", + "core": "코어", + "dark": "다크", + "emptyAllPages": "이 워크스페이스는 비어있습니다. 새로운 페이지를 생성하여 이어가세요.", + "emptySharedPages": "공유된 페이지는 여기서 확인할 수 있습니다.", + "is a Cloud Workspace": "는 클라우드 워크스페이스 입니다.", + "is a Local Workspace": "는 로컬 워크스페이스 입니다.", + "light": "밝은", + "login success": "로그인 성공", + "mobile device": "모바일 기기에서 탐색 중인 것으로 보임.", + "others": "다른", + "restored": "{{title}} 복구됨", + "still designed": "(현재 페이지는 지속적으로 수정되고 있습니다.)", + "system": "시스템", + "upgradeBrowser": "최상의 경험을 위해 크롬을 최신 버전으로 업테이트 해주세요.", + "will delete member": "멤버를 삭제합니다" } diff --git a/packages/frontend/i18n/src/resources/pt-BR.json b/packages/frontend/i18n/src/resources/pt-BR.json new file mode 100644 index 0000000000..a17124fab3 --- /dev/null +++ b/packages/frontend/i18n/src/resources/pt-BR.json @@ -0,0 +1,425 @@ +{ + "404 - Page Not Found": "404 - Página não encontrada", + "404.back": "Voltar para Meu Conteúdo\n", + "AFFiNE Cloud": "Nuvem AFFiNE", + "AFFiNE Community": "Comunidade AFFiNE", + "About AFFiNE": "Sobre AFFiNE", + "Access level": "Nível de acesso", + "Add Filter": "Adicionar filtro", + "Add Workspace": "Adicionar Área de Trabalho", + "Add Workspace Hint": "Selecione o arquivo de banco de dados existente", + "Add a subpage inside": "Adicione uma subpágina dentro", + "Add to Favorites": "Adicionar aos favoritos", + "Add to favorites": "Adicionar aos favoritos", + "Added Successfully": "Adicionado com sucesso", + "Added to Favorites": "Adicionado aos Favoritos", + "All changes are saved locally": "Todas as alterações estão salvas localmente", + "All data has been stored in the cloud": "Todos os dados foram armazenados na nuvem.", + "All pages": "Todas as páginas", + "App Version": "Versão do App", + "Appearance Settings": "Configurações de aparência", + "Append to Daily Note": "Anexar à nota diária", + "Available Offline": "Disponível off-line", + "Back Home": "Voltar para Home", + "Back to Quick Search": "Voltar para Pesquisa Rápida", + "Back to all": "Voltar para todos", + "Body text": "Texto do Corpo", + "Bold": "Negrito", + "Cancel": "Cancelar", + "Change avatar hint": "Novo avatar será mostrado para todo mundo.", + "Change workspace name hint": "Novo nome será mostrado para todo mundo.", + "Changelog description": "Veja o log de alterações do AFFiNE.", + "Check Keyboard Shortcuts quickly": "Verifique os atalhos de teclado rapidamente", + "Check Our Docs": "Confira Nossa Documentação", + "Check for updates": "Verifique se há atualizações", + "Check for updates automatically": "Verifique se há atualizações automaticamente", + "Choose your font style": "Selecione seu estilo de fonte", + "Client Border Style": "Estilo de borda do cliente", + "Cloud Workspace": "Espaço de trabalho na nuvem", + "Cloud Workspace Description": "Todos os dados serão sincronizados e salvos na conta AFFiNE <1>{{email}}", + "Code block": "Bloco de código", + "Collaboration": "Colaboração", + "Collaboration Description": "Colaborar com outros membros exige o serviço AFFiNE Cloud.", + "Collapse sidebar": "Ocultar barra lateral", + "Collections": "Coleções", + "Communities": "Comunidades", + "Confirm": "Confirme", + "Connector": "Conector (em breve)", + "Contact Us": "Entre em contato", + "Contact with us": "Entre em contato", + "Continue": "Continuar", + "Continue with Google": "Continue com o Google", + "Convert to ": "Converter para", + "Copied link to clipboard": "Link copiado para a área de transferência", + "Copy": "Copiar", + "Copy Link": "Copiar link", + "Create": "Criar", + "Create Or Import": "Criar ou Importar", + "Create Shared Link Description": "Criar descrição de link compartilhado", + "Create a collection": "Criar uma coleção", + "Create your own workspace": "Crie sua área de trabalho", + "Created": "Criado", + "Created Successfully": "Criado com sucesso", + "Created with": "Criado com", + "Customize": "Customizar", + "Customize your AFFiNE Appearance": "Personalize sua aparência AFFiNE", + "DB_FILE_ALREADY_LOADED": "Arquivo de banco de dados já carregado", + "DB_FILE_INVALID": "Arquivo de banco de dados inválido", + "DB_FILE_MIGRATION_FAILED": "Falha na migração do arquivo de banco de dados", + "DB_FILE_PATH_INVALID": "Caminho do arquivo de banco de dados inválido", + "Data sync mode": "Modo de sincronização de dados", + "Date": "Data", + "Date Format": "Formato de Data", + "Default Location": "Localização padrão", + "Default db location hint": "Por padrão será salvo em {{location}}", + "Delete": "Deletar", + "Delete Member?": "Apagar Membro?", + "Delete Workspace": "Deletar Workspace", + "Delete Workspace Description": "Deletar (<1>{{workspace}}) não pode ser desfeito, por favor proceder com atenção. Todos os conteúdos da sua Workspace serão perdidos. ", + "Delete Workspace Description2": "Deletar (<1>{{workspace}}) deletará na cópia local e na nuvem contratada, esta operação não pode ser desfeita, por favor proceda com atenção.", + "Delete Workspace Label Hint": "Após apagar esta Área de Trabalho, você apagará permanentemente todo o seu conteúdo para todo mundo. Ninguém poderá recuperar o conteúdo desta Área de Trabalho.", + "Delete Workspace placeholder": "Por favor, digite \"Delete\" para confirmar", + "Delete page?": "Deletar página?", + "Delete permanently": "Deletar permanentemente", + "Disable": "Desabilitar", + "Disable Public Link": "Desativar link público", + "Disable Public Link ?": "Desativar link público?", + "Disable Public Link Description": "Desativar este link público impedirá que qualquer pessoa com o link acesse esta página.", + "Disable Public Sharing": "Desativar compartilhamento público", + "Discover what's new": "Descubra o que há de novo", + "Discover what's new!": "Descubre o que há de novo!", + "Display Language": "Idioma de exibição", + "Divider": "Divisor", + "Download all data": "Baixe todos os dados", + "Download data Description1": "Ocupa mais espaço no seu dispositivo.", + "Download updates automatically": "Baixe atualizações automaticamente", + "Edgeless": "Sem Bordas", + "Edit": "Editar", + "Edit Filter": "Editar Filtro", + "Editor Version": "Editar Versão", + "Enable": "Habilitar", + "Enable AFFiNE Cloud": "Habilitar AFFiNE Cloud", + "Enable AFFiNE Cloud Description": "Se habilitada, os dados desta Workspace serão salvos e sincronizados via AFFiNE Cloud.", + "Enabled success": "Habilitado com sucesso", + "Exclude from filter": "Excluir do filtro", + "Expand sidebar": "Expandir barra lateral", + "Expand/Collapse Sidebar": "Expandir/Retrair Barra Lateral", + "Export": "Exportar", + "Export AFFiNE backup file": "Exportar arquivo de backup AFFiNE", + "Export Shared Pages Description": "Baixe uma cópia estática da sua página para compartilhar com o pessoal.", + "Export Workspace": "Exportar Workspace <1>{{workspace}} (em breve)", + "Export success": "Exportado com sucesso", + "Export to HTML": "Exportar para HTML", + "Export to Markdown": "Exportar para Markdown", + "Export to PDF": "Exportar para PDF", + "Export to PNG": "Exportar para PNG", + "FILE_ALREADY_EXISTS": "Arquivo já existe", + "Failed to publish workspace": "Falha ao publicar o espaço de trabalho", + "Favorite": "Favorito", + "Favorite pages for easy access": "Páginas favoritar para acessar rapidamente", + "Favorited": "Favoritado", + "Favorites": "Favoritos", + "Filters": "Filtros", + "Find 0 result": "Nenhum resultado foi encontrado", + "Find results": "Foram encontrados {{number}} resultados", + "Font Style": "Estilo de Fonte", + "Force Sign Out": "Force Desconexão", + "General": "Geral", + "Get in touch!": "Entre em contato!", + "Go Back": "Voltar", + "Go Forward": "Avançar", + "Got it": "Entendi", + "Group": "Grupo", + "Group as Database": "Agrupe em uma Base de Dados", + "Heading": "Cabeçalho {{number}}", + "Help and Feedback": "Ajude e dê Feedbacks", + "How is AFFiNE Alpha different?": "Como AFFiNE Alpha é diferente?", + "Image": "Imagem", + "Import": "Importar", + "Increase indent": "Aumentar Indento", + "Info": "Informações", + "Info of legal": "Informações Legais", + "Inline code": "Código inline", + "Invite": "Convidar", + "Invite Members": "Convidar Membros", + "Invite placeholder": "Pesquisar e-mail (Apenas Gmail)", + "It takes up little space on your device": "Ocupa pouca memória do seu dispositivo.", + "It takes up little space on your device.": "Ocupa pouca memória do seu dispositivo.", + "It takes up more space on your device": "Ocupa mais memória do seu dispositivo.", + "It takes up more space on your device.": "Ocupa mais memória do seu dispositivo.", + "Italic": "Itálico", + "Jump to": "Pular para", + "Keyboard Shortcuts": "Atalhos do Teclado", + "Leave": "Sair", + "Leave Workspace": "Sair da Workspace.", + "Leave Workspace Description": "Depois de você sair, você não conseguirá acessar os conteúdos dessa Workspace.", + "Link": "Hyperlink (com o texto selecionado)", + "Loading": "Carregando...", + "Loading All Workspaces": "Carregando Todas as Áreas de Trabalho", + "Local Workspace": "Área de Trabalho Local", + "Local Workspace Description": "Todos os dados são armazenados no dispositivo atual. Você pode ativar a Nuvem AFFiNE para esta Área de Trabalho para que mantenha os dados sincronizados com a nuvem.", + "Markdown Syntax": "Sintaxe Markdown", + "Member": "Membro", + "Member has been removed": "{{name}} foi removido", + "Members": "Membros", + "Members hint": "Gerencie membros aqui, convide novos membros por email.", + "Move Down": "Descer", + "Move Up": "Subir", + "Move folder": "Mover pasta", + "Move folder hint": "Selecione um novo local de armazenamento", + "Move folder success": "Pasta movida com sucesso", + "Move page to": "Mover página para...", + "Move page to...": "Mover página para...", + "Move to": "Mover para", + "Move to Trash": "Mandar para Lixeira", + "Moved to Trash": "Movido para a Lixeira", + "My Workspaces": "Minhas Workspaces", + "Name Your Workspace": "Nomeie Sua Área de Trabalho", + "New Keyword Page": "Nova página '{{query}}' ", + "New Page": "Nova Página", + "New Workspace": "Nova Workspace", + "New version is ready": "Nova Versão está pronta", + "No item": "Nenhum item", + "Non-Gmail": "Apenas o Gmail é suportado momento. Demais e-mails não são.", + "None yet": "Nenhum ainda", + "Not now": "Agora não", + "Note": "Nota", + "Official Website": "Website Oficial", + "Open Workspace Settings": "Abrir Configurações de Área de Trabalho", + "Open folder": "Abrir pasta", + "Open folder hint": "Confira onde a pasta está armazenada.", + "Open in new tab": "Abrir em uma nova aba", + "Organize pages to build knowledge": "Organize as páginas para construir conhecimento", + "Owner": "Dono", + "Page": "Página", + "Paper": "Papel", + "Pen": "Caneta (em breve)", + "Pending": "Pendente", + "Permanently deleted": "Deletado permanentemente", + "Placeholder of delete workspace": "Por favor digite o nome da Área de Trabalho para confirmar", + "Please make sure you are online": "Por favor confirme se você está online", + "Privacy": "Privacidade", + "Publish": "Publicar", + "Publish to web": "Publicar na Web", + "Published Description": "O espaço de trabalho atual foi publicado na web, todos podem visualizar o conteúdo deste espaço de trabalho através do link.", + "Published hint": "Os visitantes podem visualizar o conteúdo através do link fornecido.", + "Published to Web": "Publicado na Web", + "Publishing": "Publicar para a web demanda o serviço AFFiNE Cloud.", + "Publishing Description": "Após publicar para a web, qualquer pessoa poderá ver o conteúdo desta Workspace através do link.", + "Quick Search": "Pesquisa Rápida", + "Quick search": "Pesquisa rápida", + "Quick search placeholder": "Pesquisa rápida...", + "Quick search placeholder2": "Pesquisar em {{workspace}}", + "Recent": "Recente", + "Redo": "Refazer", + "Reduce indent": "Reduzir o espaço do indento", + "Remove from favorites": "Remover dos Favoritos", + "Remove from workspace": "Remover da Área de Trabalho", + "Remove special filter": "Remover filtro especial", + "Removed from Favorites": "Removido dos Favoritos", + "Rename": "Renomear", + "Restart Install Client Update": "Reinicie para instalar atualização", + "Restore it": "Restaurar", + "Save": "Salvar", + "Save As New Collection": "Salve como uma Nova Coleção", + "Saved then enable AFFiNE Cloud": "Todas as modificações são salvas localmente, clique para habilitar a Nuvem AFFiNE.", + "Select": "Selecionar", + "Select All": "Selecione Todos", + "Set a Workspace name": "Defina o nome da Área de Trabalho", + "Set database location": "Definir localização da base de dados", + "Set up an AFFiNE account to sync data": "Crie uma conta AFFiNE para sincronizar seus dados", + "Settings": "Configurações", + "Shape": "Forma", + "Share Menu Public Workspace Description1": "Convide outros para integrar sua Área de Trabalho ou publique isso na web.", + "Share Menu Public Workspace Description2": "Área de Trabalho atual foi publicada na web como uma Área de Trabalho pública.", + "Share with link": "Compartilhar com link", + "Shared Pages": "Páginas Compartilhadas", + "Shared Pages Description": "Compartilhar publicamente uma página requer o service de Nuvem AFFiNE.", + "Shortcuts": "Atalhos", + "Sidebar": "Barra Lateral", + "Sign in": "Logar na AFFiNE Cloud", + "Sign in and Enable": "Logar na conta e Habilitar", + "Sign out": "Desconectar", + "Sign out description": "Sair fará com que você perca todo o conteúdo que ainda não foi sincronizado.", + "Skip": "Pular", + "Start Week On Monday": "Começar Semana na Segunda-Feira", + "Stay logged out": "Permanecer deslogado", + "Sticky": "Sticky (em breve)", + "Stop publishing": "Para a publicação", + "Storage": "Armazenar", + "Storage Folder": "Pasta de Armazenamento", + "Storage and Export": "Armazenamento e Exportação", + "Strikethrough": "Riscado", + "Successfully deleted": "Apagado com Sucesso", + "Switch": "Troque", + "Sync": "Sincronizar", + "Tags": "Tags", + "Terms of Use": "Termos de Uso", + "Text": "Texto (em breve)", + "Theme": "Tema", + "Title": "Título", + "Trash": "Lixeira", + "TrashButtonGroupDescription": "Uma vez deletado, você não poderá desfazer esta ação. Deseja confirmar?", + "TrashButtonGroupTitle": "Deletar permanentemente", + "UNKNOWN_ERROR": "Erro Desconhecido", + "Underline": "Sublinhar", + "Undo": "Desfazer", + "Ungroup": "Desagrupar", + "Unpublished hint": "Uma vez publicado na web, visitantes podem ver o conteúdo através do link disponibilizado.", + "Untitled": "Sem título", + "Untitled Collection": "Coleção sem Título", + "Update Available": "Atualização disponível", + "Update Collection": "Atualize a Coleção", + "Update workspace name success": "Nome da Área de Trabalho atualizado com sucesso", + "Updated": "Atualizado", + "Upload": "Upload", + "Users": "Usuários", + "Version": "Versão", + "Workspace Icon": "Ícone da Workspace", + "Workspace Name": "Nome da Workspace", + "Workspace Not Found": "Área de Trabalho Não Encontrada", + "Workspace Owner": "Dono da Área de Trabalho", + "Workspace Settings": "Configurações da Workspace", + "Workspace Settings with name": "Configurações de {{name}}", + "Workspace Type": "Tipo de Workspace", + "Workspace database storage description": "Selecione onde você deseja criar seu espaço de trabalho. Os dados do espaço de trabalho são salvos localmente por padrão.", + "Workspace description": "Workspace é o seu espaço virtual para capturar, criar e planejar individualmente ou colaborando com sua equipe.", + "Workspace saved locally": "{{name}} é salvo localmente", + "You cannot delete the last workspace": "Você não pode excluir o último espaço de trabalho", + "Zoom in": "Mais Zoom", + "Zoom out": "Reduzir o zoom", + "Zoom to 100%": "Zoom para 100%", + "all": "todos", + "com.affine.auth.change.email.page.subtitle": "Por favor digite seu novo endereço de email abaixo. Enviaremos um link de verificação para este email para completar o processo.", + "com.affine.auth.change.email.page.success.subtitle": "Parabéns! Você atualizou com sucesso seu email que está associado com a sua conta da Nuvem AFFiNE.", + "com.affine.auth.change.email.page.success.title": "Endereço de email atualizado!", + "com.affine.auth.change.email.page.title": "Mudar endereço de email", + "com.affine.auth.create.count": "Criar Conta", + "com.affine.auth.forget": "Esqueceu sua senha", + "com.affine.auth.has.signed": "você entrou!", + "com.affine.auth.later": "Depois", + "com.affine.auth.open.affine": "Abrir AFFiNE", + "com.affine.auth.page.sent.email.title": "Bem-vindo à Nuvem AFFiNE, você está quase lá!", + "com.affine.auth.password": "Senha", + "com.affine.auth.password.error": "Senha incorreta", + "com.affine.auth.reset.password": "Redefinir Senha", + "com.affine.auth.reset.password.message": "Você receberá um email com um link para redefinir sua senha. Por favor verifique sua caixa de entrada.", + "com.affine.auth.reset.password.page.title": "Redefina sua senha da Nuvem AFFiNE", + "com.affine.auth.send.change.email.link": "Envie um link de verificação", + "com.affine.auth.send.reset.password.link": "Enviar link de redefinição", + "com.affine.auth.send.set.password.link": "Enviar link de definição", + "com.affine.auth.sent": "Enviado", + "com.affine.auth.sent.change.email.hint": "Link de verificação foi enviado.", + "com.affine.auth.sent.change.password.hint": "Link de redefinição de senha foi enviado.", + "com.affine.auth.set.email.save": "Salvar Email", + "com.affine.auth.set.password.placeholder.confirm": "Confirmar senha", + "com.affine.auth.set.password.save": "Salvar Senha", + "com.affine.auth.sign.auth.code.error.hint": "Código errado, por favor tente novamente", + "com.affine.auth.sign.auth.code.on.resend.hint": "Código enviado novamente", + "com.affine.auth.sign.auth.code.resend.hint": "Reenviar código", + "com.affine.auth.sign.condition": "Termos de Condições", + "com.affine.auth.sign.email.continue": "Continue com Email", + "com.affine.auth.sign.email.error": "Email incorreto", + "com.affine.auth.sign.email.placeholder": "Digite seu endereço de email", + "com.affine.auth.sign.in": "Entrar", + "com.affine.auth.sign.in.sent.email.subtitle": "Confirme seu email", + "com.affine.auth.sign.no.access.link": "Acesso antecipado à nuvem AFFiNE", + "com.affine.auth.sign.no.access.wait": "Aguarde o lançamento público", + "com.affine.auth.sign.policy": "Políticas de Privacidade", + "com.affine.auth.sign.sent.email.message.end": "Você pode acessar o link e criar uma conta automaticamente.", + "com.affine.auth.sign.sent.email.message.start": "Um email com um link mágico foi enviado para", + "com.affine.auth.sign.up": "Cadastrar", + "com.affine.auth.sign.up.sent.email.subtitle": "Crie sua conta", + "com.affine.auth.sign.up.success.title": "Sua conta foi criada e você entrou!", + "com.affine.auth.signed.success.subtitle": "Você fez login com sucesso. O aplicativo será aberto automaticamente ou redirecionado para a versão web. se encontrar algum problema, você também pode clicar no botão abaixo para abrir manualmente o aplicativo AFFiNE.", + "com.affine.auth.signed.success.title": "Você está quase lá!", + "com.affine.auth.toast.message.failed": "Erro no servidor, tente novamente mais tarde.", + "com.affine.cloudTempDisable.title": "Nuvem AFFiNE está atualizando agora.", + "com.affine.collection-bar.action.tooltip.delete": "Apagar", + "com.affine.collection-bar.action.tooltip.edit": "Editar", + "com.affine.collection-bar.action.tooltip.pin": "Fixar na barra lateral", + "com.affine.currentYear": "Este Ano", + "com.affine.emptyDesc": "Não há nenhuma página por aqui ainda", + "com.affine.expired.page.title": "O link expirou...", + "com.affine.export.error.message": "Por favor tente isso novamente mais tarde.", + "com.affine.export.error.title": "Exportação falhou devido um erro inesperado", + "com.affine.export.success.title": "Exportado com sucesso", + "com.affine.filter": "Filtro", + "com.affine.filter.after": "depois", + "com.affine.filter.before": "antes", + "com.affine.filter.contains all": "contém tudo", + "com.affine.filter.false": "falso", + "com.affine.filter.is": "é", + "com.affine.filter.is empty": "é vazio", + "com.affine.filter.is not empty": "não é vazio", + "com.affine.filter.true": "verdadeiro", + "com.affine.header.option.add-tag": "Adicione Tag", + "com.affine.header.option.duplicate": "Duplique", + "com.affine.helpIsland.gettingStarted": "Começando", + "com.affine.last30Days": "Últimos 30 dias", + "com.affine.last7Days": "Últimos 7 dias", + "com.affine.lastMonth": "Mês passado", + "com.affine.lastWeek": "Semana passada", + "com.affine.lastYear": "Ano passado", + "com.affine.loading": "Carregando...", + "com.affine.new_import": "Importar", + "com.affine.pageMode": "Modo de página", + "com.affine.setting.account": "Configurações de Conta", + "com.affine.setting.account.delete": "Apagar Conta", + "com.affine.setting.account.message": "Sua informação pessoal", + "com.affine.setting.sign.message": "Sincronize com AFFiNE Cloud", + "com.affine.setting.sign.out.message": "Saia da sua conta com segurança.", + "com.affine.settings.about.message": "Informações sobre AFFiNE", + "com.affine.settings.about.update.check.message": "Verifique automaticamente se há novas atualizações periodicamente.", + "com.affine.settings.about.update.download.message": "Baixe atualizações automaticamente (para este dispositivo).", + "com.affine.settings.appearance": "Aparência", + "com.affine.settings.appearance.language-description": "Selecione o idioma para a interface.", + "com.affine.settings.appearance.start-week-description": "Por padrão, a semana começa no Domingo.", + "com.affine.settings.auto-check-description": "Se ativado, ele verificará automaticamente novas versões em intervalos regulares.", + "com.affine.settings.auto-download-description": "Se ativado, novas versões serão baixadas automaticamente para o dispositivo atual.", + "com.affine.settings.email": "Email", + "com.affine.settings.email.action": "Mudar Email", + "com.affine.settings.password": "Senha", + "com.affine.settings.password.action.change": "Mudar senha", + "com.affine.settings.profile": "Meu Perfil", + "com.affine.settings.profile.message": "O perfil da sua conta será mostrado para todo mundo.", + "com.affine.settings.profile.name": "Mostrar Nome", + "com.affine.settings.remove-workspace": "Remover Área de Trabalho", + "com.affine.settings.sign": "Entrar / Cadastrar", + "com.affine.settings.suggestion": "Precisa de mais opções de customização? Nos avise na comunidade.", + "com.affine.settings.workspace": "Área de Trabalho", + "com.affine.settings.workspace.description": "Você pode customizar sua Área de Trabalho aqui.", + "com.affine.settings.workspace.not-owner": "Apenas um dono pode editar um avatar ou nome de uma Área de Trabalho. Mudanças serão mostradas para todo mundo.", + "com.affine.settings.workspace.publish-tooltip": "Habilite a Nuvem AFFiNE para publicar essa Área de Trabalho", + "com.affine.today": "Hoje", + "com.affine.updater.downloading": "Baixando", + "com.affine.updater.update-available": "Atualização disponível", + "com.affine.workspace.cannot-delete": "Você não pode apagar a última Área de Trabalho", + "com.affine.workspace.cloud.account.logout": "Sair", + "com.affine.workspace.cloud.account.settings": "Configurações de Conta", + "com.affine.workspace.cloud.auth": "Cadastrar/ Entrar", + "com.affine.workspace.cloud.join": "Entrar na Área de Trabalho", + "com.affine.workspace.cloud.sync": "Sincronizar nuvem", + "com.affine.workspace.local.import": "Importar Área de Trabalho", + "com.affine.yesterday": "Ontem", + "core": "core", + "dark": "Escuro", + "emptyAllPages": "Esta Workspace está vazia. Crie uma nova página para começar a editá-la.", + "emptyFavorite": "Clique Adicionar para Favoritos e a página irá aparecer aqui.", + "emptySharedPages": "As páginas compartilhadas aparecerão aqui.", + "emptyTrash": "Clique Adicionar para Lixeira e a página irá aparecer aqui.", + "is a Cloud Workspace": "é um espaço de trabalho na nuvem", + "is a Local Workspace": "é um espaço de trabalho local", + "light": "Claro", + "login success": "Login feito com sucesso", + "mobile device": "Parece que você está acessando de um smartphone.", + "mobile device description": "Nós ainda estamos trabalhando na versão mobile e recomendamos que você utilize um computador.", + "others": "Outros", + "recommendBrowser": "Nós recomendamos o navegador <1>Chrome para a melhor experiência de uso.", + "restored": "{{title}} foi restaurado", + "still designed": "(Está página está em construção.)", + "system": "Sistema", + "upgradeBrowser": "Por favor, atualize o seu Chrome para a última versão para poder usufruir da melhor experiência.", + "will be moved to Trash": "\n{{title}} será movido para a Lixeira", + "will delete member": "apagará membro" +} diff --git a/packages/frontend/i18n/src/resources/ru.json b/packages/frontend/i18n/src/resources/ru.json index 7e9b54f231..167332b6cc 100644 --- a/packages/frontend/i18n/src/resources/ru.json +++ b/packages/frontend/i18n/src/resources/ru.json @@ -1,291 +1,438 @@ { + "404 - Page Not Found": "404 - Страница не найдена", + "404.hint": "Извините, у вас нет доступа или этого материала не существует...", + "404.signOut": "Войдите в другой аккаунт", + "AFFiNE Cloud": "AFFiNE Cloud", + "AFFiNE Community": "Сообщество AFFiNE", + "About AFFiNE": "Об AFFiNE", "Access level": "Уровень доступа", + "Actions": "Действия", + "Add Filter": "Добавить фильтр", "Add Workspace": "Добавить пространство", + "Add Workspace Hint": "Выберите файл существующей базы данных", + "Add a subpage inside": "Добавить подстраницу внутри", + "Add to Favorites": "В Избранное", + "Add to favorites": "В Избранное", + "Added Successfully": "Успешно добавлено", + "Added to Favorites": "Добавлено в Избранное", "All changes are saved locally": "Все изменения сохраняются локально", "All data has been stored in the cloud": "Все данные хранятся в облаке.", + "All pages": "Все страницы", + "App Version": "Версия приложения", + "Appearance Settings": "Настройки оформления", + "Append to Daily Note": "Добавить в ежедневник", + "Available Offline": "Доступно оффлайн", + "Back Home": "Вернуться на Главную", "Back to Quick Search": "Назад к Быстрому поиску", + "Body text": "Основной текст", + "Bold": "Жирный", + "Cancel": "Отменить", "Change avatar hint": "Новый аватар будет отображаться для всех пользователей.", - "Change workspace name hint": "Новое название будет отображаться для всех пользователей.", + "Change workspace name hint": "Новое имя будет отображаться для всех пользователей.", + "Changelog description": "Просмотреть журнал изменений AFFiNE.", + "Check Keyboard Shortcuts quickly": "Быстрая проверка горячих клавиш", "Check Our Docs": "Проверьте нашу документацию", + "Check for updates": "Проверить обновления", + "Check for updates automatically": "Проверять обновления автоматически", + "Choose your font style": "Выберите стиль шрифта", + "Cloud Workspace": "Облачное рабочее пространство", "Cloud Workspace Description": "Все данные будут синхронизированы и сохранены в AFFiNE аккаунт <1>{{email}}", + "Code block": "Блок кода", "Collaboration": "Совместная работа", "Collaboration Description": "Для совместной работы с другими участниками требуется сервис AFFiNE Cloud.", - "com.affine.aboutAFFiNE.autoCheckUpdate.title": "Проверять обновления автоматически", - "com.affine.aboutAFFiNE.autoDownloadUpdate.description": "Загружать обновления автоматически (на данное устройство).", - "com.affine.aboutAFFiNE.autoDownloadUpdate.title": "Загружать обновления автоматически", - "com.affine.aboutAFFiNE.checkUpdate.description": "Доступна новая версия", - "com.affine.aboutAFFiNE.checkUpdate.title": "Проверить обновления", - "com.affine.aboutAFFiNE.community.title": "Сообщества", - "com.affine.aboutAFFiNE.contact.community": "Сообщество AFFiNE", - "com.affine.aboutAFFiNE.contact.title": "Связаться с нами", - "com.affine.aboutAFFiNE.contact.website": "Официальный Сайт", - "com.affine.aboutAFFiNE.legal.privacy": "Конфиденциальность", - "com.affine.aboutAFFiNE.legal.title": "Юридическая информация", - "com.affine.aboutAFFiNE.subtitle": "Информация об AFFiNE", - "com.affine.aboutAFFiNE.title": "Об AFFiNE", - "com.affine.aboutAFFiNE.version.app": "Версия приложения", - "com.affine.appearanceSettings.clientBorder.description": "Настроить внешний вид клиента.", - "com.affine.appearanceSettings.color.description": "Выберите цветовую схему", - "com.affine.appearanceSettings.color.title": "Цветовая схема", - "com.affine.appearanceSettings.date.title": "Дата", - "com.affine.appearanceSettings.dateFormat.description": "Настроить формат даты.", - "com.affine.appearanceSettings.dateFormat.title": "Формат даты", - "com.affine.appearanceSettings.font.description": "Выберите стиль шрифта", - "com.affine.appearanceSettings.font.title": "Стиль шрифта", - "com.affine.appearanceSettings.language.title": "Язык интерфейса", - "com.affine.appearanceSettings.startWeek.description": "По умолчанию неделя начинается с воскресенья.", - "com.affine.appearanceSettings.title": "Настройки оформления", - "com.affine.appUpdater.downloading": "Загрузка", - "com.affine.appUpdater.installUpdate": "Перезапустить для установки обновления", - "com.affine.appUpdater.updateAvailable": "Доступно обновление", - "com.affine.backButton": "Вернуться на Главную", - "com.affine.brand.affineCloud": "AFFiNE Cloud", - "com.affine.confirmModal.button.cancel": "Отмена", - "com.affine.deleteLeaveWorkspace.leave": "Выйти из рабочего пространства", - "com.affine.editCollection.button.cancel": "Отмена", - "com.affine.editCollection.button.create": "Создать", - "com.affine.enableAffineCloudModal.button.cancel": "Отмена", - "com.affine.export.success.title": "Экспорт прошел успешно", - "com.affine.favoritePageOperation.add": "Добавить в избранное", - "com.affine.favoritePageOperation.remove": "Удалить из Избранного", - "com.affine.filter": "Фильтр", - "com.affine.helpIsland.contactUs": "Связаться с нами", - "com.affine.helpIsland.helpAndFeedback": "Помощь и обратная связь", - "com.affine.inviteModal.button.cancel": "Отмена", - "com.affine.keyboardShortcuts.bodyText": "Основной текст", - "com.affine.keyboardShortcuts.bold": "Жирный", - "com.affine.keyboardShortcuts.cancel": "Отмена", - "com.affine.keyboardShortcuts.codeBlock": "Блок кода", - "com.affine.keyboardShortcuts.divider": "Разделитель", - "com.affine.keyboardShortcuts.expandOrCollapseSidebar": "Развернуть/Свернуть Боковую панель", - "com.affine.keyboardShortcuts.group": "Группировать", - "com.affine.keyboardShortcuts.hand": "Рука", - "com.affine.keyboardShortcuts.heading": "Заголовок {{number}}", - "com.affine.keyboardShortcuts.image": "Изображение", - "com.affine.keyboardShortcuts.increaseIndent": "Увеличить отступ", - "com.affine.keyboardShortcuts.inlineCode": "Встроенный код", - "com.affine.keyboardShortcuts.italic": "Курсив", - "com.affine.keyboardShortcuts.link": "Гиперссылка (с выделенным текстом)", - "com.affine.keyboardShortcuts.moveDown": "Переместить вниз", - "com.affine.keyboardShortcuts.moveUp": "Переместить вверх", - "com.affine.keyboardShortcuts.newPage": "Новая страница", - "com.affine.keyboardShortcuts.pen": "Ручка (скоро)", - "com.affine.keyboardShortcuts.quickSearch": "Быстрый поиск", - "com.affine.keyboardShortcuts.redo": "Повторно выполнить", - "com.affine.keyboardShortcuts.reduceIndent": "Уменьшить отступ", - "com.affine.keyboardShortcuts.select": "Выбор", - "com.affine.keyboardShortcuts.shape": "Фигура", - "com.affine.keyboardShortcuts.strikethrough": "Перечеркнутый", - "com.affine.keyboardShortcuts.subtitle": "Быстрая проверка горячих клавиш", - "com.affine.keyboardShortcuts.text": "Текст (скоро)", - "com.affine.keyboardShortcuts.title": "Горячие Клавиши", - "com.affine.keyboardShortcuts.underline": "Подчеркнутый", - "com.affine.keyboardShortcuts.undo": "Отменить", - "com.affine.last30Days": "Последние 30 дней", - "com.affine.last7Days": "Последние 7 дней", - "com.affine.lastMonth": "Последний месяц", - "com.affine.moveToTrash.confirmModal.description": "{{title}} будет перемещен в Корзину", - "com.affine.moveToTrash.confirmModal.title": "Удалить страницу?", - "com.affine.moveToTrash.title": "Переместить в корзину", - "com.affine.nameWorkspace.button.cancel": "Отмена", - "com.affine.nameWorkspace.button.create": "Создать", - "com.affine.nameWorkspace.description": "Рабочее пространство - это ваше виртуальное пространство для фиксации, создания и планирования в одиночку или в команде. ", - "com.affine.nameWorkspace.placeholder": "Задайте имя рабочего пространства", - "com.affine.notFoundPage.backButton": "Вернуться на Главную", - "com.affine.notFoundPage.title": "404 - Страница не найдена", - "com.affine.openPageOperation.newTab": "Открыть в новой вкладке", - "com.affine.pageMode.all": "все", - "com.affine.pageMode.edgeless": "Без полей", - "com.affine.pageMode.page": "Страница", - "com.affine.publicLinkDisableModal.button.cancel": "Отмена", - "com.affine.publicLinkDisableModal.button.disable": "Отключить", - "com.affine.publicLinkDisableModal.description": "Отключение этой публичной ссылки запретит доступ к этой странице всем, у кого есть эта ссылка.", - "com.affine.publicLinkDisableModal.title": "Отключить публичную ссылку ?", - "com.affine.rootAppSidebar.collections": "Коллекции", - "com.affine.rootAppSidebar.favorites": "Избранное", - "com.affine.setDBLocation.button.customize": "Настроить", - "com.affine.setDBLocation.button.defaultLocation": "Расположение по умолчанию", - "com.affine.setDBLocation.tooltip.defaultLocation": "По умолчанию будет сохранена в {{location}}.", - "com.affine.setSyncingMode.button.continue": "Продолжить", - "com.affine.setSyncingMode.title.added": "Успешно добавлено", - "com.affine.setSyncingMode.title.created": "Успешно создано", - "com.affine.settings.appearance": "Внешний вид", - "com.affine.settings.remove-workspace": "Удалить рабочее пространство", - "com.affine.settings.workspace.storage.tip": "Щелкните, чтобы переместить место хранения.", - "com.affine.settingSidebar.settings.general": "Общие", - "com.affine.settingSidebar.title": "Настройки", - "com.affine.shortcutsTitle.edgeless": "Без полей", - "com.affine.shortcutsTitle.general": "Общие", - "com.affine.shortcutsTitle.markdownSyntax": "Markdown Синтаксис", - "com.affine.shortcutsTitle.page": "Страница", - "com.affine.sidebarSwitch.collapse": "Свернуть боковую панель", - "com.affine.sidebarSwitch.expand": "Развернуть боковую панель", - "com.affine.themeSettings.dark": "Темная", - "com.affine.themeSettings.light": "Светлая", - "com.affine.toastMessage.addedFavorites": "Добавлено в Избранное", - "com.affine.toastMessage.movedTrash": "Перемещено в корзину", - "com.affine.toastMessage.pageMode": "Режим страницы", - "com.affine.toastMessage.permanentlyDeleted": "Удалено навсегда", - "com.affine.toastMessage.removedFavorites": "Удалено из Избранного", - "com.affine.toastMessage.restored": "{{title}} восстановлен", - "com.affine.today": "Сегодня", - "com.affine.trashOperation.delete": "Удалить", - "com.affine.trashOperation.delete.description": "После удаления вы не сможете отменить это действие. Уверены?", - "com.affine.trashOperation.delete.title": "Удалить навсегда", - "com.affine.trashOperation.deletePermanently": "Удалить навсегда", - "com.affine.trashOperation.restoreIt": "Восстановить", - "com.affine.workspaceDelete.button.cancel": "Отмена", - "com.affine.workspaceDelete.button.delete": "Удалить", - "com.affine.workspaceDelete.description": "Удаление <1>{{workspace}} нельзя отменить, пожалуйста, действуйте с осторожностью. Все содержимое будет потеряно.", - "com.affine.workspaceDelete.description2": "Удаление <1>{{workspace}} приведет к удалению как локальных, так и облачных данных, эта операция не может быть отменена, пожалуйста действуйте с осторожностью.", - "com.affine.workspaceDelete.placeholder": "Пожалуйста, введите имя рабочего пространства для подтверждения", - "com.affine.workspaceDelete.title": "Удалить рабочее пространство", - "com.affine.workspaceLeave.button.cancel": "Отмена", - "com.affine.workspaceLeave.button.leave": "Выйти", - "com.affine.workspaceLeave.description": "После выхода вы больше не сможете получить доступ к содержимому этого рабочего пространства.", - "com.affine.workspaceSubPath.all": "Все страницы", - "com.affine.workspaceSubPath.trash": "Корзина", - "com.affine.workspaceType.cloud": "Облачное рабочее пространство", - "com.affine.workspaceType.joined": "Присоединенное рабочее пространство", - "com.affine.workspaceType.local": "Локальное рабочее пространство", - "com.affine.workspaceType.offline": "Доступно оффлайн", - "com.affine.yesterday": "Вчера", + "Collapse sidebar": "Свернуть боковую панель", + "Collections": "Коллекции", + "Communities": "Сообщества", "Confirm": "Подтвердить", "Connector": "Коннектор (скоро)", + "Contact Us": "Связаться с нами", + "Contact with us": "Связаться с нами", + "Continue": "Продолжить", "Continue with Google": "Войти через Google", - "Convert to ": "Конвертировать в режим", + "Convert to ": "Конвертировать в ", "Copied link to clipboard": "Ссылка скопирована в буфер обмена", "Copy": "Копировать", "Copy Link": "Копировать ссылку", - "core": "основных", "Create": "Создать", "Create Or Import": "Создать или Импортировать", "Create Shared Link Description": "Создайте ссылку, которой можно легко поделиться с кем угодно.", + "Create a collection": "Создать коллекцию", + "Create your own workspace": "Создать свое пространство", "Created": "Создано", - "Data sync mode": "Режим синхронизации данных", + "Created Successfully": "Успешно создано", + "Curve Connector": "Изогнутый коннектор", + "Customize": "Настроить", + "Customize your AFFiNE Appearance": "Настройте внешний вид AFFiNE", + "DB_FILE_ALREADY_LOADED": "Файл базы данных уже загружен", "DB_FILE_INVALID": "Неверный файл базы данных", "DB_FILE_MIGRATION_FAILED": "Не удалось выполнить перенос файлов базы данных", + "DB_FILE_PATH_INVALID": "Неверный путь к файлу базы данных", + "Data sync mode": "Режим синхронизации данных", + "Date": "Дата", + "Date Format": "Формат даты", + "Default Location": "Расположение по умолчанию", + "Default db location hint": "По умолчанию сохраняется в {{location}}.", "Delete": "Удалить", "Delete Member?": "Удалить участника?", + "Delete Workspace": "Удалить пространство", + "Delete Workspace Description": "Удаление <1>{{workspace}} нельзя отменить, пожалуйста, действуйте с осторожностью. Все содержимое будет потеряно.", + "Delete Workspace Description2": "Удаление <1>{{workspace}} приведет к удалению как локальных, так и облачных данных, эта операция не может быть отменена, пожалуйста действуйте с осторожностью.", "Delete Workspace Label Hint": "После удаления этого рабочего пространства вы навсегда удалите все его содержимое для всех. Никто не сможет восстановить содержимое этого рабочего пространства.", "Delete Workspace placeholder": "Пожалуйста, введите \"Delete\" для подтверждения", + "Delete page?": "Удалить страницу?", + "Delete permanently": "Удалить навсегда", "Disable": "Отключить", "Disable Public Link": "Отключить публичную ссылку", + "Disable Public Link ?": "Отключить публичную ссылку ?", + "Disable Public Link Description": "При отключении этой публичной ссылки доступ к этой странице будет закрыт для всех.", "Disable Public Sharing": "Отключить общий доступ", + "Discover what's new": "Узнайте, что нового", + "Discover what's new!": "Узнайте, что нового!", + "Display Language": "Язык интерфейса", + "Divider": "Разделитель", "Download all data": "Скачать все данные", "Download core data": "Скачать основные данные", "Download data": "Скачать {{CoreOrAll}} данные", "Download data Description1": "Это занимает больше места на вашем устройстве.", "Download data Description2": "Это занимает мало места на вашем устройстве.", + "Download updates automatically": "Загружать обновления автоматически", + "Edgeless": "Без рамок", "Edit": "Редактировать", - "emptyAllPages": "Это рабочее пространство пусто. Создайте новую страницу, чтобы начать редактирование.", - "emptyAllPagesClient": "Нажмите на <1>$t(New Page) или <3>{{shortcut}}, чтобы создать свою первую страницу.", - "emptyFavorite": "Нажмите «Добавить в избранное», и страница появится здесь.", - "emptyTrash": "Нажмите «Добавить в корзину», и страница появится здесь.", + "Edit Filter": "Изменить фильтр", + "Editor Version": "Версия редактора", + "Elbowed Connector": "Угловой коннектор", "Enable": "Включить", "Enable AFFiNE Cloud": "Включить AFFiNE Cloud", "Enable AFFiNE Cloud Description": "Если этот параметр включен, данные в этом рабочем пространстве будут скопированы и синхронизированы с помощью AFFiNE Cloud.", "Enable cloud hint": "Данные функции работают на базе AFFiNE Cloud. Все данные хранятся на данном устройстве. Для синхронизации данных с облаком вы можете включить AFFiNE Cloud для этого рабочего пространства.", "Enabled success": "Успешно", + "Exclude from filter": "Убрать из фильтра", + "Expand sidebar": "Развернуть боковую панель", + "Expand/Collapse Sidebar": "Развернуть/Свернуть Боковую панель", "Export": "Экспорт", "Export AFFiNE backup file": "Экспорт файла резервной копии AFFiNE", "Export Description": "Вы можете экспортировать все данные рабочего пространства, потом эти данные можно повторно импортировать.", + "Export Workspace": "Экспорт рабочего пространства <1>{{workspace}} скоро будет доступен", "Export success": "Экспорт прошел успешно", "Export to HTML": "Экспортировать в HTML", "Export to Markdown": "Экспортировать в Markdown", "Export to PDF": "Экспортировать в PDF", "Export to PNG": "Экспортировать в PNG", - "Export Workspace": "Экспорт рабочего пространства <1>{{workspace}} скоро будет доступен", + "FILE_ALREADY_EXISTS": "Файл уже существует", "Failed to publish workspace": "Не удалось опубликовать рабочее пространство", "Favorite": "В Избранное", "Favorite pages for easy access": "Избранные страницы для быстрого доступа", "Favorited": "В Избранном", - "FILE_ALREADY_EXISTS": "Файл уже существует", + "Favorites": "Избранное", + "Filters": "Фильтры", "Find 0 result": "Найдено 0 результатов", "Find results": "Найдено {{number}} результатов", + "Font Style": "Стиль шрифта", "Force Sign Out": "Принудительный выход", + "Full width Layout": "Во всю ширину", + "General": "Общие", "Get in touch!": "Связаться!", "Get in touch! Join our communities": "Свяжитесь с нами! Присоединяйтесь к нашим сообществам.", "Get in touch! Join our communities.": "Свяжитесь с нами! Присоединяйтесь к нашим сообществам.", + "Go Back": "Назад", + "Go Forward": "Вперед", "Got it": "Понятно", + "Group": "Группировать", + "Group as Database": "Сгруппировать в базу данных", + "Hand": "Рука", + "Heading": "Заголовок {{number}}", + "Help and Feedback": "Помощь и обратная связь", "How is AFFiNE Alpha different?": "Чем отличается AFFiNE Alpha?", + "Image": "Изображение", "Import": "Импортировать", + "Increase indent": "Увеличить отступ", "Info": "Информация", + "Info of legal": "Юридическая информация", + "Inline code": "Встроенный код", "Invite": "Пригласить", "Invite Members": "Пригласить участников", "Invite placeholder": "Поиск почты (поддерживается только Gmail)", - "is a Cloud Workspace": "это облачное рабочее пространство.", - "is a Local Workspace": "это локальное рабочее пространство", "It takes up little space on your device": "Занимает мало места на вашем устройстве.", "It takes up little space on your device.": "Занимает мало места на вашем устройстве.", "It takes up more space on your device": "Занимает много места на вашем устройстве.", "It takes up more space on your device.": "Занимает много места на вашем устройстве.", + "Italic": "Курсив", + "Joined Workspace": "Присоединенное рабочее пространство", "Jump to": "Перейти к", + "Keyboard Shortcuts": "Горячие Клавиши", + "Leave": "Выйти", + "Leave Workspace": "Выйти из рабочего пространства", + "Leave Workspace Description": "После выхода вы больше не сможете получить доступ к содержимому этого рабочего пространства.", + "Link": "Гиперссылка (с выделенным текстом)", "Loading": "Загрузка...", + "Loading All Workspaces": "Загрузка всех пространств", + "Local Workspace": "Локальное рабочее пространство", "Local Workspace Description": "Все данные хранятся на текущем устройстве. Для синхронизации данных с облаком вы можете включить AFFiNE Cloud для этого рабочего пространства.", - "login success": "Успешный вход в систему", + "Markdown Syntax": "Markdown Синтаксис", "Member": "Участник", "Member has been removed": "{{name}} был удален", "Members": "Участники", "Members hint": "Здесь можно управлять участниками, приглашать новых участников по электронной почте.", - "mobile device": "Похоже, что вы просматриваете страницу на мобильном устройстве.", - "mobile device description": "Мы все еще работаем над поддержкой мобильных устройств и рекомендуем использовать настольное устройство.", + "Move Down": "Переместить вниз", + "Move Up": "Переместить вверх", + "Move folder": "Переместить папку", "Move folder hint": "Выберите новое место хранения.", "Move folder success": "Перемещение папки успешно", "Move page to": "Переместить страницу в...", "Move page to...": "Переместить страницу в...", + "Move to": "Переместить в", + "Move to Trash": "В Корзину", "Moved to Trash": "Перемещено в корзину", "My Workspaces": "Мои рабочие пространства", + "Name Your Workspace": "Назовите ваше пространство", + "Navigation Path": "Путь", "New Keyword Page": "Новая '{{query}}' страница", "New Page": "Новая страница", "New Workspace": "Новое рабочее пространство", + "New version is ready": "Доступна новая версия", "No item": "Нет элементов", "Non-Gmail": "Поддерживается только Gmail", "Not now": "Не сейчас", + "Note": "Заметка", + "Official Website": "Официальный Сайт", + "Open Workspace Settings": "Открыть Настройки Пространства", "Open folder": "Открыть папку", + "Open folder hint": "Проверить, где находится папка хранения.", + "Open in new tab": "Открыть в новой вкладке", "Owner": "Владелец", + "Page": "Страница", "Paper": "Лист", + "Pen": "Ручка (скоро)", "Pending": "В ожидании", + "Permanently deleted": "Удалено навсегда", + "Placeholder of delete workspace": "Для подтверждения введите имя рабочего пространства", "Please make sure you are online": "Пожалуйста, убедитесь, что вы онлайн", + "Privacy": "Конфиденциальность", "Publish": "Публикация", "Publish to web": "Опубликовать в Интернете", "Published Description": "Текущее рабочее пространство было опубликовано в Интернете. Любой может просматривать содержимое по ссылке. ", + "Published hint": "Пользователи могут просмотреть содержимое по указанной ссылке.", "Published to Web": "Опубликовано в Интернете", "Publishing": "Для публикации в интернете требуется сервис AFFiNE Cloud", "Publishing Description": "После публикации в Интернете любой сможет просматривать содержимое этого рабочего пространства по ссылке.", + "Quick Search": "Быстрый поиск", "Quick search": "Быстрый поиск", "Quick search placeholder": "Быстрый поиск...", "Quick search placeholder2": "Поиск в {{workspace}}", - "recommendBrowser": "Для оптимальной работы мы рекомендуем использовать браузер <1>Chrome.", + "Recent": "Недавнее", + "Redo": "Повторно выполнить", + "Reduce indent": "Уменьшить отступ", + "Remove from favorites": "Удалить из Избранного", "Remove from workspace": "Удалить из рабочего пространства", + "Remove special filter": "Удалить спец. фильтр", + "Removed from Favorites": "Удалено из Избранного", + "Rename": "Переименовать", + "Restart Install Client Update": "Перезапустить для установки обновления", + "Restore it": "Восстановить", "Retain cached cloud data": "Сохраняйте кэшированные облачные данные", "Retain local cached data": "Сохранять локальные кэшированные данные", + "Save": "Сохранить", + "Save As New Collection": "Сохранить как Новую Коллекцию", "Saved then enable AFFiNE Cloud": "Все изменения сохраняются локально, нажмите чтобы включить AFFiNE Cloud.", + "Select": "Выбор", + "Select All": "Выбрать все", + "Set a Workspace name": "Задайте имя рабочего пространства", + "Set database location": "Задайте расположение базы данных", "Set up an AFFiNE account to sync data": "Настройте учетную запись AFFiNE для синхронизации данных", + "Settings": "Настройки", + "Shape": "Фигура", "Share with link": "Поделиться ссылкой", + "Shared Pages": "Общие страницы", + "Shared Pages Description": "Чтобы предоставить публичный доступ к странице, требуется AFFiNE Cloud.", "Shortcuts": "Ярлыки", + "Sidebar": "Боковая панель", "Sign in": "Войти в AFFiNE Cloud", "Sign in and Enable": "Войти и Включить", "Sign out": "Выйти из AFFiNE Cloud", "Sign out description": "Выход приведет к потере несинхронизированного контента.", "Skip": "Пропустить", + "Start Week On Monday": "Начать неделю с понедельника", "Stay logged out": "Не выходить из системы", "Sticky": "Стикер (скоро)", - "still designed": "(Эта страница все еще находится в разработке.)", "Stop publishing": "Остановить публикацию", + "Storage": "Хранилище", + "Storage Folder": "Папка для хранения", + "Storage and Export": "Хранение и экспорт", + "Straight Connector": "Прямой коннектор", + "Strikethrough": "Перечеркнутый", + "Successfully deleted": "Успешно удалено", + "Switch": "Переключить", "Sync": "Синхронизация", + "Sync across devices with AFFiNE Cloud": "Синхронизируйте устройства с помощью AFFiNE Cloud", + "Synced with AFFiNE Cloud": "Синхронизировано с AFFiNE Cloud", + "Tags": "Теги", + "Terms of Use": "Правила пользования", + "Text": "Текст", + "Theme": "Тема", "Title": "Название", + "Trash": "Корзина", + "TrashButtonGroupDescription": "После удаления вы не сможете отменить это действие. Уверены?", + "TrashButtonGroupTitle": "Удалить навсегда", + "UNKNOWN_ERROR": "Неизвестная ошибка", + "Underline": "Подчеркнутый", + "Undo": "Отменить", + "Ungroup": "Разгруппировать", + "Unpin": "Открепить", + "Unpublished hint": "После размещения в сети, пользователи могут просмотреть содержимое по указанной ссылке.", "Untitled": "Без названия", + "Untitled Collection": "Без названия", + "Update Available": "Доступно обновление", + "Update Collection": "Обновить Коллекцию", + "Update workspace name success": "Успешное обновление имени рабочего пространства", "Updated": "Обновлено", - "upgradeBrowser": "Пожалуйста, обновите Chrome до последней версии для лучшего взаимодействия.", "Upload": "Загрузить", + "Use on current device only": "Использовать только на текущем устройстве", "Users": "Пользователи", + "Version": "Версия", + "View Navigation Path": "Просмотреть путь", "Wait for Sync": "Дождитесь синхронизации", - "will delete member": "удалит участника", "Workspace Avatar": "Аватар рабочего пространства", "Workspace Icon": "Иконка рабочего пространства", "Workspace Name": "Имя рабочего пространства", "Workspace Owner": "Владелец рабочего пространства", "Workspace Settings": "Настройки рабочего пространства", - "Workspace Type": "Тип рабочего пространства" + "Workspace Settings with name": "Настройки {{name}}", + "Workspace Type": "Тип рабочего пространства", + "Workspace description": "Рабочее пространство - это ваше виртуальное пространство для фиксации, создания и планирования в одиночку или в команде. ", + "Workspace saved locally": "{{name}} хранится локально", + "You cannot delete the last workspace": "Невозможно удалить последнее пространство", + "Zoom in": "Увеличить", + "Zoom out": "Уменьшить", + "Zoom to 100%": "Увеличить до 100%", + "Zoom to fit": "Подогнать по размеру", + "all": "все", + "com.affine.auth.change.email.page.success.title": "Адрес электронной почты обновлен!", + "com.affine.auth.change.email.page.title": "Изменить адрес электронной почты", + "com.affine.auth.create.count": "Создать учетную запись", + "com.affine.auth.forget": "Забыли пароль", + "com.affine.auth.has.signed": "вошел!", + "com.affine.auth.later": "Позже", + "com.affine.auth.open.affine": "Открыть AFFiNE", + "com.affine.auth.password": "Пароль", + "com.affine.auth.password.error": "Неверный пароль", + "com.affine.auth.reset.password": "Восстановить пароль", + "com.affine.auth.reset.password.message": "Вы получите письмо со ссылкой для восстановления пароля. Пожалуйста, проверьте свой почтовый ящик.", + "com.affine.auth.reset.password.page.title": "Восстановить пароль AFFiNE Cloud", + "com.affine.auth.send.change.email.link": "Отправить ссылку для подтверждения", + "com.affine.auth.send.reset.password.link": "Отправить ссылку для восстановления", + "com.affine.auth.sent": "Отправлено", + "com.affine.auth.sent.change.email.hint": "Ссылка для подтверждения отправлена.", + "com.affine.auth.sent.change.password.hint": "Ссылка для восстановления пароля отправлена.", + "com.affine.auth.sent.set.password.hint": "Ссылка для установки пароля отправлена.", + "com.affine.auth.set.email.save": "Сохранить электронную почту", + "com.affine.auth.set.password": "Задать пароль", + "com.affine.auth.set.password.message": "Для продолжения регистрации задайте пароль из 8-20 символов с буквами и цифрами", + "com.affine.auth.set.password.page.success": "Пароль задан успешно", + "com.affine.auth.set.password.placeholder.confirm": "Подтвердить пароль", + "com.affine.auth.set.password.save": "Сохранить пароль", + "com.affine.auth.sign.auth.code.error.hint": "Неправильный код, попробуйте еще раз", + "com.affine.auth.sign.auth.code.message": "Если вы не получили письмо, проверьте папку \"Спам\".", + "com.affine.auth.sign.auth.code.on.resend.hint": "Отправить код повторно", + "com.affine.auth.sign.auth.code.resend.hint": "Отправить код повторно", + "com.affine.auth.sign.condition": "Условия", + "com.affine.auth.sign.email.continue": "Войти через почту", + "com.affine.auth.sign.email.error": "Неверный адрес электронной почты", + "com.affine.auth.sign.email.placeholder": "Введите адрес электронной почты", + "com.affine.auth.sign.in": "Войти", + "com.affine.auth.sign.in.sent.email.subtitle": "Подтвердить электронную почту", + "com.affine.auth.sign.message": "Нажимая \"Войти через Google/Почту\", вы подтверждаете, что согласны с <1>Условиями пользования AFFiNE и <3>Политикой конфиденциальности.", + "com.affine.auth.sign.policy": "Политика конфиденциальности", + "com.affine.auth.sign.up": "Зарегистрироваться", + "com.affine.auth.sign.up.sent.email.subtitle": "Создать учетную запись", + "com.affine.auth.sign.up.success.title": "Ваша учетная запись создана и Вы вошли в систему!", + "com.affine.auth.signed.success.subtitle": "Вы успешно вошли в систему. Приложение автоматически откроется или будет перенаправлено на веб-версию. Если у вас возникнут какие-либо проблемы, вы также можете нажать кнопку ниже, чтобы вручную открыть приложение AFFiNE.", + "com.affine.auth.signed.success.title": "Почти готово!", + "com.affine.auth.toast.message.failed": "Ошибка сервера, повторите попытку позже.", + "com.affine.banner.content": "Эта демо-версия ограничена. <1>Загрузите AFFiNE Client чтобы получить самые последние функции и высокую производительность.", + "com.affine.cloudTempDisable.title": "AFFiNE Cloud сейчас обновляется.", + "com.affine.collection-bar.action.tooltip.delete": "Удалить", + "com.affine.collection-bar.action.tooltip.edit": "Редактировать", + "com.affine.collection-bar.action.tooltip.pin": "Закрепить на боковой панели", + "com.affine.collection-bar.action.tooltip.unpin": "Открепить", + "com.affine.collection.menu.rename": "Переименовать", + "com.affine.currentYear": "Текущий год", + "com.affine.draw_with_a_blank_whiteboard": "Рисуйте на пустой доске", + "com.affine.earlier": "Ранее", + "com.affine.edgelessMode": "Безрамочный режим", + "com.affine.editCollection.renameCollection": "Переименовать коллекцию", + "com.affine.editCollectionName.name": "Имя", + "com.affine.editCollectionName.name.placeholder": "Имя коллекции", + "com.affine.emptyDesc": "Здесь пока нет страниц", + "com.affine.expired.page.subtitle": "Пожалуйста, запросите новую ссылку для восстановления пароля.", + "com.affine.expired.page.title": "Срок действия этой ссылки истек...", + "com.affine.export.error.message": "Пожалуйста, повторите попытку позже.", + "com.affine.export.error.title": "Экспорт не удался из-за непредвиденной ошибки", + "com.affine.export.success.message": "Пожалуйста, проверьте папку загрузки.", + "com.affine.export.success.title": "Экспорт прошел успешно", + "com.affine.filter": "Фильтр", + "com.affine.filter.after": "после", + "com.affine.filter.before": "до", + "com.affine.filter.contains all": "содержит все", + "com.affine.filter.contains one of": "содержит одно из", + "com.affine.filter.does not contains all": "не содержит все", + "com.affine.filter.false": "нет", + "com.affine.filter.is empty": "пусто", + "com.affine.filter.is not empty": "не пусто", + "com.affine.filter.is-favourited": "Избранное", + "com.affine.filter.save-view": "Сохранить вид", + "com.affine.filter.true": "да", + "com.affine.header.option.add-tag": "Добавить тег", + "com.affine.header.option.duplicate": "Дублировать", + "com.affine.helpIsland.gettingStarted": "Начало работы", + "com.affine.import_file": "Поддержка Markdown/Notion", + "com.affine.last30Days": "Последние 30 дней", + "com.affine.last7Days": "Последние 7 дней", + "com.affine.lastMonth": "Последний месяц", + "com.affine.lastWeek": "Прошлая неделя", + "com.affine.lastYear": "Прошлый год", + "com.affine.nameWorkspace.button.cancel": "Отменить", + "com.affine.nameWorkspace.button.create": "Создать", + "com.affine.nameWorkspace.title": "Назовите ваше пространство", + "com.affine.new_edgeless": "Новый безрамочный", + "com.affine.new_import": "Импортировать", + "com.affine.onboarding.title2": "Интуитивное и надежное редактирование на основе блоков", + "com.affine.pageMode": "Режим страницы", + "com.affine.payment.plans-error-tip": "Невозможно загрузить тарифные планы, проверьте свое подключение к сети.", + "com.affine.payment.upgrade-success-page.support": "Если у Вас возникли вопросы, обращайтесь в нашу <1> службу поддержки клиентов.", + "com.affine.setting.account": "Настройки учетной записи", + "com.affine.setting.account.delete": "Удалить аккаунт", + "com.affine.setting.account.message": "Ваша персональная информация", + "com.affine.settings.about.message": "Информация об AFFiNE", + "com.affine.settings.about.update.download.message": "Загружать обновления автоматически (на данное устройство).", + "com.affine.settings.appearance": "Внешний вид", + "com.affine.settings.appearance.border-style-description": "Настроить внешний вид клиента.", + "com.affine.settings.appearance.date-format-description": "Настроить формат даты.", + "com.affine.settings.appearance.start-week-description": "По умолчанию неделя начинается с воскресенья.", + "com.affine.settings.remove-workspace": "Удалить рабочее пространство", + "com.affine.settings.workspace.not-owner": "Только владелец может редактировать аватар и имя рабочего пространства. Изменения будут отображаться для всех.", + "com.affine.settings.workspace.storage.tip": "Щелкните, чтобы переместить место хранения.", + "com.affine.today": "Сегодня", + "com.affine.updater.downloading": "Загрузка", + "com.affine.updater.restart-to-update": "Перезапустить для установки обновления", + "com.affine.updater.update-available": "Доступно обновление", + "com.affine.workspaceDelete.placeholder": "Для подтверждения введите имя рабочего пространства", + "com.affine.yesterday": "Вчера", + "core": "основных", + "dark": "Темная", + "emptyAllPages": "Это рабочее пространство пусто. Создайте новую страницу, чтобы начать редактирование.", + "emptyAllPagesClient": "Нажмите <1>$t(New Page) или <3>{{shortcut}}, чтобы создать свою первую страницу.", + "emptyFavorite": "Нажмите «Добавить в избранное», и страница появится здесь.", + "emptyTrash": "Нажмите «Добавить в корзину», и страница появится здесь.", + "is a Cloud Workspace": "это облачное рабочее пространство.", + "is a Local Workspace": "это локальное рабочее пространство", + "light": "Светлая", + "login success": "Успешный вход в систему", + "mobile device": "Похоже, что вы просматриваете страницу на мобильном устройстве.", + "mobile device description": "Мы все еще работаем над поддержкой мобильных устройств и рекомендуем использовать настольное устройство.", + "recommendBrowser": "Для оптимальной работы мы рекомендуем использовать браузер <1>Chrome.", + "restored": "{{title}} восстановлен", + "still designed": "(Эта страница все еще находится в разработке.)", + "upgradeBrowser": "Пожалуйста, обновите Chrome до последней версии для лучшего взаимодействия.", + "will be moved to Trash": "{{title}} будет перемещен в Корзину", + "will delete member": "удалит участника" } diff --git a/packages/frontend/i18n/src/resources/zh-Hans.json b/packages/frontend/i18n/src/resources/zh-Hans.json index d568708fed..47833ee09c 100644 --- a/packages/frontend/i18n/src/resources/zh-Hans.json +++ b/packages/frontend/i18n/src/resources/zh-Hans.json @@ -1,17 +1,343 @@ { + "404 - Page Not Found": "404 - 找不到页面", + "404.back": "返回我的内容", + "404.hint": "抱歉,您没有访问权限或该内容不存在...", + "404.signOut": "登录另一个帐户", + "AFFiNE Cloud": "AFFiNE Cloud", + "AFFiNE Community": "AFFiNE 社区", + "About AFFiNE": "关于 AFFiNE", "Access level": "访问权限", - "Add a subpage inside": "添加一个子页面", + "Actions": "操作", + "Add Filter": "添加筛选条件", "Add Workspace": "导入工作区", - "Add Workspace Hint": "请选择已有的数据库文件", + "Add Workspace Hint": "选择已有的数据库文件", + "Add a subpage inside": "添加一个子页面", + "Add to Favorites": "加入收藏", + "Add to favorites": "加入收藏", + "Added Successfully": "导入成功", + "Added to Favorites": "已收藏", "All changes are saved locally": "所有改动已保存到本地", "All data has been stored in the cloud": "所有数据已被保存在云端。", + "All pages": "全部页面", + "App Version": "应用版本", + "Appearance Settings": "外观设置", + "Append to Daily Note": "附加到随笔", + "Available Offline": "可供离线使用", + "Back Home": "返回首页", "Back to Quick Search": "返回快速搜索", + "Back to all": "返回全部", + "Body text": "正文", + "Bold": "粗体", + "Cancel": "取消", "Change avatar hint": "新的头像将对所有人显示。", "Change workspace name hint": "新的名称将对所有人显示。", + "Changelog description": "查看 AFFiNE 更新日志。", + "Check Keyboard Shortcuts quickly": "快速查看快捷键", "Check Our Docs": "查看我们的文档", + "Check for updates": "检查更新", + "Check for updates automatically": "自动检查更新", + "Choose your font style": "选择你的字体样式", + "Click to replace photo": "点击以更换照片", + "Client Border Style": "客户端边框样式", + "Cloud Workspace": "云端工作区", "Cloud Workspace Description": "所有数据将被同步并保存在 AFFiNE 账户(<1>{{email}})中", + "Code block": "代码块", "Collaboration": "协作", "Collaboration Description": "与其他成员协作需要 AFFiNE Cloud 服务支持。", + "Collapse sidebar": "折叠侧边栏", + "Collections": "精选", + "Communities": "社区", + "Confirm": "确认", + "Connector": "链接", + "Contact Us": "联系我们", + "Contact with us": "联系我们", + "Continue": "继续", + "Continue with Google": "谷歌登录以继续", + "Convert to ": "转换为", + "Copied link to clipboard": "复制链接到剪贴板", + "Copy": "复制", + "Copy Link": "复制链接", + "Create": "创建", + "Create Or Import": "创建或导入", + "Create Shared Link Description": "创建一个可以轻松分享给任何人的链接", + "Create a collection": "创建精选", + "Create your own workspace": "创建属于你的工作区", + "Created": "创建时间", + "Created Successfully": "创建成功", + "Created with": "创建于", + "Curve Connector": "曲线连接", + "Customize": "自定义", + "Customize your AFFiNE Appearance": "定制您的 AFFiNE 外观", + "DB_FILE_ALREADY_LOADED": "数据库文件已加载", + "DB_FILE_INVALID": "无效的数据库文件", + "DB_FILE_MIGRATION_FAILED": "数据库文件迁移失败", + "DB_FILE_PATH_INVALID": "数据库文件路径无效", + "Data sync mode": "数据同步模式", + "Date": "日期", + "Date Format": "日期格式", + "Default Location": "默认位置", + "Default db location hint": "默认情况下将保存到 {{location}}", + "Delete": "删除", + "Delete Member?": "删除成员?", + "Delete Workspace": "删除工作空间", + "Delete Workspace Description": "正在删除 <1>{{workspace}} ,此操作无法撤销,所有内容将会丢失。", + "Delete Workspace Description2": "正在删除<1>{{workspace}} ,将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。", + "Delete Workspace Label Hint": "在删除此工作区后,您将永久删除所有内容,任何人都无法恢复此工作区的内容。", + "Delete Workspace placeholder": "请输入”Delete“以确认", + "Delete page?": "确定要删除页面?", + "Delete permanently": "永久删除", + "Disable": "禁用", + "Disable Public Link": "禁用公共链接", + "Disable Public Link ?": "禁用公共链接 ?", + "Disable Public Link Description": "禁用此公共链接将阻止任何拥有此链接的人访问此页面。", + "Disable Public Sharing": "禁用公开分享", + "Discover what's new": "发现新动态", + "Discover what's new!": "发现最近更新!", + "Display Language": "显示语言", + "Divider": "分割线", + "Download all data": "下载所有数据", + "Download core data": "下载核心数据", + "Download data": "下载 {{CoreOrAll}} 数据", + "Download data Description1": "此操作会在你的设备上占用更多空间。", + "Download data Description2": "此操作会在你的设备上占用少许空间。", + "Download updates automatically": "自动下载更新", + "Early Access Stage": "抢先体验阶段", + "Edgeless": "无界", + "Edit": "编辑", + "Edit Filter": "编辑筛选条件", + "Editor Version": "编辑器版本", + "Elbowed Connector": "弯曲连接", + "Enable": "启用", + "Enable AFFiNE Cloud": "启用 AFFiNE Cloud 服务", + "Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过 AFFiNE Cloud 进行备份和同步。", + "Enable cloud hint": "以下功能依赖于 AFFiNE Cloud。 所有数据都存储在当前设备上。 您可以为此工作区启用 AFFiNE Cloud,以保持数据与云同步。", + "Enabled success": "启用成功", + "Exclude from filter": "从筛选条件中移除", + "Expand sidebar": "展开侧边栏", + "Expand/Collapse Sidebar": "展开/折叠侧边栏", + "Export": "导出", + "Export AFFiNE backup file": "导出 AFFiNE 备份文件", + "Export Description": "您可以导出整个工作区数据进行备份,导出的数据可以重新被导入。", + "Export Shared Pages Description": "下载页面的静态副本以与他人分享。", + "Export Workspace": "导出工作区 <1>{{workspace}} 即将上线", + "Export failed": "导出失败", + "Export success": "导出成功", + "Export to HTML": "导出为 HTML", + "Export to Markdown": "导出为 Markdown", + "Export to PDF": "导出为 PDF", + "Export to PNG": "导出为 PNG", + "FILE_ALREADY_EXISTS": "文件已存在", + "Failed to publish workspace": "工作区发布失败", + "Favorite": "收藏", + "Favorite pages for easy access": "将页面添加到收藏夹以便轻松访问", + "Favorited": "已收藏", + "Favorites": "收藏夹", + "Filters": "筛选条件", + "Find 0 result": "找到 0 个结果", + "Find results": "找到 {{number}} 个结果", + "Font Style": "字体样式", + "Force Sign Out": "强制登出", + "Full width Layout": "全宽布局", + "General": "常规", + "Get in touch!": "保持联络!", + "Get in touch! Join our communities": "保持联系!加入我们的社区。", + "Get in touch! Join our communities.": "加入社区,保持联络!", + "Go Back": "返回", + "Go Forward": "前进", + "Got it": "知道了", + "Group": "分组", + "Group as Database": "作为数据库分组", + "Hand": "拖放", + "Heading": "标题 {{number}}", + "Help and Feedback": "帮助与反馈", + "How is AFFiNE Alpha different?": "AFFiNE Alpha 有何不同?", + "Image": "图像", + "Import": "导入", + "Increase indent": "增加缩进", + "Info": "信息", + "Info of legal": "法律信息", + "Inline code": "行内代码", + "Invitation sent": "邀请已发送", + "Invitation sent hint": "已通过电子邮件通知受邀成员加入此工作区。", + "Invite": "邀请", + "Invite Members": "邀请成员", + "Invite Members Message": "受邀成员将在当前工作空间中与您协作", + "Invite placeholder": "搜索邮件(仅支持Gmail)", + "It takes up little space on your device": "它会在你的设备上占用少许空间。", + "It takes up little space on your device.": "此操作会在你的设备上占用少许空间。", + "It takes up more space on your device": "它会在你的设备上占用更多空间。", + "It takes up more space on your device.": "此操作会在你的设备上占用更多空间。", + "Italic": "斜体", + "Joined Workspace": "加入的工作区", + "Jump to": "跳转到", + "Keyboard Shortcuts": "键盘快捷键", + "Leave": "退出", + "Leave Workspace": "退出工作区", + "Leave Workspace Description": "退出后,您将无法再访问此工作区的内容。", + "Leave Workspace hint": "离开后,您将无法访问此工作区中的内容。", + "Link": "超链接(选定文本)", + "Loading": "加载中...", + "Loading All Workspaces": "正在加载所有工作区", + "Local": "本地", + "Local Workspace": "本地工作区", + "Local Workspace Description": "所有数据都本地存储在当前设备。您可以为此工作区启用 AFFiNE Cloud,以保证数据时刻被云端同步。", + "Markdown Syntax": "Markdown 语法", + "Member": "成员", + "Member has been removed": "{{name}} 已被移除。", + "Members": "成员", + "Members hint": "在这里管理成员,通过电子邮件邀请新成员。", + "Move Down": "下移", + "Move Up": "上移", + "Move folder": "移动文件夹", + "Move folder hint": "选择新的存储位置", + "Move folder success": "移动文件夹成功", + "Move page to": "将此页面移动到...", + "Move page to...": "将此页面移动...", + "Move to": "移动到", + "Move to Trash": "移到垃圾箱", + "Moved to Trash": "已移到垃圾箱", + "My Workspaces": "我的工作区", + "Name Your Workspace": "给您的工作区命名", + "NativeTitleBar": "原生标题栏", + "Navigation Path": "导航路径", + "New Keyword Page": "新建 “{{query}}“ 为标题的页面 ", + "New Page": "新建页面", + "New Workspace": "新建工作区", + "New version is ready": "新版本已准备就绪", + "No item": "无项目", + "Non-Gmail": "不支持非 Gmail 邮箱", + "None yet": "还没有", + "Not now": "稍后再说", + "Note": "笔记", + "Official Website": "官网", + "Open Workspace Settings": "打开工作区设置", + "Open folder": "打开文件夹", + "Open folder hint": "检查存储文件夹的位置。", + "Open in new tab": "在新标签页打开", + "Organize pages to build knowledge": "组织页面以建立知识库。", + "Owner": "所有者", + "Page": "页面", + "Paper": "文档", + "Pen": "笔", + "Pending": "待定", + "Permanently deleted": "已永久删除", + "Pivots": "枢纽", + "Placeholder of delete workspace": "请输入工作区名字以确认", + "Please make sure you are online": "请确保你的网络在线", + "Privacy": "隐私", + "Publish": "发布", + "Publish to web": "发布到web", + "Published Description": "当前工作区已被发布到 Web,所有人都可以通过链接来查看此工作区内容。", + "Published hint": "访客可以通过提供的链接查看内容。", + "Published to Web": "公开到互联网", + "Publishing": "发布到 web 需要 AFFiNE Cloud 服务。", + "Publishing Description": "发布到 web 后,所有人都可以通过链接查看此工作区的内容。", + "Quick Search": "快速搜索", + "Quick search": "快速搜索", + "Quick search placeholder": "快速搜索...", + "Quick search placeholder2": "在 {{workspace}} 中搜索", + "RFP": "页面可以从枢纽上被自由添加或删除,但仍然可以在“所有页面”中访问。", + "Recent": "最近", + "Redo": "重做", + "Reduce indent": "减少缩进", + "Remove from Pivots": "从枢纽中删除", + "Remove from favorites": "从收藏中移除", + "Remove from workspace": "从工作区移除", + "Remove photo": "移除照片", + "Remove special filter": "移除特殊筛选", + "Removed from Favorites": "已从收藏中移除", + "Removed successfully": "成功移除", + "Rename": "重命名", + "Restart Install Client Update": "重启以安装更新", + "Restore it": "恢复TA", + "Retain cached cloud data": "保留缓存的云数据", + "Retain local cached data": "保留本地缓存数据", + "Save": "保存", + "Save As New Collection": "另存为新精选", + "Save as New Collection": "另存为新精选", + "Saved then enable AFFiNE Cloud": "所有改动已保存在本地,点击启用 AFFiNE Cloud 服务。", + "Select": "选择", + "Select All": "全选", + "Set a Workspace name": "设置工作区名字", + "Set database location": "设置数据库位置", + "Set up an AFFiNE account to sync data": "设置 AFFiNE 帐户以同步数据", + "Settings": "设置", + "Shape": "图形", + "Share Menu Public Workspace Description1": "邀请其他人加入工作区或将其发布到网络。", + "Share Menu Public Workspace Description2": "当前工作区已被发布到网络作为公共工作区。", + "Share with link": "通过链接分享", + "Shared Pages": "已分享页面", + "Shared Pages Description": "公开分享页面需要 AFFiNE Cloud 服务。", + "Shared Pages In Public Workspace Description": "整个工作区已在网络上发布,可以通过<1>工作区设置进行编辑。", + "Shortcuts": "快捷键", + "Sidebar": "侧边栏", + "Sign in": "登录 AFFiNE Cloud", + "Sign in and Enable": "登录并启用", + "Sign out": "登出 AFFiNE 云", + "Sign out description": "登出会导致未同步的内容丢失", + "Skip": "跳过", + "Start Week On Monday": "一周从周一开始", + "Stay logged out": "保持登出状态", + "Sticky": "便利贴", + "Stop publishing": "中止发布", + "Storage": "储存", + "Storage Folder": "存储文件夹", + "Storage and Export": "储存与导出", + "Straight Connector": "直线连接", + "Strikethrough": "删除线", + "Successfully deleted": "成功删除。", + "Successfully enabled AFFiNE Cloud": "成功启用 AFFiNE Cloud", + "Successfully joined!": "加入成功!", + "Switch": "切换", + "Sync": "同步", + "Sync across devices with AFFiNE Cloud": "使用 AFFiNE Cloud 在多个设备间进行同步", + "Synced with AFFiNE Cloud": "AFFiNE Cloud 同步完成", + "Tags": "标签", + "Terms of Use": "使用条款", + "Text": "文本", + "Theme": "主题", + "Title": "标题", + "Trash": "垃圾箱", + "TrashButtonGroupDescription": "一旦删除,将无法撤消此操作。确定吗?", + "TrashButtonGroupTitle": "永久删除", + "UNKNOWN_ERROR": "未知错误", + "Underline": "下划线", + "Undo": "撤销", + "Ungroup": "取消分组", + "Unpin": "取消固定", + "Unpublished hint": "发布到网络后,访问者可以通过提供的链接查看内容。", + "Untitled": "未命名", + "Untitled Collection": "未命名精选", + "Update Available": "有可用的更新", + "Update Collection": "更新精选", + "Update workspace name success": "成功更新工作区名称", + "Updated": "更新时间", + "Upload": "上传", + "Use on current device only": "仅在当前设备上使用", + "Users": "用户", + "Version": "版本", + "View Navigation Path": "查看导航路径", + "Visit Workspace": "访问工作区", + "Wait for Sync": "等待同步", + "Window frame style": "视窗样式", + "Workspace Avatar": "工作区头像", + "Workspace Icon": "工作区图标", + "Workspace Name": "工作区名称", + "Workspace Not Found": "未找到工作区", + "Workspace Owner": "工作区所有者", + "Workspace Profile": "工作区配置文件", + "Workspace Settings": "工作区设置", + "Workspace Settings with name": "{{name}} 的设置", + "Workspace Type": "工作区类型", + "Workspace database storage description": "选择您要创建工作区的位置。工作区的数据默认情况下会保存在本地。", + "Workspace description": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。", + "Workspace saved locally": "{{name}} 已保存在本地", + "You cannot delete the last workspace": "您无法删除最后一个工作区", + "Zoom in": "放大", + "Zoom out": "缩小", + "Zoom to 100%": "缩放至 100%", + "Zoom to fit": "缩放至适当尺寸", + "all": "全部", "com.affine.aboutAFFiNE.autoCheckUpdate.description": "定期自动检查更新。", "com.affine.aboutAFFiNE.autoCheckUpdate.title": "自动检查更新", "com.affine.aboutAFFiNE.autoDownloadUpdate.description": "自动下载更新(到此设备)。", @@ -27,62 +353,237 @@ "com.affine.aboutAFFiNE.legal.privacy": "隐私", "com.affine.aboutAFFiNE.legal.title": "法律信息", "com.affine.aboutAFFiNE.legal.tos": "使用条款", - "com.affine.aboutAFFiNE.subtitle": "关于AFFiNE的资讯", + "com.affine.aboutAFFiNE.subtitle": "关于 AFFiNE 的资讯", "com.affine.aboutAFFiNE.title": "关于 AFFiNE", "com.affine.aboutAFFiNE.version.app": "应用版本", "com.affine.aboutAFFiNE.version.editor.title": "编辑器版本", "com.affine.aboutAFFiNE.version.title": "版本", + "com.affine.all-pages.header": "所有页面", + "com.affine.appUpdater.downloading": "下载中", + "com.affine.appUpdater.installUpdate": "重新启动以安装更新", + "com.affine.appUpdater.openDownloadPage": "打开下载页面", + "com.affine.appUpdater.updateAvailable": "有可用的更新", + "com.affine.appUpdater.whatsNew": "发现新动态!", "com.affine.appearanceSettings.clientBorder.description": "自定义客户端外观。", "com.affine.appearanceSettings.clientBorder.title": "客户端边框样式", - "com.affine.appearanceSettings.color.description": "选择你的配色方案", + "com.affine.appearanceSettings.color.description": "选择您的配色方案", "com.affine.appearanceSettings.color.title": "配色方案", "com.affine.appearanceSettings.date.title": "日期", - "com.affine.appearanceSettings.dateFormat.description": "定制您的日期格式。", + "com.affine.appearanceSettings.dateFormat.description": "自定义您的日期样式", "com.affine.appearanceSettings.dateFormat.title": "日期格式", - "com.affine.appearanceSettings.font.description": "选择你的字体风格", - "com.affine.appearanceSettings.font.title": "字体", - "com.affine.appearanceSettings.fontStyle.sans": "无衬线", - "com.affine.appearanceSettings.fontStyle.serif": "衬线", + "com.affine.appearanceSettings.font.description": "选择您的字体样式", + "com.affine.appearanceSettings.font.title": "字体样式", "com.affine.appearanceSettings.fontStyle.mono": "等宽", + "com.affine.appearanceSettings.fontStyle.sans": "默认", + "com.affine.appearanceSettings.fontStyle.serif": "衬线", "com.affine.appearanceSettings.fullWidth.description": "页面内容的最大显示量。", "com.affine.appearanceSettings.fullWidth.title": "全宽布局", "com.affine.appearanceSettings.language.description": "选择界面语言。", "com.affine.appearanceSettings.language.title": "显示语言", "com.affine.appearanceSettings.noisyBackground.description": "在侧边栏使用噪点背景效果。", - "com.affine.appearanceSettings.noisyBackground.title": "侧边栏的噪点背景", + "com.affine.appearanceSettings.noisyBackground.title": "侧边栏噪点背景", "com.affine.appearanceSettings.sidebar.title": "侧边栏", - "com.affine.appearanceSettings.startWeek.description": "默认情况下,一周从星期日开始。", - "com.affine.appearanceSettings.startWeek.title": "一周从周一开始", + "com.affine.appearanceSettings.startWeek.description": "默认以星期日开始一周", + "com.affine.appearanceSettings.startWeek.title": "以星期一开始一周", "com.affine.appearanceSettings.subtitle": "定制您的 AFFiNE 外观", "com.affine.appearanceSettings.theme.title": "主题", "com.affine.appearanceSettings.title": "外观设置", "com.affine.appearanceSettings.translucentUI.description": "在侧边栏使用半透明效果。", "com.affine.appearanceSettings.translucentUI.title": "侧边栏的透明效果", + "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "原生标题栏", "com.affine.appearanceSettings.windowFrame.description": "自定义 Windows 客户端外观。", "com.affine.appearanceSettings.windowFrame.frameless": "无边框", - "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "原生标题栏", "com.affine.appearanceSettings.windowFrame.title": "视窗样式", - "com.affine.appUpdater.downloading": "下载中", - "com.affine.appUpdater.installUpdate": "重新启动以安装更新", - "com.affine.appUpdater.openDownloadPage": "打开下载页面", - "com.affine.appUpdater.updateAvailable": "有可用的更新", - "com.affine.appUpdater.whatsNew": "发现最近更新!", + "com.affine.auth.change.email.message": "您当前的邮箱是 {{email}}。我们将向此邮箱发送一个临时的验证链接。", + "com.affine.auth.change.email.page.subtitle": "请在下方输入您的新电子邮件地址。我们将把验证链接发送至该电子邮件地址以完成此过程。", + "com.affine.auth.change.email.page.success.subtitle": "恭喜!您已更新了与 AFFiNE Cloud 账户关联的电子邮件地址。", + "com.affine.auth.change.email.page.success.title": "邮箱地址已更新!", + "com.affine.auth.change.email.page.title": "更改邮箱地址", + "com.affine.auth.create.count": "创建账号", + "com.affine.auth.desktop.signing.in": "正在登录...", + "com.affine.auth.forget": "忘记密码", + "com.affine.auth.has.signed": "已登录!", + "com.affine.auth.has.signed.message": "您已登录,开始与 AFFiNE Cloud 同步您的数据吧!", + "com.affine.auth.later": "稍后", + "com.affine.auth.open.affine": "打开 AFFiNE", + "com.affine.auth.open.affine.download-app": "下载应用", + "com.affine.auth.open.affine.prompt": "正在打开 <1>AFFiNE 应用\n", + "com.affine.auth.open.affine.try-again": "重试", + "com.affine.auth.page.sent.email.subtitle": "请输入一个长度在8-20个字符之间,同时包含字母和数字的密码以继续注册", + "com.affine.auth.page.sent.email.title": "欢迎来到 AFFiNE Cloud,即将完成!", + "com.affine.auth.password": "密码", + "com.affine.auth.password.error": "无效密码", + "com.affine.auth.password.set-failed": "设置密码失败", + "com.affine.auth.reset.password": "重置密码", + "com.affine.auth.reset.password.message": "您将收到一封电子邮件,以便重置密码。请在收件箱中查收。", + "com.affine.auth.reset.password.page.success": "密码重置成功", + "com.affine.auth.reset.password.page.title": "重置您的 AFFiNE Cloud 密码", + "com.affine.auth.send.change.email.link": "发送验证链接", + "com.affine.auth.send.reset.password.link": "发送重置链接", + "com.affine.auth.send.set.password.link": "发送设置链接", + "com.affine.auth.sent": "已发送", + "com.affine.auth.sent.change.email.hint": "验证链接已发送", + "com.affine.auth.sent.change.password.hint": "重置密码链接已发送。", + "com.affine.auth.sent.reset.password.success.message": "您的密码已更新!您可以使用新密码登录 AFFiNE Cloud!", + "com.affine.auth.sent.set.password.hint": "设置密码链接已发送。", + "com.affine.auth.sent.set.password.success.message": "您的密码已保存!您可以使用邮箱和密码登录 AFFiNE Cloud!", + "com.affine.auth.set.email.save": "保存电子邮件", + "com.affine.auth.set.password": "设置密码", + "com.affine.auth.set.password.message": "请输入一个长度在8-20个字符之间,同时包含字母和数字的密码以继续注册", + "com.affine.auth.set.password.page.success": "密码设置成功", + "com.affine.auth.set.password.page.title": "设置您的 AFFiNE Cloud 密码", + "com.affine.auth.set.password.placeholder": "密码长度至少需要8个字符", + "com.affine.auth.set.password.placeholder.confirm": "确认密码", + "com.affine.auth.set.password.save": "保存密码", + "com.affine.auth.sign-out.confirm-modal.cancel": "取消", + "com.affine.auth.sign-out.confirm-modal.confirm": "登出", + "com.affine.auth.sign-out.confirm-modal.description": "登出后,与此帐户关联的云端工作区将从当前设备中删除,再次登录会将它们添加回来。", + "com.affine.auth.sign-out.confirm-modal.title": "登出?", + "com.affine.auth.sign.auth.code.error.hint": "验证码错误,请重试", + "com.affine.auth.sign.auth.code.message": "如果您没有收到电子邮件,请检查您的垃圾邮件文件夹。", + "com.affine.auth.sign.auth.code.message.password": "或者使用<1>密码登录。", + "com.affine.auth.sign.auth.code.on.resend.hint": "再次发送验证码", + "com.affine.auth.sign.auth.code.resend.hint": "重发验证码", + "com.affine.auth.sign.condition": "条款与条件", + "com.affine.auth.sign.email.continue": "以电子邮件继续", + "com.affine.auth.sign.email.error": "无效的电子邮件", + "com.affine.auth.sign.email.placeholder": "请输入电子邮件地址", + "com.affine.auth.sign.in": "登录", + "com.affine.auth.sign.in.sent.email.subtitle": "请确认电子邮件", + "com.affine.auth.sign.message": "点击上面的“谷歌登录以继续”,即表示您确认同意 AFFiNE 的<1>条件条款和<3>隐私政策。", + "com.affine.auth.sign.no.access.hint": "AFFiNE Cloud 处于抢先体验阶段。 查看此链接,了解有关成为 AFFiNE Cloud 早期支持者的好处的更多信息:", + "com.affine.auth.sign.no.access.link": "AFFiNE Cloud 抢先体验", + "com.affine.auth.sign.no.access.wait": "请期待正式发行", + "com.affine.auth.sign.policy": "隐私政策", + "com.affine.auth.sign.sent.email.message.end": "您可以点击链接自动创建账户。", + "com.affine.auth.sign.sent.email.message.start": "一封带有 magic link 的邮件已发送至", + "com.affine.auth.sign.up": "注册", + "com.affine.auth.sign.up.sent.email.subtitle": "创建您的账号", + "com.affine.auth.sign.up.success.subtitle": "AFFiNE 客户端将自动打开或重定向到网页端,如果您遇到任何问题,可以点击下方按钮手动打开 AFFiNE。", + "com.affine.auth.sign.up.success.title": "注册成功", + "com.affine.auth.signed.success.subtitle": "您已成功登录。应用程序将自动打开或重定向至网页版。 如果您遇到任何问题,您还可以单击下面的按钮手动打开 AFFiNE 应用程序。", + "com.affine.auth.signed.success.title": "即将完成!", + "com.affine.auth.toast.message.failed": "服务器错误,请稍后重试。", + "com.affine.auth.toast.message.signed-in": "您已登录,开始与 AFFiNE Cloud 同步您的数据!", + "com.affine.auth.toast.title.failed": "无法登录", + "com.affine.auth.toast.title.signed-in": "已登录", "com.affine.backButton": "返回首页", "com.affine.banner.content": "此演示有限。<1>下载 AFFiNE 客户端以获取最新功能和表现。", "com.affine.brand.affineCloud": "AFFiNE Cloud", "com.affine.cloudTempDisable.description": "我们正在升级 AFFiNE Cloud 服务,客户端暂时不可启用它。如果您希望随时了解进度并收到关于云服务的可用性通知,您可以填写我们的<1>表单。", "com.affine.cloudTempDisable.title": "AFFiNE Cloud 正在进行升级。", + "com.affine.cmdk.affine.category.affine.collections": "精选", + "com.affine.cmdk.affine.category.affine.creation": "创建", + "com.affine.cmdk.affine.category.affine.edgeless": "无界", + "com.affine.cmdk.affine.category.affine.general": "常规", + "com.affine.cmdk.affine.category.affine.help": "帮助", + "com.affine.cmdk.affine.category.affine.layout": "布局控制", + "com.affine.cmdk.affine.category.affine.navigation": "导航", + "com.affine.cmdk.affine.category.affine.pages": "页面", + "com.affine.cmdk.affine.category.affine.recent": "最近", + "com.affine.cmdk.affine.category.affine.settings": "设置", + "com.affine.cmdk.affine.category.affine.updates": "更新", + "com.affine.cmdk.affine.category.editor.edgeless": "无界命令", + "com.affine.cmdk.affine.category.editor.insert-object": "插入对象", + "com.affine.cmdk.affine.category.editor.page": "页面命令", + "com.affine.cmdk.affine.client-border-style.to": "更改客户端边框样式为", + "com.affine.cmdk.affine.color-mode.to": "更改颜色模式为", + "com.affine.cmdk.affine.color-scheme.to": "更改颜色方案为", + "com.affine.cmdk.affine.contact-us": "联系我们", + "com.affine.cmdk.affine.create-new-edgeless-as": "新建 “{{keyWord}}” 为标题的无界页面", + "com.affine.cmdk.affine.create-new-page-as": "新建 “{{keyWord}}” 为标题的页面", + "com.affine.cmdk.affine.display-language.to": "更改显示语言为", + "com.affine.cmdk.affine.editor.add-to-favourites": "加入收藏", + "com.affine.cmdk.affine.editor.edgeless.presentation-start": "开始演示", + "com.affine.cmdk.affine.editor.remove-from-favourites": "从收藏中移除", + "com.affine.cmdk.affine.editor.restore-from-trash": "从垃圾箱恢复", + "com.affine.cmdk.affine.font-style.to": "更改字体样式为", + "com.affine.cmdk.affine.full-width-layout.to": "更改全宽布局为", + "com.affine.cmdk.affine.getting-started": "开始使用", + "com.affine.cmdk.affine.import-workspace": "导入工作区", + "com.affine.cmdk.affine.left-sidebar.collapse": "折叠左侧边栏", + "com.affine.cmdk.affine.left-sidebar.expand": "展开左侧边栏", + "com.affine.cmdk.affine.navigation.goto-all-pages": "前往所有页面", + "com.affine.cmdk.affine.navigation.goto-edgeless-list": "前往无界列表", + "com.affine.cmdk.affine.navigation.goto-page-list": "前往页面列表", + "com.affine.cmdk.affine.navigation.goto-trash": "前往垃圾箱", + "com.affine.cmdk.affine.navigation.goto-workspace": "前往工作区", + "com.affine.cmdk.affine.navigation.open-settings": "前往设置", + "com.affine.cmdk.affine.new-edgeless-page": "新建无界页面", + "com.affine.cmdk.affine.new-page": "新建页面", + "com.affine.cmdk.affine.new-workspace": "新建工作区", + "com.affine.cmdk.affine.noise-background-on-the-sidebar.to": "更改侧边栏噪声背景为", + "com.affine.cmdk.affine.restart-to-upgrade": "重启以升级", + "com.affine.cmdk.affine.switch-state.off": "关", + "com.affine.cmdk.affine.switch-state.on": "开", + "com.affine.cmdk.affine.translucent-ui-on-the-sidebar.to": "更改侧边栏半透明界面为", + "com.affine.cmdk.affine.whats-new": "新内容", + "com.affine.cmdk.placeholder": "输入命令或搜索任何内容...", + "com.affine.collection-bar.action.tooltip.delete": "删除", + "com.affine.collection-bar.action.tooltip.edit": "编辑", + "com.affine.collection-bar.action.tooltip.pin": "固定到侧边栏", + "com.affine.collection-bar.action.tooltip.unpin": "取消固定", + "com.affine.collection.addPage.alreadyExists": "页面已存在", + "com.affine.collection.addPage.success": "页面添加成功", + "com.affine.collection.addPages": "添加页面", + "com.affine.collection.addPages.tips": "<0>添加页面:您可以自由选择页面并将其添加到精选中。", + "com.affine.collection.addRules": "添加规则", + "com.affine.collection.addRules.tips": "<0>添加规则:规则基于过滤条件。 添加规则后,符合要求的页面会自动添加到当前精选中。", + "com.affine.collection.allCollections": "所有精选", + "com.affine.collection.emptyCollection": "空的精选", + "com.affine.collection.emptyCollectionDescription": "精选是一个智能文件夹,您可以手动添加页面或通过规则自动添加页面。", + "com.affine.collection.helpInfo": "帮助信息", + "com.affine.collection.menu.edit": "编辑精选", + "com.affine.collection.menu.rename": "重命名", + "com.affine.collectionBar.backToAll": "返回全部", + "com.affine.collections.header": "精选", "com.affine.confirmModal.button.cancel": "取消", "com.affine.currentYear": "今年", - "com.affine.deleteLeaveWorkspace.description": "从此设备中删除工作区,并可选择删除所有数据。", + "com.affine.deleteLeaveWorkspace.description": "从此设备删除工作区,并可选择删除所有数据。", "com.affine.deleteLeaveWorkspace.leave": "退出工作区", + "com.affine.deleteLeaveWorkspace.leaveDescription": "退出后,您将无法再访问此工作区的内容。", "com.affine.draw_with_a_blank_whiteboard": "在空白白板画画", "com.affine.earlier": "更早", + "com.affine.edgelessMode": "无界模式", "com.affine.editCollection.button.cancel": "取消", "com.affine.editCollection.button.create": "创建", + "com.affine.editCollection.createCollection": "创建精选", + "com.affine.editCollection.filters": "过滤", + "com.affine.editCollection.pages": "页面", + "com.affine.editCollection.pages.clear": "清除页面", + "com.affine.editCollection.renameCollection": "重命名精选", + "com.affine.editCollection.rules": "规则", + "com.affine.editCollection.rules.countTips": "已选择 <1>{{selectedCount}},已过滤 <3>{{filteredCount}}", + "com.affine.editCollection.rules.countTips.more": "显示 <1>{{count}} 个页面。", + "com.affine.editCollection.rules.countTips.one": "显示1个页面。", + "com.affine.editCollection.rules.countTips.zero": "显示0个页面。", + "com.affine.editCollection.rules.empty.noResults": "没有结果", + "com.affine.editCollection.rules.empty.noResults.tips": "没有页面符合过滤规则", + "com.affine.editCollection.rules.empty.noRules": "没有规则", + "com.affine.editCollection.rules.empty.noRules.tips": "请<1>添加规则保存此精选或切换到<3>页面,使用手动选择模式", + "com.affine.editCollection.rules.include.add": "添加被选中的页面", + "com.affine.editCollection.rules.include.is": "是", + "com.affine.editCollection.rules.include.page": "页面", + "com.affine.editCollection.rules.include.tips": "“选定页面”是指手动添加页面,而不是通过规则匹配自动添加页面。 您可以通过“添加所选页面”选项或通过拖放来手动添加页面。", + "com.affine.editCollection.rules.include.tipsTitle": "什么是“选定页面”?", + "com.affine.editCollection.rules.include.title": "选中的页面", + "com.affine.editCollection.rules.preview": "预览", + "com.affine.editCollection.rules.reset": "重置", + "com.affine.editCollection.rules.tips": "符合规则的页面将 <2>{{highlight}} 被添加到当前精选", + "com.affine.editCollection.rules.tips.highlight": "自动", "com.affine.editCollection.save": "保存", + "com.affine.editCollection.saveCollection": "保存精选", + "com.affine.editCollection.search.placeholder": "搜索页面...", + "com.affine.editCollection.untitledCollection": "未命名精选", + "com.affine.editCollection.updateCollection": "更新精选", + "com.affine.editCollectionName.createTips": "精选是一个智能文件夹,您可以手动添加页面或通过规则自动添加页面。", + "com.affine.editCollectionName.name": "名称", + "com.affine.editCollectionName.name.placeholder": "精选名称", + "com.affine.editorModeSwitch.tooltip": "切换", "com.affine.emptyDesc": "这里还没有页面", "com.affine.enableAffineCloudModal.button.cancel": "取消", + "com.affine.expired.page.subtitle": "请重新请求重置密码链接。", + "com.affine.expired.page.title": "链接已失效...", "com.affine.export.error.message": "请稍后再试。", "com.affine.export.error.title": "未知错误引发导出失败", "com.affine.export.success.message": "请打开下载文件夹以查看。", @@ -92,30 +593,39 @@ "com.affine.filter": "筛选", "com.affine.filter.after": "晚于", "com.affine.filter.before": "早于", + "com.affine.filter.contains all": "包含以下所有", + "com.affine.filter.contains one of": "包含以下之一", + "com.affine.filter.does not contains all": "不包含以下所有", + "com.affine.filter.does not contains one of": "不包含以下之一", "com.affine.filter.false": "否", "com.affine.filter.is": "为", + "com.affine.filter.is empty": "为空", + "com.affine.filter.is not empty": "不为空", "com.affine.filter.is-favourited": "已收藏", "com.affine.filter.save-view": "保存视图", "com.affine.filter.true": "是", + "com.affine.filterList.button.add": "添加筛选条件", + "com.affine.header.option.add-tag": "添加标签", + "com.affine.header.option.duplicate": "复制", "com.affine.helpIsland.contactUs": "联系我们", "com.affine.helpIsland.gettingStarted": "开始使用", "com.affine.helpIsland.helpAndFeedback": "帮助与反馈", "com.affine.import_file": "支持 Markdown/Notion", "com.affine.inviteModal.button.cancel": "取消", - "com.affine.keyboardShortcuts.appendDailyNote": "附加到随笔", + "com.affine.keyboardShortcuts.appendDailyNote": "添加日常笔记快捷键", "com.affine.keyboardShortcuts.bodyText": "正文", "com.affine.keyboardShortcuts.bold": "粗体", "com.affine.keyboardShortcuts.cancel": "取消", "com.affine.keyboardShortcuts.codeBlock": "代码块", "com.affine.keyboardShortcuts.curveConnector": "曲线连接", "com.affine.keyboardShortcuts.divider": "分割线", - "com.affine.keyboardShortcuts.elbowedConnector": "弯曲连接", + "com.affine.keyboardShortcuts.elbowedConnector": "弯曲连接器快捷键", "com.affine.keyboardShortcuts.expandOrCollapseSidebar": "展开/折叠侧边栏", "com.affine.keyboardShortcuts.goBack": "返回", "com.affine.keyboardShortcuts.goForward": "前进", - "com.affine.keyboardShortcuts.group": "分组", - "com.affine.keyboardShortcuts.groupDatabase": "作为数据库分组", - "com.affine.keyboardShortcuts.hand": "拖放", + "com.affine.keyboardShortcuts.group": "组快捷键", + "com.affine.keyboardShortcuts.groupDatabase": "组数据库快捷键", + "com.affine.keyboardShortcuts.hand": "抓手快捷键", "com.affine.keyboardShortcuts.heading": "标题 {{number}}", "com.affine.keyboardShortcuts.image": "图像", "com.affine.keyboardShortcuts.increaseIndent": "增加缩进", @@ -125,296 +635,342 @@ "com.affine.keyboardShortcuts.moveDown": "下移", "com.affine.keyboardShortcuts.moveUp": "上移", "com.affine.keyboardShortcuts.newPage": "新建页面", - "com.affine.keyboardShortcuts.note": "笔记", + "com.affine.keyboardShortcuts.note": "笔记快捷键", "com.affine.keyboardShortcuts.pen": "笔", "com.affine.keyboardShortcuts.quickSearch": "快速搜索", - "com.affine.keyboardShortcuts.redo": "重做", + "com.affine.keyboardShortcuts.redo": "重做快捷键", "com.affine.keyboardShortcuts.reduceIndent": "减少缩进", "com.affine.keyboardShortcuts.select": "选择", "com.affine.keyboardShortcuts.selectAll": "全选", - "com.affine.keyboardShortcuts.shape": "图形", - "com.affine.keyboardShortcuts.straightConnector": "直线连接", + "com.affine.keyboardShortcuts.shape": "形状快捷键", + "com.affine.keyboardShortcuts.straightConnector": "直线连接器快捷键", "com.affine.keyboardShortcuts.strikethrough": "删除线", "com.affine.keyboardShortcuts.subtitle": "快速查看快捷键", + "com.affine.keyboardShortcuts.switch": "切换快捷键", "com.affine.keyboardShortcuts.text": "文本", "com.affine.keyboardShortcuts.title": "键盘快捷键", + "com.affine.keyboardShortcuts.unGroup": "取消分组", "com.affine.keyboardShortcuts.underline": "下划线", "com.affine.keyboardShortcuts.undo": "撤销", - "com.affine.keyboardShortcuts.unGroup": "取消分组", "com.affine.keyboardShortcuts.zoomIn": "放大", "com.affine.keyboardShortcuts.zoomOut": "缩小", "com.affine.keyboardShortcuts.zoomTo100": "缩放至 100%", - "com.affine.keyboardShortcuts.zoomToFit": "缩放至适当尺寸", + "com.affine.keyboardShortcuts.zoomToFit": "自适应缩放", "com.affine.last30Days": "过去 30 天", "com.affine.last7Days": "过去 7 天", "com.affine.lastMonth": "上个月", "com.affine.lastWeek": "上周", "com.affine.lastYear": "去年", - "com.affine.moveToTrash.confirmModal.description": "{{title}} 将被移到垃圾箱", + "com.affine.loading": "加载中...", + "com.affine.moreThan30Days": "超过30天", + "com.affine.moveToTrash.confirmModal.description": "{{title}} 将被移动到回收站", + "com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} 个页面将移至回收站", "com.affine.moveToTrash.confirmModal.title": "确定要删除页面?", - "com.affine.moveToTrash.title": "移到垃圾箱", + "com.affine.moveToTrash.confirmModal.title.multiple": "确认删除 {{ number }} 个页面吗?", + "com.affine.moveToTrash.title": "移动到回收站", "com.affine.nameWorkspace.button.cancel": "取消", "com.affine.nameWorkspace.button.create": "创建", "com.affine.nameWorkspace.description": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。", - "com.affine.nameWorkspace.placeholder": "设置工作区名字", - "com.affine.nameWorkspace.title": "给您的工作区命名", - "com.affine.new_edgeless": "新的无边页面", + "com.affine.nameWorkspace.placeholder": "设置工作区名称", + "com.affine.nameWorkspace.title": "命名您的工作区", + "com.affine.new_edgeless": "新的无界页面", "com.affine.new_import": "导入", "com.affine.notFoundPage.backButton": "返回首页", - "com.affine.notFoundPage.title": "404 - 页面不见了", + "com.affine.notFoundPage.title": "404 - 页面未找到", "com.affine.onboarding.title1": "白板和文档的超融合", "com.affine.onboarding.title2": "直观且强大的块级编辑", "com.affine.onboarding.videoDescription1": "在页面模式和白板模式之间轻松切换,你可以在页面模式下创建结构化文档,并在白板模式下自由表达创意思想。", "com.affine.onboarding.videoDescription2": "轻松创建结构化文档,使用模块化界面将文本块、图像和其他内容拖放到页面中。", "com.affine.openPageOperation.newTab": "在新标签页打开", + "com.affine.other-page.nav.affine-community": "AFFiNE 社区", + "com.affine.other-page.nav.blog": "博客", + "com.affine.other-page.nav.contact-us": "联系我们", + "com.affine.other-page.nav.download-app": "下载应用", + "com.affine.other-page.nav.official-website": "官方网站", + "com.affine.other-page.nav.open-affine": "打开 AFFiNE", + "com.affine.page.group-header.clear": "清除选择", + "com.affine.page.group-header.select-all": "全选", + "com.affine.page.toolbar.selected": "已选择 <0>{{count}} 个", + "com.affine.page.toolbar.selected_one": "已选中 <0>{{count}} 个页面", + "com.affine.page.toolbar.selected_others": "已选中 <0>{{count}} 个页面", + "com.affine.pageMode": "页面模式", "com.affine.pageMode.all": "全部", "com.affine.pageMode.edgeless": "无界", "com.affine.pageMode.page": "页面", + "com.affine.payment.benefit-1": "无限制的本地工作区", + "com.affine.payment.benefit-2": "无限制的登录设备", + "com.affine.payment.benefit-3": "无限制的区块", + "com.affine.payment.benefit-4": "{{capacity}} 的云存储", + "com.affine.payment.benefit-5": "{{capacity}} 的最大文件大小", + "com.affine.payment.benefit-6": "每个工作区的成员数量 ≤ {{capacity}}", + "com.affine.payment.billing-setting.cancel-subscription": "取消订阅", + "com.affine.payment.billing-setting.cancel-subscription.description": "订阅已取消,您的 Pro 账户将在 {{cancelDate}} 到期", + "com.affine.payment.billing-setting.change-plan": "更改计划", + "com.affine.payment.billing-setting.current-plan": "当前计划", + "com.affine.payment.billing-setting.current-plan.description": "您目前处于<1> {{planName}} 计划。", + "com.affine.payment.billing-setting.current-plan.description.monthly": "您目前处于每月<1> {{planName}} 计划。", + "com.affine.payment.billing-setting.current-plan.description.yearly": "您目前处于每年<1> {{planName}} 计划。", + "com.affine.payment.billing-setting.expiration-date": "到期日期", + "com.affine.payment.billing-setting.expiration-date.description": "您的订阅有效期至 {{expirationDate}}", + "com.affine.payment.billing-setting.history": "计费历史", + "com.affine.payment.billing-setting.information": "信息", + "com.affine.payment.billing-setting.month": "月", + "com.affine.payment.billing-setting.no-invoice": "没有要显示的发票。", + "com.affine.payment.billing-setting.paid": "已支付", + "com.affine.payment.billing-setting.payment-method": "支付方式", + "com.affine.payment.billing-setting.payment-method.description": "由Stripe提供。", + "com.affine.payment.billing-setting.renew-date": "续费日期", + "com.affine.payment.billing-setting.renew-date.description": "下次计费日期: {{renewDate}}", + "com.affine.payment.billing-setting.resume-subscription": "恢复", + "com.affine.payment.billing-setting.subtitle": "管理您的计费信息和发票。", + "com.affine.payment.billing-setting.title": "计费", + "com.affine.payment.billing-setting.update": "更新", + "com.affine.payment.billing-setting.upgrade": "升级", + "com.affine.payment.billing-setting.view-invoice": "查看发票", + "com.affine.payment.billing-setting.year": "年", + "com.affine.payment.buy-pro": "购买专业版", + "com.affine.payment.change-to": "切换到 {{to}} 计费", + "com.affine.payment.contact-sales": "联系销售", + "com.affine.payment.current-plan": "当前计划", + "com.affine.payment.disable-payment.description": "这是 AFFiNE 的特别测试(Canary)版本。此版本不支持账户升级。如果您想体验完整服务,请从我们的官网下载稳定版本。", + "com.affine.payment.disable-payment.title": "账户升级不可用", + "com.affine.payment.discount-amount": "{{amount}}% 折扣", + "com.affine.payment.downgrade": "降级", + "com.affine.payment.downgraded-tooltip": "您已成功降级。当前计费周期结束后,您的账户将自动切换到免费计划。", + "com.affine.payment.dynamic-benefit-1": "最佳团队协作和知识提炼工作区。", + "com.affine.payment.dynamic-benefit-2": "专注于真正重要的事情,用团队项目管理和自动化。", + "com.affine.payment.dynamic-benefit-3": "按座位付费,适应所有团队规模。", + "com.affine.payment.dynamic-benefit-4": "针对专门需求的解决方案和最佳实践。", + "com.affine.payment.dynamic-benefit-5": "嵌入式与IT支持的询问。", + "com.affine.payment.member.description": "在此处管理成员。{{planName}} 用户可以邀请最多 {{memberLimit}} 人。", + "com.affine.payment.member.description.go-upgrade": "前往升级", + "com.affine.payment.modal.change.cancel": "取消", + "com.affine.payment.modal.change.confirm": "更改", + "com.affine.payment.modal.change.title": "更改您的订阅", + "com.affine.payment.modal.downgrade.cancel": "取消订阅", + "com.affine.payment.modal.downgrade.caption": "您可以继续使用 AFFiNE Cloud 专业版,直到本计费周期结束:)", + "com.affine.payment.modal.downgrade.confirm": "保持 AFFiNE Cloud 专业版", + "com.affine.payment.modal.downgrade.content": "很遗憾看到您离开,但我们一直在努力改进,欢迎您的反馈。我们希望在未来能再次看到您。", + "com.affine.payment.modal.downgrade.title": "您确定吗?", + "com.affine.payment.modal.resume.cancel": "取消", + "com.affine.payment.modal.resume.confirm": "确认", + "com.affine.payment.modal.resume.content": "您确定要恢复 Pro 账户的订阅吗?这意味着您的支付方式将在每个计费周期结束时自动扣费,从下一个计费周期开始。", + "com.affine.payment.modal.resume.title": "恢复自动续费?", + "com.affine.payment.plans-error-retry": "刷新", + "com.affine.payment.plans-error-tip": "无法加载定价计划,请检查您的网络。", + "com.affine.payment.price-description.per-month": "每月", + "com.affine.payment.recurring-monthly": "每月", + "com.affine.payment.recurring-yearly": "每年", + "com.affine.payment.resume": "恢复", + "com.affine.payment.resume-renewal": "恢复自动续费", + "com.affine.payment.see-all-plans": "查看所有计划", + "com.affine.payment.sign-up-free": "免费注册", + "com.affine.payment.subscription.exist": "您已有订阅。", + "com.affine.payment.subscription.go-to-subscribe": "订阅AFFiNE", + "com.affine.payment.subtitle-active": "您目前处于 {{currentPlan}} 计划。如果您有任何问题,请联系我们的<3>客户支持。", + "com.affine.payment.subtitle-canceled": "您目前处于 {{plan}} 计划。当前计费周期结束后,您的账户将自动切换到免费计划。", + "com.affine.payment.subtitle-not-signed-in": "这是 AFFiNE Cloud 的定价计划。您可以先注册或登录您的账户。", + "com.affine.payment.tag-tooltips": "查看所有计划", + "com.affine.payment.title": "定价计划", + "com.affine.payment.updated-notify-msg": "您已更改您的计划为 {{plan}} 计费。", + "com.affine.payment.updated-notify-msg.cancel-subscription": "从下一个计费周期开始,将不再进行收费。", + "com.affine.payment.updated-notify-title": "订阅已更新", + "com.affine.payment.upgrade": "升级", + "com.affine.payment.upgrade-success-page.support": "如果您有任何问题,请联系我们的<1>客户支持。", + "com.affine.payment.upgrade-success-page.text": "恭喜!您的AFFiNE账户已成功升级为 Pro 账户。", + "com.affine.payment.upgrade-success-page.title": "升级成功!", "com.affine.publicLinkDisableModal.button.cancel": "取消", "com.affine.publicLinkDisableModal.button.disable": "禁用", "com.affine.publicLinkDisableModal.description": "禁用此公共链接将阻止任何拥有此链接的人访问此页面。", - "com.affine.publicLinkDisableModal.title": "禁用公共链接 ?", + "com.affine.publicLinkDisableModal.title": "禁用公共链接", "com.affine.rootAppSidebar.collections": "精选", "com.affine.rootAppSidebar.favorites": "收藏夹", "com.affine.rootAppSidebar.others": "其他", + "com.affine.selectPage.empty": "选择页面为空", + "com.affine.selectPage.empty.tips": "没有页面标题包含 <1>{{search}}", + "com.affine.selectPage.selected": "已选中的页面", + "com.affine.selectPage.title": "添加选中的页面", "com.affine.setDBLocation.button.customize": "自定义", "com.affine.setDBLocation.button.defaultLocation": "默认位置", "com.affine.setDBLocation.description": "选择您要创建工作区的位置。工作区的数据默认情况下会保存在本地。", "com.affine.setDBLocation.title": "设置数据库位置", - "com.affine.setDBLocation.tooltip.defaultLocation": "默认情况下将保存到 {{location}}", + "com.affine.setDBLocation.tooltip.defaultLocation": "默认保存至 {{location}}", "com.affine.setSyncingMode.button.continue": "继续", "com.affine.setSyncingMode.cloud": "使用 AFFiNE Cloud 在多个设备间进行同步", "com.affine.setSyncingMode.deviceOnly": "仅在当前设备上使用", "com.affine.setSyncingMode.title.added": "导入成功", "com.affine.setSyncingMode.title.created": "创建成功", + "com.affine.setting.account": "账号设置", + "com.affine.setting.account.delete": "删除账号", + "com.affine.setting.account.delete.message": "永久删除此账户和 AFFiNE Cloud 上的工作区数据备份。该操作无法取消。", + "com.affine.setting.account.message": "个人信息", + "com.affine.setting.sign.message": "通过 AFFiNE Cloud 同步", + "com.affine.setting.sign.out.message": "安全登出账户", + "com.affine.settingSidebar.settings.general": "常规", + "com.affine.settingSidebar.settings.workspace": "工作区", + "com.affine.settingSidebar.title": "设置", + "com.affine.settings.about.message": "关于 AFFiNE 的资讯", + "com.affine.settings.about.update.check.message": "定期自动检查更新。", + "com.affine.settings.about.update.download.message": "自动下载更新(到此设备)。", "com.affine.settings.appearance": "外观", + "com.affine.settings.appearance.border-style-description": "自定义客户端外观。", + "com.affine.settings.appearance.date-format-description": "定制您的日期格式。", + "com.affine.settings.appearance.full-width-description": "页面内容的最大显示量。", + "com.affine.settings.appearance.language-description": "选择界面语言。", + "com.affine.settings.appearance.start-week-description": "默认情况下,一周从星期日开始。", + "com.affine.settings.appearance.window-frame-description": "自定义 Windows 客户端外观。", "com.affine.settings.auto-check-description": "如果启用,它将定期自动检查新版本。", "com.affine.settings.auto-download-description": "如果启用,新版本将自动下载到当前设备。", + "com.affine.settings.email": "电子邮件", + "com.affine.settings.email.action": "更改邮箱", "com.affine.settings.member-tooltip": "启用 AFFiNE Cloud 以与他人协作", + "com.affine.settings.noise-style": "侧边栏的噪点背景", + "com.affine.settings.noise-style-description": "在侧边栏使用噪点背景效果。", + "com.affine.settings.password": "密码", + "com.affine.settings.password.action.change": "更改密码", + "com.affine.settings.password.action.set": "设置密码", + "com.affine.settings.password.message": "设置密码以登录您的账号", + "com.affine.settings.profile": "个人资料", + "com.affine.settings.profile.message": "您的账户个人资料将向所有人显示。", + "com.affine.settings.profile.name": "显示名称", + "com.affine.settings.profile.placeholder": "输入账号名称", "com.affine.settings.remove-workspace": "删除工作区", + "com.affine.settings.remove-workspace-description": "从此设备中删除工作区,并可选择删除所有数据。", + "com.affine.settings.sign": "登录 / 注册", + "com.affine.settings.storage.db-location.change-hint": "点击以移动存储位置。", + "com.affine.settings.storage.description": "检查或更改存储位置", + "com.affine.settings.storage.description-alt": "检查或更改存储位置。点击路径以编辑位置。", "com.affine.settings.suggestion": "需要更多定制选项?您可以在社区中向我们推荐它们。", + "com.affine.settings.translucent-style": "侧边栏的透明效果", + "com.affine.settings.translucent-style-description": "在侧边栏使用半透明效果。", + "com.affine.settings.workspace": "工作区", "com.affine.settings.workspace.description": "您可以在此处自定义您的工作区。", "com.affine.settings.workspace.not-owner": "只有所有者才能编辑工作区头像和名称。更改将向所有人显示。", "com.affine.settings.workspace.publish-tooltip": "启用 AFFiNE Cloud 以发布此 Workspace", "com.affine.settings.workspace.storage.tip": "点击可移动存储位置。", - "com.affine.settingSidebar.settings.general": "常规", - "com.affine.settingSidebar.settings.workspace": "工作区", - "com.affine.settingSidebar.title": "设置", + "com.affine.share-menu.EnableCloudDescription": "共享页面需要 AFFiNE Cloud 服务。", + "com.affine.share-menu.ShareMode": "分享模式", + "com.affine.share-menu.SharePage": "分享页面", + "com.affine.share-menu.ShareViaExport": "通过导出分享", + "com.affine.share-menu.ShareViaExportDescription": "下载页面的静态副本以与他人分享。", + "com.affine.share-menu.ShareWithLink": "通过链接分享", + "com.affine.share-menu.ShareWithLinkDescription": "创建一个链接,便于与任何人分享。访问者将以文档形式打开您的页面。", + "com.affine.share-menu.SharedPage": "已分享页面", + "com.affine.share-menu.confirm-modify-mode.notification.fail.message": "请稍后再试。", + "com.affine.share-menu.confirm-modify-mode.notification.fail.title": "修改失败", + "com.affine.share-menu.confirm-modify-mode.notification.success.message": "您已将公共链接从 {{preMode}} 模式更改为 {{currentMode}} 模式。", + "com.affine.share-menu.confirm-modify-mode.notification.success.title": "修改成功", + "com.affine.share-menu.copy-private-link": "复制私密链接", + "com.affine.share-menu.create-public-link.notification.fail.message": "请稍后再试。", + "com.affine.share-menu.create-public-link.notification.fail.title": "创建公开分享链接失败", + "com.affine.share-menu.create-public-link.notification.success.message": "您可以通过链接分享这份文档。", + "com.affine.share-menu.create-public-link.notification.success.title": "已创建公开分享链接", + "com.affine.share-menu.disable-publish-link.notification.fail.message": "请稍后再试。", + "com.affine.share-menu.disable-publish-link.notification.fail.title": "禁用公开分享链接失败", + "com.affine.share-menu.disable-publish-link.notification.success.message": "这个页面不再公开分享了。", + "com.affine.share-menu.disable-publish-link.notification.success.title": "已禁用公开分享链接", + "com.affine.share-menu.publish-to-web": "发布至网页", + "com.affine.share-menu.publish-to-web.description": "允许任何人通过链接查看此页面的只读版本。", + "com.affine.share-menu.share-privately": "私密分享", + "com.affine.share-menu.share-privately.description": "只有此工作区的成员可以打开此链接。", + "com.affine.share-menu.shareButton": "分享", + "com.affine.share-menu.sharedButton": "已分享", "com.affine.shortcutsTitle.edgeless": "无界", "com.affine.shortcutsTitle.general": "常规", "com.affine.shortcutsTitle.markdownSyntax": "Markdown 语法", "com.affine.shortcutsTitle.page": "页面", "com.affine.sidebarSwitch.collapse": "折叠侧边栏", "com.affine.sidebarSwitch.expand": "展开侧边栏", + "com.affine.storage.change-plan": "更改", + "com.affine.storage.disabled.hint": "AFFiNE Cloud 目前处于抢先体验阶段,不支持升级,请耐心等待我们的定价计划。", + "com.affine.storage.extend.hint": "使用量已达到最大容量,AFFiNE Cloud 目前处于抢先体验阶段,不支持升级,请耐心等待我们的定价计划。", + "com.affine.storage.extend.link": "点击以获取更多信息。", + "com.affine.storage.maximum-tips": "您已达到当前账户的最大容量限制", + "com.affine.storage.plan": "计划", + "com.affine.storage.title": "AFFiNE Cloud 存储", + "com.affine.storage.upgrade": "升级", + "com.affine.storage.used.hint": "已使用空间", "com.affine.themeSettings.dark": "深色", "com.affine.themeSettings.light": "浅色", "com.affine.themeSettings.system": "跟随系统", - "com.affine.toastMessage.addedFavorites": "已收藏", + "com.affine.toastMessage.addedFavorites": "已添加到收藏夹", "com.affine.toastMessage.edgelessMode": "无界模式", - "com.affine.toastMessage.movedTrash": "已移到垃圾箱", + "com.affine.toastMessage.movedTrash": "已移动到垃圾箱", "com.affine.toastMessage.pageMode": "页面模式", "com.affine.toastMessage.permanentlyDeleted": "已永久删除", "com.affine.toastMessage.removedFavorites": "已从收藏中移除", "com.affine.toastMessage.restored": "{{title}} 已恢复", - "com.affine.toastMessage.successfullyDeleted": "成功删除。", + "com.affine.toastMessage.successfullyDeleted": "删除成功", "com.affine.today": "今天", "com.affine.trashOperation.delete": "删除", - "com.affine.trashOperation.delete.description": "一旦删除,将无法撤消此操作。确定吗?", + "com.affine.trashOperation.delete.description": "一旦删除,您将无法撤销此操作。您确定吗?", "com.affine.trashOperation.delete.title": "永久删除", + "com.affine.trashOperation.deleteDescription": "一旦删除,您将无法撤销此操作。您确定吗?", "com.affine.trashOperation.deletePermanently": "永久删除", - "com.affine.trashOperation.restoreIt": "恢复TA", + "com.affine.trashOperation.restoreIt": "恢复", + "com.affine.updater.downloading": "下载中", + "com.affine.updater.open-download-page": "打开下载页面", + "com.affine.updater.restart-to-update": "重新启动以安装更新", + "com.affine.updater.update-available": "有可用的更新", + "com.affine.upgrade.button-text.done": "刷新当前页面", + "com.affine.upgrade.button-text.error": "数据升级错误", + "com.affine.upgrade.button-text.pending": "升级工作区数据", + "com.affine.upgrade.button-text.upgrading": "正在升级", + "com.affine.upgrade.tips.done": "升级工作区数据后,请刷新页面以查看更改。", + "com.affine.upgrade.tips.error": "在升级工作区数据时遇到了一些错误。", + "com.affine.upgrade.tips.normal": "为确保与更新后的 AFFiNE 客户端兼容,请点击下方的“升级工作区数据”按钮进行数据升级。", "com.affine.workspace.cannot-delete": "您无法删除最后一个工作区", + "com.affine.workspace.cloud": "云工作区", + "com.affine.workspace.cloud.account.logout": "退出登录", + "com.affine.workspace.cloud.account.settings": "账户设置", + "com.affine.workspace.cloud.auth": "登录 / 注册", + "com.affine.workspace.cloud.description": "通过 AFFiNE Cloud 同步", + "com.affine.workspace.cloud.join": "加入工作区", + "com.affine.workspace.cloud.sync": "云同步", + "com.affine.workspace.local": "本地工作区", + "com.affine.workspace.local.import": "导入工作区", "com.affine.workspaceDelete.button.cancel": "取消", "com.affine.workspaceDelete.button.delete": "删除", - "com.affine.workspaceDelete.description": "正在删除 <1>{{workspace}} ,此操作无法撤销,所有内容将会丢失。", - "com.affine.workspaceDelete.description2": "正在删除<1>{{workspace}} ,将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。", - "com.affine.workspaceDelete.placeholder": "请输入工作区名字以确认", - "com.affine.workspaceDelete.title": "删除工作空间", + "com.affine.workspaceDelete.description": "删除<1>{{workspace}}后无法撤销,请谨慎操作。所有内容都将丢失。", + "com.affine.workspaceDelete.description2": "删除<1>{{workspace}}将删除本地和云端数据,此操作无法撤销,请谨慎操作。", + "com.affine.workspaceDelete.placeholder": "请输入工作区名称以确认", + "com.affine.workspaceDelete.title": "删除工作区", "com.affine.workspaceLeave.button.cancel": "取消", "com.affine.workspaceLeave.button.leave": "退出", - "com.affine.workspaceLeave.description": "退出后,您将无法再访问此工作区的内容。", + "com.affine.workspaceLeave.description": "离开后,您将无法访问此工作区的内容。", + "com.affine.workspaceList.addWorkspace.create": "创建工作区", + "com.affine.workspaceList.workspaceListType.cloud": "云同步", + "com.affine.workspaceList.workspaceListType.local": "本地储存", "com.affine.workspaceSubPath.all": "全部页面", - "com.affine.workspaceSubPath.trash": "垃圾箱", + "com.affine.workspaceSubPath.trash": "回收站", + "com.affine.workspaceSubPath.trash.empty-description": "已删除的页面将显示在此处。", "com.affine.workspaceType.cloud": "云端工作区", - "com.affine.workspaceType.joined": "加入工作区", + "com.affine.workspaceType.joined": "加入的工作区", "com.affine.workspaceType.local": "本地工作区", - "com.affine.workspaceType.offline": "可供离线使用", + "com.affine.workspaceType.offline": "离线可用", "com.affine.write_with_a_blank_page": "在空白页面书写", "com.affine.yesterday": "昨天", - "Confirm": "确认", - "Connector": "链接", - "Continue with Google": "谷歌登录以继续", - "Convert to ": "转换为", - "Copied link to clipboard": "复制链接到剪贴板", - "Copy": "复制", - "Copy Link": "复制链接", "core": "核心", - "Create": "创建", - "Create Or Import": "创建或导入", - "Create Shared Link Description": "创建一个可以轻松分享给任何人的链接", - "Create your own workspace": "创建属于你的工作区", - "Created": "创建时间", - "Created with": "创建于", - "Data sync mode": "数据同步模式", - "DB_FILE_ALREADY_LOADED": "数据库文件已加载", - "DB_FILE_INVALID": "无效的数据库文件", - "DB_FILE_PATH_INVALID": "数据库文件路径无效", - "Delete": "删除", - "Delete Member?": "删除成员?", - "Delete Workspace Label Hint": "在删除此工作区后,您将永久删除所有内容,任何人都无法恢复此工作区的内容。", - "Delete Workspace placeholder": "请输入”Delete“以确认", - "Disable": "禁用", - "Disable Public Link": "禁用公共链接", - "Disable Public Sharing": "禁用公开分享", - "Download all data": "下载所有数据", - "Download core data": "下载核心数据", - "Download data": "下载 {{CoreOrAll}} 数据", - "Download data Description1": "此操作会在你的设备上占用更多空间。", - "Download data Description2": "此操作会在你的设备上占用少许空间。", - "Edit": "编辑", - "emptyAllPages": "此工作区为空。创建新页面并开始编辑。", + "dark": "深色", + "emptyAllPages": "点击<1>$t(New Page)按钮创建您的第一个页面。", "emptyAllPagesClient": "点击 <1>$t(New Page) 按钮或按 <3>{{shortcut}} 以创建您的第一个页面。", - "emptyFavorite": "单击“添加到收藏夹”,页面将显示在此处。", + "emptyFavorite": "点击添加到收藏夹,页面将出现在这里。", "emptySharedPages": "共享的页面将显示在此处。", - "emptyTrash": "单击“添加到垃圾箱”,页面将显示在此处。", - "Enable": "启用", - "Enable AFFiNE Cloud": "启用 AFFiNE Cloud 服务", - "Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过 AFFiNE Cloud 进行备份和同步。", - "Enable cloud hint": "以下功能依赖于 AFFiNE Cloud。 所有数据都存储在当前设备上。 您可以为此工作区启用 AFFiNE Cloud,以保持数据与云同步。", - "Enabled success": "启用成功", - "Export": "导出", - "Export AFFiNE backup file": "导出 AFFiNE 备份文件", - "Export Description": "您可以导出整个工作区数据进行备份,导出的数据可以重新被导入。", - "Export Shared Pages Description": "下载页面的静态副本以与他人分享。", - "Export success": "导出成功", - "Export to HTML": "导出为 HTML", - "Export to Markdown": "导出为 Markdown", - "Export to PDF": "导出为 PDF", - "Export to PNG": "导出为 PNG", - "Export Workspace": "导出工作区 <1>{{workspace}} 即将上线", - "Failed to publish workspace": "工作区发布失败", - "Favorite": "收藏", - "Favorite pages for easy access": "将页面添加到收藏夹以便轻松访问", - "Favorited": "已收藏", - "FILE_ALREADY_EXISTS": "文件已存在", - "Find 0 result": "找到 0 个结果", - "Find results": "找到 {{number}} 个结果", - "Force Sign Out": "强制登出", - "Get in touch!": "保持联络!", - "Get in touch! Join our communities": "保持联系!加入我们的社区。", - "Get in touch! Join our communities.": "加入社区,保持联络!", - "Got it": "知道了", - "How is AFFiNE Alpha different?": "AFFiNE Alpha 有何不同?", - "Import": "导入", - "Info": "信息", - "Invite": "邀请", - "Invite Members": "邀请成员", - "Invite placeholder": "搜索邮件(仅支持Gmail)", + "emptyTrash": "点击添加到垃圾箱,页面将出现在这里。", + "frameless": "无边框", + "invited you to join": "邀请您加入", "is a Cloud Workspace": "是云端工作区", "is a Local Workspace": "是本地工作区", - "It takes up little space on your device": "它会在你的设备上占用少许空间。", - "It takes up little space on your device.": "此操作会在你的设备上占用少许空间。", - "It takes up more space on your device": "它会在你的设备上占用更多空间。", - "It takes up more space on your device.": "此操作会在你的设备上占用更多空间。", - "Jump to": "跳转到", - "Loading": "加载中...", - "Local Workspace Description": "所有数据都本地存储在当前设备。您可以为此工作区启用 AFFiNE Cloud,以保证数据时刻被云端同步。", + "light": "浅色", "login success": "登录成功", - "Member": "成员", - "Member has been removed": "{{name}} 已被移除。", - "Members": "成员", - "Members hint": "在这里管理成员,通过电子邮件邀请新成员。", - "mobile device": "貌似你正在移动设备上浏览。", + "mobile device": "看起来您正在使用移动设备浏览。", "mobile device description": "我们仍在进行移动端的支持工作,建议使用桌面设备。", - "Move folder": "移动文件夹", - "Move folder hint": "选择新的存储位置", - "Move folder success": "移动文件夹成功", - "Move page to": "将此页面移动到...", - "Move page to...": "将此页面移动...", - "Move to": "移动到", - "Moved to Trash": "已移到垃圾箱", - "My Workspaces": "我的工作区", - "Navigation Path": "导航路径", - "New Keyword Page": "新建 “{{query}}“ 为标题的页面 ", - "New Page": "新建页面", - "New Workspace": "新建工作区", - "No item": "无项目", - "Non-Gmail": "不支持非 Gmail 邮箱", - "None yet": "还没有", - "Not now": "稍后再说", - "Open folder": "打开文件夹", - "Open folder hint": "检查存储文件夹的位置。", - "Open Workspace Settings": "打开工作区设置", - "Organize pages to build knowledge": "组织页面以建立知识库。", - "Owner": "所有者", - "Paper": "文档", - "Pending": "待定", - "Pivots": "枢纽", - "Please make sure you are online": "请确保你在线", - "Publish": "发布", - "Publish to web": "发布到web", - "Published Description": "当前工作区已被发布到 Web,所有人都可以通过链接来查看此工作区内容。", - "Published hint": "访客可以通过提供的链接查看内容。", - "Published to Web": "公开到互联网", - "Publishing": "发布到 web 需要 AFFiNE Cloud 服务。", - "Publishing Description": "发布到 web 后,所有人都可以通过链接查看此工作区的内容。", - "Quick search": "快速搜索", - "Quick search placeholder": "快速搜索...", - "Quick search placeholder2": "在{{workspace}} 中搜索", - "Recent": "最近", - "recommendBrowser": "建议使用 <1>Chrome 浏览器以获得最佳体验。", - "Remove from Pivots": "从枢纽中删除", - "Remove from workspace": "从工作区移除", - "Rename": "重命名", - "Restart Install Client Update": "重启以安装更新", - "Retain cached cloud data": "保留缓存的云数据", - "Retain local cached data": "保留本地缓存数据", - "RFP": "页面可以从枢纽上被自由添加或删除,但仍然可以在“所有页面”中访问。", - "Saved then enable AFFiNE Cloud": "所有改动已保存在本地,点击启用 AFFiNE Cloud 服务。", - "Set up an AFFiNE account to sync data": "设置AFFiNE帐户以同步数据", - "Share Menu Public Workspace Description1": "邀请其他人加入工作区或将其发布到网络。", - "Share Menu Public Workspace Description2": "当前工作区已被发布到网络作为公共工作区。", - "Share with link": "通过链接分享", - "Shared Pages": "已分享页面", - "Shared Pages Description": "公开分享页面需要 AFFiNE Cloud 服务。", - "Shared Pages In Public Workspace Description": "整个工作区已在网络上发布,可以通过<1>工作区设置进行编辑。", - "Shortcuts": "快捷键", - "Sign in": "登录 AFFiNE Cloud", - "Sign in and Enable": "登录并启用", - "Sign out": "登出 AFFiNE 云", - "Sign out description": "登出会导致未同步的内容丢失", - "Skip": "跳过", - "Stay logged out": "保持登出状态", - "Sticky": "便利贴", + "others": "其他", + "recommendBrowser": "我们推荐使用<1>Chrome浏览器获得最佳体验。", + "restored": "{{title}} 已恢复", "still designed": "(此页面仍在设计中。)", - "Stop publishing": "中止发布", - "Storage": "储存", - "Storage and Export": "储存与导出", - "Storage Folder": "存储文件夹", - "Sync": "同步", - "Synced with AFFiNE Cloud": "AFFiNE Cloud 同步完成", - "Title": "标题", - "UNKNOWN_ERROR": "未知错误", - "Unpublished hint": "发布到网络后,访问者可以通过提供的链接查看内容。", - "Untitled": "未命名", - "Update Available": "有可用的更新", - "Update workspace name success": "成功更新工作区名称", - "Updated": "更新时间", - "upgradeBrowser": "请升级到最新版本的 Chrome 以获得最佳体验。", - "Upload": "上传", - "Users": "用户", - "View Navigation Path": "查看导航路径", - "Wait for Sync": "等待同步", - "will delete member": "将删除成员", - "Workspace Avatar": "工作区头像", - "Workspace Icon": "工作区图标", - "Workspace Name": "工作区名称", - "Workspace Not Found": "未找到工作区", - "Workspace Owner": "工作区所有者", - "Workspace Profile": "工作区配置文件", - "Workspace saved locally": "{{name}} 已保存在本地", - "Workspace Settings": "工作区设置", - "Workspace Settings with name": "{{name}} 的设置", - "Workspace Type": "工作区类型", - "You cannot delete the last workspace": "您不能删除最后一个工作区" + "system": "跟随系统", + "upgradeBrowser": "请升级至最新版Chrome浏览器以获得最佳体验。", + "will be moved to Trash": "{{title}} 将被移到垃圾箱", + "will delete member": "将删除成员" } diff --git a/packages/frontend/i18n/src/resources/zh-Hant.json b/packages/frontend/i18n/src/resources/zh-Hant.json index cabe01ec6c..32e6b38a33 100644 --- a/packages/frontend/i18n/src/resources/zh-Hant.json +++ b/packages/frontend/i18n/src/resources/zh-Hant.json @@ -1,102 +1,395 @@ { + "404 - Page Not Found": "404 - 搵唔到搜尋的網頁", + "AFFiNE Cloud": "\nAFFiNE Cloud", + "AFFiNE Community": "AFFiNE 社群", + "About AFFiNE": "關於 AFFiNE", "Access level": "訪問權限", - "Add a subpage inside": "建立子頁面", + "Add Filter": "添加篩選器", "Add Workspace": "建立 Workspace", "Add Workspace Hint": "選擇已有數據庫檔", + "Add a subpage inside": "建立子頁面", + "Add to Favorites": "收藏", + "Add to favorites": "加入收藏", + "Added Successfully": "匯入成功", + "Added to Favorites": "已收藏", "All changes are saved locally": "所有修訂已儲存在本機", "All data has been stored in the cloud": "所有修訂已儲存在雲端", + "All pages": "所有頁面", + "App Version": "App 版本", + "Appearance Settings": "外觀設定", + "Append to Daily Note": "附加到隨筆", + "Available Offline": "離線時可用", + "Back Home": "回到主頁", "Back to Quick Search": "回到快速搜尋", + "Back to all": "回到全部", + "Body text": "正文", + "Bold": "粗體", + "Cancel": "取消", "Change avatar hint": "新頭像將公開。", "Change workspace name hint": "新名稱將公開。", + "Changelog description": "查看 AFFiNE 更新日誌。", + "Check Keyboard Shortcuts quickly": "快速睇返快捷鍵", "Check Our Docs": "查閱我哋嘅文檔", + "Check for updates": "檢查更新", + "Check for updates automatically": "自動檢查更新", + "Choose your font style": "選擇你的字體風格", + "Client Border Style": "用戶端邊框樣式", + "Cloud Workspace": "\nCloud Workspace", "Cloud Workspace Description": "全部數據都會保存並透過AFFINE帳戶同步 <1>{{email}}", + "Code block": "代碼塊", "Collaboration": "協作", "Collaboration Description": "同其他成員協作需要 AFFiNE Cloud 服務。", - "com.affine.aboutAFFiNE.autoCheckUpdate.description": "定期自動檢查更新。", - "com.affine.aboutAFFiNE.autoCheckUpdate.title": "自動檢查更新", - "com.affine.aboutAFFiNE.autoDownloadUpdate.description": "自動下載更新(到本機)。", - "com.affine.aboutAFFiNE.autoDownloadUpdate.title": "自動下載更新", - "com.affine.aboutAFFiNE.changelog.description": "查看 AFFiNE 更新日誌。", - "com.affine.aboutAFFiNE.changelog.title": "探索 What's new", - "com.affine.aboutAFFiNE.checkUpdate.description": "新版本已準備就緒", - "com.affine.aboutAFFiNE.checkUpdate.title": "檢查更新", - "com.affine.aboutAFFiNE.community.title": "社群", - "com.affine.aboutAFFiNE.contact.community": "AFFiNE 社群", - "com.affine.aboutAFFiNE.contact.title": "聯絡我哋", - "com.affine.aboutAFFiNE.contact.website": "官方網站", - "com.affine.aboutAFFiNE.legal.privacy": "隱私", - "com.affine.aboutAFFiNE.legal.title": "法律資訊", - "com.affine.aboutAFFiNE.legal.tos": "使用條款", - "com.affine.aboutAFFiNE.subtitle": "關於 AFFiNE 的資訊", - "com.affine.aboutAFFiNE.title": "關於 AFFiNE", - "com.affine.aboutAFFiNE.version.app": "App 版本", - "com.affine.aboutAFFiNE.version.editor.title": "編輯器版本", - "com.affine.aboutAFFiNE.version.title": "版本", - "com.affine.appearanceSettings.clientBorder.description": "訂製用戶端外觀。", - "com.affine.appearanceSettings.clientBorder.title": "用戶端邊框樣式", - "com.affine.appearanceSettings.color.description": "選擇你的配色", - "com.affine.appearanceSettings.color.title": "配色", - "com.affine.appearanceSettings.date.title": "日期", - "com.affine.appearanceSettings.dateFormat.description": "訂製你的日期樣式", - "com.affine.appearanceSettings.dateFormat.title": "日期格式", - "com.affine.appearanceSettings.font.description": "選擇你的字體風格", - "com.affine.appearanceSettings.font.title": "字形", - "com.affine.appearanceSettings.fontStyle.sans": "無襯線", - "com.affine.appearanceSettings.fontStyle.serif": "襯線", - "com.affine.appearanceSettings.fontStyle.mono": "等寬", - "com.affine.appearanceSettings.fullWidth.description": "頁面內內容的最大顯示量。", - "com.affine.appearanceSettings.fullWidth.title": "全寬佈局", - "com.affine.appearanceSettings.language.description": "選擇介面語言。", - "com.affine.appearanceSettings.language.title": "外觀語言", - "com.affine.appearanceSettings.noisyBackground.description": "在側欄背景使用雜訊效果。", - "com.affine.appearanceSettings.noisyBackground.title": "側欄背景雜訊效果", - "com.affine.appearanceSettings.sidebar.title": "側欄", - "com.affine.appearanceSettings.startWeek.description": "預設下一星期的第一日為週日。", - "com.affine.appearanceSettings.startWeek.title": "每週從周一開始", - "com.affine.appearanceSettings.subtitle": "訂製你的 AFFiNE 外觀", - "com.affine.appearanceSettings.theme.title": "主題", - "com.affine.appearanceSettings.title": "外觀設定", - "com.affine.appearanceSettings.translucentUI.description": "在側欄使用透明效果。", - "com.affine.appearanceSettings.translucentUI.title": "側欄半透明用戶介面", - "com.affine.appearanceSettings.windowFrame.description": "定製 Windows 用戶端外觀。", - "com.affine.appearanceSettings.windowFrame.frameless": "無框", - "com.affine.appearanceSettings.windowFrame.NativeTitleBar": "原生標題列", - "com.affine.appearanceSettings.windowFrame.title": "視窗樣式", - "com.affine.appUpdater.downloading": "下載中", - "com.affine.appUpdater.installUpdate": "重啟以安裝更新", - "com.affine.appUpdater.openDownloadPage": "打開下載頁面", - "com.affine.appUpdater.updateAvailable": "更新可用", - "com.affine.appUpdater.whatsNew": "探索 What's new!", - "com.affine.backButton": "回到主頁", + "Collapse sidebar": "收起側欄", + "Collections": "收藏集", + "Communities": "社群", + "Confirm": "確認", + "Connector": "連接", + "Contact Us": "聯絡我哋", + "Contact with us": "聯絡我哋", + "Continue": "繼續", + "Continue with Google": "以 Google 登入", + "Convert to ": "轉換為", + "Copied link to clipboard": "複製連結到剪貼簿", + "Copy": "複製", + "Copy Link": "複製連結", + "Create": "建立", + "Create Or Import": "建立或匯入", + "Create Shared Link Description": "建立一個可共享連結。", + "Create a collection": "創建收藏集", + "Create your own workspace": "建立你的 workspace", + "Created": "建立時間", + "Created Successfully": "建立成功", + "Created with": "建立於", + "Curve Connector": "曲線連接", + "Customize": "定製", + "Customize your AFFiNE Appearance": "訂製你的 AFFiNE 外觀", + "DB_FILE_ALREADY_LOADED": "數據庫已載入", + "DB_FILE_INVALID": "無效數據庫文檔", + "DB_FILE_MIGRATION_FAILED": "數據庫併入失敗", + "DB_FILE_PATH_INVALID": "數據庫路徑無效", + "Data sync mode": "數據同步模式", + "Date": "日期", + "Date Format": "日期格式", + "Default Location": "預設位置", + "Default db location hint": "預設下将存儲到 {{location}}", + "Delete": "刪除", + "Delete Member?": "刪除成員?", + "Delete Workspace": "刪除 Workspace", + "Delete Workspace Description": "刪除 <1>{{workspace}} ,此步驟無法重做,全部內容將丟失。", + "Delete Workspace Description2": "刪除<1>{{workspace}} ,將同時刪除本機同雲端資料。此步驟無法重做,請慎重考慮。", + "Delete Workspace Label Hint": "刪除此 Workspace 後,所有內容將永久清除,任何人都無法恢復。", + "Delete Workspace placeholder": "鍵入 “Delete” 以確認", + "Delete page?": "確認刪除頁面?", + "Delete permanently": "永久刪除", + "Disable": "停用", + "Disable Public Link": "停用公開連結", + "Disable Public Link ?": "確認停用公開連結?", + "Disable Public Link Description": "停用此公開連結,將阻止擁有連結者登入此頁面。", + "Disable Public Sharing": "停用公開分享", + "Discover what's new": "探索 What's new", + "Discover what's new!": "探索 What's new!", + "Display Language": "外觀語言", + "Divider": "分割線", + "Download all data": "下載全部數據", + "Download core data": "下載核心數據", + "Download data": "下載 {{CoreOrAll}} 數據", + "Download data Description1": "這將佔用更多存儲空間。", + "Download data Description2": "這只佔用較小存儲空間。", + "Download updates automatically": "自動下載更新", + "Edgeless": "無界", + "Edit": "編輯", + "Edit Filter": "編輯篩選器", + "Editor Version": "編輯器版本", + "Elbowed Connector": "彎曲連接器", + "Enable": "啟用", + "Enable AFFiNE Cloud": "啟用 AFFiNE Cloud", + "Enable AFFiNE Cloud Description": "啓用後 Workspace 數據將透過 AFFiNE Cloud 備份及同步。", + "Enable cloud hint": "以下功能依賴於 AFFiNE Cloud。 所有數據都存儲在當前設備上。 您可以為此 Workspace 啓用 AFFiNE Cloud,以保持數據與雲同步。", + "Enabled success": "啟用成功", + "Exclude from filter": "從篩選器中排除", + "Expand sidebar": "展開側欄", + "Expand/Collapse Sidebar": "展開/收起邊欄", + "Export": "匯出", + "Export AFFiNE backup file": "匯出 AFFiNE 備份檔", + "Export Description": "您可以匯出整個 Workspace 數據進行備份,匯出的數據亦可重新匯入。", + "Export Shared Pages Description": "下載此頁的靜態副本以與他人共享。", + "Export Workspace": "匯出 Workspace <1>{{workspace}} 即將推出", + "Export success": "匯出成功", + "Export to HTML": "匯出為 HTML", + "Export to Markdown": "匯出為 Markdown", + "Export to PDF": "匯出為 PDF", + "Export to PNG": "匯出為 PNG", + "FILE_ALREADY_EXISTS": "檔已存在", + "Failed to publish workspace": "Workspace 發佈失敗", + "Favorite": "收藏", + "Favorite pages for easy access": "收藏頁面以便訪問", + "Favorited": "已收藏", + "Favorites": "我的收藏", + "Filters": "篩選器", + "Find 0 result": "發現 0 個結果", + "Find results": "發現 {{number}} 個結果", + "Font Style": "字形", + "Force Sign Out": "強制登出", + "Full width Layout": "全寬佈局", + "General": "一般", + "Get in touch!": "聯絡我哋!", + "Get in touch! Join our communities": "聯絡我哋!加入我們的社群。", + "Get in touch! Join our communities.": "聯絡我哋!加入我們的社群。", + "Go Back": "返回", + "Go Forward": "前進", + "Got it": "明白了", + "Group": "分組", + "Group as Database": "分組為資料庫", + "Hand": "拖放", + "Heading": "標題 {{number}}", + "Help and Feedback": "幫助和反饋", + "How is AFFiNE Alpha different?": "AFFiNE Alpha 有何不同?", + "Image": "圖像", + "Import": "匯入", + "Increase indent": "增加縮進", + "Info": "資訊", + "Info of legal": "法律資訊", + "Inline code": "內聯代碼", + "Invite": "邀請", + "Invite Members": "邀請成員", + "Invite placeholder": "搜尋郵件(只支援 Gmail)", + "It takes up little space on your device": "這只佔用較小存儲空間。", + "It takes up little space on your device.": "這只佔用較小存儲空間。", + "It takes up more space on your device": "這將佔用更多存儲空間。", + "It takes up more space on your device.": "這將佔用更多存儲空間。", + "Italic": "斜體", + "Joined Workspace": "加入的 Workspace", + "Jump to": "跳轉到", + "Keyboard Shortcuts": "鍵盤快捷鍵", + "Leave": "離開", + "Leave Workspace": "離開 Workspace", + "Leave Workspace Description": "離開後,您將無法再訪問此 Workspace 的內容。", + "Link": "超連結(帶有所選文字)", + "Loading": "載入中⋯⋯", + "Loading All Workspaces": "載入全部 Workspace", + "Local Workspace": "本機 Workspace", + "Local Workspace Description": "所有數據都存儲在當前設備上。 您可以為此 Workspace 啓用 AFFiNE Cloud,以保持數據與雲同步。", + "Markdown Syntax": "Markdown 語法", + "Member": "成員", + "Member has been removed": "{{name}} 已被移除。", + "Members": "成員", + "Members hint": "在這裡管理成員,透過電子郵件邀請新成員。", + "Move Down": "下移", + "Move Up": "上移", + "Move folder": "移動資料夾", + "Move folder hint": "選取新的檔案位置", + "Move folder success": "移動資料夾成功", + "Move page to": "將頁面移動到⋯⋯", + "Move page to...": "將頁面移動到⋯⋯", + "Move to": "移至", + "Move to Trash": "移至廢紙簍", + "Moved to Trash": "已移至廢紙簍", + "My Workspaces": "我的 Workspace", + "Name Your Workspace": "為 Workspace 命名", + "NativeTitleBar": "原生標題列", + "Navigation Path": "導航路徑", + "New Keyword Page": "新建 “{{query}}” 頁面", + "New Page": "新頁面", + "New Workspace": "新建 Workspace", + "New version is ready": "新版本已準備就緒", + "No item": "無項目", + "Non-Gmail": "不支援非 Gmail", + "None yet": "暫未", + "Not now": "稍後", + "Note": "筆記", + "Official Website": "官方網站", + "Open Workspace Settings": "打開 Workspace 設定", + "Open folder": "打開資料夾", + "Open folder hint": "檢查存儲資料夾的位置。", + "Open in new tab": "在新標籤頁中打開", + "Organize pages to build knowledge": "整理頁面以構建知識庫", + "Owner": "擁有者", + "Page": "頁面", + "Paper": "文檔", + "Pen": "筆", + "Pending": "待定", + "Permanently deleted": "已永久刪除", + "Pivots": "樞紐", + "Placeholder of delete workspace": "請鍵入 Workspace 名稱以確認", + "Please make sure you are online": "請確保您在線", + "Privacy": "隱私", + "Publish": "發佈", + "Publish to web": "發佈到網絡", + "Published Description": "此 Workspace 已發佈到網絡,所有人均可透過連結查看內容。", + "Published hint": "訪問者可透過提供的連結查看內容。", + "Published to Web": "已發佈到網絡", + "Publishing": "發佈到網絡需要 AFFiNE Cloud 服務。", + "Publishing Description": "發佈到網絡後,所有人均可透過連結查看內容。", + "Quick Search": "快速搜尋", + "Quick search": "快速搜尋", + "Quick search placeholder": "快速搜尋⋯⋯", + "Quick search placeholder2": "在 {{workspace}} 中搜尋", + "RFP": "頁面可在樞紐中自由添加或刪除,但仍可從「所有頁面」訪問。", + "Recent": "最近", + "Redo": "重做", + "Reduce indent": "減少縮進", + "Remove from Pivots": "從樞紐中刪除", + "Remove from favorites": "從我的收藏中刪除", + "Remove from workspace": "從 Workspace 中刪除", + "Remove special filter": "移除特殊篩選器", + "Removed from Favorites": "已從我的收藏中刪除", + "Rename": "重新命名", + "Restart Install Client Update": "重啟以安裝更新", + "Restore it": "恢復它", + "Retain cached cloud data": "保留緩衝的雲數據", + "Retain local cached data": "保留本機緩衝數據", + "Save": "保存", + "Save As New Collection": "另存為新收藏集", + "Saved then enable AFFiNE Cloud": "所有修訂已儲存在本機,點按以啟用 AFFiNE Cloud。", + "Select": "選擇", + "Select All": "全選", + "Set a Workspace name": "為 Workspace 命名", + "Set database location": "設定資料庫位置", + "Set up an AFFiNE account to sync data": "設定 AFFiNE 帳戶以同步數據", + "Settings": "設定", + "Shape": "圖形", + "Share Menu Public Workspace Description1": "邀請他人加入 Workshop 或將其發佈到網絡。", + "Share Menu Public Workspace Description2": "當前 Workspace 已作為公共 Workspace 發佈到網絡。", + "Share with link": "透過連結分享", + "Shared Pages": "已分享頁面", + "Shared Pages Description": "公開分享頁面需要 AFFiNE Cloud 服務。", + "Shared Pages In Public Workspace Description": "整個 Workspace 已在網絡發布,可透過<1> Workspace 設定進行編輯。", + "Shortcuts": "快速鍵", + "Sidebar": "側欄", + "Sign in": "登入 AFFiNE Cloud", + "Sign in and Enable": "登入並啟用", + "Sign out": "登出", + "Sign out description": "登出將使未同步內容丟失。", + "Skip": "略過", + "Start Week On Monday": "每週從周一開始", + "Stay logged out": "保持登出狀態", + "Sticky": "Memo紙", + "Stop publishing": "中止發佈", + "Storage": "儲存", + "Storage Folder": "存儲資料夾", + "Storage and Export": "存儲和匯出", + "Straight Connector": "直線連接", + "Strikethrough": "刪除線", + "Successfully deleted": "已成功刪除", + "Switch": "開閂掣", + "Sync": "同步", + "Sync across devices with AFFiNE Cloud": "使用 AFFiNE Cloud 跨設備同步", + "Synced with AFFiNE Cloud": "AFFiNE Cloud 同步完成", + "Tags": "標籤", + "Terms of Use": "使用條款", + "Text": "文本", + "Theme": "主題", + "Title": "標題", + "Trash": "廢紙簍", + "TrashButtonGroupDescription": "刪除後,您將無法撤消此操作。您確認嗎?", + "TrashButtonGroupTitle": "永久刪除", + "UNKNOWN_ERROR": "未知錯誤", + "Underline": "下劃線", + "Undo": "撤銷", + "Ungroup": "取消分組", + "Unpin": "取消固定", + "Unpublished hint": "發布到網絡後,訪問者可透過提供的連結查看內容。", + "Untitled": "未命名", + "Untitled Collection": "未命名收藏集", + "Update Available": "更新可用", + "Update Collection": "更新收藏集", + "Update workspace name success": "成功更新 Workspace 名稱", + "Updated": "更新時間", + "Upload": "上傳", + "Use on current device only": "僅在本機使用", + "Users": "使用者", + "Version": "版本", + "View Navigation Path": "查看導航路徑", + "Wait for Sync": "等待同步", + "Window frame style": "視窗樣式", + "Workspace Avatar": "Workspace 頭像", + "Workspace Icon": "Workspace 圖示", + "Workspace Name": "Workspace 名稱", + "Workspace Not Found": "未找到 Workspace", + "Workspace Owner": "Workspace 擁有者", + "Workspace Profile": "Workspace 配置檔", + "Workspace Settings": "Workspace 設定", + "Workspace Settings with name": "{{name}} 的設定", + "Workspace Type": "Workspace 類型", + "Workspace database storage description": "選擇欲創建 Workspace 之位置。預設下,Workspace 數據存儲在本機。", + "Workspace description": "Workspace 是您的虛擬空間,無論對於個人或是團隊,均可用於引用、創建與規劃。", + "Workspace saved locally": "{{name}} 已保存在本機", + "You cannot delete the last workspace": "您不能刪除僅剩的 Workspace", + "Zoom in": "放大", + "Zoom out": "縮小", + "Zoom to 100%": "縮放至 100%", + "Zoom to fit": "縮放至適當尺寸", + "all": "全部", + "com.affine.auth.change.email.page.subtitle": "請在下面輸入您的新電子郵件地址。我們將向此電子郵件地址發送驗證鏈接以完成該過程。", + "com.affine.auth.change.email.page.success.subtitle": "恭喜!您已成功更新與您的 AFFiNE Cloud 帳戶關聯的電子郵件地址。", + "com.affine.auth.change.email.page.success.title": "電子郵件地址已更新!", + "com.affine.auth.change.email.page.title": "更改電子郵件地址", + "com.affine.auth.create.count": "建立帳號", + "com.affine.auth.forget": "忘記密碼", + "com.affine.auth.has.signed": "已登入!", + "com.affine.auth.later": "之後", + "com.affine.auth.open.affine": "打開 AFFiNE", + "com.affine.auth.page.sent.email.subtitle": "請設定由8-20位字母和數字組成的密碼", + "com.affine.auth.page.sent.email.title": "歡迎來到 AFFiNE Cloud,即將完成", + "com.affine.auth.password": "密碼", + "com.affine.auth.password.error": "無效的密碼", + "com.affine.auth.reset.password": "重設密碼", + "com.affine.auth.reset.password.message": "您將收到一封電子郵件,其中包含重設密碼的連結。請檢查您的收件箱。", + "com.affine.auth.reset.password.page.title": "重設您的 AFFiNE Cloud 密碼", + "com.affine.auth.send.change.email.link": "發送驗證連結", + "com.affine.auth.send.reset.password.link": "發送重設連結", + "com.affine.auth.send.set.password.link": "發送設定連結", + "com.affine.auth.sent": "已發送", + "com.affine.auth.sent.change.email.hint": "驗證連結已發送。", + "com.affine.auth.sent.change.password.hint": "重設密碼連結已發送。", + "com.affine.auth.sent.set.password.hint": "設定密碼連結已發送。", + "com.affine.auth.set.email.save": "保存電子郵件地址", + "com.affine.auth.set.password": "設定密碼", + "com.affine.auth.set.password.message": "請設定由8-20位字母和數字組成的密碼", + "com.affine.auth.set.password.page.success": "成功設定密碼", + "com.affine.auth.set.password.page.title": "重定您的 AFFiNE Cloud 密碼", + "com.affine.auth.set.password.placeholder": "設定至少包含 8 位字符的密碼", + "com.affine.auth.set.password.placeholder.confirm": "確認密碼", + "com.affine.auth.set.password.save": "保存密碼", + "com.affine.auth.sign.auth.code.error.hint": "驗證碼錯誤,請重試", + "com.affine.auth.sign.auth.code.message": "如果您沒有收到電子郵件,請檢查您的垃圾郵件文件夾。", + "com.affine.auth.sign.auth.code.message.password": "如果您沒有收到電子郵件,請檢查您的垃圾郵件文件夾。或者使用<1>sign in with password登錄。", + "com.affine.auth.sign.auth.code.on.resend.hint": "再次發送驗證碼", + "com.affine.auth.sign.auth.code.resend.hint": "重發驗證碼", + "com.affine.auth.sign.condition": "服務條款", + "com.affine.auth.sign.email.continue": "以電子郵件登入", + "com.affine.auth.sign.email.error": "無效郵件地址", + "com.affine.auth.sign.email.placeholder": "鍵入您的電子郵件地址", + "com.affine.auth.sign.in": "登入", + "com.affine.auth.sign.in.sent.email.subtitle": "確認您的電子郵件地址", + "com.affine.auth.sign.message": "點擊上方「使用 Google/電子郵件地址 繼續」,即表示您確認同意 AFFiNE 的 <1>Terms of Conditions and <3>Privacy Policy。", + "com.affine.auth.sign.policy": "隱私政策", + "com.affine.auth.sign.sent.email.message.end": "您可以點擊連結自動建立帳號。", + "com.affine.auth.sign.sent.email.message.start": "一封帶有魔法連結的電子郵件已發送至", + "com.affine.auth.sign.up": "建立帳號", + "com.affine.auth.sign.up.sent.email.subtitle": "建立您的帳號", + "com.affine.auth.sign.up.success.subtitle": "應用將自動打開或重定向到網頁版本。如果您遇到任何問題,您還可以點擊下面的按鈕手動打開 AFFiNE 應用程序。", + "com.affine.auth.sign.up.success.title": "您的帳號已創建,現在您已登入!", + "com.affine.auth.signed.success.subtitle": "您已成功登入。應用將自動打開或重定向到網頁版本。如果您遇到任何問題,您還可以點擊下面的按鈕手動打開 AFFiNE 應用程序。", + "com.affine.auth.signed.success.title": "即將完成!", "com.affine.banner.content": "此演示有限。<1>下載 AFFiNE 客戶端以獲取最新功能和表現。", - "com.affine.brand.affineCloud": "\nAFFiNE Cloud", "com.affine.cloudTempDisable.description": "我們正在升級 AFFiNE Cloud 服務,客戶端暫時不可用。 如果您希望隨時了解進度並收到可用性通知,您可以填寫我們的<1>表單。", "com.affine.cloudTempDisable.title": "AFFiNE Cloud 正進行升級。", "com.affine.collection-bar.action.tooltip.delete": "刪除", "com.affine.collection-bar.action.tooltip.edit": "編輯", "com.affine.collection-bar.action.tooltip.pin": "固定到側欄", "com.affine.collection-bar.action.tooltip.unpin": "取消固定", - "com.affine.collectionBar.backToAll": "回到全部", - "com.affine.confirmModal.button.cancel": "取消", "com.affine.currentYear": "本年度", - "com.affine.deleteLeaveWorkspace.description": "從本機刪除 Workspace,並可選擇刪除所有數據。", - "com.affine.deleteLeaveWorkspace.leave": "離開 Workspace", "com.affine.draw_with_a_blank_whiteboard": "使用空白白板繪圖", "com.affine.earlier": "早些時候", - "com.affine.editCollection.button.cancel": "取消", - "com.affine.editCollection.button.create": "建立", - "com.affine.editCollection.save": "保存", - "com.affine.editCollection.saveCollection": "另存為新收藏集", - "com.affine.editCollection.updateCollection": "更新收藏集", - "com.affine.editorModeSwitch.tooltip": "開閂掣", + "com.affine.edgelessMode": "無界模式", "com.affine.emptyDesc": "仲未有頁面", - "com.affine.enableAffineCloudModal.button.cancel": "取消", + "com.affine.expired.page.subtitle": "請求新的密碼重設連結。", + "com.affine.expired.page.title": "此連結已過期⋯⋯", "com.affine.export.error.message": "請稍後再試。", "com.affine.export.error.title": "由於意外錯誤,匯出失敗", "com.affine.export.success.message": "請打開下載資料夾以檢查。", "com.affine.export.success.title": "匯出成功", - "com.affine.favoritePageOperation.add": "加入收藏", - "com.affine.favoritePageOperation.remove": "從我的收藏中刪除", "com.affine.filter": "篩選器", "com.affine.filter.after": "晚於", "com.affine.filter.before": "早於", @@ -113,335 +406,99 @@ "com.affine.filter.true": "是", "com.affine.header.option.add-tag": "添加標籤", "com.affine.header.option.duplicate": "製作替身", - "com.affine.helpIsland.contactUs": "聯絡我哋", "com.affine.helpIsland.gettingStarted": "開始使用", - "com.affine.helpIsland.helpAndFeedback": "幫助和反饋", "com.affine.import_file": "支援 Markdown/Notion", - "com.affine.inviteModal.button.cancel": "取消", - "com.affine.keyboardShortcuts.appendDailyNote": "附加到隨筆", - "com.affine.keyboardShortcuts.bodyText": "正文", - "com.affine.keyboardShortcuts.bold": "粗體", - "com.affine.keyboardShortcuts.cancel": "取消", - "com.affine.keyboardShortcuts.codeBlock": "代碼塊", - "com.affine.keyboardShortcuts.curveConnector": "曲線連接", - "com.affine.keyboardShortcuts.divider": "分割線", - "com.affine.keyboardShortcuts.elbowedConnector": "彎曲連接器", - "com.affine.keyboardShortcuts.expandOrCollapseSidebar": "展開/收起邊欄", - "com.affine.keyboardShortcuts.goBack": "返回", - "com.affine.keyboardShortcuts.goForward": "前進", - "com.affine.keyboardShortcuts.group": "分組", - "com.affine.keyboardShortcuts.groupDatabase": "分組為資料庫", - "com.affine.keyboardShortcuts.hand": "拖放", - "com.affine.keyboardShortcuts.heading": "標題 {{number}}", - "com.affine.keyboardShortcuts.image": "圖像", - "com.affine.keyboardShortcuts.increaseIndent": "增加縮進", - "com.affine.keyboardShortcuts.inlineCode": "內聯代碼", - "com.affine.keyboardShortcuts.italic": "斜體", - "com.affine.keyboardShortcuts.link": "超連結(帶有所選文字)", - "com.affine.keyboardShortcuts.moveDown": "下移", - "com.affine.keyboardShortcuts.moveUp": "上移", - "com.affine.keyboardShortcuts.newPage": "新頁面", - "com.affine.keyboardShortcuts.note": "筆記", - "com.affine.keyboardShortcuts.pen": "筆", - "com.affine.keyboardShortcuts.quickSearch": "快速搜尋", - "com.affine.keyboardShortcuts.redo": "重做", - "com.affine.keyboardShortcuts.reduceIndent": "減少縮進", - "com.affine.keyboardShortcuts.select": "選擇", - "com.affine.keyboardShortcuts.selectAll": "全選", - "com.affine.keyboardShortcuts.shape": "圖形", - "com.affine.keyboardShortcuts.straightConnector": "直線連接", - "com.affine.keyboardShortcuts.strikethrough": "刪除線", - "com.affine.keyboardShortcuts.subtitle": "快速睇返快捷鍵", - "com.affine.keyboardShortcuts.switch": "開閂掣", - "com.affine.keyboardShortcuts.text": "文本", - "com.affine.keyboardShortcuts.title": "鍵盤快捷鍵", - "com.affine.keyboardShortcuts.underline": "下劃線", - "com.affine.keyboardShortcuts.undo": "撤銷", - "com.affine.keyboardShortcuts.unGroup": "取消分組", - "com.affine.keyboardShortcuts.zoomIn": "放大", - "com.affine.keyboardShortcuts.zoomOut": "縮小", - "com.affine.keyboardShortcuts.zoomTo100": "縮放至 100%", - "com.affine.keyboardShortcuts.zoomToFit": "縮放至適當尺寸", "com.affine.last30Days": "最近 30 天", "com.affine.last7Days": "最近 7 天", "com.affine.lastMonth": "上個月", "com.affine.lastWeek": "上個星期", "com.affine.lastYear": "去年", - "com.affine.moveToTrash.confirmModal.description": " {{title}} 將被移至廢紙簍", - "com.affine.moveToTrash.confirmModal.title": "確認刪除頁面?", - "com.affine.moveToTrash.title": "移至廢紙簍", - "com.affine.nameWorkspace.button.cancel": "取消", - "com.affine.nameWorkspace.button.create": "建立", - "com.affine.nameWorkspace.description": "Workspace 是您的虛擬空間,無論對於個人或是團隊,均可用於引用、創建與規劃。", - "com.affine.nameWorkspace.placeholder": "為 Workspace 命名", - "com.affine.nameWorkspace.title": "為 Workspace 命名", "com.affine.new_edgeless": "新的無界頁面", "com.affine.new_import": "匯入", - "com.affine.notFoundPage.backButton": "回到主頁", - "com.affine.notFoundPage.title": "404 - 搵唔到搜尋的網頁", "com.affine.onboarding.title1": "超合併白板和文檔", "com.affine.onboarding.title2": "直觀而強大的基於塊的編輯", "com.affine.onboarding.videoDescription1": "在頁面模式(用於結構化文檔創建)和白板模式(用於自由形式直觀地表達創意)之間輕鬆切換。", "com.affine.onboarding.videoDescription2": "使用模組化介面拖放文本、圖像和其他內容塊,輕鬆創建結構化文檔。", - "com.affine.openPageOperation.newTab": "在新標籤頁中打開", - "com.affine.pageMode.all": "全部", - "com.affine.pageMode.edgeless": "無界", - "com.affine.pageMode.page": "頁面", - "com.affine.publicLinkDisableModal.button.cancel": "取消", - "com.affine.publicLinkDisableModal.button.disable": "停用", - "com.affine.publicLinkDisableModal.description": "停用此公開連結,將阻止擁有連結者登入此頁面。", - "com.affine.publicLinkDisableModal.title": "確認停用公開連結?", - "com.affine.rootAppSidebar.collections": "收藏集", - "com.affine.rootAppSidebar.favorites": "我的收藏", - "com.affine.rootAppSidebar.others": "其他", - "com.affine.setDBLocation.button.customize": "定製", - "com.affine.setDBLocation.button.defaultLocation": "預設位置", - "com.affine.setDBLocation.description": "選擇欲創建 Workspace 之位置。預設下,Workspace 數據存儲在本機。", - "com.affine.setDBLocation.title": "設定資料庫位置", - "com.affine.setDBLocation.tooltip.defaultLocation": "預設下将存儲到 {{location}}", - "com.affine.setSyncingMode.button.continue": "繼續", - "com.affine.setSyncingMode.cloud": "使用 AFFiNE Cloud 跨設備同步", - "com.affine.setSyncingMode.deviceOnly": "僅在本機使用", - "com.affine.setSyncingMode.title.added": "匯入成功", - "com.affine.setSyncingMode.title.created": "建立成功", + "com.affine.pageMode": "頁面模式", + "com.affine.setting.account": "帳號設定", + "com.affine.setting.account.delete": "刪除帳號", + "com.affine.setting.account.delete.message": "永久刪除該帳戶以及 AFFiNE Cloud 中的 Workspace 數據備份。此操作無法撤消。", + "com.affine.setting.account.message": "你的個人資料", + "com.affine.setting.sign.message": "透過 AFFiNE Cloud 同步", + "com.affine.setting.sign.out.message": "安全登出您的帳號。", + "com.affine.settings.about.message": "關於 AFFiNE 的資訊", + "com.affine.settings.about.update.check.message": "定期自動檢查更新。", + "com.affine.settings.about.update.download.message": "自動下載更新(到本機)。", "com.affine.settings.appearance": "外觀", + "com.affine.settings.appearance.border-style-description": "訂製用戶端外觀。", + "com.affine.settings.appearance.date-format-description": "訂製你的日期樣式", + "com.affine.settings.appearance.full-width-description": "頁面內內容的最大顯示量。", + "com.affine.settings.appearance.language-description": "選擇介面語言。", + "com.affine.settings.appearance.start-week-description": "預設下一星期的第一日為週日。", + "com.affine.settings.appearance.window-frame-description": "定製 Windows 用戶端外觀。", "com.affine.settings.auto-check-description": "若啟用,將定期自動檢測新版本。", "com.affine.settings.auto-download-description": "若啟用,將自動下載新版本。", + "com.affine.settings.email": "電子郵件地址", + "com.affine.settings.email.action": "更改電子郵件地址", "com.affine.settings.member-tooltip": "啟用 AFFiNE Cloud 以與他人協作", + "com.affine.settings.noise-style": "側欄背景雜訊效果", + "com.affine.settings.noise-style-description": "在側欄背景使用雜訊效果。", + "com.affine.settings.password": "密碼", + "com.affine.settings.password.action.change": "更改密碼", + "com.affine.settings.password.action.set": "設定密碼", + "com.affine.settings.password.message": "設定密碼以登入您的帳號", + "com.affine.settings.profile": "我的個人資料", + "com.affine.settings.profile.message": "您的個人資料將向所有人公開。", + "com.affine.settings.profile.name": "顯示名稱", + "com.affine.settings.profile.placeholder": "鍵入帳號名稱", "com.affine.settings.remove-workspace": "刪除 Workspace", + "com.affine.settings.remove-workspace-description": "從本機刪除 Workspace,並可選擇刪除所有數據。", + "com.affine.settings.sign": "登入 / 建立帳號", "com.affine.settings.storage.db-location.change-hint": "點按以更改儲存位置。", "com.affine.settings.storage.description": "檢查或更改存儲位置", "com.affine.settings.storage.description-alt": "檢查或更改存儲位置。按下路徑以編輯。", "com.affine.settings.suggestion": "需要更多定製選項?您可以在社區中提意見。", + "com.affine.settings.translucent-style": "側欄半透明用戶介面", + "com.affine.settings.translucent-style-description": "在側欄使用透明效果。", + "com.affine.settings.workspace": "Workspace", "com.affine.settings.workspace.description": "您可在此自訂您的 Workspace", "com.affine.settings.workspace.not-owner": "只有擁有者才能編輯 Workspace 頭像與名稱。 更改將向所有人顯示。", "com.affine.settings.workspace.publish-tooltip": "啟用 AFFiNE Cloud 以發布此 Workspace", "com.affine.settings.workspace.storage.tip": "點按以更改儲存位置。", - "com.affine.settingSidebar.settings.general": "一般", - "com.affine.settingSidebar.settings.workspace": "Workspace", - "com.affine.settingSidebar.title": "設置", - "com.affine.shortcutsTitle.edgeless": "無界", - "com.affine.shortcutsTitle.general": "一般", - "com.affine.shortcutsTitle.markdownSyntax": "Markdown 語法", - "com.affine.shortcutsTitle.page": "頁面", - "com.affine.sidebarSwitch.collapse": "收起側欄", - "com.affine.sidebarSwitch.expand": "展開側欄", - "com.affine.themeSettings.dark": "深色", - "com.affine.themeSettings.light": "淺色", - "com.affine.themeSettings.system": "跟隨系統", - "com.affine.toastMessage.addedFavorites": "已收藏", - "com.affine.toastMessage.edgelessMode": "無界模式", - "com.affine.toastMessage.movedTrash": "已移至廢紙簍", - "com.affine.toastMessage.pageMode": "頁面模式", - "com.affine.toastMessage.permanentlyDeleted": "已永久刪除", - "com.affine.toastMessage.removedFavorites": "已從我的收藏中刪除", - "com.affine.toastMessage.restored": "{{title}} 已恢復", - "com.affine.toastMessage.successfullyDeleted": "已成功刪除", "com.affine.today": "今天", - "com.affine.trashOperation.delete": "刪除", - "com.affine.trashOperation.delete.description": "刪除後,您將無法撤消此操作。您確認嗎?", - "com.affine.trashOperation.delete.title": "永久刪除", - "com.affine.trashOperation.deletePermanently": "永久刪除", - "com.affine.trashOperation.restoreIt": "恢復它", + "com.affine.updater.downloading": "下載中", + "com.affine.updater.open-download-page": "打開下載頁面", + "com.affine.updater.restart-to-update": "重啟以安裝更新", + "com.affine.updater.update-available": "更新可用", "com.affine.workspace.cannot-delete": "您不能刪除僅剩的 Workspace", - "com.affine.workspaceDelete.button.cancel": "取消", - "com.affine.workspaceDelete.button.delete": "刪除", - "com.affine.workspaceDelete.description": "刪除 <1>{{workspace}} ,此步驟無法重做,全部內容將丟失。", - "com.affine.workspaceDelete.description2": "刪除<1>{{workspace}} ,將同時刪除本機同雲端資料。此步驟無法重做,請慎重考慮。", - "com.affine.workspaceDelete.placeholder": "請鍵入 Workspace 名稱以確認", - "com.affine.workspaceDelete.title": "刪除 Workspace", - "com.affine.workspaceLeave.button.cancel": "取消", - "com.affine.workspaceLeave.button.leave": "離開", - "com.affine.workspaceLeave.description": "離開後,您將無法再訪問此 Workspace 的內容。", - "com.affine.workspaceSubPath.all": "所有頁面", - "com.affine.workspaceSubPath.trash": "廢紙簍", - "com.affine.workspaceType.cloud": "\nCloud Workspace", - "com.affine.workspaceType.joined": "加入的 Workspace", - "com.affine.workspaceType.local": "本機 Workspace", - "com.affine.workspaceType.offline": "離線時可用", + "com.affine.workspace.cloud.account.logout": "登出", + "com.affine.workspace.cloud.account.settings": "帳號設定", + "com.affine.workspace.cloud.auth": "登入 / 建立帳號", + "com.affine.workspace.cloud.join": "加入 Workspace", + "com.affine.workspace.cloud.sync": "云同步", + "com.affine.workspace.local.import": "導入 Workspace", "com.affine.write_with_a_blank_page": "在空白頁書寫", "com.affine.yesterday": "昨天", - "Confirm": "確認", - "Connector": "連接", - "Continue with Google": "以 Google 登入", - "Convert to ": "轉換為", - "Copied link to clipboard": "複製連結到剪貼簿", - "Copy": "複製", - "Copy Link": "複製連結", "core": "核心", - "Create": "建立", - "Create Or Import": "建立或匯入", - "Create Shared Link Description": "建立一個可共享連結。", - "Create your own workspace": "建立你的 workspace", - "Created": "建立時間", - "Created with": "建立於", - "Data sync mode": "數據同步模式", - "DB_FILE_ALREADY_LOADED": "數據庫已載入", - "DB_FILE_INVALID": "無效數據庫文檔", - "DB_FILE_MIGRATION_FAILED": "數據庫併入失敗", - "DB_FILE_PATH_INVALID": "數據庫路徑無效", - "Delete": "刪除", - "Delete Member?": "刪除成員?", - "Delete Workspace Label Hint": "刪除此 Workspace 後,所有內容將永久清除,任何人都無法恢復。", - "Delete Workspace placeholder": "鍵入 “Delete” 以確認", - "Disable": "停用", - "Disable Public Link": "停用公開連結", - "Disable Public Sharing": "停用公開分享", - "Download all data": "下載全部數據", - "Download core data": "下載核心數據", - "Download data": "下載 {{CoreOrAll}} 數據", - "Download data Description1": "這將佔用更多存儲空間。", - "Download data Description2": "這只佔用較小存儲空間。", - "Edgeless": "無界", - "Edit": "編輯", - "Edit Filter": "編輯篩選器", + "dark": "深色", "emptyAllPages": "點擊<1>$t(New Page)按鈕創建您的第一個頁面。", "emptyAllPagesClient": "點擊<1>$t(New Page)或按下<3>{{shortcut}}按鈕創建您的第一個頁面。", "emptyFavorite": "按下添加到我的收藏,頁面將顯示在此處。", "emptySharedPages": "共用頁面將顯示在此處。", "emptyTrash": "按下添加到廢紙簍,頁面將顯示在此處。", - "Enable": "啟用", - "Enable AFFiNE Cloud": "啟用 AFFiNE Cloud", - "Enable AFFiNE Cloud Description": "啓用後 Workspace 數據將透過 AFFiNE Cloud 備份及同步。", - "Enable cloud hint": "以下功能依賴於 AFFiNE Cloud。 所有數據都存儲在當前設備上。 您可以為此 Workspace 啓用 AFFiNE Cloud,以保持數據與雲同步。", - "Enabled success": "啟用成功", - "Exclude from filter": "從篩選器中排除", - "Export": "匯出", - "Export AFFiNE backup file": "匯出 AFFiNE 備份檔", - "Export Description": "您可以匯出整個 Workspace 數據進行備份,匯出的數據亦可重新匯入。", - "Export Shared Pages Description": "下載此頁的靜態副本以與他人共享。", - "Export success": "匯出成功", - "Export to HTML": "匯出為 HTML", - "Export to Markdown": "匯出為 Markdown", - "Export to PDF": "匯出為 PDF", - "Export to PNG": "匯出為 PNG", - "Export Workspace": "匯出 Workspace <1>{{workspace}} 即將推出", - "Failed to publish workspace": "Workspace 發佈失敗", - "Favorite": "收藏", - "Favorite pages for easy access": "收藏頁面以便訪問", - "Favorited": "已收藏", - "FILE_ALREADY_EXISTS": "檔已存在", - "Find 0 result": "發現 0 個結果", - "Find results": "發現 {{number}} 個結果", - "Force Sign Out": "強制登出", - "Get in touch!": "聯絡我哋!", - "Get in touch! Join our communities": "聯絡我哋!加入我們的社群。", - "Get in touch! Join our communities.": "聯絡我哋!加入我們的社群。", - "Got it": "明白了", - "How is AFFiNE Alpha different?": "AFFiNE Alpha 有何不同?", - "Import": "匯入", - "Info": "資訊", - "Invite": "邀請", - "Invite Members": "邀請成員", - "Invite placeholder": "搜尋郵件(只支援 Gmail)", + "frameless": "無框", "is a Cloud Workspace": "是一個 Cloud Workspace。", "is a Local Workspace": "是本機 Workspace。", - "It takes up little space on your device": "這只佔用較小存儲空間。", - "It takes up little space on your device.": "這只佔用較小存儲空間。", - "It takes up more space on your device": "這將佔用更多存儲空間。", - "It takes up more space on your device.": "這將佔用更多存儲空間。", - "Jump to": "跳轉到", - "Loading": "載入中⋯⋯", - "Local Workspace Description": "所有數據都存儲在當前設備上。 您可以為此 Workspace 啓用 AFFiNE Cloud,以保持數據與雲同步。", + "light": "淺色", "login success": "登入成功", - "Member": "成員", - "Member has been removed": "{{name}} 已被移除。", - "Members": "成員", - "Members hint": "在這裡管理成員,透過電子郵件邀請新成員。", "mobile device": "看起來您正在手提電話上流覽。", "mobile device description": "我們仍在適配手提電話,現階段建議您使用電腦。", - "Move folder": "移動資料夾", - "Move folder hint": "選取新的檔案位置", - "Move folder success": "移動資料夾成功", - "Move page to": "將頁面移動到⋯⋯", - "Move page to...": "將頁面移動到⋯⋯", - "Move to": "移至", - "Moved to Trash": "已移至廢紙簍", - "My Workspaces": "我的 Workspace", - "Navigation Path": "導航路徑", - "New Keyword Page": "新建 “{{query}}” 頁面", - "New Page": "新頁面", - "New Workspace": "新建 Workspace", - "No item": "無項目", - "Non-Gmail": "不支援非 Gmail", - "None yet": "暫未", - "Not now": "稍後", - "Open folder": "打開資料夾", - "Open folder hint": "檢查存儲資料夾的位置。", - "Open Workspace Settings": "打開 Workspace 設定", - "Organize pages to build knowledge": "整理頁面以構建知識庫", - "Owner": "擁有者", - "Paper": "文檔", - "Pending": "待定", - "Pivots": "樞紐", - "Please make sure you are online": "請確保您在線", - "Publish": "發佈", - "Publish to web": "發佈到網絡", - "Published Description": "此 Workspace 已發佈到網絡,所有人均可透過連結查看內容。", - "Published hint": "訪問者可透過提供的連結查看內容。", - "Published to Web": "已發佈到網絡", - "Publishing": "發佈到網絡需要 AFFiNE Cloud 服務。", - "Publishing Description": "發佈到網絡後,所有人均可透過連結查看內容。", - "Quick search": "快速搜尋", - "Quick search placeholder": "快速搜尋⋯⋯", - "Quick search placeholder2": "在 {{workspace}} 中搜尋", - "Recent": "最近", + "others": "其他", "recommendBrowser": "我們建議使用 <1>Chrome 瀏覽器以獲得最佳體驗。", - "Remove from Pivots": "從樞紐中刪除", - "Remove from workspace": "從 Workspace 中刪除", - "Remove special filter": "移除特殊篩選器", - "Rename": "重新命名", - "Restart Install Client Update": "重啟以安裝更新", - "Retain cached cloud data": "保留緩衝的雲數據", - "Retain local cached data": "保留本機緩衝數據", - "RFP": "頁面可在樞紐中自由添加或刪除,但仍可從「所有頁面」訪問。", - "Saved then enable AFFiNE Cloud": "所有修訂已儲存在本機,點按以啟用 AFFiNE Cloud。", - "Set up an AFFiNE account to sync data": "設定 AFFiNE 帳戶以同步數據", - "Share Menu Public Workspace Description1": "邀請他人加入 Workshop 或將其發佈到網絡。", - "Share Menu Public Workspace Description2": "當前 Workspace 已作為公共 Workspace 發佈到網絡。", - "Share with link": "透過連結分享", - "Shared Pages": "已分享頁面", - "Shared Pages Description": "公開分享頁面需要 AFFiNE Cloud 服務。", - "Shared Pages In Public Workspace Description": "整個 Workspace 已在網絡發布,可透過<1> Workspace 設置進行編輯。", - "Shortcuts": "快速鍵", - "Sign in": "登入 AFFiNE Cloud", - "Sign in and Enable": "登入並啟用", - "Sign out": "登出", - "Sign out description": "登出將使未同步內容丟失。", - "Skip": "略過", - "Stay logged out": "保持登出狀態", - "Sticky": "Memo紙", + "restored": "{{title}} 已恢復", "still designed": "(此頁面仍在設計中。 )", - "Stop publishing": "中止發佈", - "Storage": "儲存", - "Storage and Export": "存儲和匯出", - "Storage Folder": "存儲資料夾", - "Sync": "同步", - "Synced with AFFiNE Cloud": "AFFiNE Cloud 同步完成", - "Tags": "標籤", - "Title": "標題", - "UNKNOWN_ERROR": "未知錯誤", - "Unpin": "取消固定", - "Unpublished hint": "發布到網絡後,訪問者可透過提供的連結查看內容。", - "Untitled": "未命名", - "Update Available": "更新可用", - "Update workspace name success": "成功更新 Workspace 名稱", - "Updated": "更新時間", + "system": "跟隨系統", "upgradeBrowser": "更新至最新版本 Chrome,以享有更優質的使用體驗。", - "Upload": "上傳", - "Users": "使用者", - "View Navigation Path": "查看導航路徑", - "Wait for Sync": "等待同步", - "will delete member": "將刪除成員", - "Workspace Avatar": "Workspace 頭像", - "Workspace Icon": "Workspace 圖示", - "Workspace Name": "Workspace 名稱", - "Workspace Not Found": "未找到 Workspace", - "Workspace Owner": "Workspace 擁有者", - "Workspace Profile": "Workspace 配置檔", - "Workspace saved locally": "{{name}} 已保存在本機", - "Workspace Settings": "Workspace 設定", - "Workspace Settings with name": "{{name}} 的設定", - "Workspace Type": "Workspace 類型", - "You cannot delete the last workspace": "您不能刪除僅剩的 Workspace" + "will be moved to Trash": " {{title}} 將被移至廢紙簍", + "will delete member": "將刪除成員" } diff --git a/packages/frontend/i18n/src/scripts/download.ts b/packages/frontend/i18n/src/scripts/download.ts index ecdcf14b34..31e8fb397b 100644 --- a/packages/frontend/i18n/src/scripts/download.ts +++ b/packages/frontend/i18n/src/scripts/download.ts @@ -84,7 +84,7 @@ const main = async () => { ); const availableLanguages = languagesWithTranslations.filter( - language => language.completeRate > 0.4 + language => language.completeRate > 0.2 ); for (const language of availableLanguages diff --git a/packages/frontend/i18n/src/scripts/request.ts b/packages/frontend/i18n/src/scripts/request.ts index 717477d389..973bbff892 100644 --- a/packages/frontend/i18n/src/scripts/request.ts +++ b/packages/frontend/i18n/src/scripts/request.ts @@ -1,3 +1,5 @@ +import type { Request } from 'undici-types'; + // cSpell:ignore Tolgee const TOLGEE_API_KEY = process.env['TOLGEE_API_KEY']; const TOLGEE_API_URL = 'https://i18n.affine.pro'; @@ -15,7 +17,7 @@ const withTolgee = ( 'Content-Type': 'application/json', }); - const isRequest = (input: RequestInfo | URL): input is Request => { + const isRequest = (input: NodeJS.fetch.RequestInfo): input is Request => { return typeof input === 'object' && !('href' in input); }; @@ -31,6 +33,7 @@ const withTolgee = ( argArray[0] = { ...argArray[0], url: `${baseUrl}${argArray[0].url}`, + // @ts-expect-error Node.js types incorrectly define RequestInit headers, }; } diff --git a/packages/frontend/native/package.json b/packages/frontend/native/package.json index 03e2a9952f..0805113456 100644 --- a/packages/frontend/native/package.json +++ b/packages/frontend/native/package.json @@ -35,16 +35,16 @@ } }, "devDependencies": { - "@napi-rs/cli": "^2.16.3", - "@types/node": "^18.18.5", - "@types/uuid": "^9.0.5", + "@napi-rs/cli": "^2.16.5", + "@types/node": "^20.9.3", + "@types/uuid": "^9.0.7", "ava": "^5.3.1", "cross-env": "^7.0.3", - "nx": "^16.10.0", + "nx": "^17.1.3", "nx-cloud": "^16.5.2", "rxjs": "^7.8.1", "ts-node": "^10.9.1", - "typescript": "^5.2.2", + "typescript": "^5.3.2", "uuid": "^9.0.1" }, "engines": { @@ -58,5 +58,5 @@ "test": "ava", "version": "napi version" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/templates/package.json b/packages/frontend/templates/package.json index b308d8e2bc..050c224ec1 100644 --- a/packages/frontend/templates/package.json +++ b/packages/frontend/templates/package.json @@ -7,5 +7,5 @@ "./v1/*.json": "./v1/*.json", "./preloading.json": "./preloading.json" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/workspace/package.json b/packages/frontend/workspace/package.json index 30081f3099..57d5f88b5c 100644 --- a/packages/frontend/workspace/package.json +++ b/packages/frontend/workspace/package.json @@ -4,15 +4,13 @@ "exports": { "./atom": "./src/atom.ts", "./manager": "./src/manager/index.ts", - "./type": "./src/type.ts", - "./migration": "./src/migration/index.ts", "./local/crud": "./src/local/crud.ts", - "./affine": "./src/affine/index.ts", "./affine/*": "./src/affine/*.ts", "./providers": "./src/providers/index.ts" }, "peerDependencies": { "@blocksuite/blocks": "*", + "@blocksuite/global": "*", "@blocksuite/store": "*" }, "dependencies": { @@ -23,14 +21,16 @@ "@toeverything/hooks": "workspace:*", "@toeverything/y-indexeddb": "workspace:*", "async-call-rpc": "^6.3.1", + "idb": "^7.1.1", + "idb-keyval": "^6.2.1", "is-svg": "^5.0.0", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "js-base64": "^3.7.5", "ky": "^1.0.1", "lib0": "^0.2.87", "lodash-es": "^4.17.21", - "nanoid": "^5.0.1", - "next-auth": "^4.23.2", + "nanoid": "^5.0.3", + "next-auth": "^4.24.5", "react": "18.2.0", "react-dom": "18.2.0", "socket.io-client": "^4.7.2", @@ -38,7 +38,7 @@ "valtio": "^1.11.2", "y-protocols": "^1.0.6", "y-provider": "workspace:*", - "yjs": "^13.6.8", + "yjs": "^13.6.10", "zod": "^3.22.4" }, "devDependencies": { @@ -48,5 +48,5 @@ "vitest": "0.34.6", "ws": "^8.14.2" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/frontend/workspace/src/affine/crud.ts b/packages/frontend/workspace/src/affine/crud.ts index 0edbcf663e..e4a656c409 100644 --- a/packages/frontend/workspace/src/affine/crud.ts +++ b/packages/frontend/workspace/src/affine/crud.ts @@ -9,16 +9,10 @@ import { getWorkspaceQuery, getWorkspacesQuery, } from '@affine/graphql'; -import { createAffineDataSource } from '@affine/workspace/affine/index'; import { createIndexeddbStorage, Workspace } from '@blocksuite/store'; import { migrateLocalBlobStorage } from '@toeverything/infra/blocksuite'; -import { - createIndexedDBProvider, - DEFAULT_DB_NAME, -} from '@toeverything/y-indexeddb'; import { getSession } from 'next-auth/react'; import { proxy } from 'valtio/vanilla'; -import { syncDataSourceFromDoc } from 'y-provider'; import { getOrCreateWorkspace } from '../manager'; import { fetcher } from './gql'; @@ -59,45 +53,41 @@ export const CRUD: WorkspaceCRUD = { WorkspaceFlavour.AFFINE_CLOUD ); - Y.applyUpdate( - newBlockSuiteWorkspace.doc, - Y.encodeStateAsUpdate(upstreamWorkspace.doc) - ); + if (environment.isDesktop) { + // this will clone all data from existing db to new db file, including docs and blobs + await window.apis.workspace.clone( + upstreamWorkspace.id, + createWorkspace.id + ); - await Promise.all( - [...upstreamWorkspace.doc.subdocs].map(async subdoc => { - subdoc.load(); - return subdoc.whenLoaded.then(() => { - newBlockSuiteWorkspace.doc.subdocs.forEach(newSubdoc => { - if (newSubdoc.guid === subdoc.guid) { - Y.applyUpdate(newSubdoc, Y.encodeStateAsUpdate(subdoc)); - } + // skip apply updates in memory and we will use providers to sync data from db + } else { + Y.applyUpdate( + newBlockSuiteWorkspace.doc, + Y.encodeStateAsUpdate(upstreamWorkspace.doc) + ); + + await Promise.all( + [...upstreamWorkspace.doc.subdocs].map(async subdoc => { + subdoc.load(); + return subdoc.whenLoaded.then(() => { + newBlockSuiteWorkspace.doc.subdocs.forEach(newSubdoc => { + if (newSubdoc.guid === subdoc.guid) { + Y.applyUpdate(newSubdoc, Y.encodeStateAsUpdate(subdoc)); + } + }); }); + }) + ); + + migrateLocalBlobStorage(upstreamWorkspace.id, createWorkspace.id) + .then(() => deleteLocalBlobStorage(upstreamWorkspace.id)) + .catch(e => { + console.error('error when moving blob storage:', e); }); - }) - ); + // todo(himself65): delete old workspace in the future + } - const datasource = createAffineDataSource( - createWorkspace.id, - newBlockSuiteWorkspace.doc, - newBlockSuiteWorkspace.awarenessStore.awareness - ); - - const disconnect = datasource.onDocUpdate(() => {}); - await syncDataSourceFromDoc(upstreamWorkspace.doc, datasource); - disconnect(); - - const provider = createIndexedDBProvider( - newBlockSuiteWorkspace.doc, - DEFAULT_DB_NAME - ); - provider.connect(); - migrateLocalBlobStorage(upstreamWorkspace.id, createWorkspace.id) - .then(() => deleteLocalBlobStorage(upstreamWorkspace.id)) - .catch(e => { - console.error('error when moving blob storage:', e); - }); - // todo(himself65): delete old workspace in the future return createWorkspace.id; }, delete: async workspace => { diff --git a/packages/frontend/workspace/src/affine/download.ts b/packages/frontend/workspace/src/affine/download.ts new file mode 100644 index 0000000000..b397c742f9 --- /dev/null +++ b/packages/frontend/workspace/src/affine/download.ts @@ -0,0 +1,37 @@ +import { fetchWithTraceReport } from '@affine/graphql'; + +const hashMap = new Map(); +type DocPublishMode = 'edgeless' | 'page'; + +export type CloudDoc = { + arrayBuffer: ArrayBuffer; + publishMode: DocPublishMode; +}; + +export async function downloadBinaryFromCloud( + rootGuid: string, + pageGuid: string +): Promise { + const cached = hashMap.get(`${rootGuid}/${pageGuid}`); + if (cached) { + return cached; + } + const response = await fetchWithTraceReport( + runtimeConfig.serverUrlPrefix + + `/api/workspaces/${rootGuid}/docs/${pageGuid}`, + { + priority: 'high', + } + ); + if (response.ok) { + const publishMode = (response.headers.get('publish-mode') || + 'page') as DocPublishMode; + const arrayBuffer = await response.arrayBuffer(); + hashMap.set(`${rootGuid}/${pageGuid}`, { arrayBuffer, publishMode }); + + // return both arrayBuffer and publish mode + return { arrayBuffer, publishMode }; + } + + return null; +} diff --git a/packages/frontend/workspace/src/affine/index.ts b/packages/frontend/workspace/src/affine/index.ts deleted file mode 100644 index 7cb2099e47..0000000000 --- a/packages/frontend/workspace/src/affine/index.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { DebugLogger } from '@affine/debug'; -import type { Socket } from 'socket.io-client'; -import { Manager } from 'socket.io-client'; -import { - applyAwarenessUpdate, - type Awareness, - encodeAwarenessUpdate, - removeAwarenessStates, -} from 'y-protocols/awareness'; -import type { DocDataSource } from 'y-provider'; -import type { Doc } from 'yjs'; - -import { MultipleBatchSyncSender } from './batch-sync-sender'; -import { - type AwarenessChanges, - base64ToUint8Array, - uint8ArrayToBase64, -} from './utils'; - -let ioManager: Manager | null = null; - -// use lazy initialization to avoid global side effect -function getIoManager(): Manager { - if (ioManager) { - return ioManager; - } - ioManager = new Manager(runtimeConfig.serverUrlPrefix + '/', { - autoConnect: false, - transports: ['websocket'], - }); - return ioManager; -} - -const logger = new DebugLogger('affine:sync'); - -export const createAffineDataSource = ( - id: string, - rootDoc: Doc, - awareness: Awareness -) => { - if (id !== rootDoc.guid) { - console.warn('important!! please use doc.guid as roomName'); - } - - logger.debug('createAffineDataSource', id, rootDoc.guid); - const socket = getIoManager().socket('/'); - const syncSender = new MultipleBatchSyncSender(async (guid, updates) => { - const payload = await Promise.all( - updates.map(update => uint8ArrayToBase64(update)) - ); - - return new Promise(resolve => { - socket.emit( - 'client-update-v2', - { - workspaceId: rootDoc.guid, - guid, - updates: payload, - }, - (response: { - // TODO: reuse `EventError` with server - error?: any; - data: any; - }) => { - // TODO: raise error with different code to users - if (response.error) { - logger.error('client-update-v2 error', { - workspaceId: rootDoc.guid, - guid, - response, - }); - } - - resolve({ - accepted: !response.error, - // TODO: reuse `EventError` with server - retry: response.error?.code === 'INTERNAL', - }); - } - ); - }); - }); - - return { - get socket() { - return socket; - }, - queryDocState: async (guid, options) => { - const stateVector = options?.stateVector - ? await uint8ArrayToBase64(options.stateVector) - : undefined; - - return new Promise((resolve, reject) => { - logger.debug('doc-load-v2', { - workspaceId: rootDoc.guid, - guid, - stateVector, - }); - socket.emit( - 'doc-load-v2', - { - workspaceId: rootDoc.guid, - guid, - stateVector, - }, - ( - response: // TODO: reuse `EventError` with server - { error: any } | { data: { missing: string; state: string } } - ) => { - logger.debug('doc-load callback', { - workspaceId: rootDoc.guid, - guid, - stateVector, - response, - }); - - if ('error' in response) { - // TODO: result `EventError` with server - if (response.error.code === 'DOC_NOT_FOUND') { - resolve(false); - } else { - reject(new Error(response.error.message)); - } - } else { - resolve({ - missing: base64ToUint8Array(response.data.missing), - state: response.data.state - ? base64ToUint8Array(response.data.state) - : undefined, - }); - } - } - ); - }); - }, - sendDocUpdate: async (guid: string, update: Uint8Array) => { - logger.debug('client-update-v2', { - workspaceId: rootDoc.guid, - guid, - update, - }); - - await syncSender.send(guid, update); - }, - onDocUpdate: callback => { - const onUpdate = async (message: { - workspaceId: string; - guid: string; - updates: string[]; - }) => { - if (message.workspaceId === rootDoc.guid) { - message.updates.forEach(update => { - callback(message.guid, base64ToUint8Array(update)); - }); - } - }; - let destroyAwareness = () => {}; - socket.on('server-updates', onUpdate); - socket.on('connect', () => { - socket.emit( - 'client-handshake', - rootDoc.guid, - (response: { error?: any }) => { - if (!response.error) { - syncSender.start(); - destroyAwareness = setupAffineAwareness( - socket, - rootDoc, - awareness - ); - } - } - ); - }); - - socket.connect(); - return () => { - syncSender.stop(); - socket.emit('client-leave', rootDoc.guid); - socket.off('server-updates', onUpdate); - destroyAwareness(); - socket.disconnect(); - }; - }, - } satisfies DocDataSource & { readonly socket: Socket }; -}; - -function setupAffineAwareness( - conn: Socket, - rootDoc: Doc, - awareness: Awareness -) { - const awarenessBroadcast = ({ - workspaceId, - awarenessUpdate, - }: { - workspaceId: string; - awarenessUpdate: string; - }) => { - if (workspaceId !== rootDoc.guid) { - return; - } - applyAwarenessUpdate( - awareness, - base64ToUint8Array(awarenessUpdate), - 'server' - ); - }; - - const awarenessUpdate = (changes: AwarenessChanges, origin: unknown) => { - if (origin === 'server') { - return; - } - - const changedClients = Object.values(changes).reduce((res, cur) => [ - ...res, - ...cur, - ]); - - const update = encodeAwarenessUpdate(awareness, changedClients); - uint8ArrayToBase64(update) - .then(encodedUpdate => { - conn.emit('awareness-update', { - workspaceId: rootDoc.guid, - awarenessUpdate: encodedUpdate, - }); - }) - .catch(err => logger.error(err)); - }; - - const newClientAwarenessInitHandler = () => { - const awarenessUpdate = encodeAwarenessUpdate(awareness, [ - awareness.clientID, - ]); - uint8ArrayToBase64(awarenessUpdate) - .then(encodedAwarenessUpdate => { - conn.emit('awareness-update', { - guid: rootDoc.guid, - awarenessUpdate: encodedAwarenessUpdate, - }); - }) - .catch(err => logger.error(err)); - }; - - const windowBeforeUnloadHandler = () => { - removeAwarenessStates(awareness, [awareness.clientID], 'window unload'); - }; - - conn.on('server-awareness-broadcast', awarenessBroadcast); - conn.on('new-client-awareness-init', newClientAwarenessInitHandler); - awareness.on('update', awarenessUpdate); - - window.addEventListener('beforeunload', windowBeforeUnloadHandler); - - conn.emit('awareness-init', rootDoc.guid); - - return () => { - awareness.off('update', awarenessUpdate); - conn.off('server-awareness-broadcast', awarenessBroadcast); - conn.off('new-client-awareness-init', newClientAwarenessInitHandler); - window.removeEventListener('unload', windowBeforeUnloadHandler); - }; -} diff --git a/packages/frontend/workspace/src/affine/sync.ts b/packages/frontend/workspace/src/affine/sync.ts deleted file mode 100644 index c126439cc9..0000000000 --- a/packages/frontend/workspace/src/affine/sync.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { DebugLogger } from '@affine/debug'; -import { createIndexeddbStorage } from '@blocksuite/store'; -import { - createIndexedDBDatasource, - DEFAULT_DB_NAME, - downloadBinary, -} from '@toeverything/y-indexeddb'; -import { syncDataSource } from 'y-provider'; -import type { Doc } from 'yjs'; -import { applyUpdate } from 'yjs'; - -import { createCloudBlobStorage } from '../blob/cloud-blob-storage'; -import { createAffineDataSource } from '.'; -import { CRUD } from './crud'; - -const performanceLogger = new DebugLogger('performance:sync'); -let abortController: AbortController | undefined; - -const downloadRootFromIndexedDB = async ( - rootGuid: string, - doc: Doc, - signal: AbortSignal -): Promise => { - if (signal.aborted) { - return; - } - const update = await downloadBinary(rootGuid); - if (update !== false) { - applyUpdate(doc, update); - } -}; - -export async function startSync() { - performanceLogger.info('start'); - - abortController = new AbortController(); - const signal = abortController.signal; - const workspaces = await CRUD.list(); - performanceLogger.info('CRUD list'); - - const syncDocPromises = workspaces.map(workspace => - downloadRootFromIndexedDB( - workspace.id, - workspace.blockSuiteWorkspace.doc, - signal - ) - ); - await Promise.all(syncDocPromises); - performanceLogger.info('all sync promise'); - - const syncPromises = workspaces.map(workspace => { - const remoteDataSource = createAffineDataSource( - workspace.id, - workspace.blockSuiteWorkspace.doc, - workspace.blockSuiteWorkspace.awarenessStore.awareness - ); - const indexeddbDataSource = createIndexedDBDatasource({ - dbName: DEFAULT_DB_NAME, - }); - return syncDataSource( - (): string[] => [ - workspace.blockSuiteWorkspace.doc.guid, - ...[...workspace.blockSuiteWorkspace.doc.subdocs].map(doc => doc.guid), - ], - remoteDataSource, - indexeddbDataSource - ); - }); - - const syncBlobPromises = workspaces.map(async workspace => { - const cloudBlobStorage = createCloudBlobStorage(workspace.id); - const indexeddbBlobStorage = createIndexeddbStorage(workspace.id); - return Promise.all([ - cloudBlobStorage.crud.list(), - indexeddbBlobStorage.crud.list(), - ]).then(([cloudKeys, indexeddbKeys]) => { - if (signal.aborted) { - return; - } - const cloudKeysSet = new Set(cloudKeys); - const indexeddbKeysSet = new Set(indexeddbKeys); - // missing in indexeddb - const missingLocalKeys = cloudKeys.filter( - key => !indexeddbKeysSet.has(key) - ); - // missing in cloud - const missingCloudKeys = indexeddbKeys.filter( - key => !cloudKeysSet.has(key) - ); - return Promise.all([ - ...missingLocalKeys.map(key => - cloudBlobStorage.crud.get(key).then(async value => { - if (signal.aborted) { - return; - } - if (value) { - await indexeddbBlobStorage.crud.set(key, value); - } - }) - ), - ...missingCloudKeys.map(key => - indexeddbBlobStorage.crud.get(key).then(async value => { - if (signal.aborted) { - return; - } - if (value) { - await cloudBlobStorage.crud.set(key, value); - } - }) - ), - ]); - }); - }); - await Promise.all([...syncPromises, ...syncBlobPromises]); - performanceLogger.info('sync done'); -} - -export async function stopSync() { - abortController?.abort(); -} diff --git a/packages/frontend/workspace/src/atom.ts b/packages/frontend/workspace/src/atom.ts index 2b9fed2c73..4a63b6e2d9 100644 --- a/packages/frontend/workspace/src/atom.ts +++ b/packages/frontend/workspace/src/atom.ts @@ -74,15 +74,12 @@ const rootWorkspacesMetadataPrimitiveAtom = atom(atom: Atom) => Value; -type FetchMetadata = ( - get: Getter, - options: { signal: AbortSignal } -) => Promise; +type FetchMetadata = (get: Getter) => Promise; /** * @internal */ -const fetchMetadata: FetchMetadata = async (get, { signal }) => { +const fetchMetadata: FetchMetadata = async get => { performanceJotaiLogger.info('fetch metadata start'); const WorkspaceAdapters = get(workspaceAdaptersAtom); @@ -111,23 +108,6 @@ const fetchMetadata: FetchMetadata = async (get, { signal }) => { } return []; }; - - const maybeMetadata = loadFromLocalStorage(); - - // migration step, only data in `METADATA_STORAGE_KEY` will be migrated - if ( - maybeMetadata.some(meta => !('version' in meta)) && - !window.$migrationDone - ) { - await new Promise((resolve, reject) => { - signal.addEventListener('abort', () => reject(), { once: true }); - window.addEventListener('migration-done', () => resolve(), { - once: true, - }); - }); - performanceJotaiLogger.info('migration done'); - } - metadata.push(...loadFromLocalStorage()); } // step 2: fetch from adapters @@ -211,14 +191,14 @@ const fetchMetadata: FetchMetadata = async (get, { signal }) => { const rootWorkspacesMetadataPromiseAtom = atom< Promise ->(async (get, { signal }) => { +>(async get => { const primitiveMetadata = get(rootWorkspacesMetadataPrimitiveAtom); assertEquals( primitiveMetadata, null, 'rootWorkspacesMetadataPrimitiveAtom should be null' ); - return fetchMetadata(get, { signal }); + return fetchMetadata(get); }); type SetStateAction = Value | ((prev: Value) => Value); @@ -268,7 +248,6 @@ export const rootWorkspacesMetadataAtom = atom< } if (newWorkspaceId) { - set(currentPageIdAtom, null); set(currentWorkspaceIdAtom, newWorkspaceId); } return metadata; @@ -277,11 +256,7 @@ export const rootWorkspacesMetadataAtom = atom< ); export const refreshRootMetadataAtom = atom(null, (get, set) => { - const abortController = new AbortController(); - set( - rootWorkspacesMetadataPrimitiveAtom, - fetchMetadata(get, { signal: abortController.signal }) - ); + set(rootWorkspacesMetadataPrimitiveAtom, fetchMetadata(get)); }); // blocksuite atoms, diff --git a/packages/frontend/workspace/src/blob/__tests__/util.spec.ts b/packages/frontend/workspace/src/blob/__tests__/util.spec.ts new file mode 100644 index 0000000000..1b3e0fe20a --- /dev/null +++ b/packages/frontend/workspace/src/blob/__tests__/util.spec.ts @@ -0,0 +1,13 @@ +import { Buffer } from 'node:buffer'; + +import { describe, expect, test } from 'vitest'; + +import { isSvgBuffer } from '../util'; + +describe('isSvgBuffer', () => { + test('basic', async () => { + expect(isSvgBuffer(Buffer.from(''))).toBe(true); + expect(isSvgBuffer(Buffer.from(' \n\r\t'))).toBe(true); + expect(isSvgBuffer(Buffer.from('<123>'))).toBe(false); + }); +}); diff --git a/packages/frontend/workspace/src/blob/cloud-blob-storage.ts b/packages/frontend/workspace/src/blob/cloud-blob-storage.ts deleted file mode 100644 index 7a8ca39549..0000000000 --- a/packages/frontend/workspace/src/blob/cloud-blob-storage.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - checkBlobSizesQuery, - deleteBlobMutation, - fetchWithTraceReport, - listBlobsQuery, - setBlobMutation, -} from '@affine/graphql'; -import { fetcher } from '@affine/workspace/affine/gql'; -import type { BlobStorage } from '@blocksuite/store'; - -import { predefinedStaticFiles } from './local-static-storage'; -import { bufferToBlob } from './util'; - -export const createCloudBlobStorage = (workspaceId: string): BlobStorage => { - return { - crud: { - get: async key => { - const suffix = predefinedStaticFiles.includes(key) - ? `/static/${key}` - : `/api/workspaces/${workspaceId}/blobs/${key}`; - - return fetchWithTraceReport( - runtimeConfig.serverUrlPrefix + suffix - ).then(async res => { - if (!res.ok) { - // status not in the range 200-299 - return null; - } - return bufferToBlob(await res.arrayBuffer()); - }); - }, - set: async (key, value) => { - const { - checkBlobSize: { size }, - } = await fetcher({ - query: checkBlobSizesQuery, - variables: { - workspaceId, - size: value.size, - }, - }); - - if (size <= 0) { - throw new Error('Blob size limit exceeded'); - } - - const result = await fetcher({ - query: setBlobMutation, - variables: { - workspaceId, - blob: new File([value], key), - }, - }); - console.assert(result.setBlob === key, 'Blob hash mismatch'); - return key; - }, - list: async () => { - const result = await fetcher({ - query: listBlobsQuery, - variables: { - workspaceId, - }, - }); - return result.listBlobs; - }, - delete: async (key: string) => { - await fetcher({ - query: deleteBlobMutation, - variables: { - workspaceId, - hash: key, - }, - }); - }, - }, - }; -}; diff --git a/packages/frontend/workspace/src/blob/engine.ts b/packages/frontend/workspace/src/blob/engine.ts new file mode 100644 index 0000000000..16f993bdaa --- /dev/null +++ b/packages/frontend/workspace/src/blob/engine.ts @@ -0,0 +1,139 @@ +import { DebugLogger } from '@affine/debug'; +import { difference } from 'lodash-es'; + +const logger = new DebugLogger('affine:blob-engine'); + +export class BlobEngine { + constructor( + private local: BlobStorage, + private remotes: BlobStorage[] + ) {} + + get storages() { + return [this.local, ...this.remotes]; + } + + async sync() { + if (this.local.readonly) { + return; + } + logger.debug('start syncing blob...'); + for (const remote of this.remotes) { + let localList; + let remoteList; + try { + localList = await this.local.list(); + remoteList = await remote.list(); + } catch (err) { + logger.error(`error when sync`, err); + continue; + } + + if (!remote.readonly) { + const needUpload = difference(localList, remoteList); + for (const key of needUpload) { + try { + const data = await this.local.get(key); + if (data) { + await remote.set(key, data); + } + } catch (err) { + logger.error( + `error when sync ${key} from [${this.local.name}] to [${remote.name}]`, + err + ); + } + } + } + + const needDownload = difference(remoteList, localList); + + for (const key of needDownload) { + try { + const data = await remote.get(key); + if (data) { + await this.local.set(key, data); + } + } catch (err) { + logger.error( + `error when sync ${key} from [${remote.name}] to [${this.local.name}]`, + err + ); + } + } + } + + logger.debug('finish syncing blob'); + } + + async get(key: string) { + logger.debug('get blob', key); + for (const storage of this.storages) { + const data = await storage.get(key); + if (data) { + return data; + } + } + return undefined; + } + + async set(key: string, value: Blob) { + if (this.local.readonly) { + throw new Error('local peer is readonly'); + } + + // await upload to the local peer + await this.local.set(key, value); + + // uploads to other peers in the background + Promise.allSettled( + this.remotes + .filter(r => !r.readonly) + .map(peer => + peer.set(key, value).catch(err => { + logger.error('error when upload to peer', err); + }) + ) + ) + .then(result => { + if (result.some(({ status }) => status === 'rejected')) { + logger.error( + `blob ${key} update finish, but some peers failed to update` + ); + } else { + logger.debug(`blob ${key} update finish`); + } + }) + .catch(() => { + // Promise.allSettled never reject + }); + } + + async delete(_key: string) { + // not supported + } + + async list() { + const blobList = new Set(); + + for (const peer of this.storages) { + const list = await peer.list(); + if (list) { + for (const blob of list) { + blobList.add(blob); + } + } + } + + return Array.from(blobList); + } +} + +export interface BlobStorage { + name: string; + readonly: boolean; + get: (key: string) => Promise; + set: (key: string, value: Blob) => Promise; + delete: (key: string) => Promise; + list: () => Promise; +} diff --git a/packages/frontend/workspace/src/blob/index.ts b/packages/frontend/workspace/src/blob/index.ts new file mode 100644 index 0000000000..e6fc140b24 --- /dev/null +++ b/packages/frontend/workspace/src/blob/index.ts @@ -0,0 +1,37 @@ +import { BlobEngine } from './engine'; +import { + createAffineCloudBlobStorage, + createIndexeddbBlobStorage, + createSQLiteBlobStorage, + createStaticBlobStorage, +} from './storage'; + +export * from './engine'; +export * from './storage'; + +export function createLocalBlobStorage(workspaceId: string) { + if (environment.isDesktop) { + return createSQLiteBlobStorage(workspaceId); + } else { + return createIndexeddbBlobStorage(workspaceId); + } +} + +export function createLocalBlobEngine(workspaceId: string) { + return new BlobEngine(createLocalBlobStorage(workspaceId), [ + createStaticBlobStorage(), + ]); +} + +export function createAffineCloudBlobEngine(workspaceId: string) { + return new BlobEngine(createLocalBlobStorage(workspaceId), [ + createStaticBlobStorage(), + createAffineCloudBlobStorage(workspaceId), + ]); +} + +export function createAffinePublicBlobEngine(workspaceId: string) { + return new BlobEngine(createAffineCloudBlobStorage(workspaceId), [ + createStaticBlobStorage(), + ]); +} diff --git a/packages/frontend/workspace/src/blob/sqlite-blob-storage.ts b/packages/frontend/workspace/src/blob/sqlite-blob-storage.ts deleted file mode 100644 index c095eeee33..0000000000 --- a/packages/frontend/workspace/src/blob/sqlite-blob-storage.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { assertExists } from '@blocksuite/global/utils'; -import type { BlobStorage } from '@blocksuite/store'; - -import { bufferToBlob } from './util'; - -export const createSQLiteStorage = (workspaceId: string): BlobStorage => { - const apis = window.apis; - assertExists(apis); - return { - crud: { - get: async (key: string) => { - const buffer = await apis.db.getBlob(workspaceId, key); - if (buffer) { - return bufferToBlob(buffer); - } - return null; - }, - set: async (key: string, value: Blob) => { - await apis.db.addBlob( - workspaceId, - key, - new Uint8Array(await value.arrayBuffer()) - ); - return key; - }, - delete: async (key: string) => { - return apis.db.deleteBlob(workspaceId, key); - }, - list: async () => { - return apis.db.getBlobKeys(workspaceId); - }, - }, - }; -}; diff --git a/packages/frontend/workspace/src/blob/storage/affine-cloud.ts b/packages/frontend/workspace/src/blob/storage/affine-cloud.ts new file mode 100644 index 0000000000..91ffa92a4f --- /dev/null +++ b/packages/frontend/workspace/src/blob/storage/affine-cloud.ts @@ -0,0 +1,76 @@ +import { + checkBlobSizesQuery, + deleteBlobMutation, + fetchWithTraceReport, + listBlobsQuery, + setBlobMutation, +} from '@affine/graphql'; +import { fetcher } from '@affine/workspace/affine/gql'; + +import type { BlobStorage } from '../engine'; + +export const createAffineCloudBlobStorage = ( + workspaceId: string +): BlobStorage => { + return { + name: 'affine-cloud', + readonly: false, + get: async key => { + const suffix = key.startsWith('/') + ? key + : `/api/workspaces/${workspaceId}/blobs/${key}`; + + return fetchWithTraceReport(runtimeConfig.serverUrlPrefix + suffix).then( + async res => { + if (!res.ok) { + // status not in the range 200-299 + return undefined; + } + return await res.blob(); + } + ); + }, + set: async (key, value) => { + const { + checkBlobSize: { size }, + } = await fetcher({ + query: checkBlobSizesQuery, + variables: { + workspaceId, + size: value.size, + }, + }); + + if (size <= 0) { + throw new Error('Blob size limit exceeded'); + } + + const result = await fetcher({ + query: setBlobMutation, + variables: { + workspaceId, + blob: new File([value], key), + }, + }); + console.assert(result.setBlob === key, 'Blob hash mismatch'); + }, + list: async () => { + const result = await fetcher({ + query: listBlobsQuery, + variables: { + workspaceId, + }, + }); + return result.listBlobs; + }, + delete: async (key: string) => { + await fetcher({ + query: deleteBlobMutation, + variables: { + workspaceId, + hash: key, + }, + }); + }, + }; +}; diff --git a/packages/frontend/workspace/src/blob/storage/index.ts b/packages/frontend/workspace/src/blob/storage/index.ts new file mode 100644 index 0000000000..a8d9bd6e86 --- /dev/null +++ b/packages/frontend/workspace/src/blob/storage/index.ts @@ -0,0 +1,4 @@ +export * from './affine-cloud'; +export * from './indexeddb'; +export * from './sqlite'; +export * from './static'; diff --git a/packages/frontend/workspace/src/blob/storage/indexeddb.ts b/packages/frontend/workspace/src/blob/storage/indexeddb.ts new file mode 100644 index 0000000000..66973bd28a --- /dev/null +++ b/packages/frontend/workspace/src/blob/storage/indexeddb.ts @@ -0,0 +1,32 @@ +import { createStore, del, get, keys, set } from 'idb-keyval'; + +import type { BlobStorage } from '../engine'; + +export const createIndexeddbBlobStorage = ( + workspaceId: string +): BlobStorage => { + const db = createStore(`${workspaceId}_blob`, 'blob'); + const mimeTypeDb = createStore(`${workspaceId}_blob_mime`, 'blob_mime'); + return { + name: 'indexeddb', + readonly: false, + get: async (key: string) => { + const res = await get(key, db); + if (res) { + return new Blob([res], { type: await get(key, mimeTypeDb) }); + } + return undefined; + }, + set: async (key: string, value: Blob) => { + await set(key, await value.arrayBuffer(), db); + await set(key, value.type, mimeTypeDb); + }, + delete: async (key: string) => { + await del(key, db); + await del(key, mimeTypeDb); + }, + list: async () => { + return keys(db); + }, + }; +}; diff --git a/packages/frontend/workspace/src/blob/storage/sqlite.ts b/packages/frontend/workspace/src/blob/storage/sqlite.ts new file mode 100644 index 0000000000..3f3a0c080c --- /dev/null +++ b/packages/frontend/workspace/src/blob/storage/sqlite.ts @@ -0,0 +1,33 @@ +import { assertExists } from '@blocksuite/global/utils'; + +import type { BlobStorage } from '../engine'; +import { bufferToBlob } from '../util'; + +export const createSQLiteBlobStorage = (workspaceId: string): BlobStorage => { + const apis = window.apis; + assertExists(apis); + return { + name: 'sqlite', + readonly: false, + get: async (key: string) => { + const buffer = await apis.db.getBlob(workspaceId, key); + if (buffer) { + return bufferToBlob(buffer); + } + return undefined; + }, + set: async (key: string, value: Blob) => { + await apis.db.addBlob( + workspaceId, + key, + new Uint8Array(await value.arrayBuffer()) + ); + }, + delete: async (key: string) => { + return apis.db.deleteBlob(workspaceId, key); + }, + list: async () => { + return apis.db.getBlobKeys(workspaceId); + }, + }; +}; diff --git a/packages/frontend/workspace/src/blob/local-static-storage.ts b/packages/frontend/workspace/src/blob/storage/static.ts similarity index 67% rename from packages/frontend/workspace/src/blob/local-static-storage.ts rename to packages/frontend/workspace/src/blob/storage/static.ts index 93c3bf79c8..56578543c3 100644 --- a/packages/frontend/workspace/src/blob/local-static-storage.ts +++ b/packages/frontend/workspace/src/blob/storage/static.ts @@ -1,6 +1,4 @@ -import type { BlobStorage } from '@blocksuite/store'; - -import { bufferToBlob } from './util'; +import type { BlobStorage } from '../engine'; export const predefinedStaticFiles = [ '029uztLz2CzJezK7UUhrbGiWUdZ0J7NVs_qR6RDsvb8=', @@ -38,38 +36,36 @@ export const predefinedStaticFiles = [ 'v2yF7lY2L5rtorTtTmYFsoMb9dBPKs5M1y9cUKxcI1M=', ]; -export const createStaticStorage = (): BlobStorage => { +export const createStaticBlobStorage = (): BlobStorage => { return { - crud: { - get: async (key: string) => { - const isStaticResource = - predefinedStaticFiles.includes(key) || key.startsWith('/static/'); + name: 'static', + readonly: true, + get: async (key: string) => { + const isStaticResource = + predefinedStaticFiles.includes(key) || key.startsWith('/static/'); - if (!isStaticResource) { - return null; - } + if (!isStaticResource) { + return undefined; + } - const path = key.startsWith('/static/') ? key : `/static/${key}`; - const response = await fetch(path); + const path = key.startsWith('/static/') ? key : `/static/${key}`; + const response = await fetch(path); - if (response.ok) { - const buffer = await response.arrayBuffer(); - return bufferToBlob(buffer); - } + if (response.ok) { + return await response.blob(); + } - return null; - }, - set: async (key: string) => { - // ignore - return key; - }, - delete: async () => { - // ignore - }, - list: async () => { - // ignore - return []; - }, + return undefined; + }, + set: async () => { + // ignore + }, + delete: async () => { + // ignore + }, + list: async () => { + // ignore + return []; }, }; }; diff --git a/packages/frontend/workspace/src/blob/util.ts b/packages/frontend/workspace/src/blob/util.ts index e5c206b1fe..2ff1d9e1e7 100644 --- a/packages/frontend/workspace/src/blob/util.ts +++ b/packages/frontend/workspace/src/blob/util.ts @@ -1,8 +1,39 @@ import isSvg from 'is-svg'; +function fastCheckIsNotSvg(buffer: Uint8Array) { + // check first non-whitespace character is not ' { }); }; +const workspaceBlobEngineWeakMap = new WeakMap(); +export function getBlobEngine(workspace: Workspace) { + // temporary solution to get blob engine from workspace + return workspaceBlobEngineWeakMap.get(workspace); +} + // if not exist, create a new workspace export function getOrCreateWorkspace( id: string, @@ -91,48 +100,47 @@ export function getOrCreateWorkspace( return INTERNAL_BLOCKSUITE_HASH_MAP.get(id) as Workspace; } - const blobStorages: StoreOptions['blobStorages'] = []; + let blobEngine: BlobEngine; if (flavour === WorkspaceFlavour.AFFINE_CLOUD) { - if (isBrowser) { - blobStorages.push(createIndexeddbStorage); - blobStorages.push(createCloudBlobStorage); - if (environment.isDesktop && runtimeConfig.enableSQLiteProvider) { - blobStorages.push(createSQLiteStorage); - } - providerCreators.push(...createAffineProviders()); - - // todo(JimmFly): add support for cloud storage - } + blobEngine = createAffineCloudBlobEngine(id); + providerCreators.push(...createAffineProviders()); } else if (flavour === WorkspaceFlavour.LOCAL) { - if (isBrowser) { - blobStorages.push(createIndexeddbStorage); - if (environment.isDesktop && runtimeConfig.enableSQLiteProvider) { - blobStorages.push(createSQLiteStorage); - } - } + blobEngine = createLocalBlobEngine(id); providerCreators.push(...createLocalProviders()); } else if (flavour === WorkspaceFlavour.AFFINE_PUBLIC) { - if (isBrowser) { - blobStorages.push(createIndexeddbStorage); - if (environment.isDesktop && runtimeConfig.enableSQLiteProvider) { - blobStorages.push(createSQLiteStorage); - } - } - blobStorages.push(createCloudBlobStorage); + blobEngine = createAffinePublicBlobEngine(id); providerCreators.push(...createAffinePublicProviders()); } else { throw new Error('unsupported flavour'); } - blobStorages.push(createStaticStorage); const workspace = new Workspace({ id, isSSR: !isBrowser, providerCreators: typeof window === 'undefined' ? [] : providerCreators, - blobStorages: blobStorages, + blobStorages: [ + () => ({ + crud: { + async get(key) { + return (await blobEngine.get(key)) ?? null; + }, + async set(key, value) { + await blobEngine.set(key, value); + return key; + }, + async delete(key) { + return blobEngine.delete(key); + }, + async list() { + return blobEngine.list(); + }, + }, + }), + ], idGenerator: () => nanoid(), schema: globalBlockSuiteSchema, }); + workspaceBlobEngineWeakMap.set(workspace, blobEngine); createMonitor(workspace.doc); setEditorFlags(workspace); INTERNAL_BLOCKSUITE_HASH_MAP.set(id, workspace); diff --git a/packages/frontend/workspace/src/providers/__tests__/socketio-provider.spec.ts b/packages/frontend/workspace/src/providers/__tests__/socketio-provider.spec.ts deleted file mode 100644 index 7a155bd24a..0000000000 --- a/packages/frontend/workspace/src/providers/__tests__/socketio-provider.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @vitest-environment happy-dom - */ -import 'fake-indexeddb/auto'; - -import type { AffineSocketIOProvider } from '@affine/env/workspace'; -import { __unstableSchemas, AffineSchemas } from '@blocksuite/blocks/models'; -import { Schema, Workspace } from '@blocksuite/store'; -import { describe, expect, test } from 'vitest'; -import * as awarenessProtocol from 'y-protocols/awareness'; -import { Doc } from 'yjs'; - -import { createAffineSocketIOProvider } from '..'; - -const schema = new Schema(); - -schema.register(AffineSchemas).register(__unstableSchemas); - -describe('sockio provider', () => { - test.skip('test storage', async () => { - const workspaceId = 'test-storage-ws'; - { - const workspace = new Workspace({ - id: workspaceId, - isSSR: true, - schema, - }); - const provider = createAffineSocketIOProvider( - workspace.id, - workspace.doc, - { - awareness: workspace.awarenessStore.awareness, - } - ) as AffineSocketIOProvider; - provider.connect(); - const page = workspace.createPage({ - id: 'page', - }); - - await page.waitForLoaded(); - page.addBlock('affine:page', { - title: new page.Text('123123'), - }); - - await new Promise(resolve => setTimeout(resolve, 1000)); - } - - { - const workspace = new Workspace({ - id: workspaceId, - isSSR: true, - schema, - }); - const provider = createAffineSocketIOProvider( - workspace.id, - workspace.doc, - { - awareness: workspace.awarenessStore.awareness, - } - ) as AffineSocketIOProvider; - - provider.connect(); - - await new Promise(resolve => setTimeout(resolve, 1000)); - const page = workspace.getPage('page')!; - await page.waitForLoaded(); - const block = page.getBlockByFlavour('affine:page'); - expect(block[0].flavour).toEqual('affine:page'); - } - }); - - test.skip('test collaboration', async () => { - const workspaceId = 'test-collboration-ws'; - { - const doc = new Doc({ guid: workspaceId }); - const provider = createAffineSocketIOProvider(doc.guid, doc, { - awareness: new awarenessProtocol.Awareness(doc), - }) as AffineSocketIOProvider; - - const doc2 = new Doc({ guid: workspaceId }); - const provider2 = createAffineSocketIOProvider(doc2.guid, doc2, { - awareness: new awarenessProtocol.Awareness(doc2), - }) as AffineSocketIOProvider; - - provider.connect(); - provider2.connect(); - - await new Promise(resolve => setTimeout(resolve, 500)); - - const subdoc = new Doc(); - const folder = doc.getMap(); - folder.set('subDoc', subdoc); - subdoc.getText().insert(0, 'subDoc content'); - - await new Promise(resolve => setTimeout(resolve, 1000)); - - expect( - (doc2.getMap().get('subDoc') as Doc).getText().toJSON(), - 'subDoc content' - ); - } - }); -}); diff --git a/packages/frontend/workspace/src/providers/__tests__/sqlite-provider.spec.ts b/packages/frontend/workspace/src/providers/__tests__/sqlite-provider.spec.ts deleted file mode 100644 index f96b4c7e5c..0000000000 --- a/packages/frontend/workspace/src/providers/__tests__/sqlite-provider.spec.ts +++ /dev/null @@ -1,165 +0,0 @@ -import type { - SQLiteDBDownloadProvider, - SQLiteProvider, -} from '@affine/env/workspace'; -import { __unstableSchemas, AffineSchemas } from '@blocksuite/blocks/models'; -import type { Y as YType } from '@blocksuite/store'; -import { Schema, Workspace } from '@blocksuite/store'; -import type { DBHandlerManager } from '@toeverything/infra/handler'; -import type { - EventMap, - UnwrapManagerHandlerToClientSide, -} from '@toeverything/infra/type'; -import { nanoid } from 'nanoid'; -import { setTimeout } from 'timers/promises'; -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { getDoc } from 'y-provider'; - -import { - createSQLiteDBDownloadProvider, - createSQLiteProvider, -} from '../sqlite-providers'; - -const Y = Workspace.Y; - -let id: string; -let workspace: Workspace; -let provider: SQLiteProvider; -let downloadProvider: SQLiteDBDownloadProvider; - -let offlineYdoc: YType.Doc; - -let triggerDBUpdate: - | Parameters[0] - | null = null; - -const mockedAddBlob = vi.fn(); - -vi.stubGlobal('window', { - apis: { - db: { - getDocAsUpdates: async (_, guid) => { - const subdoc = guid ? getDoc(offlineYdoc, guid) : offlineYdoc; - if (!subdoc) { - return false; - } - return Y.encodeStateAsUpdate(subdoc); - }, - applyDocUpdate: async (_, update, subdocId) => { - const subdoc = subdocId ? getDoc(offlineYdoc, subdocId) : offlineYdoc; - if (!subdoc) { - return; - } - Y.applyUpdate(subdoc, update, 'sqlite'); - }, - getBlobKeys: async () => { - // todo: may need to hack the way to get hash keys of blobs - return []; - }, - addBlob: mockedAddBlob, - } satisfies Partial>, - }, - events: { - db: { - onExternalUpdate: fn => { - triggerDBUpdate = fn; - return () => { - triggerDBUpdate = null; - }; - }, - }, - } as Partial, -}); - -vi.stubGlobal('environment', { - isDesktop: true, -}); - -const schema = new Schema(); - -schema.register(AffineSchemas).register(__unstableSchemas); - -beforeEach(() => { - id = nanoid(); - workspace = new Workspace({ - id, - isSSR: true, - schema, - }); - provider = createSQLiteProvider(workspace.id, workspace.doc, { - awareness: workspace.awarenessStore.awareness, - }) as SQLiteProvider; - downloadProvider = createSQLiteDBDownloadProvider( - workspace.id, - workspace.doc, - { - awareness: workspace.awarenessStore.awareness, - } - ) as SQLiteDBDownloadProvider; - offlineYdoc = new Y.Doc(); - offlineYdoc.getText('text').insert(0, 'sqlite-hello'); -}); - -describe('SQLite download provider', () => { - test('sync updates', async () => { - // on connect, the updates from sqlite should be sync'ed to the existing ydoc - workspace.doc.getText('text').insert(0, 'mem-hello'); - - downloadProvider.sync(); - await downloadProvider.whenReady; - - // depending on the nature of the sync, the data can be sync'ed in either direction - const options = ['sqlite-hellomem-hello', 'mem-hellosqlite-hello']; - const synced = options.filter( - o => o === workspace.doc.getText('text').toString() - ); - expect(synced.length).toBe(1); - }); - - // there is no updates from sqlite for now - test.skip('on db update', async () => { - provider.connect(); - - await setTimeout(200); - - offlineYdoc.getText('text').insert(0, 'sqlite-world'); - - triggerDBUpdate?.({ - workspaceId: id + '-another-id', - update: Y.encodeStateAsUpdate(offlineYdoc), - }); - - // not yet updated (because the workspace id is different) - expect(workspace.doc.getText('text').toString()).toBe(''); - - triggerDBUpdate?.({ - workspaceId: id, - update: Y.encodeStateAsUpdate(offlineYdoc), - }); - - expect(workspace.doc.getText('text').toString()).toBe( - 'sqlite-worldsqlite-hello' - ); - }); - - test('disconnect handlers', async () => { - const offHandler = vi.fn(); - let handleUpdate = () => {}; - let handleSubdocs = () => {}; - workspace.doc.on = (event: string, fn: () => void) => { - if (event === 'update') { - handleUpdate = fn; - } else if (event === 'subdocs') { - handleSubdocs = fn; - } - }; - workspace.doc.off = offHandler; - provider.connect(); - - provider.disconnect(); - - expect(triggerDBUpdate).toBe(null); - expect(offHandler).toBeCalledWith('update', handleUpdate); - expect(offHandler).toBeCalledWith('subdocs', handleSubdocs); - }); -}); diff --git a/packages/frontend/workspace/src/providers/awareness/affine/index.ts b/packages/frontend/workspace/src/providers/awareness/affine/index.ts new file mode 100644 index 0000000000..41d652e983 --- /dev/null +++ b/packages/frontend/workspace/src/providers/awareness/affine/index.ts @@ -0,0 +1,101 @@ +import { DebugLogger } from '@affine/debug'; +import { + applyAwarenessUpdate, + type Awareness, + encodeAwarenessUpdate, + removeAwarenessStates, +} from 'y-protocols/awareness'; + +import { getIoManager } from '../../utils/affine-io'; +import { base64ToUint8Array, uint8ArrayToBase64 } from '../../utils/base64'; +import type { AwarenessProvider } from '..'; + +const logger = new DebugLogger('affine:awareness:socketio'); + +export type AwarenessChanges = Record< + 'added' | 'updated' | 'removed', + number[] +>; + +export function createAffineAwarenessProvider( + workspaceId: string, + awareness: Awareness +): AwarenessProvider { + const socket = getIoManager().socket('/'); + + const awarenessBroadcast = ({ + workspaceId, + awarenessUpdate, + }: { + workspaceId: string; + awarenessUpdate: string; + }) => { + if (workspaceId !== workspaceId) { + return; + } + applyAwarenessUpdate( + awareness, + base64ToUint8Array(awarenessUpdate), + 'remote' + ); + }; + + const awarenessUpdate = (changes: AwarenessChanges, origin: unknown) => { + if (origin === 'remote') { + return; + } + + const changedClients = Object.values(changes).reduce((res, cur) => [ + ...res, + ...cur, + ]); + + const update = encodeAwarenessUpdate(awareness, changedClients); + uint8ArrayToBase64(update) + .then(encodedUpdate => { + socket.emit('awareness-update', { + workspaceId: workspaceId, + awarenessUpdate: encodedUpdate, + }); + }) + .catch(err => logger.error(err)); + }; + + const newClientAwarenessInitHandler = () => { + const awarenessUpdate = encodeAwarenessUpdate(awareness, [ + awareness.clientID, + ]); + uint8ArrayToBase64(awarenessUpdate) + .then(encodedAwarenessUpdate => { + socket.emit('awareness-update', { + guid: workspaceId, + awarenessUpdate: encodedAwarenessUpdate, + }); + }) + .catch(err => logger.error(err)); + }; + + const windowBeforeUnloadHandler = () => { + removeAwarenessStates(awareness, [awareness.clientID], 'window unload'); + }; + + return { + connect: () => { + socket.on('server-awareness-broadcast', awarenessBroadcast); + socket.on('new-client-awareness-init', newClientAwarenessInitHandler); + awareness.on('update', awarenessUpdate); + + window.addEventListener('beforeunload', windowBeforeUnloadHandler); + + socket.emit('awareness-init', workspaceId); + socket.connect(); + }, + disconnect: () => { + awareness.off('update', awarenessUpdate); + socket.off('server-awareness-broadcast', awarenessBroadcast); + socket.off('new-client-awareness-init', newClientAwarenessInitHandler); + window.removeEventListener('unload', windowBeforeUnloadHandler); + socket.disconnect(); + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/awareness/broadcast-channel/index.ts b/packages/frontend/workspace/src/providers/awareness/broadcast-channel/index.ts new file mode 100644 index 0000000000..3fa9f7cb26 --- /dev/null +++ b/packages/frontend/workspace/src/providers/awareness/broadcast-channel/index.ts @@ -0,0 +1,63 @@ +import type { Awareness } from 'y-protocols/awareness.js'; +import { + applyAwarenessUpdate, + encodeAwarenessUpdate, +} from 'y-protocols/awareness.js'; + +import type { AwarenessProvider } from '..'; +import type { AwarenessChanges } from '../affine'; + +type ChannelMessage = + | { type: 'connect' } + | { type: 'update'; update: Uint8Array }; + +export function createBroadcastChannelAwarenessProvider( + workspaceId: string, + awareness: Awareness +): AwarenessProvider { + const channel = new BroadcastChannel('awareness:' + workspaceId); + + function handleAwarenessUpdate(changes: AwarenessChanges, origin: unknown) { + if (origin === 'remote') { + return; + } + + const changedClients = Object.values(changes).reduce((res, cur) => [ + ...res, + ...cur, + ]); + + const update = encodeAwarenessUpdate(awareness, changedClients); + channel.postMessage({ + type: 'update', + update: update, + } satisfies ChannelMessage); + } + + function handleChannelMessage(event: MessageEvent) { + if (event.data.type === 'update') { + const update = event.data.update; + applyAwarenessUpdate(awareness, update, 'remote'); + } + if (event.data.type === 'connect') { + channel.postMessage({ + type: 'update', + update: encodeAwarenessUpdate(awareness, [awareness.clientID]), + } satisfies ChannelMessage); + } + } + + return { + connect() { + channel.postMessage({ + type: 'connect', + } satisfies ChannelMessage); + awareness.on('update', handleAwarenessUpdate); + channel.addEventListener('message', handleChannelMessage); + }, + disconnect() { + awareness.off('update', handleAwarenessUpdate); + channel.removeEventListener('message', handleChannelMessage); + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/awareness/index.ts b/packages/frontend/workspace/src/providers/awareness/index.ts new file mode 100644 index 0000000000..2fc09f42e9 --- /dev/null +++ b/packages/frontend/workspace/src/providers/awareness/index.ts @@ -0,0 +1,7 @@ +export interface AwarenessProvider { + connect(): void; + disconnect(): void; +} + +export * from './affine'; +export * from './broadcast-channel'; diff --git a/packages/frontend/workspace/src/providers/cloud/index.ts b/packages/frontend/workspace/src/providers/cloud/index.ts deleted file mode 100644 index b374451d5e..0000000000 --- a/packages/frontend/workspace/src/providers/cloud/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { DebugLogger } from '@affine/debug'; -import { fetchWithTraceReport } from '@affine/graphql'; -import type { ActiveDocProvider, DocProviderCreator } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; -import type { Doc } from 'yjs'; - -const Y = Workspace.Y; - -const logger = new DebugLogger('affine:cloud'); - -const hashMap = new Map(); - -export async function downloadBinaryFromCloud( - rootGuid: string, - pageGuid: string -): Promise { - if (hashMap.has(`${rootGuid}/${pageGuid}`)) { - return true; - } - const response = await fetchWithTraceReport( - runtimeConfig.serverUrlPrefix + - `/api/workspaces/${rootGuid}/docs/${pageGuid}`, - { - priority: 'high', - } - ); - if (response.ok) { - const arrayBuffer = await response.arrayBuffer(); - hashMap.set(`${rootGuid}/${pageGuid}`, arrayBuffer); - return arrayBuffer; - } - return false; -} - -async function downloadBinary(rootGuid: string, doc: Doc) { - const buffer = await downloadBinaryFromCloud(rootGuid, doc.guid); - if (typeof buffer !== 'boolean') { - Y.applyUpdate(doc, new Uint8Array(buffer), 'affine-cloud'); - } -} - -export const createCloudDownloadProvider: DocProviderCreator = ( - id, - doc -): ActiveDocProvider => { - let _resolve: () => void; - let _reject: (error: unknown) => void; - const promise = new Promise((resolve, reject) => { - _resolve = resolve; - _reject = reject; - }); - - return { - flavour: 'affine-cloud-download', - active: true, - sync() { - downloadBinary(id, doc) - .then(() => { - logger.info(`Downloaded ${id}`); - _resolve(); - }) - .catch(_reject); - }, - get whenReady() { - return promise; - }, - }; -}; - -export const createMergeCloudSnapshotProvider: DocProviderCreator = ( - id, - doc -): ActiveDocProvider => { - let _resolve: () => void; - const promise = new Promise(resolve => { - _resolve = resolve; - }); - - return { - flavour: 'affine-cloud-merge-snapshot', - active: true, - sync() { - downloadBinary(id, doc) - .then(() => { - logger.info(`Downloaded ${id}`); - _resolve(); - }) - // ignore error - .catch(e => { - console.error(e); - _resolve(); - }); - }, - get whenReady() { - return promise; - }, - }; -}; diff --git a/packages/frontend/workspace/src/providers/index.ts b/packages/frontend/workspace/src/providers/index.ts index 29864d1009..199521b4bf 100644 --- a/packages/frontend/workspace/src/providers/index.ts +++ b/packages/frontend/workspace/src/providers/index.ts @@ -1,160 +1,142 @@ -import { DebugLogger } from '@affine/debug'; -import type { - AffineSocketIOProvider, - LocalIndexedDBBackgroundProvider, - LocalIndexedDBDownloadProvider, -} from '@affine/env/workspace'; -import { assertExists } from '@blocksuite/global/utils'; +/** + * The `Provider` is responsible for sync `Y.Doc` with the local database and the Affine Cloud, serving as the source of + * Affine's local-first collaborative magic. + * + * When Affine boot, the `Provider` is tasked with reading content from the local database and loading it into the + * workspace, continuously storing any changes made by the user into the local database. + * + * When using Affine Cloud, the `Provider` also handles sync content with the Cloud. + * + * Additionally, the `Provider` is responsible for implementing a local-first capability, allowing users to edit offline + * with changes stored in the local database and sync with the Cloud when the network is restored. + */ + import type { DocProviderCreator } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; -import { createBroadcastChannelProvider } from '@blocksuite/store/providers/broadcast-channel'; + import { - createIndexedDBDatasource, - createIndexedDBProvider as create, -} from '@toeverything/y-indexeddb'; -import { createLazyProvider } from 'y-provider'; -import { encodeStateVector } from 'yjs'; + createAffineAwarenessProvider, + createBroadcastChannelAwarenessProvider, +} from './awareness'; +import { createAffineStorage } from './storage/affine'; +import { createIndexedDBStorage } from './storage/indexeddb'; +import { createSQLiteStorage } from './storage/sqlite'; +import { SyncEngine } from './sync'; -import { createAffineDataSource } from '../affine'; -import { - createCloudDownloadProvider, - createMergeCloudSnapshotProvider, - downloadBinaryFromCloud, -} from './cloud'; -import { - createSQLiteDBDownloadProvider, - createSQLiteProvider, -} from './sqlite-providers'; - -const Y = Workspace.Y; -const logger = new DebugLogger('indexeddb-provider'); - -const createAffineSocketIOProvider: DocProviderCreator = ( - id, - doc, - { awareness } -): AffineSocketIOProvider => { - const dataSource = createAffineDataSource(id, doc, awareness); - const lazyProvider = createLazyProvider(doc, dataSource, { - origin: 'affine-socket-io', - }); - - Object.assign(lazyProvider, { flavour: 'affine-socket-io' }); - - return lazyProvider as unknown as AffineSocketIOProvider; -}; - -const createIndexedDBBackgroundProvider: DocProviderCreator = ( - id, - blockSuiteWorkspace -): LocalIndexedDBBackgroundProvider => { - const indexeddbProvider = create(blockSuiteWorkspace); - - let connected = false; - return { - flavour: 'local-indexeddb-background', - datasource: indexeddbProvider.datasource, - passive: true, - get status() { - return indexeddbProvider.status; - }, - subscribeStatusChange: indexeddbProvider.subscribeStatusChange, - get connected() { - return connected; - }, - cleanup: () => { - indexeddbProvider.cleanup().catch(console.error); - }, - connect: () => { - logger.info('connect indexeddb provider', id); - indexeddbProvider.connect(); - }, - disconnect: () => { - assertExists(indexeddbProvider); - logger.info('disconnect indexeddb provider', id); - indexeddbProvider.disconnect(); - connected = false; - }, - }; -}; - -const indexedDBDownloadOrigin = 'indexeddb-download-provider'; - -const createIndexedDBDownloadProvider: DocProviderCreator = ( - id, - doc -): LocalIndexedDBDownloadProvider => { - const datasource = createIndexedDBDatasource({}); - let _resolve: () => void; - let _reject: (error: unknown) => void; - const promise = new Promise((resolve, reject) => { - _resolve = resolve; - _reject = reject; - }); - - return { - flavour: 'local-indexeddb', - active: true, - get whenReady() { - return promise; - }, - cleanup: () => { - // todo: cleanup data - }, - sync: () => { - logger.info('sync indexeddb provider', id); - datasource - .queryDocState(doc.guid, { - stateVector: encodeStateVector(doc), - }) - .then(docState => { - if (docState) { - Y.applyUpdate(doc, docState.missing, indexedDBDownloadOrigin); - } - _resolve(); - }) - .catch(_reject); - }, - }; -}; - -export { - createAffineSocketIOProvider, - createBroadcastChannelProvider, - createIndexedDBBackgroundProvider, - createIndexedDBDownloadProvider, - createSQLiteDBDownloadProvider, - createSQLiteProvider, - downloadBinaryFromCloud, -}; +export * from './sync'; export const createLocalProviders = (): DocProviderCreator[] => { - const providers = [ - createIndexedDBBackgroundProvider, - createIndexedDBDownloadProvider, - ] as DocProviderCreator[]; + return [ + (_, doc, { awareness }) => { + const engine = new SyncEngine( + doc, + environment.isDesktop + ? createSQLiteStorage(doc.guid) + : createIndexedDBStorage(doc.guid), + [] + ); - if (runtimeConfig.enableBroadcastChannelProvider) { - providers.push(createBroadcastChannelProvider); - } + const awarenessProviders = [ + createBroadcastChannelAwarenessProvider(doc.guid, awareness), + ]; - if (environment.isDesktop && runtimeConfig.enableSQLiteProvider) { - providers.push(createSQLiteProvider, createSQLiteDBDownloadProvider); - } + let connected = false; - return providers; + return { + flavour: '_', + passive: true, + active: true, + sync() { + if (!connected) { + engine.start(); + + for (const provider of awarenessProviders) { + provider.connect(); + } + connected = true; + } + }, + get whenReady() { + return engine.waitForLoadedRootDoc(); + }, + connect() { + if (!connected) { + engine.start(); + + for (const provider of awarenessProviders) { + provider.connect(); + } + connected = true; + } + }, + disconnect() { + // TODO: actually disconnect + }, + get connected() { + return connected; + }, + engine, + }; + }, + ]; }; export const createAffineProviders = (): DocProviderCreator[] => { - return ( - [ - ...createLocalProviders(), - runtimeConfig.enableCloud && createAffineSocketIOProvider, - runtimeConfig.enableCloud && createMergeCloudSnapshotProvider, - ] as DocProviderCreator[] - ).filter(v => Boolean(v)); + return [ + (_, doc, { awareness }) => { + const engine = new SyncEngine( + doc, + environment.isDesktop + ? createSQLiteStorage(doc.guid) + : createIndexedDBStorage(doc.guid), + [createAffineStorage(doc.guid)] + ); + + const awarenessProviders = [ + createBroadcastChannelAwarenessProvider(doc.guid, awareness), + createAffineAwarenessProvider(doc.guid, awareness), + ]; + + let connected = false; + + return { + flavour: '_', + passive: true, + active: true, + sync() { + if (!connected) { + engine.start(); + + for (const provider of awarenessProviders) { + provider.connect(); + } + connected = true; + } + }, + get whenReady() { + return engine.waitForLoadedRootDoc(); + }, + connect() { + if (!connected) { + engine.start(); + + for (const provider of awarenessProviders) { + provider.connect(); + } + connected = true; + } + }, + disconnect() { + // TODO: actually disconnect + }, + get connected() { + return connected; + }, + engine, + }; + }, + ]; }; export const createAffinePublicProviders = (): DocProviderCreator[] => { - return [createCloudDownloadProvider]; + return []; }; diff --git a/packages/frontend/workspace/src/providers/logger.ts b/packages/frontend/workspace/src/providers/logger.ts deleted file mode 100644 index b9d2b1dd68..0000000000 --- a/packages/frontend/workspace/src/providers/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { DebugLogger } from '@affine/debug'; - -export const localProviderLogger = new DebugLogger('local-provider'); diff --git a/packages/frontend/workspace/src/providers/sqlite-providers.ts b/packages/frontend/workspace/src/providers/sqlite-providers.ts deleted file mode 100644 index 0369c65a27..0000000000 --- a/packages/frontend/workspace/src/providers/sqlite-providers.ts +++ /dev/null @@ -1,133 +0,0 @@ -import type { - SQLiteDBDownloadProvider, - SQLiteProvider, -} from '@affine/env/workspace'; -import { assertExists } from '@blocksuite/global/utils'; -import type { DocProviderCreator } from '@blocksuite/store'; -import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store'; -import { createLazyProvider, type DocDataSource } from 'y-provider'; -import type { Doc } from 'yjs'; - -import { localProviderLogger as logger } from './logger'; - -const Y = BlockSuiteWorkspace.Y; - -const sqliteOrigin = 'sqlite-provider-origin'; - -const createDatasource = (workspaceId: string): DocDataSource => { - if (!window.apis?.db) { - throw new Error('sqlite datasource is not available'); - } - - return { - queryDocState: async guid => { - const update = await window.apis.db.getDocAsUpdates( - workspaceId, - workspaceId === guid ? undefined : guid - ); - - if (update) { - return { - missing: update, - }; - } - - return false; - }, - sendDocUpdate: async (guid, update) => { - return window.apis.db.applyDocUpdate( - workspaceId, - update, - workspaceId === guid ? undefined : guid - ); - }, - }; -}; - -/** - * A provider that is responsible for syncing updates the workspace with the local SQLite database. - */ -export const createSQLiteProvider: DocProviderCreator = ( - id, - rootDoc -): SQLiteProvider => { - const datasource = createDatasource(id); - let provider: ReturnType | null = null; - let connected = false; - return { - flavour: 'sqlite', - datasource, - passive: true, - get status() { - assertExists(provider); - return provider.status; - }, - subscribeStatusChange(onStatusChange) { - assertExists(provider); - return provider.subscribeStatusChange(onStatusChange); - }, - connect: () => { - provider = createLazyProvider(rootDoc, datasource, { origin: 'sqlite' }); - provider.connect(); - connected = true; - }, - disconnect: () => { - provider?.disconnect(); - provider = null; - connected = false; - }, - get connected() { - return connected; - }, - }; -}; - -/** - * A provider that is responsible for DOWNLOADING updates from the local SQLite database. - */ -export const createSQLiteDBDownloadProvider: DocProviderCreator = ( - id, - rootDoc -): SQLiteDBDownloadProvider => { - const { apis } = window; - - let _resolve: () => void; - let _reject: (error: unknown) => void; - const promise = new Promise((resolve, reject) => { - _resolve = resolve; - _reject = reject; - }); - - async function syncUpdates(doc: Doc) { - logger.info('syncing updates from sqlite', doc.guid); - const subdocId = doc.guid === id ? undefined : doc.guid; - const updates = await apis.db.getDocAsUpdates(id, subdocId); - - if (updates) { - Y.applyUpdate(doc, updates, sqliteOrigin); - } - - return true; - } - - return { - flavour: 'sqlite-download', - active: true, - get whenReady() { - return promise; - }, - cleanup: () => { - // todo - }, - sync: () => { - logger.info('connect sqlite download provider', id); - syncUpdates(rootDoc) - .then(() => { - _resolve(); - }) - .catch(error => { - _reject(error); - }); - }, - }; -}; diff --git a/packages/frontend/workspace/src/affine/batch-sync-sender.ts b/packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts similarity index 100% rename from packages/frontend/workspace/src/affine/batch-sync-sender.ts rename to packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts diff --git a/packages/frontend/workspace/src/providers/storage/affine/index.ts b/packages/frontend/workspace/src/providers/storage/affine/index.ts new file mode 100644 index 0000000000..622ef8b6b4 --- /dev/null +++ b/packages/frontend/workspace/src/providers/storage/affine/index.ts @@ -0,0 +1,162 @@ +import { DebugLogger } from '@affine/debug'; + +import { getIoManager } from '../../utils/affine-io'; +import { base64ToUint8Array, uint8ArrayToBase64 } from '../../utils/base64'; +import type { Storage } from '..'; +import { MultipleBatchSyncSender } from './batch-sync-sender'; + +const logger = new DebugLogger('affine:storage:socketio'); + +export function createAffineStorage( + workspaceId: string +): Storage & { disconnect: () => void } { + logger.debug('createAffineStorage', workspaceId); + const socket = getIoManager().socket('/'); + + const syncSender = new MultipleBatchSyncSender(async (guid, updates) => { + const payload = await Promise.all( + updates.map(update => uint8ArrayToBase64(update)) + ); + + return new Promise(resolve => { + socket.emit( + 'client-update-v2', + { + workspaceId, + guid, + updates: payload, + }, + (response: { + // TODO: reuse `EventError` with server + error?: any; + data: any; + }) => { + // TODO: raise error with different code to users + if (response.error) { + logger.error('client-update-v2 error', { + workspaceId, + guid, + response, + }); + } + + resolve({ + accepted: !response.error, + // TODO: reuse `EventError` with server + retry: response.error?.code === 'INTERNAL', + }); + } + ); + }); + }); + + // TODO: handle error + socket.on('connect', () => { + socket.emit( + 'client-handshake', + workspaceId, + (response: { error?: any }) => { + if (!response.error) { + syncSender.start(); + } + } + ); + }); + + socket.connect(); + + return { + name: 'socketio', + async pull(docId, state) { + const stateVector = state ? await uint8ArrayToBase64(state) : undefined; + + return new Promise((resolve, reject) => { + logger.debug('doc-load-v2', { + workspaceId: workspaceId, + guid: docId, + stateVector, + }); + socket.emit( + 'doc-load-v2', + { + workspaceId: workspaceId, + guid: docId, + stateVector, + }, + ( + response: // TODO: reuse `EventError` with server + { error: any } | { data: { missing: string; state: string } } + ) => { + logger.debug('doc-load callback', { + workspaceId: workspaceId, + guid: docId, + stateVector, + response, + }); + + if ('error' in response) { + // TODO: result `EventError` with server + if (response.error.code === 'DOC_NOT_FOUND') { + resolve(null); + } else { + reject(new Error(response.error.message)); + } + } else { + resolve({ + data: base64ToUint8Array(response.data.missing), + state: response.data.state + ? base64ToUint8Array(response.data.state) + : undefined, + }); + } + } + ); + }); + }, + async push(docId, update) { + logger.debug('client-update-v2', { + workspaceId, + guid: docId, + update, + }); + + await syncSender.send(docId, update); + }, + async subscribe(cb, disconnect) { + const response: { error?: any } = await socket + .timeout(10000) + .emitWithAck('client-handshake', workspaceId); + + if (response.error) { + throw new Error('client-handshake error, ' + response.error); + } + + const handleUpdate = async (message: { + workspaceId: string; + guid: string; + updates: string[]; + }) => { + if (message.workspaceId === workspaceId) { + message.updates.forEach(update => { + cb(message.guid, base64ToUint8Array(update)); + }); + } + }; + socket.on('server-updates', handleUpdate); + + socket.on('disconnect', reason => { + socket.off('server-updates', handleUpdate); + disconnect(reason); + }); + + return () => { + socket.off('server-updates', handleUpdate); + }; + }, + disconnect() { + syncSender.stop(); + socket.emit('client-leave', workspaceId); + socket.disconnect(); + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/storage/index.ts b/packages/frontend/workspace/src/providers/storage/index.ts new file mode 100644 index 0000000000..f9847f195a --- /dev/null +++ b/packages/frontend/workspace/src/providers/storage/index.ts @@ -0,0 +1,29 @@ +export interface Storage { + /** + * for debug + */ + name: string; + + pull( + docId: string, + state: Uint8Array + ): Promise<{ data: Uint8Array; state?: Uint8Array } | null>; + push(docId: string, data: Uint8Array): Promise; + + /** + * Subscribe to updates from peer + * + * @param cb callback to handle updates + * @param disconnect callback to handle disconnect, reason can be something like 'network-error' + * + * @returns unsubscribe function + */ + subscribe( + cb: (docId: string, data: Uint8Array) => void, + disconnect: (reason: string) => void + ): Promise<() => void>; +} + +export * from './affine'; +export * from './indexeddb'; +export * from './sqlite'; diff --git a/packages/frontend/workspace/src/providers/storage/indexeddb/index.ts b/packages/frontend/workspace/src/providers/storage/indexeddb/index.ts new file mode 100644 index 0000000000..51a47d352f --- /dev/null +++ b/packages/frontend/workspace/src/providers/storage/indexeddb/index.ts @@ -0,0 +1,139 @@ +import { type DBSchema, type IDBPDatabase, openDB } from 'idb'; +import { + applyUpdate, + diffUpdate, + Doc, + encodeStateAsUpdate, + encodeStateVectorFromUpdate, +} from 'yjs'; + +import type { Storage } from '..'; + +export const dbVersion = 1; +export const DEFAULT_DB_NAME = 'affine-local'; + +export function mergeUpdates(updates: Uint8Array[]) { + if (updates.length === 0) { + return new Uint8Array(); + } + if (updates.length === 1) { + return updates[0]; + } + const doc = new Doc(); + doc.transact(() => { + updates.forEach(update => { + applyUpdate(doc, update); + }); + }); + return encodeStateAsUpdate(doc); +} + +type UpdateMessage = { + timestamp: number; + update: Uint8Array; +}; + +type WorkspacePersist = { + id: string; + updates: UpdateMessage[]; +}; + +interface BlockSuiteBinaryDB extends DBSchema { + workspace: { + key: string; + value: WorkspacePersist; + }; + milestone: { + key: string; + value: unknown; + }; +} + +export function upgradeDB(db: IDBPDatabase) { + db.createObjectStore('workspace', { keyPath: 'id' }); + db.createObjectStore('milestone', { keyPath: 'id' }); +} + +type ChannelMessage = { + type: 'db-updated'; + payload: { docId: string; update: Uint8Array }; +}; + +export function createIndexedDBStorage( + workspaceId: string, + dbName = DEFAULT_DB_NAME, + mergeCount = 1 +): Storage { + let dbPromise: Promise> | null = null; + const getDb = async () => { + if (dbPromise === null) { + dbPromise = openDB(dbName, dbVersion, { + upgrade: upgradeDB, + }); + } + return dbPromise; + }; + + // indexeddb could be shared between tabs, so we use broadcast channel to notify other tabs + const channel = new BroadcastChannel('indexeddb:' + workspaceId); + + return { + name: 'indexeddb', + async pull(docId, state) { + const db = await getDb(); + const store = db + .transaction('workspace', 'readonly') + .objectStore('workspace'); + const data = await store.get(docId); + + if (!data) { + return null; + } + + const { updates } = data; + const update = mergeUpdates(updates.map(({ update }) => update)); + + const diff = state ? diffUpdate(update, state) : update; + + return { data: diff, state: encodeStateVectorFromUpdate(update) }; + }, + async push(docId, update) { + const db = await getDb(); + const store = db + .transaction('workspace', 'readwrite') + .objectStore('workspace'); + + // TODO: maybe we do not need to get data every time + const { updates } = (await store.get(docId)) ?? { updates: [] }; + let rows: UpdateMessage[] = [ + ...updates, + { timestamp: Date.now(), update }, + ]; + if (mergeCount && rows.length >= mergeCount) { + const merged = mergeUpdates(rows.map(({ update }) => update)); + rows = [{ timestamp: Date.now(), update: merged }]; + } + await store.put({ + id: docId, + updates: rows, + }); + channel.postMessage({ + type: 'db-updated', + payload: { docId, update }, + } satisfies ChannelMessage); + }, + async subscribe(cb, _disconnect) { + function onMessage(event: MessageEvent) { + const { type, payload } = event.data; + if (type === 'db-updated') { + const { docId, update } = payload; + cb(docId, update); + } + } + channel.addEventListener('message', onMessage); + return () => { + channel.removeEventListener('message', onMessage); + }; + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/storage/sqlite/index.ts b/packages/frontend/workspace/src/providers/storage/sqlite/index.ts new file mode 100644 index 0000000000..be7dafd45d --- /dev/null +++ b/packages/frontend/workspace/src/providers/storage/sqlite/index.ts @@ -0,0 +1,38 @@ +import { encodeStateVectorFromUpdate } from 'yjs'; + +import type { Storage } from '..'; + +export function createSQLiteStorage(workspaceId: string): Storage { + if (!window.apis?.db) { + throw new Error('sqlite datasource is not available'); + } + + return { + name: 'sqlite', + async pull(docId, _state) { + const update = await window.apis.db.getDocAsUpdates( + workspaceId, + workspaceId === docId ? undefined : docId + ); + + if (update) { + return { + data: update, + state: encodeStateVectorFromUpdate(update), + }; + } + + return null; + }, + async push(docId, data) { + return window.apis.db.applyDocUpdate( + workspaceId, + data, + workspaceId === docId ? undefined : docId + ); + }, + async subscribe(_cb, _disconnect) { + return () => {}; + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/sync/__tests__/engine.spec.ts b/packages/frontend/workspace/src/providers/sync/__tests__/engine.spec.ts new file mode 100644 index 0000000000..6e9028caa5 --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/__tests__/engine.spec.ts @@ -0,0 +1,172 @@ +import 'fake-indexeddb/auto'; + +import { setTimeout } from 'node:timers/promises'; + +import { __unstableSchemas, AffineSchemas } from '@blocksuite/blocks/models'; +import { Schema, Workspace } from '@blocksuite/store'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { Doc } from 'yjs'; + +import { createIndexedDBStorage } from '../../storage'; +import { SyncEngine, SyncEngineStep, SyncPeerStep } from '../'; +import { createTestStorage } from './test-storage'; + +const schema = new Schema(); + +schema.register(AffineSchemas).register(__unstableSchemas); + +beforeEach(() => { + vi.useFakeTimers({ toFake: ['requestIdleCallback'] }); +}); + +describe('SyncEngine', () => { + test('basic - indexeddb', async () => { + let prev: any; + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + + const syncEngine = new SyncEngine( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid), + [ + createIndexedDBStorage(workspace.doc.guid + '1'), + createIndexedDBStorage(workspace.doc.guid + '2'), + ] + ); + syncEngine.start(); + + const page = workspace.createPage({ + id: 'page0', + }); + await page.load(); + const pageBlockId = page.addBlock('affine:page', { + title: new page.Text(''), + }); + page.addBlock('affine:surface', {}, pageBlockId); + const frameId = page.addBlock('affine:note', {}, pageBlockId); + page.addBlock('affine:paragraph', {}, frameId); + await syncEngine.waitForSynced(); + syncEngine.stop(); + prev = workspace.doc.toJSON(); + } + + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + const syncEngine = new SyncEngine( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid), + [] + ); + syncEngine.start(); + await syncEngine.waitForSynced(); + expect(workspace.doc.toJSON()).toEqual({ + ...prev, + }); + syncEngine.stop(); + } + + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + const syncEngine = new SyncEngine( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid + '1'), + [] + ); + syncEngine.start(); + await syncEngine.waitForSynced(); + expect(workspace.doc.toJSON()).toEqual({ + ...prev, + }); + syncEngine.stop(); + } + + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + const syncEngine = new SyncEngine( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid + '2'), + [] + ); + syncEngine.start(); + await syncEngine.waitForSynced(); + expect(workspace.doc.toJSON()).toEqual({ + ...prev, + }); + syncEngine.stop(); + } + }); + + test('status', async () => { + const ydoc = new Doc({ guid: 'test - status' }); + + const localStorage = createTestStorage(createIndexedDBStorage(ydoc.guid)); + const remoteStorage = createTestStorage(createIndexedDBStorage(ydoc.guid)); + + localStorage.pausePull(); + localStorage.pausePush(); + remoteStorage.pausePull(); + remoteStorage.pausePush(); + + const syncEngine = new SyncEngine(ydoc, localStorage, [remoteStorage]); + expect(syncEngine.status.step).toEqual(SyncEngineStep.Stopped); + + syncEngine.start(); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Syncing); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.LoadingRootDoc); + + localStorage.resumePull(); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Syncing); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.Synced); + expect(syncEngine.status.remotes[0]?.step).toEqual( + SyncPeerStep.LoadingRootDoc + ); + + remoteStorage.resumePull(); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Synced); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.Synced); + expect(syncEngine.status.remotes[0]?.step).toEqual(SyncPeerStep.Synced); + + ydoc.getArray('test').insert(0, [1, 2, 3]); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Syncing); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.Syncing); + expect(syncEngine.status.remotes[0]?.step).toEqual(SyncPeerStep.Syncing); + + localStorage.resumePush(); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Syncing); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.Synced); + expect(syncEngine.status.remotes[0]?.step).toEqual(SyncPeerStep.Syncing); + + remoteStorage.resumePush(); + await setTimeout(100); + + expect(syncEngine.status.step).toEqual(SyncEngineStep.Synced); + expect(syncEngine.status.local?.step).toEqual(SyncPeerStep.Synced); + expect(syncEngine.status.remotes[0]?.step).toEqual(SyncPeerStep.Synced); + }); +}); diff --git a/packages/frontend/workspace/src/providers/sync/__tests__/peer.spec.ts b/packages/frontend/workspace/src/providers/sync/__tests__/peer.spec.ts new file mode 100644 index 0000000000..db605a89a4 --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/__tests__/peer.spec.ts @@ -0,0 +1,94 @@ +import 'fake-indexeddb/auto'; + +import { __unstableSchemas, AffineSchemas } from '@blocksuite/blocks/models'; +import { Schema, Workspace } from '@blocksuite/store'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; + +import { createIndexedDBStorage } from '../../storage'; +import { SyncPeer, SyncPeerStep } from '../'; + +const schema = new Schema(); + +schema.register(AffineSchemas).register(__unstableSchemas); + +beforeEach(() => { + vi.useFakeTimers({ toFake: ['requestIdleCallback'] }); +}); + +describe('SyncPeer', () => { + test('basic - indexeddb', async () => { + let prev: any; + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + + const syncPeer = new SyncPeer( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid) + ); + await syncPeer.waitForLoaded(); + + const page = workspace.createPage({ + id: 'page0', + }); + await page.load(); + const pageBlockId = page.addBlock('affine:page', { + title: new page.Text(''), + }); + page.addBlock('affine:surface', {}, pageBlockId); + const frameId = page.addBlock('affine:note', {}, pageBlockId); + page.addBlock('affine:paragraph', {}, frameId); + await syncPeer.waitForSynced(); + syncPeer.stop(); + prev = workspace.doc.toJSON(); + } + + { + const workspace = new Workspace({ + id: 'test', + isSSR: true, + schema, + }); + const syncPeer = new SyncPeer( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid) + ); + await syncPeer.waitForSynced(); + expect(workspace.doc.toJSON()).toEqual({ + ...prev, + }); + syncPeer.stop(); + } + }); + + test('status', async () => { + const workspace = new Workspace({ + id: 'test - status', + isSSR: true, + schema, + }); + + const syncPeer = new SyncPeer( + workspace.doc, + createIndexedDBStorage(workspace.doc.guid) + ); + expect(syncPeer.status.step).toBe(SyncPeerStep.LoadingRootDoc); + await syncPeer.waitForSynced(); + expect(syncPeer.status.step).toBe(SyncPeerStep.Synced); + + const page = workspace.createPage({ + id: 'page0', + }); + expect(syncPeer.status.step).toBe(SyncPeerStep.LoadingSubDoc); + await page.load(); + await syncPeer.waitForSynced(); + page.addBlock('affine:page', { + title: new page.Text(''), + }); + expect(syncPeer.status.step).toBe(SyncPeerStep.Syncing); + syncPeer.stop(); + }); +}); diff --git a/packages/frontend/workspace/src/providers/sync/__tests__/test-storage.ts b/packages/frontend/workspace/src/providers/sync/__tests__/test-storage.ts new file mode 100644 index 0000000000..ab5390e0e8 --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/__tests__/test-storage.ts @@ -0,0 +1,42 @@ +import type { Storage } from '../../storage'; + +export function createTestStorage(origin: Storage) { + const controler = { + pausedPull: Promise.resolve(), + resumePull: () => {}, + pausedPush: Promise.resolve(), + resumePush: () => {}, + }; + + return { + name: `${origin.name}(testing)`, + pull(docId: string, state: Uint8Array) { + return controler.pausedPull.then(() => origin.pull(docId, state)); + }, + push(docId: string, data: Uint8Array) { + return controler.pausedPush.then(() => origin.push(docId, data)); + }, + subscribe( + cb: (docId: string, data: Uint8Array) => void, + disconnect: (reason: string) => void + ) { + return origin.subscribe(cb, disconnect); + }, + pausePull() { + controler.pausedPull = new Promise(resolve => { + controler.resumePull = resolve; + }); + }, + resumePull() { + controler.resumePull?.(); + }, + pausePush() { + controler.pausedPush = new Promise(resolve => { + controler.resumePush = resolve; + }); + }, + resumePush() { + controler.resumePush?.(); + }, + }; +} diff --git a/packages/frontend/workspace/src/providers/sync/engine.ts b/packages/frontend/workspace/src/providers/sync/engine.ts new file mode 100644 index 0000000000..ae723708c6 --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/engine.ts @@ -0,0 +1,247 @@ +import { DebugLogger } from '@affine/debug'; +import { Slot } from '@blocksuite/global/utils'; +import type { Doc } from 'yjs'; + +import type { Storage } from '../storage'; +import { SyncPeer, type SyncPeerStatus, SyncPeerStep } from './peer'; + +export const MANUALLY_STOP = 'manually-stop'; + +export enum SyncEngineStep { + Stopped = 0, + Syncing = 1, + Synced = 2, +} + +export interface SyncEngineStatus { + step: SyncEngineStep; + local: SyncPeerStatus | null; + remotes: (SyncPeerStatus | null)[]; + retrying: boolean; +} + +/** + * # SyncEngine + * + * ``` + * ┌────────────┐ + * │ SyncEngine │ + * └─────┬──────┘ + * │ + * ▼ + * ┌────────────┐ + * │ SyncPeer │ + * ┌─────────┤ local ├─────────┐ + * │ └─────┬──────┘ │ + * │ │ │ + * ▼ ▼ ▼ + * ┌────────────┐ ┌────────────┐ ┌────────────┐ + * │ SyncPeer │ │ SyncPeer │ │ SyncPeer │ + * │ Remote │ │ Remote │ │ Remote │ + * └────────────┘ └────────────┘ └────────────┘ + * ``` + * + * Sync engine manage sync peers + * + * Sync steps: + * 1. start local sync + * 2. wait for local sync complete + * 3. start remote sync + * 4. continuously sync local and remote + */ +export class SyncEngine { + get rootDocId() { + return this.rootDoc.guid; + } + + logger = new DebugLogger('affine:sync-engine:' + this.rootDocId); + private _status: SyncEngineStatus; + onStatusChange = new Slot(); + private set status(s: SyncEngineStatus) { + this.logger.info('status change', SyncEngineStep[s.step]); + this._status = s; + this.onStatusChange.emit(s); + } + + get status() { + return this._status; + } + + private abort = new AbortController(); + + constructor( + private rootDoc: Doc, + private local: Storage, + private remotes: Storage[] + ) { + this._status = { + step: SyncEngineStep.Stopped, + local: null, + remotes: remotes.map(() => null), + retrying: false, + }; + } + + start() { + if (this.status.step !== SyncEngineStep.Stopped) { + this.stop(); + } + this.abort = new AbortController(); + + this.sync(this.abort.signal).catch(err => { + // should never reach here + this.logger.error(err); + }); + } + + stop() { + this.abort.abort(MANUALLY_STOP); + this._status = { + step: SyncEngineStep.Stopped, + local: null, + remotes: this.remotes.map(() => null), + retrying: false, + }; + } + + // main sync process, should never return until abort + async sync(signal: AbortSignal) { + const state: { + localPeer: SyncPeer | null; + remotePeers: (SyncPeer | null)[]; + } = { + localPeer: null, + remotePeers: this.remotes.map(() => null), + }; + + const cleanUp: (() => void)[] = []; + try { + // Step 1: start local sync peer + state.localPeer = new SyncPeer(this.rootDoc, this.local); + + cleanUp.push( + state.localPeer.onStatusChange.on(() => { + if (!signal.aborted) + this.updateSyncingState(state.localPeer, state.remotePeers); + }).dispose + ); + + this.updateSyncingState(state.localPeer, state.remotePeers); + + // Step 2: wait for local sync complete + await state.localPeer.waitForLoaded(signal); + + // Step 3: start remote sync peer + state.remotePeers = this.remotes.map(remote => { + const peer = new SyncPeer(this.rootDoc, remote); + cleanUp.push( + peer.onStatusChange.on(() => { + if (!signal.aborted) + this.updateSyncingState(state.localPeer, state.remotePeers); + }).dispose + ); + return peer; + }); + + this.updateSyncingState(state.localPeer, state.remotePeers); + + // Step 4: continuously sync local and remote + + // wait for abort + await new Promise((_, reject) => { + if (signal.aborted) { + reject(signal.reason); + } + signal.addEventListener('abort', () => { + reject(signal.reason); + }); + }); + } catch (error) { + if (error === MANUALLY_STOP) { + return; + } + throw error; + } finally { + // stop peers + state.localPeer?.stop(); + for (const remotePeer of state.remotePeers) { + remotePeer?.stop(); + } + for (const clean of cleanUp) { + clean(); + } + } + } + + updateSyncingState(local: SyncPeer | null, remotes: (SyncPeer | null)[]) { + let step = SyncEngineStep.Synced; + const allPeer = [local, ...remotes]; + for (const peer of allPeer) { + if (!peer || peer.status.step !== SyncPeerStep.Synced) { + step = SyncEngineStep.Syncing; + break; + } + } + this.status = { + step, + local: local?.status ?? null, + remotes: remotes.map(peer => peer?.status ?? null), + retrying: allPeer.some( + peer => peer?.status.step === SyncPeerStep.Retrying + ), + }; + } + + async waitForSynced(abort?: AbortSignal) { + if (this.status.step == SyncEngineStep.Synced) { + return; + } else { + return Promise.race([ + new Promise(resolve => { + this.onStatusChange.on(status => { + if (status.step == SyncEngineStep.Synced) { + resolve(); + } + }); + }), + new Promise((_, reject) => { + if (abort?.aborted) { + reject(abort?.reason); + } + abort?.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + } + } + + async waitForLoadedRootDoc(abort?: AbortSignal) { + function isLoadedRootDoc(status: SyncEngineStatus) { + return ![status.local, ...status.remotes].some( + peer => !peer || peer.step <= SyncPeerStep.LoadingRootDoc + ); + } + if (isLoadedRootDoc(this.status)) { + return; + } else { + return Promise.race([ + new Promise(resolve => { + this.onStatusChange.on(status => { + if (isLoadedRootDoc(status)) { + resolve(); + } + }); + }), + new Promise((_, reject) => { + if (abort?.aborted) { + reject(abort?.reason); + } + abort?.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + } + } +} diff --git a/packages/frontend/workspace/src/providers/sync/index.ts b/packages/frontend/workspace/src/providers/sync/index.ts new file mode 100644 index 0000000000..882fbe154a --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/index.ts @@ -0,0 +1,18 @@ +/** + * + * **SyncEngine** + * + * Manages one local storage and multiple remote storages. + * + * Responsible for creating SyncPeers for synchronization, following the local-first strategy. + * + * **SyncPeer** + * + * Responsible for synchronizing a single storage with Y.Doc. + * + * Carries the main synchronization logic. + * + */ + +export * from './engine'; +export * from './peer'; diff --git a/packages/frontend/workspace/src/providers/sync/peer.ts b/packages/frontend/workspace/src/providers/sync/peer.ts new file mode 100644 index 0000000000..ecca8106a7 --- /dev/null +++ b/packages/frontend/workspace/src/providers/sync/peer.ts @@ -0,0 +1,448 @@ +import { DebugLogger } from '@affine/debug'; +import { Slot } from '@blocksuite/global/utils'; +import { isEqual } from '@blocksuite/global/utils'; +import type { Doc } from 'yjs'; +import { applyUpdate, encodeStateAsUpdate, encodeStateVector } from 'yjs'; + +import { mergeUpdates, type Storage } from '../storage'; +import { AsyncQueue } from '../utils/async-queue'; +import { throwIfAborted } from '../utils/throw-if-aborted'; +import { MANUALLY_STOP } from './engine'; + +export enum SyncPeerStep { + Stopped = 0, + Retrying = 1, + LoadingRootDoc = 2, + LoadingSubDoc = 3, + Loaded = 4.5, + Syncing = 5, + Synced = 6, +} + +export interface SyncPeerStatus { + step: SyncPeerStep; + totalDocs: number; + loadedDocs: number; + pendingPullUpdates: number; + pendingPushUpdates: number; +} + +/** + * # SyncPeer + * A SyncPeer is responsible for syncing one Storage with one Y.Doc and its subdocs. + * + * ``` + * ┌─────┐ + * │Start│ + * └──┬──┘ + * │ + * ┌──────┐ ┌─────▼──────┐ ┌────┐ + * │listen◄─────┤pull rootdoc│ │peer│ + * └──┬───┘ └─────┬──────┘ └──┬─┘ + * │ │ onLoad() │ + * ┌──▼───┐ ┌─────▼──────┐ ┌────▼────┐ + * │listen◄─────┤pull subdocs│ │subscribe│ + * └──┬───┘ └─────┬──────┘ └────┬────┘ + * │ │ onReady() │ + * ┌──▼──┐ ┌─────▼───────┐ ┌──▼──┐ + * │queue├──────►apply updates◄───────┤queue│ + * └─────┘ └─────────────┘ └─────┘ + * ``` + * + * listen: listen for updates from ydoc, typically from user modifications. + * subscribe: listen for updates from storage, typically from other users. + * + */ +export class SyncPeer { + private _status: SyncPeerStatus = { + step: SyncPeerStep.LoadingRootDoc, + totalDocs: 1, + loadedDocs: 0, + pendingPullUpdates: 0, + pendingPushUpdates: 0, + }; + onStatusChange = new Slot(); + abort = new AbortController(); + get name() { + return this.storage.name; + } + logger = new DebugLogger('affine:sync-peer:' + this.name); + + constructor( + private rootDoc: Doc, + private storage: Storage + ) { + this.logger.debug('peer start'); + + this.syncRetryLoop(this.abort.signal).catch(err => { + // should not reach here + console.error(err); + }); + } + + private set status(s: SyncPeerStatus) { + if (!isEqual(s, this._status)) { + this.logger.debug('status change', s); + this._status = s; + this.onStatusChange.emit(s); + } + } + + get status() { + return this._status; + } + + /** + * stop sync + * + * SyncPeer is one-time use, this peer should be discarded after call stop(). + */ + stop() { + this.logger.debug('peer stop'); + this.abort.abort(MANUALLY_STOP); + } + + /** + * auto retry after 5 seconds if sync failed + */ + async syncRetryLoop(abort: AbortSignal) { + while (abort.aborted === false) { + try { + await this.sync(abort); + } catch (err) { + if (err === MANUALLY_STOP) { + return; + } + + this.logger.error('sync error', err); + } + try { + this.logger.error('retry after 5 seconds'); + this.status = { + step: SyncPeerStep.Retrying, + totalDocs: 1, + loadedDocs: 0, + pendingPullUpdates: 0, + pendingPushUpdates: 0, + }; + await Promise.race([ + new Promise(resolve => { + setTimeout(resolve, 5 * 1000); + }), + new Promise((_, reject) => { + // exit if manually stopped + if (abort.aborted) { + reject(abort.reason); + } + abort.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + } catch (err) { + if (err === MANUALLY_STOP) { + return; + } + + // should never reach here + throw err; + } + } + } + + private state: { + connectedDocs: Map; + pushUpdatesQueue: AsyncQueue<{ + docId: string; + data: Uint8Array[]; + }>; + pushingUpdate: boolean; + pullUpdatesQueue: AsyncQueue<{ + docId: string; + data: Uint8Array; + }>; + subdocLoading: boolean; + subdocsLoadQueue: AsyncQueue; + } = { + connectedDocs: new Map(), + pushUpdatesQueue: new AsyncQueue(), + pushingUpdate: false, + pullUpdatesQueue: new AsyncQueue(), + subdocLoading: false, + subdocsLoadQueue: new AsyncQueue(), + }; + + initState() { + this.state.connectedDocs.clear(); + this.state.pushUpdatesQueue.clear(); + this.state.pullUpdatesQueue.clear(); + this.state.subdocsLoadQueue.clear(); + this.state.pushingUpdate = false; + this.state.subdocLoading = false; + } + + /** + * main synchronization logic + */ + async sync(abortOuter: AbortSignal) { + this.initState(); + const abortInner = new AbortController(); + + abortOuter.addEventListener('abort', reason => { + abortInner.abort(reason); + }); + + let dispose: (() => void) | null = null; + try { + this.reportSyncStatus(); + + // start listen storage updates + dispose = await this.storage.subscribe( + this.handleStorageUpdates, + reason => { + // abort if storage disconnect, should trigger retry loop + abortInner.abort('subscribe disconnect:' + reason); + } + ); + throwIfAborted(abortInner.signal); + + // Step 1: load root doc + await this.connectDoc(this.rootDoc, abortInner.signal); + + // Step 2: load subdocs + this.state.subdocsLoadQueue.push( + ...Array.from(this.rootDoc.getSubdocs()) + ); + this.reportSyncStatus(); + + this.rootDoc.on('subdocs', this.handleSubdocsUpdate); + + // Finally: start sync + await Promise.all([ + // load subdocs + (async () => { + while (throwIfAborted(abortInner.signal)) { + const subdoc = await this.state.subdocsLoadQueue.next( + abortInner.signal + ); + this.state.subdocLoading = true; + this.reportSyncStatus(); + await this.connectDoc(subdoc, abortInner.signal); + this.state.subdocLoading = false; + this.reportSyncStatus(); + } + })(), + // pull updates + (async () => { + while (throwIfAborted(abortInner.signal)) { + const { docId, data } = await this.state.pullUpdatesQueue.next( + abortInner.signal + ); + // don't apply empty data or Uint8Array([0, 0]) + if ( + !( + data.byteLength === 0 || + (data.byteLength === 2 && data[0] === 0 && data[1] === 0) + ) + ) { + const subdoc = this.state.connectedDocs.get(docId); + if (subdoc) { + applyUpdate(subdoc, data, this.name); + } + } + this.reportSyncStatus(); + } + })(), + // push updates + (async () => { + while (throwIfAborted(abortInner.signal)) { + const { docId, data } = await this.state.pushUpdatesQueue.next( + abortInner.signal + ); + this.state.pushingUpdate = true; + this.reportSyncStatus(); + + const merged = mergeUpdates(data); + + // don't push empty data or Uint8Array([0, 0]) + if ( + !( + merged.byteLength === 0 || + (merged.byteLength === 2 && merged[0] === 0 && merged[1] === 0) + ) + ) { + await this.storage.push(docId, merged); + } + + this.state.pushingUpdate = false; + this.reportSyncStatus(); + } + })(), + ]); + } finally { + dispose?.(); + for (const docs of this.state.connectedDocs.values()) { + this.disconnectDoc(docs); + } + this.rootDoc.off('subdocs', this.handleSubdocsUpdate); + } + } + + async connectDoc(doc: Doc, abort: AbortSignal) { + const { data: docData, state: inStorageState } = + (await this.storage.pull(doc.guid, encodeStateVector(doc))) ?? {}; + throwIfAborted(abort); + + if (docData) { + applyUpdate(doc, docData, 'load'); + } + + // diff root doc and in-storage, save updates to pendingUpdates + this.state.pushUpdatesQueue.push({ + docId: doc.guid, + data: [encodeStateAsUpdate(doc, inStorageState)], + }); + + this.state.connectedDocs.set(doc.guid, doc); + + // start listen root doc changes + doc.on('update', this.handleYDocUpdates); + + // mark rootDoc as loaded + doc.emit('sync', [true]); + + this.reportSyncStatus(); + } + + disconnectDoc(doc: Doc) { + doc.off('update', this.handleYDocUpdates); + this.state.connectedDocs.delete(doc.guid); + this.reportSyncStatus(); + } + + // handle updates from ydoc + handleYDocUpdates = (update: Uint8Array, origin: string, doc: Doc) => { + // don't push updates from storage + if (origin === this.name) { + return; + } + + const exist = this.state.pushUpdatesQueue.find( + ({ docId }) => docId === doc.guid + ); + if (exist) { + exist.data.push(update); + } else { + this.state.pushUpdatesQueue.push({ + docId: doc.guid, + data: [update], + }); + } + + this.reportSyncStatus(); + }; + + // handle subdocs changes, append new subdocs to queue, remove subdocs from queue + handleSubdocsUpdate = ({ + added, + removed, + }: { + added: Set; + removed: Set; + }) => { + for (const subdoc of added) { + this.state.subdocsLoadQueue.push(subdoc); + } + + for (const subdoc of removed) { + this.disconnectDoc(subdoc); + this.state.subdocsLoadQueue.remove(doc => doc === subdoc); + } + this.reportSyncStatus(); + }; + + // handle updates from storage + handleStorageUpdates = (docId: string, data: Uint8Array) => { + this.state.pullUpdatesQueue.push({ + docId, + data, + }); + this.reportSyncStatus(); + }; + + reportSyncStatus() { + let step; + if (this.state.connectedDocs.size === 0) { + step = SyncPeerStep.LoadingRootDoc; + } else if (this.state.subdocsLoadQueue.length || this.state.subdocLoading) { + step = SyncPeerStep.LoadingSubDoc; + } else if ( + this.state.pullUpdatesQueue.length || + this.state.pushUpdatesQueue.length || + this.state.pushingUpdate + ) { + step = SyncPeerStep.Syncing; + } else { + step = SyncPeerStep.Synced; + } + + this.status = { + step: step, + totalDocs: + this.state.connectedDocs.size + this.state.subdocsLoadQueue.length, + loadedDocs: this.state.connectedDocs.size, + pendingPullUpdates: + this.state.pullUpdatesQueue.length + (this.state.subdocLoading ? 1 : 0), + pendingPushUpdates: + this.state.pushUpdatesQueue.length + (this.state.pushingUpdate ? 1 : 0), + }; + } + + async waitForSynced(abort?: AbortSignal) { + if (this.status.step >= SyncPeerStep.Synced) { + return; + } else { + return Promise.race([ + new Promise(resolve => { + this.onStatusChange.on(status => { + if (status.step >= SyncPeerStep.Synced) { + resolve(); + } + }); + }), + new Promise((_, reject) => { + if (abort?.aborted) { + reject(abort?.reason); + } + abort?.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + } + } + + async waitForLoaded(abort?: AbortSignal) { + if (this.status.step > SyncPeerStep.Loaded) { + return; + } else { + return Promise.race([ + new Promise(resolve => { + this.onStatusChange.on(status => { + if (status.step > SyncPeerStep.Loaded) { + resolve(); + } + }); + }), + new Promise((_, reject) => { + if (abort?.aborted) { + reject(abort?.reason); + } + abort?.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + } + } +} diff --git a/packages/frontend/workspace/src/providers/utils/__tests__/async-queue.spec.ts b/packages/frontend/workspace/src/providers/utils/__tests__/async-queue.spec.ts new file mode 100644 index 0000000000..017401ec84 --- /dev/null +++ b/packages/frontend/workspace/src/providers/utils/__tests__/async-queue.spec.ts @@ -0,0 +1,45 @@ +import { describe, expect, test, vi } from 'vitest'; + +import { AsyncQueue } from '../async-queue'; + +describe('async-queue', () => { + test('push & pop', async () => { + const queue = new AsyncQueue(); + queue.push(1, 2, 3); + expect(queue.length).toBe(3); + expect(await queue.next()).toBe(1); + expect(await queue.next()).toBe(2); + expect(await queue.next()).toBe(3); + expect(queue.length).toBe(0); + }); + + test('await', async () => { + const queue = new AsyncQueue(); + queue.push(1, 2); + expect(await queue.next()).toBe(1); + expect(await queue.next()).toBe(2); + + let v = -1; + + // setup 2 pop tasks + queue.next().then(next => { + v = next; + }); + queue.next().then(next => { + v = next; + }); + + // Wait for 100ms + await new Promise(resolve => setTimeout(resolve, 100)); + // v should not be changed + expect(v).toBe(-1); + + // push 3, should trigger the first pop task + queue.push(3); + await vi.waitFor(() => v === 3); + + // push 4, should trigger the second pop task + queue.push(4); + await vi.waitFor(() => v === 4); + }); +}); diff --git a/packages/frontend/workspace/src/providers/utils/__tests__/throw-if-aborted.spec.ts b/packages/frontend/workspace/src/providers/utils/__tests__/throw-if-aborted.spec.ts new file mode 100644 index 0000000000..137f748a6b --- /dev/null +++ b/packages/frontend/workspace/src/providers/utils/__tests__/throw-if-aborted.spec.ts @@ -0,0 +1,13 @@ +import { describe, expect, test } from 'vitest'; + +import { throwIfAborted } from '../throw-if-aborted'; + +describe('throw-if-aborted', () => { + test('basic', async () => { + const abortController = new AbortController(); + const abortSignal = abortController.signal; + expect(throwIfAborted(abortSignal)).toBe(true); + abortController.abort('TEST_ABORT'); + expect(() => throwIfAborted(abortSignal)).toThrowError('TEST_ABORT'); + }); +}); diff --git a/packages/frontend/workspace/src/providers/utils/affine-io.ts b/packages/frontend/workspace/src/providers/utils/affine-io.ts new file mode 100644 index 0000000000..d2f7e26029 --- /dev/null +++ b/packages/frontend/workspace/src/providers/utils/affine-io.ts @@ -0,0 +1,15 @@ +import { Manager } from 'socket.io-client'; + +let ioManager: Manager | null = null; + +// use lazy initialization socket.io io manager +export function getIoManager(): Manager { + if (ioManager) { + return ioManager; + } + ioManager = new Manager(runtimeConfig.serverUrlPrefix + '/', { + autoConnect: false, + transports: ['websocket'], + }); + return ioManager; +} diff --git a/packages/frontend/workspace/src/providers/utils/async-queue.ts b/packages/frontend/workspace/src/providers/utils/async-queue.ts new file mode 100644 index 0000000000..db29b8d43e --- /dev/null +++ b/packages/frontend/workspace/src/providers/utils/async-queue.ts @@ -0,0 +1,66 @@ +export class AsyncQueue { + private _queue: T[]; + + private _resolveUpdate: (() => void) | null = null; + private _waitForUpdate: Promise | null = null; + + constructor(init: T[] = []) { + this._queue = init; + } + + get length() { + return this._queue.length; + } + + async next(abort?: AbortSignal): Promise { + const update = this._queue.shift(); + if (update) { + return update; + } else { + if (!this._waitForUpdate) { + this._waitForUpdate = new Promise(resolve => { + this._resolveUpdate = resolve; + }); + } + + await Promise.race([ + this._waitForUpdate, + new Promise((_, reject) => { + if (abort?.aborted) { + reject(abort?.reason); + } + abort?.addEventListener('abort', () => { + reject(abort.reason); + }); + }), + ]); + + return this.next(abort); + } + } + + push(...updates: T[]) { + this._queue.push(...updates); + if (this._resolveUpdate) { + const resolve = this._resolveUpdate; + this._resolveUpdate = null; + this._waitForUpdate = null; + resolve(); + } + } + + remove(predicate: (update: T) => boolean) { + const index = this._queue.findIndex(predicate); + if (index !== -1) { + this._queue.splice(index, 1); + } + } + + find(predicate: (update: T) => boolean) { + return this._queue.find(predicate); + } + + clear() { + this._queue = []; + } +} diff --git a/packages/frontend/workspace/src/affine/utils.ts b/packages/frontend/workspace/src/providers/utils/base64.ts similarity index 67% rename from packages/frontend/workspace/src/affine/utils.ts rename to packages/frontend/workspace/src/providers/utils/base64.ts index 7c37f9c043..28096e678e 100644 --- a/packages/frontend/workspace/src/affine/utils.ts +++ b/packages/frontend/workspace/src/providers/utils/base64.ts @@ -1,20 +1,3 @@ -import type { Doc as YDoc } from 'yjs'; - -export type SubdocEvent = { - loaded: Set; - removed: Set; - added: Set; -}; - -export type UpdateHandler = (update: Uint8Array, origin: unknown) => void; -export type SubdocsHandler = (event: SubdocEvent) => void; -export type DestroyHandler = () => void; - -export type AwarenessChanges = Record< - 'added' | 'updated' | 'removed', - number[] ->; - export function uint8ArrayToBase64(array: Uint8Array): Promise { return new Promise(resolve => { // Create a blob from the Uint8Array diff --git a/packages/frontend/workspace/src/providers/utils/throw-if-aborted.ts b/packages/frontend/workspace/src/providers/utils/throw-if-aborted.ts new file mode 100644 index 0000000000..4646b0fbd9 --- /dev/null +++ b/packages/frontend/workspace/src/providers/utils/throw-if-aborted.ts @@ -0,0 +1,7 @@ +// because AbortSignal.throwIfAborted is not available in abortcontroller-polyfill +export function throwIfAborted(abort?: AbortSignal) { + if (abort?.aborted) { + throw new Error(abort.reason); + } + return true; +} diff --git a/packages/plugins/copilot/package.json b/packages/plugins/copilot/package.json index 5b56221ba8..0a83ec6ad6 100644 --- a/packages/plugins/copilot/package.json +++ b/packages/plugins/copilot/package.json @@ -16,7 +16,7 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/sdk": "workspace:*", - "@blocksuite/icons": "2.1.35", + "@blocksuite/icons": "2.1.36", "@toeverything/components": "^0.0.46", "@vanilla-extract/css": "^1.13.0", "clsx": "^2.0.0", @@ -30,7 +30,7 @@ "devDependencies": { "@affine/plugin-cli": "workspace:*", "@types/marked": "^6.0.0", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "react": "18.2.0", "react-dom": "18.2.0" }, @@ -38,5 +38,5 @@ "react": "*", "react-dom": "*" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/packages/plugins/hello-world/package.json b/packages/plugins/hello-world/package.json index 553d05ce96..2054049fb2 100644 --- a/packages/plugins/hello-world/package.json +++ b/packages/plugins/hello-world/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "description": "Hello world plugin", - "version": "0.10.2", + "version": "0.10.3-canary.2", "scripts": { "dev": "af dev", "build": "af build" @@ -17,7 +17,7 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/sdk": "workspace:*", - "@blocksuite/icons": "2.1.35", + "@blocksuite/icons": "2.1.36", "@toeverything/components": "^0.0.46" }, "devDependencies": { diff --git a/packages/plugins/image-preview/package.json b/packages/plugins/image-preview/package.json index 721e5b692a..93d7b351f4 100644 --- a/packages/plugins/image-preview/package.json +++ b/packages/plugins/image-preview/package.json @@ -1,7 +1,7 @@ { "name": "@affine/image-preview-plugin", "type": "module", - "version": "0.10.2", + "version": "0.10.3-canary.2", "description": "Image preview plugin", "affinePlugin": { "release": true, @@ -16,7 +16,7 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/sdk": "workspace:*", - "@blocksuite/icons": "2.1.35", + "@blocksuite/icons": "2.1.36", "@toeverything/components": "^0.0.46", "@toeverything/theme": "^0.7.24", "clsx": "^2.0.0", diff --git a/packages/plugins/outline/package.json b/packages/plugins/outline/package.json index c37177010c..8fd7b8cf32 100644 --- a/packages/plugins/outline/package.json +++ b/packages/plugins/outline/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "description": "Outline plugin", - "version": "0.10.2", + "version": "0.10.3-canary.2", "scripts": { "dev": "af dev", "build": "af build" @@ -17,12 +17,12 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/sdk": "workspace:*", - "@blocksuite/icons": "2.1.35", + "@blocksuite/icons": "2.1.36", "@toeverything/components": "^0.0.46" }, "devDependencies": { "@affine/plugin-cli": "workspace:*", - "jotai": "^2.4.3", + "jotai": "^2.5.1", "react": "18.2.0", "react-dom": "18.2.0" } diff --git a/packages/plugins/vue-hello-world/package.json b/packages/plugins/vue-hello-world/package.json index 19194e21a6..c188cf2a0a 100644 --- a/packages/plugins/vue-hello-world/package.json +++ b/packages/plugins/vue-hello-world/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "description": "Vue hello world plugin", - "version": "0.10.2", + "version": "0.10.3-canary.2", "scripts": { "dev": "af dev", "build": "af build" diff --git a/scripts/bump-blocksuite.sh b/scripts/bump-blocksuite.sh index 3252b16e39..eaf6d275e3 100755 --- a/scripts/bump-blocksuite.sh +++ b/scripts/bump-blocksuite.sh @@ -7,5 +7,5 @@ yarn up "@blocksuite/store@${LATEST_NIGHTLY}" yarn up "@blocksuite/blocks@${LATEST_NIGHTLY}" yarn up "@blocksuite/editor@${LATEST_NIGHTLY}" yarn up "@blocksuite/global@${LATEST_NIGHTLY}" -yarn up "@blocksuite/lit@${LATEST_NIGHTLY}" yarn up "@blocksuite/block-std@${LATEST_NIGHTLY}" +yarn up "@blocksuite/virgo@${LATEST_NIGHTLY}" diff --git a/scripts/check-version.mjs b/scripts/check-version.mjs index 79bffc7f71..a0cf70685c 100644 --- a/scripts/check-version.mjs +++ b/scripts/check-version.mjs @@ -1,5 +1,5 @@ -const semver = await import('semver').catch(() => - import('../packages/backend/server/node_modules/semver/index.js') +const semver = await import('semver').catch( + () => import('../packages/backend/server/node_modules/semver/index.js') ); import packageJson from '../package.json' assert { type: 'json' }; diff --git a/scripts/notify.mjs b/scripts/notify.mjs deleted file mode 100644 index a475261fb4..0000000000 --- a/scripts/notify.mjs +++ /dev/null @@ -1,20 +0,0 @@ -const STAGE_HOST = 'https://nightly.affine.pro/'; -if (['master', 'develop'].includes(process.env.CF_PAGES_BRANCH)) { - const message = `Daily builds: New deployment of version ${process.env.CF_PAGES_COMMIT_SHA} was deploy: [nightly](${STAGE_HOST}) / [internal](${process.env.CF_PAGES_URL})`; - const url = `https://api.telegram.org/bot${process.env.BOT_TOKEN}/sendMessage`; - - fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - chat_id: process.env.CHAT_ID, - text: message, - parse_mode: 'Markdown', - disable_notification: true, - }), - }) - .then(r => r.json()) - .then(console.log); -} diff --git a/tests/affine-cloud/e2e/collaboration.spec.ts b/tests/affine-cloud/e2e/collaboration.spec.ts index a97af04e28..2be5db6571 100644 --- a/tests/affine-cloud/e2e/collaboration.spec.ts +++ b/tests/affine-cloud/e2e/collaboration.spec.ts @@ -7,6 +7,7 @@ import { loginUser, } from '@affine-test/kit/utils/cloud'; import { dropFile } from '@affine-test/kit/utils/drop-file'; +import { clickEdgelessModeButton } from '@affine-test/kit/utils/editor'; import { clickNewPageButton, getBlockSuiteEditorTitle, @@ -78,6 +79,52 @@ test.describe('collaboration', () => { } }); + test('share page with default edgeless', async ({ page, browser }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + await page.keyboard.press('Enter', { delay: 50 }); + await page.keyboard.type('TEST CONTENT', { delay: 50 }); + await clickEdgelessModeButton(page); + await expect(page.locator('affine-edgeless-page')).toBeVisible({ + timeout: 1000, + }); + await page.getByTestId('cloud-share-menu-button').click(); + await page.getByTestId('share-menu-create-link-button').click(); + await page.getByTestId('share-menu-copy-link-button').click(); + + // check share page is accessible + { + const context = await browser.newContext(); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + await expect(page.locator('affine-edgeless-page')).toBeVisible({ + timeout: 1000, + }); + expect(await page2.textContent('affine-paragraph')).toContain( + 'TEST CONTENT' + ); + const logo = page2.getByTestId('share-page-logo'); + const editButton = page2.getByTestId('share-page-edit-button'); + await expect(editButton).not.toBeVisible(); + await expect(logo).toBeVisible(); + } + }); + test('can collaborate with other user and name should display when editing', async ({ page, browser, diff --git a/tests/affine-cloud/package.json b/tests/affine-cloud/package.json index 8da2a9070b..55ec382b58 100644 --- a/tests/affine-cloud/package.json +++ b/tests/affine-cloud/package.json @@ -9,5 +9,5 @@ "@affine-test/kit": "workspace:*", "@playwright/test": "^1.39.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-desktop-cloud/package.json b/tests/affine-desktop-cloud/package.json index 1767faf8fb..69c848632f 100644 --- a/tests/affine-desktop-cloud/package.json +++ b/tests/affine-desktop-cloud/package.json @@ -11,5 +11,5 @@ "@types/fs-extra": "^11.0.2", "fs-extra": "^11.1.1" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-desktop/e2e/basic.spec.ts b/tests/affine-desktop/e2e/basic.spec.ts index 048907f36a..c77223a573 100644 --- a/tests/affine-desktop/e2e/basic.spec.ts +++ b/tests/affine-desktop/e2e/basic.spec.ts @@ -62,43 +62,38 @@ test('app sidebar router forward/back', async ({ page }) => { }); } { - const title = (await page - .locator('.affine-doc-page-block-title') - .textContent()) as string; - expect(title.trim()).toBe('test3'); + await expect(page.locator('.affine-doc-page-block-title')).toHaveText( + 'test3' + ); } await page.click('[data-testid="app-sidebar-arrow-button-back"]'); await page.click('[data-testid="app-sidebar-arrow-button-back"]'); { - const title = (await page - .locator('.affine-doc-page-block-title') - .textContent()) as string; - expect(title.trim()).toBe('test1'); + await expect(page.locator('.affine-doc-page-block-title')).toHaveText( + 'test1' + ); } await page.click('[data-testid="app-sidebar-arrow-button-forward"]'); await page.click('[data-testid="app-sidebar-arrow-button-forward"]'); { - const title = (await page - .locator('.affine-doc-page-block-title') - .textContent()) as string; - expect(title.trim()).toBe('test3'); + await expect(page.locator('.affine-doc-page-block-title')).toHaveText( + 'test3' + ); } await historyShortcut(page, 'goBack'); await historyShortcut(page, 'goBack'); { - const title = (await page - .locator('.affine-doc-page-block-title') - .textContent()) as string; - expect(title.trim()).toBe('test1'); + await expect(page.locator('.affine-doc-page-block-title')).toHaveText( + 'test1' + ); } await historyShortcut(page, 'goForward'); await historyShortcut(page, 'goForward'); { - const title = (await page - .locator('.affine-doc-page-block-title') - .textContent()) as string; - expect(title.trim()).toBe('test3'); + await expect(page.locator('.affine-doc-page-block-title')).toHaveText( + 'test3' + ); } }); // } diff --git a/tests/affine-desktop/package.json b/tests/affine-desktop/package.json index 4c329ca9e9..f2cc8c3cdb 100644 --- a/tests/affine-desktop/package.json +++ b/tests/affine-desktop/package.json @@ -12,5 +12,5 @@ "fs-extra": "^11.1.1", "playwright": "^1.39.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-legacy/0.6.1-beta.1/package.json b/tests/affine-legacy/0.6.1-beta.1/package.json index efb2756a98..1b1371d47c 100644 --- a/tests/affine-legacy/0.6.1-beta.1/package.json +++ b/tests/affine-legacy/0.6.1-beta.1/package.json @@ -9,14 +9,14 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine-test/kit": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@playwright/test": "^1.39.0", "express": "^4.18.2", "http-proxy-middleware": "^3.0.0-beta.1", "serve": "^14.2.1" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-legacy/0.7.0-canary.18/package.json b/tests/affine-legacy/0.7.0-canary.18/package.json index dedd92fac8..7d340e4ae3 100644 --- a/tests/affine-legacy/0.7.0-canary.18/package.json +++ b/tests/affine-legacy/0.7.0-canary.18/package.json @@ -9,14 +9,14 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine-test/kit": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@playwright/test": "^1.39.0", "express": "^4.18.2", "http-proxy-middleware": "^3.0.0-beta.1", "serve": "^14.2.1" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-legacy/0.8.0-canary.7/package.json b/tests/affine-legacy/0.8.0-canary.7/package.json index 7b68ec2d52..4c08240dda 100644 --- a/tests/affine-legacy/0.8.0-canary.7/package.json +++ b/tests/affine-legacy/0.8.0-canary.7/package.json @@ -9,14 +9,14 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine-test/kit": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@playwright/test": "^1.39.0", "express": "^4.18.2", "http-proxy-middleware": "^3.0.0-beta.1", "serve": "^14.2.1" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-legacy/0.8.4/package.json b/tests/affine-legacy/0.8.4/package.json index 4788e1562c..00a2b9ec07 100644 --- a/tests/affine-legacy/0.8.4/package.json +++ b/tests/affine-legacy/0.8.4/package.json @@ -9,14 +9,14 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine-test/kit": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@playwright/test": "^1.39.0", "express": "^4.18.2", "http-proxy-middleware": "^3.0.0-beta.1", "serve": "^14.2.1" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-local/e2e/duplicate-page.spec.ts b/tests/affine-local/e2e/duplicate-page.spec.ts index 894e5fafe1..71e6b70890 100644 --- a/tests/affine-local/e2e/duplicate-page.spec.ts +++ b/tests/affine-local/e2e/duplicate-page.spec.ts @@ -18,5 +18,5 @@ test('Duplicate page should work', async ({ page }) => { const duplicateButton = page.getByTestId('editor-option-menu-duplicate'); await duplicateButton.click({ delay: 100 }); const title2 = getBlockSuiteEditorTitle(page); - expect(await title2.innerText()).toBe('test(1)'); + await expect(title2).toHaveText('test(1)', { timeout: 1000 }); }); diff --git a/tests/affine-local/e2e/local-first-collections-items.spec.ts b/tests/affine-local/e2e/local-first-collections-items.spec.ts index 089c27aec6..b59187f108 100644 --- a/tests/affine-local/e2e/local-first-collections-items.spec.ts +++ b/tests/affine-local/e2e/local-first-collections-items.spec.ts @@ -5,7 +5,10 @@ import { getBlockSuiteEditorTitle, waitForEditorLoad, } from '@affine-test/kit/utils/page-logic'; -import { clickSideBarCurrentWorkspaceBanner } from '@affine-test/kit/utils/sidebar'; +import { + clickSideBarAllPageButton, + clickSideBarCurrentWorkspaceBanner, +} from '@affine-test/kit/utils/sidebar'; import { createLocalWorkspace } from '@affine-test/kit/utils/workspace'; import type { Page } from '@playwright/test'; import { expect } from '@playwright/test'; @@ -76,6 +79,7 @@ test('Show collections items in sidebar', async ({ page }) => { skipInitialPage: true, }); expect(await items.count()).toBe(1); + await clickSideBarAllPageButton(page); await createLocalWorkspace( { name: 'Test 1', diff --git a/tests/affine-local/e2e/open-affine.spec.ts b/tests/affine-local/e2e/open-affine.spec.ts index 9c80920342..2a9b639808 100644 --- a/tests/affine-local/e2e/open-affine.spec.ts +++ b/tests/affine-local/e2e/open-affine.spec.ts @@ -25,22 +25,20 @@ test('Open last workspace when back to affine', async ({ page }) => { expect(currentWorkspaceName).toEqual('New Workspace 2'); }); -test.skip('Download client tip', async ({ page }) => { +test('Download client tip', async ({ page }) => { await openHomePage(page); - const downloadClientTipItem = page.locator( - '[data-testid=download-client-tip]' - ); - await expect(downloadClientTipItem).toBeVisible(); + const localDemoTipsItem = page.locator('[data-testid=local-demo-tips]'); + await expect(localDemoTipsItem).toBeVisible(); const closeButton = page.locator( - '[data-testid=download-client-tip-close-button]' + '[data-testid=local-demo-tips-close-button]' ); await closeButton.click(); - await expect(downloadClientTipItem).not.toBeVisible(); - await page.goto('http://localhost:8080'); - const currentDownloadClientTipItem = page.locator( - '[data-testid=download-client-tip]' + await expect(localDemoTipsItem).not.toBeVisible(); + await page.reload(); + const currentLocalDemoTipsItemItem = page.locator( + '[data-testid=local-demo-tips]' ); - await expect(currentDownloadClientTipItem).toBeVisible(); + await expect(currentLocalDemoTipsItemItem).toBeVisible(); }); test('Check the class name for the scrollbar', async ({ page }) => { diff --git a/tests/affine-local/e2e/quick-search.spec.ts b/tests/affine-local/e2e/quick-search.spec.ts index a35bb61740..cb5ceb836b 100644 --- a/tests/affine-local/e2e/quick-search.spec.ts +++ b/tests/affine-local/e2e/quick-search.spec.ts @@ -9,9 +9,11 @@ import { import { clickSideBarAllPageButton } from '@affine-test/kit/utils/sidebar'; import { expect, type Page } from '@playwright/test'; -const openQuickSearchByShortcut = async (page: Page) => { +const openQuickSearchByShortcut = async (page: Page, checkVisible = true) => { await withCtrlOrMeta(page, () => page.keyboard.press('k', { delay: 50 })); - await page.waitForTimeout(1000); + if (checkVisible) { + expect(page.getByTestId('cmdk-quick-search')).toBeVisible(); + } }; const keyboardDownAndSelect = async (page: Page, label: string) => { @@ -80,7 +82,9 @@ async function assertResultList(page: Page, texts: string[]) { .allInnerTexts(); const actualSplit = actual[0].split('\n'); expect(actualSplit[0]).toEqual(texts[0]); - expect(actualSplit[1]).toEqual(texts[1]); + if (actualSplit[1]) { + expect(actualSplit[1]).toEqual(texts[1]); + } } async function titleIsFocused(page: Page) { @@ -133,11 +137,13 @@ test('Create a new page with keyword', async ({ page }) => { await waitForEditorLoad(page); await clickNewPageButton(page); await openQuickSearchByShortcut(page); - await page.keyboard.insertText('test123456'); - const addNewPage = page.locator('[cmdk-item] >> text=New "test123456" Page'); + await page.keyboard.insertText('"test123456"'); + const addNewPage = page.locator( + '[cmdk-item] >> text=New ""test123456"" Page' + ); await addNewPage.click(); await page.waitForTimeout(300); - await assertTitle(page, 'test123456'); + await assertTitle(page, '"test123456"'); }); test('Enter a keyword to search for', async ({ page }) => { @@ -188,7 +194,7 @@ test('Navigate to the 404 page and try to open quick search', async ({ await page.goto('http://localhost:8080/404'); const notFoundTip = page.locator('button >> text=Back to My Content'); await expect(notFoundTip).toBeVisible(); - await openQuickSearchByShortcut(page); + await openQuickSearchByShortcut(page, false); const quickSearch = page.locator('[data-testid=cmdk-quick-search]'); await expect(quickSearch).toBeVisible({ visible: false }); }); @@ -215,6 +221,7 @@ test('Autofocus input after select', async ({ page }) => { await openHomePage(page); await waitForEditorLoad(page); await clickNewPageButton(page); + await page.waitForTimeout(500); // wait for new page loaded await openQuickSearchByShortcut(page); await page.keyboard.press('ArrowUp'); const locator = page.locator('[cmdk-input]'); @@ -251,8 +258,9 @@ test('assert the recent browse pages are on the recent list', async ({ await waitForEditorLoad(page); { const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('sgtokidoki'); - expect(await title.innerText()).toBe('sgtokidoki'); + await title.click(); + await title.pressSequentially('sgtokidoki', { delay: 100 }); + await expect(title).toHaveText('sgtokidoki'); } // create second page @@ -262,8 +270,9 @@ test('assert the recent browse pages are on the recent list', async ({ await waitForEditorLoad(page); { const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('theliquidhorse'); - expect(await title.innerText()).toBe('theliquidhorse'); + await title.click(); + await title.pressSequentially('theliquidhorse', { delay: 100 }); + await expect(title).toHaveText('theliquidhorse'); } await page.waitForTimeout(200); @@ -273,8 +282,9 @@ test('assert the recent browse pages are on the recent list', async ({ await waitForEditorLoad(page); { const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('battlekot'); - expect(await title.innerText()).toBe('battlekot'); + await title.click(); + await title.pressSequentially('battlekot', { delay: 100 }); + await expect(title).toHaveText('battlekot'); } await openQuickSearchByShortcut(page); @@ -283,9 +293,9 @@ test('assert the recent browse pages are on the recent list', async ({ const quickSearchItems = page.locator( '[cmdk-item] [data-testid="cmdk-label"]' ); - expect(await quickSearchItems.nth(0).textContent()).toBe('battlekot'); - expect(await quickSearchItems.nth(1).textContent()).toBe('theliquidhorse'); - expect(await quickSearchItems.nth(2).textContent()).toBe('sgtokidoki'); + await expect(quickSearchItems.nth(0)).toHaveText('battlekot'); + await expect(quickSearchItems.nth(1)).toHaveText('theliquidhorse'); + await expect(quickSearchItems.nth(2)).toHaveText('sgtokidoki'); } // create forth page, and check does the recent page list only contains three pages @@ -299,8 +309,9 @@ test('assert the recent browse pages are on the recent list', async ({ await waitForEditorLoad(page); { const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('affine is the best'); - expect(await title.innerText()).toBe('affine is the best'); + await title.click(); + await title.pressSequentially('affine is the best', { delay: 100 }); + await expect(title).toHaveText('affine is the best', { timeout: 500 }); } await page.waitForTimeout(1000); await openQuickSearchByShortcut(page); @@ -308,9 +319,7 @@ test('assert the recent browse pages are on the recent list', async ({ const quickSearchItems = page.locator( '[cmdk-item] [data-testid="cmdk-label"]' ); - expect(await quickSearchItems.nth(0).textContent()).toBe( - 'affine is the best' - ); + await expect(quickSearchItems.nth(0)).toHaveText('affine is the best'); } }); @@ -401,3 +410,25 @@ test('can use cmdk to search page content and scroll to it, then the block will const selectionElement = page.locator('affine-block-selection'); await expect(selectionElement).toBeVisible(); }); + +test('Create a new page with special characters in the title and search for this page', async ({ + page, +}) => { + const specialTitle = '"test123456"'; + + await openHomePage(page); + await waitForEditorLoad(page); + + await clickNewPageButton(page); + await getBlockSuiteEditorTitle(page).click(); + await getBlockSuiteEditorTitle(page).fill(specialTitle); + await openQuickSearchByShortcut(page); + + await page.keyboard.insertText(specialTitle); + await page.waitForTimeout(300); + + await assertResultList(page, [specialTitle, specialTitle]); + await page.keyboard.press('Enter'); + await page.waitForTimeout(300); + await assertTitle(page, specialTitle); +}); diff --git a/tests/affine-local/e2e/settings.spec.ts b/tests/affine-local/e2e/settings.spec.ts index 195f414041..2b3c65d059 100644 --- a/tests/affine-local/e2e/settings.spec.ts +++ b/tests/affine-local/e2e/settings.spec.ts @@ -110,11 +110,11 @@ test('Different workspace should have different name in the setting panel', asyn await createLocalWorkspace({ name: 'New Workspace 3' }, page); await openSettingModal(page); await page.getByTestId('current-workspace-label').click(); - expect(await page.getByTestId('workspace-name-input').inputValue()).toBe( + await expect(page.getByTestId('workspace-name-input')).toHaveValue( 'New Workspace 3' ); await page.getByText('New Workspace 2').click(); - expect(await page.getByTestId('workspace-name-input').inputValue()).toBe( + await expect(page.getByTestId('workspace-name-input')).toHaveValue( 'New Workspace 2' ); }); diff --git a/tests/affine-local/e2e/shortcuts.spec.ts b/tests/affine-local/e2e/shortcuts.spec.ts index 83642deacf..808cf7cac9 100644 --- a/tests/affine-local/e2e/shortcuts.spec.ts +++ b/tests/affine-local/e2e/shortcuts.spec.ts @@ -14,6 +14,10 @@ test('Open shortcuts modal', async ({ page }) => { await shortcutsIcon.click(); await page.waitForTimeout(1000); - const shortcutsModal = page.locator('[data-testid=shortcuts-modal]'); - await expect(shortcutsModal).toContainText('Page'); + + const settingModal = page.getByTestId('setting-modal'); + await expect(settingModal).toBeVisible(); + + const title = page.getByTestId('keyboard-shortcuts-title'); + await expect(title).toBeVisible(); }); diff --git a/tests/affine-local/package.json b/tests/affine-local/package.json index eb4c65136a..8fd92787c0 100644 --- a/tests/affine-local/package.json +++ b/tests/affine-local/package.json @@ -9,5 +9,5 @@ "@affine-test/kit": "workspace:*", "@playwright/test": "^1.39.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-migration/README.md b/tests/affine-migration/README.md index ca03f7aac7..f1326a66d8 100644 --- a/tests/affine-migration/README.md +++ b/tests/affine-migration/README.md @@ -7,3 +7,6 @@ BUILD_TYPE=canary yarn run build cd tests/affine-migration yarn run e2e ``` + +> Tips: +> Run `yarn dev` to start dev server in 8080 could make debugging more quickly. diff --git a/tests/affine-migration/e2e/basic.spec.ts b/tests/affine-migration/e2e/basic.spec.ts index 51c9351998..2942a436c5 100644 --- a/tests/affine-migration/e2e/basic.spec.ts +++ b/tests/affine-migration/e2e/basic.spec.ts @@ -34,26 +34,21 @@ test('v1 to v4', async ({ page }) => { await page.goto(coreUrl); await clickSideBarAllPageButton(page); - await page.getByText('hello').click(); - //#region fixme(himself65): blocksuite issue, data cannot be loaded to store - const url = page.url(); - await page.waitForTimeout(5000); - await page.goto(url); - //#endregion + await expect(page.getByTestId('upgrade-workspace-button')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByText('Refresh Current Page')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByTestId('page-list-item')).toHaveCount(2); + await page + .getByTestId('page-list-item-title-text') + .getByText('hello') + .click(); await waitForEditorLoad(page); - expect(await page.locator('v-line').nth(0).textContent()).toBe('hello'); - - const changedLocalStorageData = await page.evaluate(() => - window.readAffineLocalStorage() - ); - const workspaces = JSON.parse( - changedLocalStorageData['jotai-workspaces'] - ) as any[]; - for (const workspace of workspaces) { - expect(workspace.version).toBe(4); - } + await expect(page.locator('v-line').nth(0)).toHaveText('hello'); }); test('v2 to v4, database migration', async ({ page }) => { @@ -62,63 +57,72 @@ test('v2 to v4, database migration', async ({ page }) => { '0.8.0-canary.7' ); - //#region fixme(himself65): blocksuite issue, data cannot be loaded to store - const allPagePath = `${coreUrl}/workspace/${localStorageData.last_workspace_id}/all`; - await page.goto(allPagePath); - await page.waitForTimeout(5000); - //#endregion - const detailPagePath = `${coreUrl}/workspace/${localStorageData.last_workspace_id}/${localStorageData.last_page_id}`; await page.goto(detailPagePath); + + await expect(page.getByTestId('upgrade-workspace-button')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByText('Refresh Current Page')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); await waitForEditorLoad(page); // check page mode is correct - expect(await page.locator('v-line').nth(0).textContent()).toBe('hello'); - expect(await page.locator('affine-database').isVisible()).toBe(true); + await expect(page.locator('v-line').nth(0)).toHaveText('hello'); + await expect(page.locator('affine-database')).toBeVisible(); // check edgeless mode is correct await clickEdgelessModeButton(page); - await page.waitForTimeout(200); - expect(await page.locator('affine-database').isVisible()).toBe(true); - - const changedLocalStorageData = await page.evaluate(() => - window.readAffineLocalStorage() - ); - const workspaces = JSON.parse( - changedLocalStorageData['jotai-workspaces'] - ) as any[]; - for (const workspace of workspaces) { - expect(workspace.version).toBe(4); - } + await expect(page.locator('affine-database')).toBeVisible(); }); test('v3 to v4, surface migration', async ({ page }) => { const { localStorageData } = await open404PageToInitData(page, '0.8.4'); - //#region fixme(himself65): blocksuite issue, data cannot be loaded to store - const allPagePath = `${coreUrl}/workspace/${localStorageData.last_workspace_id}/all`; - await page.goto(allPagePath); - await page.waitForTimeout(5000); - //#endregion - const detailPagePath = `${coreUrl}/workspace/${localStorageData.last_workspace_id}/${localStorageData.last_page_id}`; await page.goto(detailPagePath); + + await expect(page.getByTestId('upgrade-workspace-button')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByText('Refresh Current Page')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); await waitForEditorLoad(page); // check edgeless mode is correct await clickEdgelessModeButton(page); await expect(page.locator('edgeless-toolbar')).toBeVisible(); await expect(page.locator('affine-edgeless-page')).toBeVisible(); +}); - const changedLocalStorageData = await page.evaluate(() => - window.readAffineLocalStorage() - ); - const workspaces = JSON.parse( - changedLocalStorageData['jotai-workspaces'] - ) as any[]; - for (const workspace of workspaces) { - expect(workspace.version).toBe(4); - } +test('v0 to v4, subdoc migration', async ({ page }) => { + await open404PageToInitData(page, '0.6.1-beta.1'); + + await page.goto(coreUrl); + await clickSideBarAllPageButton(page); + + await expect(page.getByTestId('upgrade-workspace-button')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByText('Refresh Current Page')).toBeVisible(); + await page.getByTestId('upgrade-workspace-button').click(); + + await expect(page.getByTestId('page-list-item')).toHaveCount(2); + await page + .getByTestId('page-list-item-title-text') + .getByText('hello') + .click(); + + await waitForEditorLoad(page); + + // check page mode is correct + await expect(page.locator('v-line').nth(0)).toHaveText('hello'); + await expect(page.locator('v-line').nth(1)).toHaveText('TEST CONTENT'); + + // check edgeless mode is correct + await clickEdgelessModeButton(page); + await expect(page.locator('edgeless-toolbar')).toBeVisible(); + await expect(page.locator('affine-edgeless-page')).toBeVisible(); }); test('v0 to v4, subdoc migration', async ({ page }) => { diff --git a/tests/affine-migration/package.json b/tests/affine-migration/package.json index 3f9643dbdf..9fc4523606 100644 --- a/tests/affine-migration/package.json +++ b/tests/affine-migration/package.json @@ -7,11 +7,11 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine-test/kit": "workspace:*", - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", "@playwright/test": "^1.39.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/affine-plugin/package.json b/tests/affine-plugin/package.json index 07f2168150..67073e367d 100644 --- a/tests/affine-plugin/package.json +++ b/tests/affine-plugin/package.json @@ -9,5 +9,5 @@ "@affine-test/kit": "workspace:*", "@playwright/test": "^1.39.0" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/fixtures/package.json b/tests/fixtures/package.json index d80191205f..d926dc7f7d 100644 --- a/tests/fixtures/package.json +++ b/tests/fixtures/package.json @@ -3,5 +3,5 @@ "exports": { "./*": "./*" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/kit/package.json b/tests/kit/package.json index d994e9a12f..1922cc0ec5 100644 --- a/tests/kit/package.json +++ b/tests/kit/package.json @@ -2,7 +2,7 @@ "name": "@affine-test/kit", "private": true, "type": "module", - "version": "0.10.2", + "version": "0.10.3-canary.2", "exports": { "./electron": "./electron.ts", "./playwright": "./playwright.ts", diff --git a/tests/kit/utils/workspace.ts b/tests/kit/utils/workspace.ts index aafea8b05e..b000786931 100644 --- a/tests/kit/utils/workspace.ts +++ b/tests/kit/utils/workspace.ts @@ -1,4 +1,6 @@ -import type { Page } from '@playwright/test'; +import { expect, type Page } from '@playwright/test'; + +import { waitForEditorLoad } from './page-logic'; interface CreateWorkspaceParams { name: string; @@ -28,10 +30,17 @@ export async function createLocalWorkspace( await page.getByPlaceholder('Set a Workspace name').fill(params.name); // click create button - await page.getByRole('button', { name: 'Create' }).click({ + await page.getByTestId('create-workspace-create-button').click({ delay: 500, }); + await expect( + page.getByTestId('create-workspace-create-button') + ).not.toBeAttached(); + await waitForEditorLoad(page); + + await expect(page.getByTestId('workspace-name')).toHaveText(params.name); + // if (isDesktop) { // await page.getByTestId('create-workspace-continue-button').click(); // } diff --git a/tests/storybook/package.json b/tests/storybook/package.json index 0919b2a77f..b45e83904b 100644 --- a/tests/storybook/package.json +++ b/tests/storybook/package.json @@ -9,53 +9,52 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/i18n": "workspace:*", - "@mui/material": "^5.14.14", - "@storybook/addon-actions": "^7.4.6", - "@storybook/addon-essentials": "^7.4.6", - "@storybook/addon-interactions": "^7.4.6", - "@storybook/addon-links": "^7.4.6", - "@storybook/addon-storysource": "^7.4.6", - "@storybook/blocks": "^7.4.6", - "@storybook/builder-vite": "^7.4.6", + "@storybook/addon-actions": "^7.5.3", + "@storybook/addon-essentials": "^7.5.3", + "@storybook/addon-interactions": "^7.5.3", + "@storybook/addon-links": "^7.5.3", + "@storybook/addon-storysource": "^7.5.3", + "@storybook/blocks": "^7.5.3", + "@storybook/builder-vite": "^7.5.3", "@storybook/jest": "^0.2.3", - "@storybook/react": "^7.4.6", - "@storybook/react-vite": "^7.4.6", - "@storybook/test-runner": "^0.13.0", + "@storybook/react": "^7.5.3", + "@storybook/react-vite": "^7.5.3", + "@storybook/test-runner": "^0.15.2", "@storybook/testing-library": "^0.2.2", - "@vitejs/plugin-react": "^4.1.0", - "concurrently": "^8.2.1", + "@vitejs/plugin-react": "^4.2.0", + "concurrently": "^8.2.2", "jest-mock": "^29.7.0", "serve": "^14.2.1", "ses": "^0.18.8", - "storybook": "^7.4.6", + "storybook": "^7.5.3", "storybook-dark-mode": "^3.0.1", - "wait-on": "^7.0.1" + "wait-on": "^7.2.0" }, "devDependencies": { - "@blocksuite/block-std": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/blocks": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/editor": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/global": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/icons": "2.1.35", - "@blocksuite/lit": "0.0.0-20231116023037-31273bb7-nightly", - "@blocksuite/store": "0.0.0-20231116023037-31273bb7-nightly", - "@dnd-kit/sortable": "^7.0.2", + "@blocksuite/block-std": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/blocks": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/editor": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/global": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/icons": "2.1.36", + "@blocksuite/lit": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/store": "0.0.0-20231122113751-6bf81eb3-nightly", + "@blocksuite/virgo": "0.0.0-20231122113751-6bf81eb3-nightly", + "@dnd-kit/sortable": "^8.0.0", "@tomfreudenberg/next-auth-mock": "^0.5.6", - "chromatic": "^7.4.0", - "foxact": "^0.2.20", - "jotai": "^2.4.3", + "chromatic": "^9.1.0", + "foxact": "^0.2.26", + "jotai": "^2.5.1", "react": "18.2.0", "react-dom": "18.2.0", - "react-router-dom": "^6.16.0", - "storybook-addon-react-router-v6": "^2.0.7" + "react-router-dom": "^6.19.0", + "storybook-addon-react-router-v6": "^2.0.10" }, "peerDependencies": { "@blocksuite/blocks": "*", "@blocksuite/editor": "*", "@blocksuite/global": "*", "@blocksuite/icons": "2.1.34", - "@blocksuite/lit": "*", "@blocksuite/store": "*" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tests/storybook/src/stories/affine-banner.stories.tsx b/tests/storybook/src/stories/affine-banner.stories.tsx index 618a7752cc..27f95e66a2 100644 --- a/tests/storybook/src/stories/affine-banner.stories.tsx +++ b/tests/storybook/src/stories/affine-banner.stories.tsx @@ -1,4 +1,4 @@ -import { BrowserWarning, DownloadTips } from '@affine/component/affine-banner'; +import { BrowserWarning, LocalDemoTips } from '@affine/component/affine-banner'; import type { StoryFn } from '@storybook/react'; import { useState } from 'react'; @@ -24,9 +24,13 @@ export const Default: StoryFn = () => { export const Download: StoryFn = () => { const [, setIsClosed] = useState(true); + const [isLoggedIn, setIsLoggedIn] = useState(false); return (
- setIsLoggedIn(true)} + onEnableCloud={() => {}} onClose={() => { setIsClosed(false); }} diff --git a/tests/storybook/src/stories/breadcrumbs.stories.tsx b/tests/storybook/src/stories/breadcrumbs.stories.tsx deleted file mode 100644 index 6136b5e7d2..0000000000 --- a/tests/storybook/src/stories/breadcrumbs.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* deepscan-disable USELESS_ARROW_FUNC_BIND */ -import { Breadcrumbs } from '@affine/component'; -import { Link, Typography } from '@mui/material'; -import { expect } from '@storybook/jest'; -import type { Meta, StoryFn } from '@storybook/react'; -import { within } from '@storybook/testing-library'; -export default { - title: 'AFFiNE/Breadcrumbs', - component: Breadcrumbs, - parameters: { - chromatic: { disableSnapshot: true }, - }, -} as Meta; - -const Template: StoryFn = args => ; - -export const Primary = Template.bind(undefined); -Primary.play = async ({ canvasElement }) => { - const canvas = within(canvasElement); - const text = canvas.getByText('AFFiNE'); - expect(text.getAttribute('data-testid')).toBe('affine'); -}; -Primary.args = { - children: [ - - AFFiNE - , - - Docs - , - - Introduction - , - ], -}; diff --git a/tests/storybook/src/stories/introduction.stories.mdx b/tests/storybook/src/stories/introduction.stories.mdx index e4b88447ad..3dba2ebe1c 100644 --- a/tests/storybook/src/stories/introduction.stories.mdx +++ b/tests/storybook/src/stories/introduction.stories.mdx @@ -15,4 +15,4 @@ If you find a bug, please file an issue on [GitHub](https://github.com/toeveryth ## Contributing -We welcome contributions from the community! [Get started here](https://github.com/toeverything/AFFiNE/blob/master/docs/BUILDING.md) +We welcome contributions from the community! [Get started here](https://github.com/toeverything/AFFiNE/blob/canary/docs/BUILDING.md) diff --git a/tests/storybook/src/stories/page-list.stories.tsx b/tests/storybook/src/stories/page-list.stories.tsx index 8e6b11aab1..0b904b1704 100644 --- a/tests/storybook/src/stories/page-list.stories.tsx +++ b/tests/storybook/src/stories/page-list.stories.tsx @@ -67,6 +67,31 @@ AffineNewPageButton.play = async ({ canvasElement }) => { }; const testTags = [ + { + color: 'red', + id: 'test-tag-id-cccc', + value: 'cccccccccccccccc', + }, + { + color: 'red', + id: 'test-tag-id-a', + value: 'a', + }, + { + color: 'red', + id: 'test-tag-id-b', + value: 'b', + }, + { + color: 'red', + id: 'test-tag-id-c', + value: 'c', + }, + { + color: 'red', + id: 'test-tag-id-d', + value: 'd', + }, { color: 'red', id: 'test-tag-id-0', diff --git a/tests/storybook/src/stories/share-menu.stories.tsx b/tests/storybook/src/stories/share-menu.stories.tsx index b711e0c2e4..7bafe3c318 100644 --- a/tests/storybook/src/stories/share-menu.stories.tsx +++ b/tests/storybook/src/stories/share-menu.stories.tsx @@ -1,9 +1,6 @@ import { toast } from '@affine/component'; -import { - PublicLinkDisableModal, - StyledDisableButton, -} from '@affine/component/share-menu'; -import { ShareMenu } from '@affine/component/share-menu'; +import { PublicLinkDisableModal } from '@affine/component/disable-public-link'; +import { ShareMenu } from '@affine/core/components/affine/share-page-modal/share-menu'; import type { AffineCloudWorkspace, LocalWorkspace, @@ -24,20 +21,6 @@ export default { }, } satisfies Meta; -const sharePageMap = new Map([]); -// todo: use a real hook -const useIsSharedPage = ( - _workspaceId: string, - pageId: string -): [isSharePage: boolean, setIsSharePage: (enable: boolean) => void] => { - const [isShared, setIsShared] = useState(sharePageMap.get(pageId) ?? false); - const togglePagePublic = (enable: boolean) => { - setIsShared(enable); - sharePageMap.set(pageId, enable); - }; - return [isShared, togglePagePublic]; -}; - async function initPage(page: Page) { await page.waitForLoaded(); // Add page block and surface block at root level @@ -88,11 +71,8 @@ export const Basic: StoryFn = () => { return ( ); }; @@ -119,11 +99,8 @@ export const AffineBasic: StoryFn = () => { return ( ); }; @@ -133,9 +110,7 @@ export const DisableModal: StoryFn = () => { use(promise); return ( <> - setOpen(!open)}> - Disable Public Link - +
setOpen(!open)}>Disable Public Link
{ diff --git a/tools/@types/env/__all.d.ts b/tools/@types/env/__all.d.ts index c91966a97e..57c735f098 100644 --- a/tools/@types/env/__all.d.ts +++ b/tools/@types/env/__all.d.ts @@ -44,11 +44,6 @@ declare global { ): this; }; }; - $migrationDone: boolean | undefined; - } - - interface WindowEventMap { - 'migration-done': CustomEvent; } // eslint-disable-next-line no-var diff --git a/tools/@types/env/package.json b/tools/@types/env/package.json index 635e491ba1..6cd4b9cddf 100644 --- a/tools/@types/env/package.json +++ b/tools/@types/env/package.json @@ -7,5 +7,5 @@ "@affine/env": "workspace:*", "@toeverything/infra": "workspace:*" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tools/cli/package.json b/tools/cli/package.json index f7cc49f8cc..ef8db93657 100644 --- a/tools/cli/package.json +++ b/tools/cli/package.json @@ -22,5 +22,5 @@ "peerDependencies": { "ts-node": "*" }, - "version": "0.10.2" + "version": "0.10.3-canary.2" } diff --git a/tools/plugin-cli/package.json b/tools/plugin-cli/package.json index 464a898473..03b05d6219 100644 --- a/tools/plugin-cli/package.json +++ b/tools/plugin-cli/package.json @@ -1,7 +1,7 @@ { "name": "@affine/plugin-cli", "type": "module", - "version": "0.10.2", + "version": "0.10.3-canary.2", "bin": { "af": "./src/af.mjs" }, diff --git a/tools/workers/package.json b/tools/workers/package.json index bc2d23cc02..39e2606ea5 100644 --- a/tools/workers/package.json +++ b/tools/workers/package.json @@ -1,6 +1,6 @@ { "name": "@affine/workers", - "version": "0.10.2", + "version": "0.10.3-canary.2", "private": true, "scripts": { "dev": "wrangler dev" diff --git a/yarn.lock b/yarn.lock index d58185d1ac..e314c8d6a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,17 @@ __metadata: dependencies: "@affine-test/fixtures": "workspace:*" "@affine-test/kit": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@playwright/test": "npm:^1.39.0" express: "npm:^4.18.2" http-proxy-middleware: "npm:^3.0.0-beta.1" @@ -42,10 +49,17 @@ __metadata: dependencies: "@affine-test/fixtures": "workspace:*" "@affine-test/kit": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@playwright/test": "npm:^1.39.0" express: "npm:^4.18.2" http-proxy-middleware: "npm:^3.0.0-beta.1" @@ -59,10 +73,17 @@ __metadata: dependencies: "@affine-test/fixtures": "workspace:*" "@affine-test/kit": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@playwright/test": "npm:^1.39.0" express: "npm:^4.18.2" http-proxy-middleware: "npm:^3.0.0-beta.1" @@ -76,10 +97,17 @@ __metadata: dependencies: "@affine-test/fixtures": "workspace:*" "@affine-test/kit": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@playwright/test": "npm:^1.39.0" express: "npm:^4.18.2" http-proxy-middleware: "npm:^3.0.0-beta.1" @@ -138,10 +166,17 @@ __metadata: dependencies: "@affine-test/fixtures": "workspace:*" "@affine-test/kit": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@playwright/test": "npm:^1.39.0" languageName: unknown linkType: soft @@ -195,7 +230,7 @@ __metadata: languageName: unknown linkType: soft -"@affine/cmdk@workspace:packages/common/cmdk": +"@affine/cmdk@workspace:*, @affine/cmdk@workspace:packages/common/cmdk": version: 0.0.0-use.local resolution: "@affine/cmdk@workspace:packages/common/cmdk" dependencies: @@ -212,22 +247,27 @@ __metadata: "@affine/graphql": "workspace:*" "@affine/i18n": "workspace:*" "@affine/workspace": "workspace:*" +<<<<<<< HEAD "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/icons": "npm:2.1.35" "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/icons": "npm:2.1.36" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@dnd-kit/core": "npm:^6.0.8" "@dnd-kit/modifiers": "npm:^6.0.1" - "@dnd-kit/sortable": "npm:^7.0.2" + "@dnd-kit/sortable": "npm:^8.0.0" "@emotion/cache": "npm:^11.11.0" "@emotion/react": "npm:^11.11.1" "@emotion/server": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0" - "@mui/base": "npm:5.0.0-beta.19" - "@mui/icons-material": "npm:^5.14.14" - "@mui/material": "npm:^5.14.14" "@popperjs/core": "npm:^2.11.8" "@radix-ui/react-avatar": "npm:^1.0.4" "@radix-ui/react-collapsible": "npm:^1.0.3" @@ -255,15 +295,14 @@ __metadata: dayjs: "npm:^1.11.10" fake-indexeddb: "npm:^5.0.0" foxact: "npm:^0.2.20" - jotai: "npm:^2.4.3" - jotai-effect: "npm:^0.2.2" - jotai-scope: "npm:^0.4.0" + jotai: "npm:^2.5.1" + jotai-effect: "npm:^0.2.3" + jotai-scope: "npm:^0.4.1" lit: "npm:^3.0.2" - lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" lottie-react: "npm:^2.4.0" lottie-web: "npm:^5.12.2" - nanoid: "npm:^5.0.1" + nanoid: "npm:^5.0.3" next-themes: "npm:^0.2.1" react: "npm:18.2.0" react-datepicker: "npm:^4.20.0" @@ -274,17 +313,16 @@ __metadata: react-router-dom: "npm:^6.16.0" react-virtuoso: "npm:^4.6.2" rxjs: "npm:^7.8.1" - typescript: "npm:^5.2.2" + typescript: "npm:^5.3.2" uuid: "npm:^9.0.1" vite: "npm:^4.4.11" vitest: "npm:0.34.6" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" peerDependencies: "@blocksuite/blocks": "*" "@blocksuite/editor": "*" "@blocksuite/global": "*" "@blocksuite/icons": 2.1.34 - "@blocksuite/lit": "*" "@blocksuite/store": "*" languageName: unknown linkType: soft @@ -296,13 +334,13 @@ __metadata: "@affine/component": "workspace:*" "@affine/plugin-cli": "workspace:*" "@affine/sdk": "workspace:*" - "@blocksuite/icons": "npm:2.1.35" + "@blocksuite/icons": "npm:2.1.36" "@toeverything/components": "npm:^0.0.46" "@types/marked": "npm:^6.0.0" "@vanilla-extract/css": "npm:^1.13.0" clsx: "npm:^2.0.0" idb: "npm:^7.1.1" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" langchain: "npm:^0.0.166" marked: "npm:^9.1.2" marked-gfm-heading-id: "npm:^3.1.0" @@ -321,6 +359,7 @@ __metadata: resolution: "@affine/core@workspace:packages/frontend/core" dependencies: "@affine-test/fixtures": "workspace:*" + "@affine/cmdk": "workspace:*" "@affine/component": "workspace:*" "@affine/debug": "workspace:*" "@affine/env": "workspace:*" @@ -329,6 +368,7 @@ __metadata: "@affine/templates": "workspace:*" "@affine/workspace": "workspace:*" "@aws-sdk/client-s3": "npm:3.433.0" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" @@ -336,50 +376,73 @@ __metadata: "@blocksuite/icons": "npm:2.1.35" "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/icons": "npm:2.1.36" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/virgo": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@dnd-kit/core": "npm:^6.0.8" - "@dnd-kit/sortable": "npm:^7.0.2" + "@dnd-kit/sortable": "npm:^8.0.0" "@emotion/cache": "npm:^11.11.0" "@emotion/react": "npm:^11.11.1" "@emotion/server": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0" "@marsidev/react-turnstile": "npm:^0.3.1" - "@mui/material": "npm:^5.14.14" "@perfsee/webpack": "npm:^1.8.4" "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11" + "@radix-ui/react-collapsible": "npm:^1.0.3" + "@radix-ui/react-dialog": "npm:^1.0.4" + "@radix-ui/react-scroll-area": "npm:^1.0.5" "@radix-ui/react-select": "npm:^2.0.0" "@react-hookz/web": "npm:^23.1.0" "@sentry/webpack-plugin": "npm:^2.8.0" "@svgr/webpack": "npm:^8.1.0" "@swc/core": "npm:^1.3.93" + "@testing-library/react": "npm:^14.0.0" "@toeverything/components": "npm:^0.0.46" + "@toeverything/theme": "npm:^0.7.20" "@types/bytes": "npm:^3.1.3" "@types/lodash-es": "npm:^4.17.9" + "@types/uuid": "npm:^9.0.5" "@types/webpack-env": "npm:^1.18.2" + "@vanilla-extract/css": "npm:^1.13.0" + "@vanilla-extract/dynamic": "npm:^2.0.3" async-call-rpc: "npm:^6.3.1" bytes: "npm:^3.1.2" + clsx: "npm:^2.0.0" copy-webpack-plugin: "npm:^11.0.0" css-loader: "npm:^6.8.1" css-spring: "npm:^4.1.0" cssnano: "npm:^6.0.1" + dayjs: "npm:^1.11.10" express: "npm:^4.18.2" + fake-indexeddb: "npm:^5.0.0" + foxact: "npm:^0.2.20" graphql: "npm:^16.8.1" html-webpack-plugin: "npm:^5.5.3" + idb: "npm:^7.1.1" intl-segmenter-polyfill-rs: "npm:^0.1.6" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" jotai-devtools: "npm:^0.7.0" lit: "npm:^3.0.2" lodash-es: "npm:^4.17.21" lottie-web: "npm:^5.12.2" mime-types: "npm:^2.1.35" mini-css-extract-plugin: "npm:^2.7.6" - next-auth: "npm:^4.23.2" + nanoid: "npm:^5.0.3" + next-auth: "npm:^4.24.5" next-themes: "npm:^0.2.1" postcss-loader: "npm:^7.3.3" raw-loader: "npm:^4.0.2" react: "npm:18.2.0" react-dom: "npm:18.2.0" + react-error-boundary: "npm:^4.0.11" react-is: "npm:18.2.0" - react-resizable-panels: "npm:^0.0.55" + react-resizable-panels: "npm:^0.0.61" react-router-dom: "npm:^6.16.0" rxjs: "npm:^7.8.1" ses: "npm:^0.18.8" @@ -389,13 +452,15 @@ __metadata: swc-plugin-coverage-instrument: "npm:^0.0.20" swr: "npm:2.2.4" thread-loader: "npm:^4.0.2" + uuid: "npm:^9.0.1" valtio: "npm:^1.11.2" + vitest: "npm:0.34.6" webpack: "npm:^5.89.0" webpack-cli: "npm:^5.1.4" webpack-dev-server: "npm:^4.15.1" webpack-merge: "npm:^5.9.0" y-protocols: "npm:^1.0.6" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" zod: "npm:^3.22.4" languageName: unknown linkType: soft @@ -424,6 +489,7 @@ __metadata: "@affine/sdk": "workspace:*" "@affine/templates": "workspace:*" "@affine/vue-hello-world-plugin": "workspace:*" +<<<<<<< HEAD "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" @@ -437,33 +503,53 @@ __metadata: "@electron-forge/maker-zip": "npm:^6.4.2" "@electron-forge/shared-types": "npm:^6.4.2" "@electron/remote": "npm:2.0.12" +======= + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@electron-forge/cli": "npm:^7.1.0" + "@electron-forge/core": "npm:^7.1.0" + "@electron-forge/core-utils": "npm:^7.1.0" + "@electron-forge/maker-deb": "npm:^7.1.0" + "@electron-forge/maker-dmg": "npm:^7.1.0" + "@electron-forge/maker-squirrel": "npm:^7.1.0" + "@electron-forge/maker-zip": "npm:^7.1.0" + "@electron-forge/plugin-auto-unpack-natives": "npm:^7.1.0" + "@electron-forge/shared-types": "npm:^7.1.0" + "@electron/remote": "npm:2.1.0" +>>>>>>> canary "@reforged/maker-appimage": "npm:^3.3.1" "@toeverything/infra": "workspace:*" - "@types/uuid": "npm:^9.0.5" + "@types/uuid": "npm:^9.0.7" async-call-rpc: "npm:^6.3.1" - builder-util-runtime: "npm:^9.2.1" + builder-util-runtime: "npm:^9.2.3" cross-env: "npm:^7.0.3" +<<<<<<< HEAD electron: "npm:^27.0.0" electron-log: "npm:^5.0.0" +======= + electron: "npm:^27.1.0" + electron-log: "npm:^5.0.1" +>>>>>>> canary electron-squirrel-startup: "npm:1.0.0" electron-updater: "npm:^6.1.5" electron-window-state: "npm:^5.0.3" - esbuild: "npm:^0.19.4" + esbuild: "npm:^0.19.7" fs-extra: "npm:^11.1.1" glob: "npm:^10.3.10" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" link-preview-js: "npm:^3.0.5" lodash-es: "npm:^4.17.21" - nanoid: "npm:^5.0.1" + nanoid: "npm:^5.0.3" rxjs: "npm:^7.8.1" semver: "npm:^7.5.4" tinykeys: "npm:^2.1.0" ts-node: "npm:^10.9.1" - undici: "npm:^5.26.3" + undici: "npm:^5.27.2" uuid: "npm:^9.0.1" vitest: "npm:0.34.6" which: "npm:^4.0.0" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" zod: "npm:^3.22.4" peerDependencies: ts-node: "*" @@ -474,8 +560,13 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/env@workspace:packages/common/env" dependencies: +<<<<<<< HEAD "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary lit: "npm:^3.0.2" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -499,6 +590,7 @@ __metadata: "@graphql-codegen/typescript-operations": "npm:^4.0.1" "@types/lodash-es": "npm:^4.17.9" graphql: "npm:^16.8.1" + lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" nanoid: "npm:^5.0.1" prettier: "npm:^3.0.3" @@ -513,7 +605,7 @@ __metadata: "@affine/component": "workspace:*" "@affine/plugin-cli": "workspace:*" "@affine/sdk": "workspace:*" - "@blocksuite/icons": "npm:2.1.35" + "@blocksuite/icons": "npm:2.1.36" "@toeverything/components": "npm:^0.0.46" languageName: unknown linkType: soft @@ -522,7 +614,6 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/i18n@workspace:packages/frontend/i18n" dependencies: - "@types/node": "npm:^18.18.5" "@types/prettier": "npm:^3.0.0" i18next: "npm:^23.5.1" prettier: "npm:^3.0.3" @@ -539,7 +630,7 @@ __metadata: "@affine/component": "workspace:*" "@affine/plugin-cli": "workspace:*" "@affine/sdk": "workspace:*" - "@blocksuite/icons": "npm:2.1.35" + "@blocksuite/icons": "npm:2.1.36" "@toeverything/components": "npm:^0.0.46" "@toeverything/theme": "npm:^0.7.24" clsx: "npm:^2.0.0" @@ -556,58 +647,58 @@ __metadata: "@affine-test/kit": "workspace:*" "@affine/cli": "workspace:*" "@affine/plugin-cli": "workspace:*" - "@commitlint/cli": "npm:^17.8.0" - "@commitlint/config-conventional": "npm:^17.8.0" - "@faker-js/faker": "npm:^8.2.0" + "@commitlint/cli": "npm:^18.4.3" + "@commitlint/config-conventional": "npm:^18.4.3" + "@faker-js/faker": "npm:^8.3.1" "@istanbuljs/schema": "npm:^0.1.3" "@magic-works/i18n-codegen": "npm:^0.5.0" - "@nx/vite": "npm:16.10.0" + "@nx/vite": "npm:17.1.3" "@perfsee/sdk": "npm:^1.9.0" - "@playwright/test": "npm:^1.39.0" + "@playwright/test": "npm:^1.40.0" "@taplo/cli": "npm:^0.5.2" - "@testing-library/react": "npm:^14.0.0" + "@testing-library/react": "npm:^14.1.2" "@toeverything/infra": "workspace:*" "@types/affine__env": "workspace:*" - "@types/eslint": "npm:^8.44.4" - "@types/node": "npm:^18.18.5" - "@typescript-eslint/eslint-plugin": "npm:^6.7.5" - "@typescript-eslint/parser": "npm:^6.7.5" - "@vanilla-extract/vite-plugin": "npm:^3.9.0" + "@types/eslint": "npm:^8.44.7" + "@types/node": "npm:^20.9.3" + "@typescript-eslint/eslint-plugin": "npm:^6.12.0" + "@typescript-eslint/parser": "npm:^6.12.0" + "@vanilla-extract/vite-plugin": "npm:^3.9.2" "@vanilla-extract/webpack-plugin": "npm:^2.3.1" - "@vitejs/plugin-react-swc": "npm:^3.4.0" + "@vitejs/plugin-react-swc": "npm:^3.5.0" "@vitest/coverage-istanbul": "npm:0.34.6" "@vitest/ui": "npm:0.34.6" - electron: "npm:^27.0.0" - eslint: "npm:^8.51.0" + electron: "npm:^27.1.0" + eslint: "npm:^8.54.0" eslint-config-prettier: "npm:^9.0.0" - eslint-plugin-i: "npm:^2.28.1" + eslint-plugin-i: "npm:^2.29.0" eslint-plugin-prettier: "npm:^5.0.1" eslint-plugin-react: "npm:^7.33.2" eslint-plugin-react-hooks: "npm:^4.6.0" eslint-plugin-simple-import-sort: "npm:^10.0.0" - eslint-plugin-sonarjs: "npm:^0.21.0" - eslint-plugin-unicorn: "npm:^48.0.1" + eslint-plugin-sonarjs: "npm:^0.23.0" + eslint-plugin-unicorn: "npm:^49.0.0" eslint-plugin-unused-imports: "npm:^3.0.0" - eslint-plugin-vue: "npm:^9.17.0" - fake-indexeddb: "npm:5.0.0" - happy-dom: "npm:^12.9.1" + eslint-plugin-vue: "npm:^9.18.1" + fake-indexeddb: "npm:5.0.1" + happy-dom: "npm:^12.10.3" husky: "npm:^8.0.3" - lint-staged: "npm:^15.0.0" + lint-staged: "npm:^15.1.0" madge: "npm:^6.1.0" - msw: "npm:^1.3.2" - nanoid: "npm:^5.0.1" - nx: "npm:^16.10.0" + msw: "npm:^2.0.8" + nanoid: "npm:^5.0.3" + nx: "npm:^17.1.3" nx-cloud: "npm:^16.5.2" nyc: "npm:^15.1.0" - prettier: "npm:^3.0.3" + prettier: "npm:^3.1.0" semver: "npm:^7.5.4" serve: "npm:^14.2.1" - string-width: "npm:^6.1.0" + string-width: "npm:^7.0.0" ts-node: "npm:^10.9.1" - typescript: "npm:^5.2.2" - vite: "npm:^4.4.11" + typescript: "npm:^5.3.2" + vite: "npm:^5.0.1" vite-plugin-istanbul: "npm:^5.0.0" - vite-plugin-static-copy: "npm:^0.17.0" + vite-plugin-static-copy: "npm:^0.17.1" vite-tsconfig-paths: "npm:^4.2.1" vitest: "npm:0.34.6" vitest-fetch-mock: "npm:^0.2.2" @@ -619,16 +710,16 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/native@workspace:packages/frontend/native" dependencies: - "@napi-rs/cli": "npm:^2.16.3" - "@types/node": "npm:^18.18.5" - "@types/uuid": "npm:^9.0.5" + "@napi-rs/cli": "npm:^2.16.5" + "@types/node": "npm:^20.9.3" + "@types/uuid": "npm:^9.0.7" ava: "npm:^5.3.1" cross-env: "npm:^7.0.3" - nx: "npm:^16.10.0" + nx: "npm:^17.1.3" nx-cloud: "npm:^16.5.2" rxjs: "npm:^7.8.1" ts-node: "npm:^10.9.1" - typescript: "npm:^5.2.2" + typescript: "npm:^5.3.2" uuid: "npm:^9.0.1" languageName: unknown linkType: soft @@ -640,9 +731,9 @@ __metadata: "@affine/component": "workspace:*" "@affine/plugin-cli": "workspace:*" "@affine/sdk": "workspace:*" - "@blocksuite/icons": "npm:2.1.35" + "@blocksuite/icons": "npm:2.1.36" "@toeverything/components": "npm:^0.0.46" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" react: "npm:18.2.0" react-dom: "npm:18.2.0" languageName: unknown @@ -671,12 +762,21 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/sdk@workspace:packages/common/sdk" dependencies: +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" jotai: "npm:^2.4.3" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + jotai: "npm:^2.5.1" +>>>>>>> canary vite: "npm:^4.4.11" vite-plugin-dts: "npm:3.6.0" zod: "npm:^3.22.4" @@ -689,59 +789,60 @@ __metadata: dependencies: "@affine-test/kit": "workspace:*" "@affine/storage": "workspace:*" - "@apollo/server": "npm:^4.9.4" - "@auth/prisma-adapter": "npm:^1.0.3" - "@aws-sdk/client-s3": "npm:^3.433.0" + "@apollo/server": "npm:^4.9.5" + "@auth/prisma-adapter": "npm:^1.0.7" + "@aws-sdk/client-s3": "npm:^3.454.0" "@google-cloud/opentelemetry-cloud-monitoring-exporter": "npm:^0.17.0" "@google-cloud/opentelemetry-cloud-trace-exporter": "npm:^2.1.0" "@keyv/redis": "npm:^2.8.0" "@napi-rs/image": "npm:^1.7.0" - "@nestjs/apollo": "npm:^12.0.9" - "@nestjs/common": "npm:^10.2.7" - "@nestjs/core": "npm:^10.2.7" - "@nestjs/event-emitter": "npm:^2.0.2" - "@nestjs/graphql": "npm:^12.0.9" - "@nestjs/platform-express": "npm:^10.2.7" - "@nestjs/platform-socket.io": "npm:^10.2.7" - "@nestjs/testing": "npm:^10.2.7" - "@nestjs/throttler": "npm:^5.0.0" - "@nestjs/websockets": "npm:^10.2.7" + "@nestjs/apollo": "npm:^12.0.11" + "@nestjs/common": "npm:^10.2.10" + "@nestjs/core": "npm:^10.2.10" + "@nestjs/event-emitter": "npm:^2.0.3" + "@nestjs/graphql": "npm:^12.0.11" + "@nestjs/platform-express": "npm:^10.2.10" + "@nestjs/platform-socket.io": "npm:^10.2.10" + "@nestjs/schedule": "npm:^4.0.0" + "@nestjs/testing": "npm:^10.2.10" + "@nestjs/throttler": "npm:^5.0.1" + "@nestjs/websockets": "npm:^10.2.10" "@node-rs/argon2": "npm:^1.5.2" "@node-rs/crc32": "npm:^1.7.2" "@node-rs/jsonwebtoken": "npm:^0.2.3" - "@opentelemetry/api": "npm:^1.6.0" - "@opentelemetry/core": "npm:^1.17.1" - "@opentelemetry/instrumentation": "npm:^0.44.0" - "@opentelemetry/instrumentation-graphql": "npm:^0.35.2" - "@opentelemetry/instrumentation-http": "npm:^0.44.0" - "@opentelemetry/instrumentation-ioredis": "npm:^0.35.2" - "@opentelemetry/instrumentation-nestjs-core": "npm:^0.33.2" - "@opentelemetry/instrumentation-socket.io": "npm:^0.34.2" - "@opentelemetry/sdk-metrics": "npm:^1.17.1" - "@opentelemetry/sdk-node": "npm:^0.44.0" - "@opentelemetry/sdk-trace-node": "npm:^1.17.1" - "@prisma/client": "npm:^5.4.2" - "@prisma/instrumentation": "npm:^5.4.2" + "@opentelemetry/api": "npm:^1.7.0" + "@opentelemetry/core": "npm:^1.18.1" + "@opentelemetry/instrumentation": "npm:^0.45.1" + "@opentelemetry/instrumentation-graphql": "npm:^0.36.0" + "@opentelemetry/instrumentation-http": "npm:^0.45.1" + "@opentelemetry/instrumentation-ioredis": "npm:^0.35.3" + "@opentelemetry/instrumentation-nestjs-core": "npm:^0.33.3" + "@opentelemetry/instrumentation-socket.io": "npm:^0.34.3" + "@opentelemetry/sdk-metrics": "npm:^1.18.1" + "@opentelemetry/sdk-node": "npm:^0.45.1" + "@opentelemetry/sdk-trace-node": "npm:^1.18.1" + "@prisma/client": "npm:^5.6.0" + "@prisma/instrumentation": "npm:^5.6.0" "@socket.io/redis-adapter": "npm:^8.2.1" - "@types/cookie-parser": "npm:^1.4.4" - "@types/engine.io": "npm:^3.1.8" - "@types/express": "npm:^4.17.19" - "@types/graphql-upload": "npm:^16.0.3" + "@types/cookie-parser": "npm:^1.4.6" + "@types/engine.io": "npm:^3.1.10" + "@types/express": "npm:^4.17.21" + "@types/graphql-upload": "npm:^16.0.5" "@types/keyv": "npm:^4.2.0" - "@types/lodash-es": "npm:^4.17.9" - "@types/node": "npm:^18.18.5" - "@types/nodemailer": "npm:^6.4.11" - "@types/on-headers": "npm:^1.0.1" - "@types/pretty-time": "npm:^1.1.3" - "@types/sinon": "npm:^10.0.19" - "@types/supertest": "npm:^2.0.14" - "@types/ws": "npm:^8.5.7" + "@types/lodash-es": "npm:^4.17.11" + "@types/node": "npm:^20.9.3" + "@types/nodemailer": "npm:^6.4.14" + "@types/on-headers": "npm:^1.0.3" + "@types/pretty-time": "npm:^1.1.5" + "@types/sinon": "npm:^17.0.2" + "@types/supertest": "npm:^2.0.16" + "@types/ws": "npm:^8.5.10" ava: "npm:^5.3.1" c8: "npm:^8.0.1" cookie-parser: "npm:^1.4.6" dotenv: "npm:^16.3.1" express: "npm:^4.18.2" - file-type: "npm:^18.5.0" + file-type: "npm:^18.7.0" get-stream: "npm:^8.0.1" graphql: "npm:^16.8.1" graphql-type-json: "npm:^0.3.2" @@ -749,28 +850,28 @@ __metadata: ioredis: "npm:^5.3.2" keyv: "npm:^4.5.4" lodash-es: "npm:^4.17.21" - nanoid: "npm:^5.0.1" - nest-commander: "npm:^3.12.0" + nanoid: "npm:^5.0.3" + nest-commander: "npm:^3.12.2" nestjs-throttler-storage-redis: "npm:^0.4.1" - next-auth: "npm:^4.23.2" - nodemailer: "npm:^6.9.6" + next-auth: "npm:^4.24.5" + nodemailer: "npm:^6.9.7" nodemon: "npm:^3.0.1" on-headers: "npm:^1.0.2" parse-duration: "npm:^1.1.0" pretty-time: "npm:^1.1.0" - prisma: "npm:^5.4.2" + prisma: "npm:^5.6.0" prom-client: "npm:^15.0.0" reflect-metadata: "npm:^0.1.13" rxjs: "npm:^7.8.1" semver: "npm:^7.5.4" - sinon: "npm:^16.1.0" + sinon: "npm:^17.0.1" socket.io: "npm:^4.7.2" - stripe: "npm:^14.1.0" + stripe: "npm:^14.5.0" supertest: "npm:^6.3.3" ts-node: "npm:^10.9.1" - typescript: "npm:^5.2.2" + typescript: "npm:^5.3.2" ws: "npm:^8.14.2" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" bin: run-test: ./scripts/run-test.ts languageName: unknown @@ -780,11 +881,11 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/storage@workspace:packages/backend/storage" dependencies: - "@napi-rs/cli": "npm:^2.16.3" + "@napi-rs/cli": "npm:^2.16.5" lib0: "npm:^0.2.87" - nx: "npm:^16.10.0" + nx: "npm:^17.1.3" nx-cloud: "npm:^16.5.2" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" languageName: unknown linkType: soft @@ -794,6 +895,7 @@ __metadata: dependencies: "@affine/component": "workspace:*" "@affine/i18n": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" @@ -810,33 +912,49 @@ __metadata: "@storybook/addon-storysource": "npm:^7.4.6" "@storybook/blocks": "npm:^7.4.6" "@storybook/builder-vite": "npm:^7.4.6" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/icons": "npm:2.1.36" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/virgo": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@dnd-kit/sortable": "npm:^8.0.0" + "@storybook/addon-actions": "npm:^7.5.3" + "@storybook/addon-essentials": "npm:^7.5.3" + "@storybook/addon-interactions": "npm:^7.5.3" + "@storybook/addon-links": "npm:^7.5.3" + "@storybook/addon-storysource": "npm:^7.5.3" + "@storybook/blocks": "npm:^7.5.3" + "@storybook/builder-vite": "npm:^7.5.3" +>>>>>>> canary "@storybook/jest": "npm:^0.2.3" - "@storybook/react": "npm:^7.4.6" - "@storybook/react-vite": "npm:^7.4.6" - "@storybook/test-runner": "npm:^0.13.0" + "@storybook/react": "npm:^7.5.3" + "@storybook/react-vite": "npm:^7.5.3" + "@storybook/test-runner": "npm:^0.15.2" "@storybook/testing-library": "npm:^0.2.2" "@tomfreudenberg/next-auth-mock": "npm:^0.5.6" - "@vitejs/plugin-react": "npm:^4.1.0" - chromatic: "npm:^7.4.0" - concurrently: "npm:^8.2.1" - foxact: "npm:^0.2.20" + "@vitejs/plugin-react": "npm:^4.2.0" + chromatic: "npm:^9.1.0" + concurrently: "npm:^8.2.2" + foxact: "npm:^0.2.26" jest-mock: "npm:^29.7.0" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" react: "npm:18.2.0" react-dom: "npm:18.2.0" - react-router-dom: "npm:^6.16.0" + react-router-dom: "npm:^6.19.0" serve: "npm:^14.2.1" ses: "npm:^0.18.8" - storybook: "npm:^7.4.6" - storybook-addon-react-router-v6: "npm:^2.0.7" + storybook: "npm:^7.5.3" + storybook-addon-react-router-v6: "npm:^2.0.10" storybook-dark-mode: "npm:^3.0.1" - wait-on: "npm:^7.0.1" + wait-on: "npm:^7.2.0" peerDependencies: "@blocksuite/blocks": "*" "@blocksuite/editor": "*" "@blocksuite/global": "*" "@blocksuite/icons": 2.1.34 - "@blocksuite/lit": "*" "@blocksuite/store": "*" languageName: unknown linkType: soft @@ -881,14 +999,16 @@ __metadata: "@types/ws": "npm:^8.5.7" async-call-rpc: "npm:^6.3.1" fake-indexeddb: "npm:^5.0.0" + idb: "npm:^7.1.1" + idb-keyval: "npm:^6.2.1" is-svg: "npm:^5.0.0" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" js-base64: "npm:^3.7.5" ky: "npm:^1.0.1" lib0: "npm:^0.2.87" lodash-es: "npm:^4.17.21" - nanoid: "npm:^5.0.1" - next-auth: "npm:^4.23.2" + nanoid: "npm:^5.0.3" + next-auth: "npm:^4.24.5" react: "npm:18.2.0" react-dom: "npm:18.2.0" socket.io-client: "npm:^4.7.2" @@ -898,10 +1018,11 @@ __metadata: ws: "npm:^8.14.2" y-protocols: "npm:^1.0.6" y-provider: "workspace:*" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" zod: "npm:^3.22.4" peerDependencies: "@blocksuite/blocks": "*" + "@blocksuite/global": "*" "@blocksuite/store": "*" languageName: unknown linkType: soft @@ -928,8 +1049,8 @@ __metadata: linkType: hard "@anthropic-ai/sdk@npm:^0.6.2": - version: 0.6.7 - resolution: "@anthropic-ai/sdk@npm:0.6.7" + version: 0.6.8 + resolution: "@anthropic-ai/sdk@npm:0.6.8" dependencies: "@types/node": "npm:^18.11.18" "@types/node-fetch": "npm:^2.6.4" @@ -940,7 +1061,7 @@ __metadata: formdata-node: "npm:^4.3.2" node-fetch: "npm:^2.6.7" web-streams-polyfill: "npm:^3.2.1" - checksum: 631045c6f20cebefaeaa15eda10141b368a791f0025bffa0dff400aa0b52fca147b68e7982617fb1da6580a6a555d440160f1d5f1d483175948b1d63af7603ee + checksum: 5cd8a4f65ed6f9e05cb67f05213feb39ca01b8822d37dafbff9ad4ceaffd343d69450618bdf3c5c64254c8e9b4db55e04c9a039a261fae801ad5765c81845332 languageName: node linkType: hard @@ -1001,9 +1122,9 @@ __metadata: languageName: node linkType: hard -"@apollo/server@npm:^4.9.4": - version: 4.9.4 - resolution: "@apollo/server@npm:4.9.4" +"@apollo/server@npm:^4.9.5": + version: 4.9.5 + resolution: "@apollo/server@npm:4.9.5" dependencies: "@apollo/cache-control-types": "npm:^1.0.3" "@apollo/server-gateway-interface": "npm:^1.1.1" @@ -1033,7 +1154,7 @@ __metadata: whatwg-mimetype: "npm:^3.0.0" peerDependencies: graphql: ^16.6.0 - checksum: 70df37afa6deaedb9efedd80661fa14086ff36128b545951b05db396004c54ae0e31c94e553756f784dbedc111d8f1eba748dbf5f6d44eac3261744464b973a2 + checksum: 68074b743a26e15bff06903ec0a1b6c0b0536ff69c4949818e8d64b8f027da4053967806076dfe793d8828fdf706b988939d74cade8a551e33d13da1bb29500a languageName: node linkType: hard @@ -1204,14 +1325,14 @@ __metadata: languageName: node linkType: hard -"@auth/core@npm:0.17.0": - version: 0.17.0 - resolution: "@auth/core@npm:0.17.0" +"@auth/core@npm:0.18.3": + version: 0.18.3 + resolution: "@auth/core@npm:0.18.3" dependencies: - "@panva/hkdf": "npm:^1.0.4" + "@panva/hkdf": "npm:^1.1.1" cookie: "npm:0.5.0" - jose: "npm:^4.11.1" - oauth4webapi: "npm:^2.0.6" + jose: "npm:^5.1.0" + oauth4webapi: "npm:^2.3.0" preact: "npm:10.11.3" preact-render-to-string: "npm:5.2.3" peerDependencies: @@ -1219,18 +1340,18 @@ __metadata: peerDependenciesMeta: nodemailer: optional: true - checksum: d0c57cb3f5d24cf7d158fd6efa6c7be335cb157f20265edddd98af95a3404f933a52111ff6ca7911c628535b764ee0546d712d9c9e45549ba8529e93bb3f7f70 + checksum: 6cd351c83cd7fd2aca6119f6516670d02e4ba769811d5beff710ef65c2fe038a49fd70c7a81bad224d16ec5b5b232ea7d38aeeb5b0920da15b121b400a592f75 languageName: node linkType: hard -"@auth/prisma-adapter@npm:^1.0.3": - version: 1.0.4 - resolution: "@auth/prisma-adapter@npm:1.0.4" +"@auth/prisma-adapter@npm:^1.0.7": + version: 1.0.8 + resolution: "@auth/prisma-adapter@npm:1.0.8" dependencies: - "@auth/core": "npm:0.17.0" + "@auth/core": "npm:0.18.3" peerDependencies: "@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5" - checksum: fcebb61bdfa83a3d8ab679cb218266f3b48b32cc7535f5ec29a521628a3917f1b7afbb45a163caa4cb9eb5467b48417ae8e8b2f53bb0698036411405f81e09c0 + checksum: 80254d5e89924dbf9fd5f1b4e8c03414e3f4ff8d9b0f3fe426617d6022e30252fbe41420eca03c48bb233b17ebb4b8dfb87bdfaa9bcf62bc2b3fcc1e04a9d7fe languageName: node linkType: hard @@ -1338,7 +1459,7 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-s3@npm:3.433.0, @aws-sdk/client-s3@npm:^3.433.0": +"@aws-sdk/client-s3@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/client-s3@npm:3.433.0" dependencies: @@ -1401,6 +1522,71 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-s3@npm:^3.454.0": + version: 3.456.0 + resolution: "@aws-sdk/client-s3@npm:3.456.0" + dependencies: + "@aws-crypto/sha1-browser": "npm:3.0.0" + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/client-sts": "npm:3.454.0" + "@aws-sdk/core": "npm:3.451.0" + "@aws-sdk/credential-provider-node": "npm:3.451.0" + "@aws-sdk/middleware-bucket-endpoint": "npm:3.451.0" + "@aws-sdk/middleware-expect-continue": "npm:3.451.0" + "@aws-sdk/middleware-flexible-checksums": "npm:3.451.0" + "@aws-sdk/middleware-host-header": "npm:3.451.0" + "@aws-sdk/middleware-location-constraint": "npm:3.451.0" + "@aws-sdk/middleware-logger": "npm:3.451.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.451.0" + "@aws-sdk/middleware-sdk-s3": "npm:3.451.0" + "@aws-sdk/middleware-signing": "npm:3.451.0" + "@aws-sdk/middleware-ssec": "npm:3.451.0" + "@aws-sdk/middleware-user-agent": "npm:3.451.0" + "@aws-sdk/region-config-resolver": "npm:3.451.0" + "@aws-sdk/signature-v4-multi-region": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-endpoints": "npm:3.451.0" + "@aws-sdk/util-user-agent-browser": "npm:3.451.0" + "@aws-sdk/util-user-agent-node": "npm:3.451.0" + "@aws-sdk/xml-builder": "npm:3.310.0" + "@smithy/config-resolver": "npm:^2.0.18" + "@smithy/eventstream-serde-browser": "npm:^2.0.13" + "@smithy/eventstream-serde-config-resolver": "npm:^2.0.13" + "@smithy/eventstream-serde-node": "npm:^2.0.13" + "@smithy/fetch-http-handler": "npm:^2.2.6" + "@smithy/hash-blob-browser": "npm:^2.0.14" + "@smithy/hash-node": "npm:^2.0.15" + "@smithy/hash-stream-node": "npm:^2.0.15" + "@smithy/invalid-dependency": "npm:^2.0.13" + "@smithy/md5-js": "npm:^2.0.15" + "@smithy/middleware-content-length": "npm:^2.0.15" + "@smithy/middleware-endpoint": "npm:^2.2.0" + "@smithy/middleware-retry": "npm:^2.0.20" + "@smithy/middleware-serde": "npm:^2.0.13" + "@smithy/middleware-stack": "npm:^2.0.7" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/node-http-handler": "npm:^2.1.9" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/smithy-client": "npm:^2.1.15" + "@smithy/types": "npm:^2.5.0" + "@smithy/url-parser": "npm:^2.0.13" + "@smithy/util-base64": "npm:^2.0.1" + "@smithy/util-body-length-browser": "npm:^2.0.0" + "@smithy/util-body-length-node": "npm:^2.1.0" + "@smithy/util-defaults-mode-browser": "npm:^2.0.19" + "@smithy/util-defaults-mode-node": "npm:^2.0.25" + "@smithy/util-endpoints": "npm:^1.0.4" + "@smithy/util-retry": "npm:^2.0.6" + "@smithy/util-stream": "npm:^2.0.20" + "@smithy/util-utf8": "npm:^2.0.2" + "@smithy/util-waiter": "npm:^2.0.13" + fast-xml-parser: "npm:4.2.5" + tslib: "npm:^2.5.0" + checksum: 11239ef01e03e2e8df9783fcfc40b3f66a7c819a9d400ab2f99d2a56b0ec38e0d17a60c564503daed1efae5e3dc5b45f3036bb4c432f79326e6d423c824a6b75 + languageName: node + linkType: hard + "@aws-sdk/client-sso@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/client-sso@npm:3.433.0" @@ -1443,6 +1629,50 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/client-sso@npm:3.451.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/core": "npm:3.451.0" + "@aws-sdk/middleware-host-header": "npm:3.451.0" + "@aws-sdk/middleware-logger": "npm:3.451.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.451.0" + "@aws-sdk/middleware-user-agent": "npm:3.451.0" + "@aws-sdk/region-config-resolver": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-endpoints": "npm:3.451.0" + "@aws-sdk/util-user-agent-browser": "npm:3.451.0" + "@aws-sdk/util-user-agent-node": "npm:3.451.0" + "@smithy/config-resolver": "npm:^2.0.18" + "@smithy/fetch-http-handler": "npm:^2.2.6" + "@smithy/hash-node": "npm:^2.0.15" + "@smithy/invalid-dependency": "npm:^2.0.13" + "@smithy/middleware-content-length": "npm:^2.0.15" + "@smithy/middleware-endpoint": "npm:^2.2.0" + "@smithy/middleware-retry": "npm:^2.0.20" + "@smithy/middleware-serde": "npm:^2.0.13" + "@smithy/middleware-stack": "npm:^2.0.7" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/node-http-handler": "npm:^2.1.9" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/smithy-client": "npm:^2.1.15" + "@smithy/types": "npm:^2.5.0" + "@smithy/url-parser": "npm:^2.0.13" + "@smithy/util-base64": "npm:^2.0.1" + "@smithy/util-body-length-browser": "npm:^2.0.0" + "@smithy/util-body-length-node": "npm:^2.1.0" + "@smithy/util-defaults-mode-browser": "npm:^2.0.19" + "@smithy/util-defaults-mode-node": "npm:^2.0.25" + "@smithy/util-endpoints": "npm:^1.0.4" + "@smithy/util-retry": "npm:^2.0.6" + "@smithy/util-utf8": "npm:^2.0.2" + tslib: "npm:^2.5.0" + checksum: ffd9f848aade06c3aa15dccb499bf76754a58cafe1d40b41b254588ad8f280a681fb1e38b74d35b3cdc166e58dcec37873c1008d52bee7d71e09491580cf5f30 + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/client-sts@npm:3.433.0" @@ -1489,6 +1719,64 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sts@npm:3.454.0": + version: 3.454.0 + resolution: "@aws-sdk/client-sts@npm:3.454.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/core": "npm:3.451.0" + "@aws-sdk/credential-provider-node": "npm:3.451.0" + "@aws-sdk/middleware-host-header": "npm:3.451.0" + "@aws-sdk/middleware-logger": "npm:3.451.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.451.0" + "@aws-sdk/middleware-sdk-sts": "npm:3.451.0" + "@aws-sdk/middleware-signing": "npm:3.451.0" + "@aws-sdk/middleware-user-agent": "npm:3.451.0" + "@aws-sdk/region-config-resolver": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-endpoints": "npm:3.451.0" + "@aws-sdk/util-user-agent-browser": "npm:3.451.0" + "@aws-sdk/util-user-agent-node": "npm:3.451.0" + "@smithy/config-resolver": "npm:^2.0.18" + "@smithy/fetch-http-handler": "npm:^2.2.6" + "@smithy/hash-node": "npm:^2.0.15" + "@smithy/invalid-dependency": "npm:^2.0.13" + "@smithy/middleware-content-length": "npm:^2.0.15" + "@smithy/middleware-endpoint": "npm:^2.2.0" + "@smithy/middleware-retry": "npm:^2.0.20" + "@smithy/middleware-serde": "npm:^2.0.13" + "@smithy/middleware-stack": "npm:^2.0.7" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/node-http-handler": "npm:^2.1.9" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/smithy-client": "npm:^2.1.15" + "@smithy/types": "npm:^2.5.0" + "@smithy/url-parser": "npm:^2.0.13" + "@smithy/util-base64": "npm:^2.0.1" + "@smithy/util-body-length-browser": "npm:^2.0.0" + "@smithy/util-body-length-node": "npm:^2.1.0" + "@smithy/util-defaults-mode-browser": "npm:^2.0.19" + "@smithy/util-defaults-mode-node": "npm:^2.0.25" + "@smithy/util-endpoints": "npm:^1.0.4" + "@smithy/util-retry": "npm:^2.0.6" + "@smithy/util-utf8": "npm:^2.0.2" + fast-xml-parser: "npm:4.2.5" + tslib: "npm:^2.5.0" + checksum: bc6e9fd7f2938bd042a686d9106231731280951fb70efba6b231d7996fcc56fba72f4c259a78d36c7e6f3ee9a2281927c5afc88344c7d0dab342d61096f3b55d + languageName: node + linkType: hard + +"@aws-sdk/core@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/core@npm:3.451.0" + dependencies: + "@smithy/smithy-client": "npm:^2.1.15" + tslib: "npm:^2.5.0" + checksum: 6f1fd70ef3889729e987d2f9065c6b128b2886060a0babd5ab3f3e7fc835d4c5a304f8f72f270d7286dbc91fa5ff01c4e9640846a1c23d2ed32331a9e211aead + languageName: node + linkType: hard + "@aws-sdk/credential-provider-env@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-env@npm:3.433.0" @@ -1501,6 +1789,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-env@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: cfb635f3737fb63d61516395ac768abcbdf0e900b02a850af4d820b46d6625bb062627a678a1d1af6d6353d4cb93e92997c7925c94f61b1ddb222e3618802e55 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-ini@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.433.0" @@ -1519,6 +1819,24 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.451.0" + dependencies: + "@aws-sdk/credential-provider-env": "npm:3.451.0" + "@aws-sdk/credential-provider-process": "npm:3.451.0" + "@aws-sdk/credential-provider-sso": "npm:3.451.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@smithy/credential-provider-imds": "npm:^2.0.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/shared-ini-file-loader": "npm:^2.0.6" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 1d1baab78ad4a68ddfac9fcd09cadd243b7ceb46bd34c6751322bf50e66a62aa7c9a1cd2701a8b56c30bb435fb48499e6af7212aebd1acd93572b5b904cd8ad2 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-node@npm:3.433.0" @@ -1538,6 +1856,25 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.451.0" + dependencies: + "@aws-sdk/credential-provider-env": "npm:3.451.0" + "@aws-sdk/credential-provider-ini": "npm:3.451.0" + "@aws-sdk/credential-provider-process": "npm:3.451.0" + "@aws-sdk/credential-provider-sso": "npm:3.451.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@smithy/credential-provider-imds": "npm:^2.0.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/shared-ini-file-loader": "npm:^2.0.6" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: c3cece4ab9e02a1ef1b3dbd927014f3efe678b03bcf9e173917ee46b67954d39c680b4574bf4345aa6fe00f9d6cfdcefe84309e7ae25f7a3058888fabff2176c + languageName: node + linkType: hard + "@aws-sdk/credential-provider-process@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-process@npm:3.433.0" @@ -1551,6 +1888,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-process@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/shared-ini-file-loader": "npm:^2.0.6" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: cd98edf0040e7602866b77edeb7b6acb6487dd8144b732321fb82f5e53d9387dfe39bb2c37260cfe24b3ab313652f3ef05513b7685e0236a01c20f3d6b3cca57 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.433.0" @@ -1566,6 +1916,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.451.0" + dependencies: + "@aws-sdk/client-sso": "npm:3.451.0" + "@aws-sdk/token-providers": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/shared-ini-file-loader": "npm:^2.0.6" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 0d9395c7196a399bced597c377702217ebc521d55416f0ad6534090ca9f1af4c10abea16e6123a25e7b418e140282de83af12fdc12dd17c463fc53735e80ccd6 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.433.0" @@ -1578,6 +1943,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 53dca09c49279c4ffa5bf56e22873c2413c5db7b3c04bb7eab762def8451febecebe815238b82de3d448c1dc61ab252c883858357f9ee8b7e2e8a827fd84f38d + languageName: node + linkType: hard + "@aws-sdk/middleware-bucket-endpoint@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.433.0" @@ -1593,6 +1970,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-bucket-endpoint@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-arn-parser": "npm:3.310.0" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + "@smithy/util-config-provider": "npm:^2.0.0" + tslib: "npm:^2.5.0" + checksum: 3ca97b5b6c988614ed02bd98099445b46a8f50cfb3722325842b0570f26685f5e10d257486bd3a2e22eb3529434f5b1807284f452d05a578fd3c153e158f279f + languageName: node + linkType: hard + "@aws-sdk/middleware-expect-continue@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-expect-continue@npm:3.433.0" @@ -1605,6 +1997,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-expect-continue@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: c0571a41d1c4dd7f04fd40ac6a346eba7c2a8c0f8093d5b4aec6847222d413b13d875e58d41fb206e3c8f656469fc0a483a9b27aa8308ec6a88c22c3e1dd2d95 + languageName: node + linkType: hard + "@aws-sdk/middleware-flexible-checksums@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.433.0" @@ -1621,6 +2025,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-flexible-checksums@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.451.0" + dependencies: + "@aws-crypto/crc32": "npm:3.0.0" + "@aws-crypto/crc32c": "npm:3.0.0" + "@aws-sdk/types": "npm:3.451.0" + "@smithy/is-array-buffer": "npm:^2.0.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + "@smithy/util-utf8": "npm:^2.0.2" + tslib: "npm:^2.5.0" + checksum: 1275ede70928ecd7b7857b705e006198c4ba01ba1094f16da4621e896096120c53d82f93adb5b5caab7d14f177c82189181ad45da98a71a9f22dcffe8918f845 + languageName: node + linkType: hard + "@aws-sdk/middleware-host-header@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-host-header@npm:3.433.0" @@ -1633,6 +2053,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-host-header@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: af87e605a138b16fb2444c8b7d7e918bb8cc3bb3802dd43644dba047f63e1580c981c4a977d3aaced71c7d4bb976f7e3670d3cd6aff17e42a5398004fbd9b08e + languageName: node + linkType: hard + "@aws-sdk/middleware-location-constraint@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-location-constraint@npm:3.433.0" @@ -1644,6 +2076,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-location-constraint@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: a767c48835dc428dc36781ad6f8586dc49d532d9e243379e53b6982c069623a4810180812638ad799c77276087bcbaff500eeb1021e7c87530b4efdaf8a146a9 + languageName: node + linkType: hard + "@aws-sdk/middleware-logger@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-logger@npm:3.433.0" @@ -1655,6 +2098,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-logger@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-logger@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 411d8849a60de0071b7ab9d2d9f31bbdc8ddc69facbcc899942ae578b4495febbaa25ac54133644e4a579f5ac0e2518c11e4feb47f31bc93316ab8d024853ed5 + languageName: node + linkType: hard + "@aws-sdk/middleware-recursion-detection@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.433.0" @@ -1667,6 +2121,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-recursion-detection@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 27ea17559a1e03702c035cf05e39c43c6c8a7dd420fabc30d90e7c86d2b009c6813e82d127b10e8c47954770a0171a30fbf7d9e91bdb8b57c1db694edfe46820 + languageName: node + linkType: hard + "@aws-sdk/middleware-sdk-s3@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-sdk-s3@npm:3.433.0" @@ -1681,6 +2147,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-sdk-s3@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-arn-parser": "npm:3.310.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/smithy-client": "npm:^2.1.15" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: f6b7c86d534eb99b3c60d62143927375e9bf6b6e3467f8647965e7a515fd61c4e5ef1c96ee77289bbf68bf3266af29729c873f92746c734b0c627fd04348301c + languageName: node + linkType: hard + "@aws-sdk/middleware-sdk-sts@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-sdk-sts@npm:3.433.0" @@ -1693,6 +2173,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-sdk-sts@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.451.0" + dependencies: + "@aws-sdk/middleware-signing": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 9931d3b1c4467e134498cedac82b7bf5939565d482052dbeec5c98de293bada3f46ceef38a08dd17dcce319bd29eb3c85c2276bec1b2c0eceb554dcef5f9c0fd + languageName: node + linkType: hard + "@aws-sdk/middleware-signing@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-signing@npm:3.433.0" @@ -1708,6 +2200,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-signing@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-signing@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/signature-v4": "npm:^2.0.0" + "@smithy/types": "npm:^2.5.0" + "@smithy/util-middleware": "npm:^2.0.6" + tslib: "npm:^2.5.0" + checksum: 582bb0e9f091c2a6a0dc35cf9a65a4266a41e43c0f18c03da406b8191bac304688cb6d88488cdcd5e44eb424ab7af30384a26aef786ed10b02e0b6d0d8412b1e + languageName: node + linkType: hard + "@aws-sdk/middleware-ssec@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-ssec@npm:3.433.0" @@ -1719,6 +2226,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-ssec@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 1c266c93f67dfdff567877248fb3c2cfd72702f673bd9d113e6829089a6ed63b84cee8ea28f1a914bb9d0b0b5cda3b902d176543ba3e96a2bfcaf9bd908432d3 + languageName: node + linkType: hard + "@aws-sdk/middleware-user-agent@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.433.0" @@ -1732,6 +2250,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-user-agent@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-endpoints": "npm:3.451.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 8b96ec76d9300861817ad31bb685f206ecdf936a7aae4591bd147f831a8c8e08136ba94fdb083a3afe9c6dd9b2b3e137de29550ff3e9597e1310bfa4f4f1c3d7 + languageName: node + linkType: hard + "@aws-sdk/region-config-resolver@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/region-config-resolver@npm:3.433.0" @@ -1745,6 +2276,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/region-config-resolver@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.451.0" + dependencies: + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/types": "npm:^2.5.0" + "@smithy/util-config-provider": "npm:^2.0.0" + "@smithy/util-middleware": "npm:^2.0.6" + tslib: "npm:^2.5.0" + checksum: aa809bcff5179b2d4801f2349dfd25677cc0c3339febc9c427019292399336b5c8654cfc7e3dfc52ae89a6bf3707606afe694c3d95409ca708cda743b6b26205 + languageName: node + linkType: hard + "@aws-sdk/signature-v4-multi-region@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/signature-v4-multi-region@npm:3.433.0" @@ -1758,6 +2302,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/signature-v4-multi-region@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/signature-v4": "npm:^2.0.0" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: e82f1a8c22e7b46e342057a8ba55cc7cdf552d4bcf58af39f1d03489e90d9eb3cbbbc383cb13c6e02bf9fdf6874d7ccd362da8b4c165eea43a20992a5cd2f26c + languageName: node + linkType: hard + "@aws-sdk/token-providers@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/token-providers@npm:3.433.0" @@ -1801,7 +2358,52 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.433.0, @aws-sdk/types@npm:^3.222.0": +"@aws-sdk/token-providers@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/token-providers@npm:3.451.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:3.0.0" + "@aws-crypto/sha256-js": "npm:3.0.0" + "@aws-sdk/middleware-host-header": "npm:3.451.0" + "@aws-sdk/middleware-logger": "npm:3.451.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.451.0" + "@aws-sdk/middleware-user-agent": "npm:3.451.0" + "@aws-sdk/region-config-resolver": "npm:3.451.0" + "@aws-sdk/types": "npm:3.451.0" + "@aws-sdk/util-endpoints": "npm:3.451.0" + "@aws-sdk/util-user-agent-browser": "npm:3.451.0" + "@aws-sdk/util-user-agent-node": "npm:3.451.0" + "@smithy/config-resolver": "npm:^2.0.18" + "@smithy/fetch-http-handler": "npm:^2.2.6" + "@smithy/hash-node": "npm:^2.0.15" + "@smithy/invalid-dependency": "npm:^2.0.13" + "@smithy/middleware-content-length": "npm:^2.0.15" + "@smithy/middleware-endpoint": "npm:^2.2.0" + "@smithy/middleware-retry": "npm:^2.0.20" + "@smithy/middleware-serde": "npm:^2.0.13" + "@smithy/middleware-stack": "npm:^2.0.7" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/node-http-handler": "npm:^2.1.9" + "@smithy/property-provider": "npm:^2.0.0" + "@smithy/protocol-http": "npm:^3.0.9" + "@smithy/shared-ini-file-loader": "npm:^2.0.6" + "@smithy/smithy-client": "npm:^2.1.15" + "@smithy/types": "npm:^2.5.0" + "@smithy/url-parser": "npm:^2.0.13" + "@smithy/util-base64": "npm:^2.0.1" + "@smithy/util-body-length-browser": "npm:^2.0.0" + "@smithy/util-body-length-node": "npm:^2.1.0" + "@smithy/util-defaults-mode-browser": "npm:^2.0.19" + "@smithy/util-defaults-mode-node": "npm:^2.0.25" + "@smithy/util-endpoints": "npm:^1.0.4" + "@smithy/util-retry": "npm:^2.0.6" + "@smithy/util-utf8": "npm:^2.0.2" + tslib: "npm:^2.5.0" + checksum: 4daabd86dbec1751becade260590a78e9559e1cecf61986c2ffeab08c73a0d41e010af7363f92b44b79189d6a85811a690468611b137a64ae38557fe3291c198 + languageName: node + linkType: hard + +"@aws-sdk/types@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/types@npm:3.433.0" dependencies: @@ -1811,6 +2413,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/types@npm:3.451.0, @aws-sdk/types@npm:^3.222.0": + version: 3.451.0 + resolution: "@aws-sdk/types@npm:3.451.0" + dependencies: + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + checksum: 1bb3891c45dbcb4f4c5e0b2371b0e3c3d615d2c61f17c6dd8e8c39ac0d6bc8516bb47a0c6f4279d5f977059a3ee328c910642741b97e07e8cd75c2393299d70f + languageName: node + linkType: hard + "@aws-sdk/util-arn-parser@npm:3.310.0": version: 3.310.0 resolution: "@aws-sdk/util-arn-parser@npm:3.310.0" @@ -1830,6 +2442,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-endpoints@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/util-endpoints@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/util-endpoints": "npm:^1.0.4" + tslib: "npm:^2.5.0" + checksum: cb50252fd6a14349fcdc732622d3f41b07b84acf67b06f805633908c3d66bcef5718fd1242d64dabbe474d63a75951eeb2fa1d494d2cb7793c6373d7fe1cb6cf + languageName: node + linkType: hard + "@aws-sdk/util-locate-window@npm:^3.0.0": version: 3.310.0 resolution: "@aws-sdk/util-locate-window@npm:3.310.0" @@ -1851,6 +2474,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-browser@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/types": "npm:^2.5.0" + bowser: "npm:^2.11.0" + tslib: "npm:^2.5.0" + checksum: 686a88e064ea2c6c7490e842a6375d60a855b0a80b11bfa33024fe1a1bcd594eb9b1af82a1e7de513aa7566990be85d7e16add7dcb0bdc6a62def6daf2701767 + languageName: node + linkType: hard + "@aws-sdk/util-user-agent-node@npm:3.433.0": version: 3.433.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.433.0" @@ -1868,6 +2503,23 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-node@npm:3.451.0": + version: 3.451.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.451.0" + dependencies: + "@aws-sdk/types": "npm:3.451.0" + "@smithy/node-config-provider": "npm:^2.1.5" + "@smithy/types": "npm:^2.5.0" + tslib: "npm:^2.5.0" + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 972e303e4d472f0460f14c20d2986332f7d2a321124eebf32144102dfe3a20e0fe3c76f1c2a5b3c3fa8a000901acbfd77ac40f5c6a26f35ec196dc923528bd5a + languageName: node + linkType: hard + "@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.259.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" @@ -1886,55 +2538,55 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13": - version: 7.22.13 - resolution: "@babel/code-frame@npm:7.22.13" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/code-frame@npm:7.23.4" dependencies: - "@babel/highlight": "npm:^7.22.13" + "@babel/highlight": "npm:^7.23.4" chalk: "npm:^2.4.2" - checksum: bf6ae6ba3a510adfda6a211b4a89b0f1c98ca1352b745c077d113f3b568141e0d44ce750b9ac2a80143ba5c8c4080c50fcfc1aa11d86e194ea6785f62520eb5a + checksum: 5a210e42b0c3138f3870e452c7b6d06ddcfc43cba824231ef3023fffd1cb0613d00ea07c7d87d0718e14e830f891b86de56aac5cd034d41128383919c84ff4f6 languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/compat-data@npm:7.23.2" - checksum: c18eccd13975c1434a65d04f721075e30d03ba1608f4872d84e8538c16552b878aaac804ff31243d8c2c0e91524f3bc98de6305e117ba1a55c9956871973b4dc +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/compat-data@npm:7.23.3" + checksum: a3d6c728150c8eb124a77227176723dfd7fd807e731c5bd01d041ae9e6a4efce32f88e6479ad17df9883bb296e181e650aa0034df7e42a3ea130df4c9b0a26fa languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.20.12, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.20, @babel/core@npm:^7.22.5, @babel/core@npm:^7.22.9, @babel/core@npm:^7.7.5": - version: 7.23.2 - resolution: "@babel/core@npm:7.23.2" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.5, @babel/core@npm:^7.22.9, @babel/core@npm:^7.23.3, @babel/core@npm:^7.7.5": + version: 7.23.3 + resolution: "@babel/core@npm:7.23.3" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.22.13" - "@babel/generator": "npm:^7.23.0" + "@babel/generator": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helpers": "npm:^7.23.2" - "@babel/parser": "npm:^7.23.0" + "@babel/parser": "npm:^7.23.3" "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" + "@babel/traverse": "npm:^7.23.3" + "@babel/types": "npm:^7.23.3" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: b69d7008695b2ac7a3a2db83c5c712fbb79f7031c4480f6351cde327930e38873003d1d021059b729a1d0cb48093f1d384c64269b78f6189f50051fe4f64dc2d + checksum: f9e7016b62842d23f78c98dc31daa3bd9161c5770c1e9df0557f78186ed75fd2cfc8e7161975fe8c6ad147665b1881790139da91de34ec03cf8b9f6a256d86eb languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.22.5, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.7.2": - version: 7.23.0 - resolution: "@babel/generator@npm:7.23.0" +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.22.5, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.23.3, @babel/generator@npm:^7.23.4, @babel/generator@npm:^7.7.2": + version: 7.23.4 + resolution: "@babel/generator@npm:7.23.4" dependencies: - "@babel/types": "npm:^7.23.0" + "@babel/types": "npm:^7.23.4" "@jridgewell/gen-mapping": "npm:^0.3.2" "@jridgewell/trace-mapping": "npm:^0.3.17" jsesc: "npm:^2.5.1" - checksum: bd1598bd356756065d90ce26968dd464ac2b915c67623f6f071fb487da5f9eb454031a380e20e7c9a7ce5c4a49d23be6cb9efde404952b0b3f3c0c3a9b73d68a + checksum: 7b45b64505bfb3ddbdeaae01288d2814e0e8d1299b3485983f4abc6563d6c10837979f00021308c78c33564d33e6d715e63aed64ac407ed8440b76f6eeb79019 languageName: node linkType: hard @@ -1947,7 +2599,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: @@ -1956,7 +2608,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": +"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: @@ -1969,7 +2621,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.22.5": +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" dependencies: @@ -1988,7 +2640,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: @@ -2051,7 +2703,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: @@ -2060,9 +2712,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-module-transforms@npm:7.23.0" +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-module-imports": "npm:^7.22.15" @@ -2071,7 +2723,7 @@ __metadata: "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0 - checksum: d72fe444f7b6c5aadaac8f393298d603eedd48e5dead67273a48e5c83a677cbccbd8a12a06c5bf5d97924666083279158a4bd0e799d28b86cbbfacba9e41f598 + checksum: 583fa580f8e50e6f45c4f46aa76a8e49c2528deb84e25f634d66461b9a0e2420e13979b0a607b67aef67eaf8db8668eb9edc038b4514b16e3879fe09e8fd294b languageName: node linkType: hard @@ -2091,7 +2743,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": +"@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: @@ -2104,7 +2756,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": +"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.9": version: 7.22.20 resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: @@ -2144,14 +2796,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 7f275a7f1a9504da06afc33441e219796352a4a3d0288a961bc14d1e30e06833a71621b33c3e60ee3ac1ff3c502d55e392bcbc0665f6f9d2629809696fab7cdd +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c352082474a2ee1d2b812bd116a56b2e8b38065df9678a32a535f151ec6f58e54633cc778778374f10544b930703cca6ddf998803888a636afa27e2658068a9c languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.22.5": +"@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" checksum: df882d2675101df2d507b95b195ca2f86a3ef28cb711c84f37e79ca23178e13b9f0d8b522774211f51e40168bf5142be4c1c9776a150cddb61a0d5bf3e95750b @@ -2177,61 +2829,73 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/helpers@npm:7.23.2" + version: 7.23.4 + resolution: "@babel/helpers@npm:7.23.4" dependencies: "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - checksum: d66d949d41513f19e62e43a9426e283d46bc9a3c72f1e3dd136568542382edd411047403458aaa0ae3adf7c14d23e0e9a1126092bb56e72ba796a6dd7e4c082a + "@babel/traverse": "npm:^7.23.4" + "@babel/types": "npm:^7.23.4" + checksum: f0d4403edd4197147ba5baccd81790708d4663f21a912e012aebabc9122467b676bad1d2e539dbcbab6039ebed32caadf1ebb6ae2a335ea010ee67baa46f0ab3 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.13": - version: 7.22.20 - resolution: "@babel/highlight@npm:7.22.20" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: "@babel/helper-validator-identifier": "npm:^7.22.20" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" - checksum: 1aabc95b2cb7f67adc26c7049554306f1435bfedb76b9731c36ff3d7cdfcb32bd65a6dd06985644124eb2100bd911721d9e5c4f5ac40b7f0da2995a61bf8da92 + checksum: 62fef9b5bcea7131df4626d009029b1ae85332042f4648a4ce6e740c3fd23112603c740c45575caec62f260c96b11054d3be5987f4981a5479793579c3aac71f languageName: node linkType: hard -"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.7, @babel/parser@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/parser@npm:7.23.0" +"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/parser@npm:7.23.4" bin: parser: ./bin/babel-parser.js - checksum: 201641e068f8cca1ff12b141fcba32d7ccbabc586961bd1b85ae89d9695867f84d57fc2e1176dc4981fd28e5e97ca0e7c32cd688bd5eabb641a302abc0cb5040 + checksum: 73c0172d2784c93455cb72a4669af5711a8f0421812d0c93e3be46bc7aee50e9215f61df90f94daf0555736ca2236f284462218f6bbc6bc804ebd94a59324f72 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 8910ca21a7ec7c06f7b247d4b86c97c5aa15ef321518f44f6f490c5912fdf82c605aaa02b90892e375d82ccbedeadfdeadd922c1b836c9dd4c596871bf654753 + checksum: ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/plugin-transform-optional-chaining": "npm:^7.22.15" + "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.13.0 - checksum: fbefedc0da014c37f1a50a8094ce7dbbf2181ae93243f23d6ecba2499b5b20196c2124d6a4dfe3e9e0125798e80593103e456352a4beb4e5c6f7c75efb80fdac + checksum: 434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.0.0, @babel/plugin-proposal-class-properties@npm:^7.13.0, @babel/plugin-proposal-class-properties@npm:^7.18.6": +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 6e13f14949eb943d33cf4d3775a7195fa93c92851dfb648931038e9eb92a9b1709fdaa5a0ff6cf063cfcd68b3e52d280f3ebc0f3085b3e006e64dd6196ecb72a + languageName: node + linkType: hard + +"@babel/plugin-proposal-class-properties@npm:^7.0.0, @babel/plugin-proposal-class-properties@npm:^7.13.0": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" dependencies: @@ -2244,17 +2908,17 @@ __metadata: linkType: hard "@babel/plugin-proposal-decorators@npm:^7.22.7": - version: 7.23.2 - resolution: "@babel/plugin-proposal-decorators@npm:7.23.2" + version: 7.23.3 + resolution: "@babel/plugin-proposal-decorators@npm:7.23.3" dependencies: "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-replace-supers": "npm:^7.22.20" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/plugin-syntax-decorators": "npm:^7.22.10" + "@babel/plugin-syntax-decorators": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 392440bad262e54246ee22da4c50774cd72cda4b62818a94b99e13cbb6e06f074a8858d0253909990fa680d94e434ff194383bfe5481c82a866408b091cb9307 + checksum: 526d0228f884e072cbacf0188ab886a43732ea1dbd6ce0bb035884da8324c41e654a500083a997de928e9cf1dd04c5be27808f773b1dccaca5c3bf33819c3030 languageName: node linkType: hard @@ -2351,14 +3015,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-syntax-decorators@npm:7.22.10" +"@babel/plugin-syntax-decorators@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-decorators@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 983caa82f5a9cbb55196cd9ff3a6e2cf11e6eba5c11fc5fecb4ef7229ca05af08a5eeab0c668e5cd9fae62c01b038ec1906ced09fd7cb6dde94f0b8824e231c6 + checksum: 5856e236f7ae15a58c839fd40df1aa4df31029048df01191b4870c34b1bff44c77fbee78ca5edd8eb3c81410005d8f9a36a9cf48094f2bb328592304a738648a languageName: node linkType: hard @@ -2384,36 +3048,36 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-flow@npm:7.22.5" +"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-flow@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 84c8c40fcfe8e78cecdd6fb90e8f97f419e3f3b27a33de8324ae97d5ce1b87cdd98a636fa21a68d4d2c37c7d63f3a279bb84b6956b849921affed6b806b6ffe7 + checksum: c6e6f355d6ace5f4a9e7bb19f1fed2398aeb9b62c4c671a189d81b124f9f5bb77c4225b6e85e19339268c60a021c1e49104e450375de5e6bb70612190d9678af languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.20.0, @babel/plugin-syntax-import-assertions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" +"@babel/plugin-syntax-import-assertions@npm:^7.20.0, @babel/plugin-syntax-import-assertions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2b8b5572db04a7bef1e6cd20debf447e4eef7cb012616f5eceb8fa3e23ce469b8f76ee74fd6d1e158ba17a8f58b0aec579d092fb67c5a30e83ccfbc5754916c1 + checksum: 883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.22.5" +"@babel/plugin-syntax-import-attributes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 197b3c5ea2a9649347f033342cb222ab47f4645633695205c0250c6bf2af29e643753b8bb24a2db39948bef08e7c540babfd365591eb57fc110cb30b425ffc47 + checksum: 9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e languageName: node linkType: hard @@ -2439,14 +3103,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" +"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.23.3 + resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce + checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e languageName: node linkType: hard @@ -2538,14 +3202,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.22.5, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.22.5 - resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" +"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.23.3 + resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a + checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 languageName: node linkType: hard @@ -2561,20 +3225,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5" +"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 35abb6c57062802c7ce8bd96b2ef2883e3124370c688bbd67609f7d2453802fb73944df8808f893b6c67de978eb2bcf87bbfe325e46d6f39b5fcb09ece11d01a + checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -2582,301 +3246,301 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868 + checksum: e2fc132c9033711d55209f4781e1fc73f0f4da5e0ca80a2da73dec805166b73c92a6e83571a8994cd2c893a28302e24107e90856202b24781bab734f800102bb languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" +"@babel/plugin-transform-async-to-generator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" dependencies: - "@babel/helper-module-imports": "npm:^7.22.5" + "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-remap-async-to-generator": "npm:^7.22.5" + "@babel/helper-remap-async-to-generator": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b95f23f99dcb379a9f0a1c2a3bbea3f8dc0e1b16dc1ac8b484fe378370169290a7a63d520959a9ba1232837cf74a80e23f6facbe14fd42a3cda6d3c2d7168e62 + checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0, @babel/plugin-transform-block-scoped-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" +"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0, @babel/plugin-transform-block-scoped-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 416b1341858e8ca4e524dee66044735956ced5f478b2c3b9bc11ec2285b0c25d7dbb96d79887169eb938084c95d0a89338c8b2fe70d473bd9dc92e5d9db1732c + checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" +"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9f60c71a0b72c7bdc0734ab363cf8ad40c4366456d9429ab3f2caedf6566c12f1ae8190478827222e93c60855b6c746a2c0e24381646fe7220d4666c332dc090 + checksum: bbb965a3acdfb03559806d149efbd194ac9c983b260581a60efcb15eb9fbe20e3054667970800146d867446db1c1398f8e4ee87f4454233e49b8f8ce947bd99b languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-class-properties@npm:7.22.5" +"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b830152dfc2ff2f647f0abe76e6251babdfbef54d18c4b2c73a6bf76b1a00050a5d998dac80dc901a48514e95604324943a9dd39317073fe0928b559e0e0c579 + checksum: 9c6f8366f667897541d360246de176dd29efc7a13d80a5b48361882f7173d9173be4646c3b7d9b003ccc0e01e25df122330308f33db921fa553aa17ad544b3fc languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" +"@babel/plugin-transform-class-static-block@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.11" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 69f040506fad66f1c6918d288d0e0edbc5c8a07c8b4462c1184ad2f9f08995d68b057126c213871c0853ae0c72afc60ec87492049dfacb20902e32346a448bcb + checksum: c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-classes@npm:7.22.15" +"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-classes@npm:7.23.3" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-compilation-targets": "npm:^7.22.15" - "@babel/helper-environment-visitor": "npm:^7.22.5" - "@babel/helper-function-name": "npm:^7.22.5" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-optimise-call-expression": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.9" + "@babel/helper-replace-supers": "npm:^7.22.20" "@babel/helper-split-export-declaration": "npm:^7.22.6" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 21d7a171055634b4c407e42fc99ef340bde70d5582d47f7bcdc9781d09b3736607d346f56c3abb1e8b9b62516e1af25ab9023a295be0c347c963d6a20f74b55f + checksum: e4906f232ad588a6e2336b99f5171d9de5c10c8a017abb64d1b405e61528108498ca578538e0ec35faad45fc9ed0ec4c89a7600357229ffcc9ef26256c1f161b languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" +"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/template": "npm:^7.22.5" + "@babel/template": "npm:^7.22.15" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a3efa8de19e4c52f01a99301d864819a7997a7845044d9cef5b67b0fb1e5e3e610ecc23053a8b5cf8fe40fcad93c15a586eaeffd22b89eeaa038339c37919661 + checksum: e75593e02c5ea473c17839e3c9d597ce3697bf039b66afe9a4d06d086a87fb3d95850b4174476897afc351dc1b46a9ec3165ee6e8fbad3732c0d65f676f855ad languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.0" +"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 924b1c0fc11c9782a9a63ae6d181b9b069250a5567c705c24409e2f1e39ac47e61846cd17b0ab45641dc77050e7b900fc80a536f8abe7dff49b4e777e7b9b952 + checksum: 5abd93718af5a61f8f6a97d2ccac9139499752dd5b2c533d7556fb02947ae01b2f51d4c4f5e64df569e8783d3743270018eb1fa979c43edec7dd1377acf107ed languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" +"@babel/plugin-transform-dotall-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 409b658d11e3082c8f69e9cdef2d96e4d6d11256f005772425fb230cc48fd05945edbfbcb709dab293a1a2f01f9c8a5bb7b4131e632b23264039d9f95864b453 + checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" +"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bb1280fbabaab6fab2ede585df34900712698210a3bd413f4df5bae6d8c24be36b496c92722ae676a7a67d060a4624f4d6c23b923485f906bfba8773c69f55b4 + checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" +"@babel/plugin-transform-dynamic-import@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 78fc9c532210bf9e8f231747f542318568ac360ee6c27e80853962c984283c73da3f8f8aebe83c2096090a435b356b092ed85de617a156cbe0729d847632be45 + checksum: 57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" +"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2d660c1b1d51ad5fec1cd5ad426a52187204068c4158f8c4aa977b31535c61b66898d532603eef21c15756827be8277f724c869b888d560f26d7fe848bb5eae + checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" +"@babel/plugin-transform-export-namespace-from@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 73af5883a321ed56a4bfd43c8a7de0164faebe619287706896fc6ee2f7a4e69042adaa1338c0b8b4bdb9f7e5fdceb016fb1d40694cb43ca3b8827429e8aac4bf + checksum: 9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.22.5" +"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-flow": "npm:^7.22.5" + "@babel/plugin-syntax-flow": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0657042178061517cd5641a9a5eed1251aa1d8cf93a4111568ae663773854a1e8f6af167ecae042237d261389751dc5ee32ba12a15e65e41af29d04150005cab + checksum: 84af4b1f6d79f1a66a2440c5cfe3ba0e2bb9355402da477add13de1867088efb8d7b2be15d67ac955f1d2a745d4a561423bbb473fe6e4622b157989598ec323f languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-for-of@npm:7.22.15" +"@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d6ac155fcc8dc3d37a092325e5b7df738a7a953c4a47520c0c02fbc30433e6a5ac38197690845ebb931870af958ac95d36132d5accf41ed4bb0765a7618371fc + checksum: 745054f125fba6dbaea3d863352c94266c97db87e3521bc6c436a8c05f384821907c0109ace437a90342e423a3365f4d8e592de06e4a241bbd7070e1f293604f languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.0.0, @babel/plugin-transform-function-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-function-name@npm:7.22.5" +"@babel/plugin-transform-function-name@npm:^7.0.0, @babel/plugin-transform-function-name@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.5" - "@babel/helper-function-name": "npm:^7.22.5" + "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cff3b876357999cb8ae30e439c3ec6b0491a53b0aa6f722920a4675a6dd5b53af97a833051df4b34791fe5b3dd326ccf769d5c8e45b322aa50ee11a660b17845 + checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" +"@babel/plugin-transform-json-strings@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 50665e5979e66358c50e90a26db53c55917f78175127ac2fa05c7888d156d418ffb930ec0a109353db0a7c5f57c756ce01bfc9825d24cbfd2b3ec453f2ed8cba + checksum: f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.0.0, @babel/plugin-transform-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-literals@npm:7.22.5" +"@babel/plugin-transform-literals@npm:^7.0.0, @babel/plugin-transform-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec37cc2ffb32667af935ab32fe28f00920ec8a1eb999aa6dc6602f2bebd8ba205a558aeedcdccdebf334381d5c57106c61f52332045730393e73410892a9735b + checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c664e9798e85afa7f92f07b867682dee7392046181d82f5d21bae6f2ca26dfe9c8375cdc52b7483c3fc09a983c1989f60eff9fbc4f373b0c0a74090553d05739 + checksum: 2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.0.0, @babel/plugin-transform-member-expression-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" +"@babel/plugin-transform-member-expression-literals@npm:^7.0.0, @babel/plugin-transform-member-expression-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec4b0e07915ddd4fda0142fd104ee61015c208608a84cfa13643a95d18760b1dc1ceb6c6e0548898b8c49e5959a994e46367260176dbabc4467f729b21868504 + checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" +"@babel/plugin-transform-modules-amd@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d06fbee89044a0c4d9d65c2bb26b45482266d14d64601a36996615ca75f1e1cc40ac95d09821601606eacbeeef39b3b634118f6197cda6431c8440975926a5d5 + checksum: 48c87dee2c7dae8ed40d16901f32c9e58be4ef87bf2c3985b51dd2e78e82081f3bad0a39ee5cf6e8909e13e954e2b4bedef0a8141922f281ed833ddb59ed9be2 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" +"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-simple-access": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 65085c8f2578b0c272b3969b78e54430ea3217fca8de7a21ded845a74ddf2d97aee284559da102d826fcb8aed5a79d09536a6e4610d868f539d7bc382eb319ff + checksum: a3bc082d0dfe8327a29263a6d721cea608d440bc8141ba3ec6ba80ad73d84e4f9bbe903c27e9291c29878feec9b5dee2bd0563822f93dc951f5d7fc36bdfe85b languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" +"@babel/plugin-transform-modules-systemjs@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-module-transforms": "npm:^7.23.0" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 43a61fd72ba90afafcf6734345df00cbaf1f244ca456f8e8532813b87a985ddfeca7fc6ea758c12350abcfeba02835875b44dc6b3118c2dac7469a3f298c79ad + checksum: 051112de7585fff4ffd67865066401f01f90745d41f26b0edbeec0981342c10517ce1a6b4d7051b583a3e513088eece6a3f57b1663f1dd9418071cd05f14fef9 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" +"@babel/plugin-transform-modules-umd@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.23.3" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b955d066c68b60c1179bfb0b744e2fad32dbe86d0673bd94637439cfe425d1e3ff579bd47a417233609aac1624f4fe69915bee73e6deb2af6188fda8aaa5db63 + checksum: e3f3af83562d687899555c7826b3faf0ab93ee7976898995b1d20cbe7f4451c55e05b0e17bfb3e549937cbe7573daf5400b752912a241b0a8a64d2457c7626e5 languageName: node linkType: hard @@ -2892,160 +3556,160 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-new-target@npm:7.22.5" +"@babel/plugin-transform-new-target@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b72112773487a881a1d6ffa680afde08bad699252020e86122180ee7a88854d5da3f15d9bca3331cf2e025df045604494a8208a2e63b486266b07c14e2ffbf3 + checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 167babecc8b8fe70796a7b7d34af667ebbf43da166c21689502e5e8cc93180b7a85979c77c9f64b7cce431b36718bd0a6df9e5e0ffea4ae22afb22cfef886372 + checksum: a27d73ea134d3d9560a6b2e26ab60012fba15f1db95865aa0153c18f5ec82cfef6a7b3d8df74e3c2fca81534fa5efeb6cacaf7b08bdb7d123e3dafdd079886a3 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" +"@babel/plugin-transform-numeric-separator@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: af064d06a4a041767ec396a5f258103f64785df290e038bba9f0ef454e6c914f2ac45d862bbdad8fac2c7ad47fa4e95356f29053c60c100a0160b02a995fe2a3 + checksum: 6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" +"@babel/plugin-transform-object-rest-spread@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" dependencies: - "@babel/compat-data": "npm:^7.22.9" + "@babel/compat-data": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.22.15" + "@babel/plugin-transform-parameters": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 04b9f4bbabf4bbd019b47c60b294d873fe5d2f6063628a5b311d88da9e81b0a8622756dd42c7030359925479b7a3cd743dee46e73d84e03afd907d8cfd44ddea + checksum: 656f09c4ec629856e807d5b386559166ae417ff75943abce19656b2c6de5101dfd0aaf23f9074e854339370b4e09f57518d3202457046ee5b567ded531005479 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.0.0, @babel/plugin-transform-object-super@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-super@npm:7.22.5" +"@babel/plugin-transform-object-super@npm:^7.0.0, @babel/plugin-transform-object-super@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.22.5" + "@babel/helper-replace-supers": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b71887877d74cb64dbccb5c0324fa67e31171e6a5311991f626650e44a4083e5436a1eaa89da78c0474fb095d4ec322d63ee778b202d33aa2e4194e1ed8e62d7 + checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" +"@babel/plugin-transform-optional-catch-binding@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f17abd90e1de67c84d63afea29c8021c74abb2794d3a6eeafb0bbe7372d3db32aefca386e392116ec63884537a4a2815d090d26264d259bacc08f6e3ed05294c + checksum: d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" +"@babel/plugin-transform-optional-chaining@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fb1103c6489b91df06c483a97fc12515c2f3840f573cbecb27959307c0a838fdd1502a34ada43805c4fb7f7dab3d1c0d1ab8428775d098af6778a7b00f494c27 + checksum: 0ef24e889d6151428953fc443af5f71f4dae73f373dc1b7f5dd3f6a61d511296eb77e9b870e8c2c02a933e3455ae24c1fa91738c826b72a4ff87e0337db527e8 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-parameters@npm:7.22.15" +"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fa9f2340fe48b88c344ff38cd86318f61e48bedafdc567a1607106a1c3a65c0db845792f406b1320f89745192fe1ae6739b0bc4eb646ff60cd797ca85752d462 + checksum: a8c36c3fc25f9daa46c4f6db47ea809c395dc4abc7f01c4b1391f6e5b0cd62b83b6016728b02a6a8ac21aca56207c9ec66daefc0336e9340976978de7e6e28df languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" +"@babel/plugin-transform-private-methods@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 321479b4fcb6d3b3ef622ab22fd24001e43d46e680e8e41324c033d5810c84646e470f81b44cbcbef5c22e99030784f7cac92f1829974da7a47a60a7139082c3 + checksum: cedc1285c49b5a6d9a3d0e5e413b756ac40b3ac2f8f68bdfc3ae268bc8d27b00abd8bb0861c72756ff5dd8bf1eb77211b7feb5baf4fdae2ebbaabe49b9adc1d0 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" +"@babel/plugin-transform-private-property-in-object@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-create-class-features-plugin": "npm:^7.22.11" + "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b00623d107069c91a164d5cf7486c0929a4ee3023fcddbc8844e21b5e66f369271e1aa51921c7d87b80d9927bc75d63afcfe4d577872457ddb0443a5b86bacca + checksum: 02eef2ee98fa86ee5052ed9bf0742d6d22b510b5df2fcce0b0f5615d6001f7786c6b31505e7f1c2f446406d8fb33603a5316d957cfa5b8365cbf78ddcc24fa42 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.0.0, @babel/plugin-transform-property-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" +"@babel/plugin-transform-property-literals@npm:^7.0.0, @babel/plugin-transform-property-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 796176a3176106f77fcb8cd04eb34a8475ce82d6d03a88db089531b8f0453a2fb8b0c6ec9a52c27948bc0ea478becec449893741fc546dfc3930ab927e3f9f2e + checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 languageName: node linkType: hard "@babel/plugin-transform-react-constant-elements@npm:^7.21.3": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0f2fc4d0a4025975f6cb4e1e80be1fe2e14546d86341beed8dbbbf9357b56908574e89476bd693431966c15b31f9c30f735636232058cf7812ca46b687d053be + checksum: 0bc89f7e81bb455bf58a90bf78ed0d3b4b0ef41bb1abde1364922fece8f0fbf9ca43887685653104238636a0b385144c7fb952c0047edaf7e8bbbaa5d734587b languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.0.0, @babel/plugin-transform-react-display-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5" +"@babel/plugin-transform-react-display-name@npm:^7.0.0, @babel/plugin-transform-react-display-name@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a12bfd1e4e93055efca3ace3c34722571bda59d9740dca364d225d9c6e3ca874f134694d21715c42cc63d79efd46db9665bd4a022998767f9245f1e29d5d204d + checksum: 7f86964e8434d3ddbd3c81d2690c9b66dbf1cd8bd9512e2e24500e9fa8cf378bc52c0853270b3b82143aba5965aec04721df7abdb768f952b44f5c6e0b198779 languageName: node linkType: hard @@ -3060,81 +3724,81 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.18.6, @babel/plugin-transform-react-jsx-self@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.22.5" +"@babel/plugin-transform-react-jsx-self@npm:^7.18.6, @babel/plugin-transform-react-jsx-self@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 671eebfabd14a0c7d6ae805fff7e289dfdb7ba984bb100ea2ef6dad1d6a665ebbb09199ab2e64fca7bc78bd0fdc80ca897b07996cf215fafc32c67bc564309af + checksum: 882bf56bc932d015c2d83214133939ddcf342e5bcafa21f1a93b19f2e052145115e1e0351730897fd66e5f67cad7875b8a8d81ceb12b6e2a886ad0102cb4eb1f languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.19.6, @babel/plugin-transform-react-jsx-source@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.22.5" +"@babel/plugin-transform-react-jsx-source@npm:^7.19.6, @babel/plugin-transform-react-jsx-source@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4ca2bd62ca14f8bbdcda9139f3f799e1c1c1bae504b67c1ca9bca142c53d81926d1a2b811f66a625f20999b2d352131053d886601f1ba3c1e9378c104d884277 + checksum: 92287fb797e522d99bdc77eaa573ce79ff0ad9f1cf4e7df374645e28e51dce0adad129f6f075430b129b5bac8dad843f65021970e12e992d6d6671f0d65bb1e0 languageName: node linkType: hard "@babel/plugin-transform-react-jsx@npm:^7.0.0, @babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" + version: 7.23.4 + resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/types": "npm:^7.22.15" + "@babel/plugin-syntax-jsx": "npm:^7.23.3" + "@babel/types": "npm:^7.23.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a436bfbffe723d162e5816d510dca7349a1fc572c501d73f1e17bbca7eb899d7a6a14d8fc2ae5993dd79fdd77bcc68d295e59a3549bed03b8579c767f6e3c9dc + checksum: d83806701349addfb77b8347b4f0dc8e76fb1c9ac21bdef69f4002394fce2396d61facfc6e1a3de54cbabcdadf991a1f642e69edb5116ac14f95e33d9f7c221d languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" +"@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 092021c4f404e267002099ec20b3f12dd730cb90b0d83c5feed3dc00dbe43b9c42c795a18e7c6c7d7bddea20c7dd56221b146aec81b37f2e7eb5137331c61120 + checksum: 9ea3698b1d422561d93c0187ac1ed8f2367e4250b10e259785ead5aa643c265830fd0f4cf5087a5bedbc4007444c06da2f2006686613220acf0949895f453666 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" +"@babel/plugin-transform-regenerator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" regenerator-transform: "npm:^0.15.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e13678d62d6fa96f11cb8b863f00e8693491e7adc88bfca3f2820f80cbac8336e7dec3a596eee6a1c4663b7ececc3564f2cd7fb44ed6d4ce84ac2bb7f39ecc6e + checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" +"@babel/plugin-transform-reserved-words@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3ffd7dbc425fe8132bfec118b9817572799cab1473113a635d25ab606c1f5a2341a636c04cf6b22df3813320365ed5a965b5eeb3192320a10e4cc2c137bd8bfc + checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 languageName: node linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.23.2 - resolution: "@babel/plugin-transform-runtime@npm:7.23.2" + version: 7.23.4 + resolution: "@babel/plugin-transform-runtime@npm:7.23.4" dependencies: "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -3144,145 +3808,146 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 536c444c494a43c1de4eec8297242199a7e778a82f64a8203a15bec46af17757ad59b520ee1fb414a03100ae743b8a2ca8527b6c0e4cc3e05be9ac1361260a44 + checksum: d962002d4cdeae91866fb7e9fb8ae5e5d568bd9ea866cfd03e8e564120f6f7db99d8f142f9b044819b975c0d0ca76418d8673bf46ea48feeba7779ae4f3bc46f languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" +"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a5ac902c56ea8effa99f681340ee61bac21094588f7aef0bc01dff98246651702e677552fa6d10e548c4ac22a3ffad047dd2f8c8f0540b68316c2c203e56818b + checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-spread@npm:7.22.5" +"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f9fd247b3fa8953416c8808c124c3a5db5cd697abbf791aae0143a0587fff6b386045f94c62bcd1b6783a1fd275629cc194f25f6c0aafc9f05f12a56fd5f94bf + checksum: c6372d2f788fd71d85aba12fbe08ee509e053ed27457e6674a4f9cae41ff885e2eb88aafea8fadd0ccf990601fc69ec596fa00959e05af68a15461a8d97a548d languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" +"@babel/plugin-transform-sticky-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 63b2c575e3e7f96c32d52ed45ee098fb7d354b35c2223b8c8e76840b32cc529ee0c0ceb5742fd082e56e91e3d82842a367ce177e82b05039af3d602c9627a729 + checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.0.0, @babel/plugin-transform-template-literals@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" +"@babel/plugin-transform-template-literals@npm:^7.0.0, @babel/plugin-transform-template-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e9bb030654cb425381c69754be4abe6a7c75b45cd7f962cd8d604b841b2f0fb7b024f2efc1c25cc53f5b16d79d5e8cfc47cacbdaa983895b3aeefa3e7e24ff + checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" +"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 82a53a63ffc3010b689ca9a54e5f53b2718b9f4b4a9818f36f9b7dba234f38a01876680553d2716a645a61920b5e6e4aaf8d4a0064add379b27ca0b403049512 + checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/plugin-transform-typescript@npm:7.22.15" +"@babel/plugin-transform-typescript@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-typescript@npm:7.23.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.22.5" "@babel/helper-create-class-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-typescript": "npm:^7.22.5" + "@babel/plugin-syntax-typescript": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95c35fbc823773058e9f077635fbe579d00b8f1762756b14a6fcae0c2db1aefddb93093fda4ca462e9e7d49edd49d71afe0a17422698d7418a6d156fc2dfba19 + checksum: cb8f34157fac16904c37b85ae1d6b1e1c28a0a7b7ebbfae6b55a0bba8e96e861da7e40c5f2b470526f6064ffed71eee90e82b5f54b4f4eb7cf6acbf7a1a924b2 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" +"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 807f40ed1324c8cb107c45358f1903384ca3f0ef1d01c5a3c5c9b271c8d8eec66936a3dcc8d75ddfceea9421420368c2e77ae3adef0a50557e778dfe296bf382 + checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2495e5f663cb388e3d888b4ba3df419ac436a5012144ac170b622ddfc221f9ea9bdba839fa2bc0185cb776b578030666406452ec7791cbf0e7a3d4c88ae9574c + checksum: 2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b5d1404c8c623b0ec9bd436c00d885a17d6a34f3f2597996343ddb9d94f6379705b21582dfd4cec2c47fd34068872e74ab6b9580116c0566b3f9447e2a7fa06 + checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.22.5" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: c042070f980b139547f8b0179efbc049ac5930abec7fc26ed7a41d89a048d8ab17d362200e204b6f71c3c20d6991a0e74415e1a412a49adc8131c2a40c04822e + checksum: 79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef languageName: node linkType: hard "@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.22.9": - version: 7.23.2 - resolution: "@babel/preset-env@npm:7.23.2" + version: 7.23.3 + resolution: "@babel/preset-env@npm:7.23.3" dependencies: - "@babel/compat-data": "npm:^7.23.2" + "@babel/compat-data": "npm:^7.23.3" "@babel/helper-compilation-targets": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.3" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.22.5" - "@babel/plugin-syntax-import-attributes": "npm:^7.22.5" + "@babel/plugin-syntax-import-assertions": "npm:^7.23.3" + "@babel/plugin-syntax-import-attributes": "npm:^7.23.3" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" @@ -3294,56 +3959,55 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.22.5" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.2" - "@babel/plugin-transform-async-to-generator": "npm:^7.22.5" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.22.5" - "@babel/plugin-transform-block-scoping": "npm:^7.23.0" - "@babel/plugin-transform-class-properties": "npm:^7.22.5" - "@babel/plugin-transform-class-static-block": "npm:^7.22.11" - "@babel/plugin-transform-classes": "npm:^7.22.15" - "@babel/plugin-transform-computed-properties": "npm:^7.22.5" - "@babel/plugin-transform-destructuring": "npm:^7.23.0" - "@babel/plugin-transform-dotall-regex": "npm:^7.22.5" - "@babel/plugin-transform-duplicate-keys": "npm:^7.22.5" - "@babel/plugin-transform-dynamic-import": "npm:^7.22.11" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.22.5" - "@babel/plugin-transform-export-namespace-from": "npm:^7.22.11" - "@babel/plugin-transform-for-of": "npm:^7.22.15" - "@babel/plugin-transform-function-name": "npm:^7.22.5" - "@babel/plugin-transform-json-strings": "npm:^7.22.11" - "@babel/plugin-transform-literals": "npm:^7.22.5" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.22.11" - "@babel/plugin-transform-member-expression-literals": "npm:^7.22.5" - "@babel/plugin-transform-modules-amd": "npm:^7.23.0" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.0" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.0" - "@babel/plugin-transform-modules-umd": "npm:^7.22.5" + "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" + "@babel/plugin-transform-async-generator-functions": "npm:^7.23.3" + "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" + "@babel/plugin-transform-block-scoping": "npm:^7.23.3" + "@babel/plugin-transform-class-properties": "npm:^7.23.3" + "@babel/plugin-transform-class-static-block": "npm:^7.23.3" + "@babel/plugin-transform-classes": "npm:^7.23.3" + "@babel/plugin-transform-computed-properties": "npm:^7.23.3" + "@babel/plugin-transform-destructuring": "npm:^7.23.3" + "@babel/plugin-transform-dotall-regex": "npm:^7.23.3" + "@babel/plugin-transform-duplicate-keys": "npm:^7.23.3" + "@babel/plugin-transform-dynamic-import": "npm:^7.23.3" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" + "@babel/plugin-transform-export-namespace-from": "npm:^7.23.3" + "@babel/plugin-transform-for-of": "npm:^7.23.3" + "@babel/plugin-transform-function-name": "npm:^7.23.3" + "@babel/plugin-transform-json-strings": "npm:^7.23.3" + "@babel/plugin-transform-literals": "npm:^7.23.3" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.23.3" + "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" + "@babel/plugin-transform-modules-amd": "npm:^7.23.3" + "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" + "@babel/plugin-transform-modules-systemjs": "npm:^7.23.3" + "@babel/plugin-transform-modules-umd": "npm:^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" - "@babel/plugin-transform-new-target": "npm:^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.22.11" - "@babel/plugin-transform-numeric-separator": "npm:^7.22.11" - "@babel/plugin-transform-object-rest-spread": "npm:^7.22.15" - "@babel/plugin-transform-object-super": "npm:^7.22.5" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.22.11" - "@babel/plugin-transform-optional-chaining": "npm:^7.23.0" - "@babel/plugin-transform-parameters": "npm:^7.22.15" - "@babel/plugin-transform-private-methods": "npm:^7.22.5" - "@babel/plugin-transform-private-property-in-object": "npm:^7.22.11" - "@babel/plugin-transform-property-literals": "npm:^7.22.5" - "@babel/plugin-transform-regenerator": "npm:^7.22.10" - "@babel/plugin-transform-reserved-words": "npm:^7.22.5" - "@babel/plugin-transform-shorthand-properties": "npm:^7.22.5" - "@babel/plugin-transform-spread": "npm:^7.22.5" - "@babel/plugin-transform-sticky-regex": "npm:^7.22.5" - "@babel/plugin-transform-template-literals": "npm:^7.22.5" - "@babel/plugin-transform-typeof-symbol": "npm:^7.22.5" - "@babel/plugin-transform-unicode-escapes": "npm:^7.22.10" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-regex": "npm:^7.22.5" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.22.5" + "@babel/plugin-transform-new-target": "npm:^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.23.3" + "@babel/plugin-transform-numeric-separator": "npm:^7.23.3" + "@babel/plugin-transform-object-rest-spread": "npm:^7.23.3" + "@babel/plugin-transform-object-super": "npm:^7.23.3" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.23.3" + "@babel/plugin-transform-optional-chaining": "npm:^7.23.3" + "@babel/plugin-transform-parameters": "npm:^7.23.3" + "@babel/plugin-transform-private-methods": "npm:^7.23.3" + "@babel/plugin-transform-private-property-in-object": "npm:^7.23.3" + "@babel/plugin-transform-property-literals": "npm:^7.23.3" + "@babel/plugin-transform-regenerator": "npm:^7.23.3" + "@babel/plugin-transform-reserved-words": "npm:^7.23.3" + "@babel/plugin-transform-shorthand-properties": "npm:^7.23.3" + "@babel/plugin-transform-spread": "npm:^7.23.3" + "@babel/plugin-transform-sticky-regex": "npm:^7.23.3" + "@babel/plugin-transform-template-literals": "npm:^7.23.3" + "@babel/plugin-transform-typeof-symbol": "npm:^7.23.3" + "@babel/plugin-transform-unicode-escapes": "npm:^7.23.3" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.23.3" + "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - "@babel/types": "npm:^7.23.0" babel-plugin-polyfill-corejs2: "npm:^0.4.6" babel-plugin-polyfill-corejs3: "npm:^0.8.5" babel-plugin-polyfill-regenerator: "npm:^0.5.3" @@ -3351,20 +4015,20 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7bc8aeed59047f99af2f608f3143044517582b6bd7b041e3c7a12eface47e0313a57e78fad2e0d450cda2ce6c58451d67493f3d3677c5c1031cf59b7db1161c3 + checksum: 90ca3a0966eb09248b41e451dc77da27fea373881fea6713ea5ca4f416733cba58f8dd5cd8708f20832a3b7a89b264ee4131cc0bf0c959a733b50e6f8c2f7187 languageName: node linkType: hard "@babel/preset-flow@npm:^7.13.13": - version: 7.22.15 - resolution: "@babel/preset-flow@npm:7.22.15" + version: 7.23.3 + resolution: "@babel/preset-flow@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-flow-strip-types": "npm:^7.22.5" + "@babel/plugin-transform-flow-strip-types": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 17f8b80b1012802f983227b423c8823990db9748aec4f8bfd56ff774d8d954e9bdea67377788abac526754b3d307215c063c9beadf5f1b4331b30d4ba0593286 + checksum: 60b5dde79621ae89943af459c4dc5b6030795f595a20ca438c8100f8d82c9ebc986881719030521ff5925799518ac5aa7f3fe62af8c33ab96be3681a71f88d03 languageName: node linkType: hard @@ -3382,33 +4046,33 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.18.6": - version: 7.22.15 - resolution: "@babel/preset-react@npm:7.22.15" + version: 7.23.3 + resolution: "@babel/preset-react@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.22.5" + "@babel/plugin-transform-react-display-name": "npm:^7.23.3" "@babel/plugin-transform-react-jsx": "npm:^7.22.15" "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.22.5" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f9296e45346c3b6ab8296952edde5f1774cc9fdbdbefbc76047278fc3e889d3e15740f038ce017aca562d89f32fcbb6c11783d464fc6ae3066433178fa58513c + checksum: ef6aef131b2f36e2883e9da0d832903643cb3c9ad4f32e04fb3eecae59e4221d583139e8d8f973e25c28d15aafa6b3e60fe9f25c5fd09abd3e2df03b8637bdd2 languageName: node linkType: hard "@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.22.5": - version: 7.23.2 - resolution: "@babel/preset-typescript@npm:7.23.2" + version: 7.23.3 + resolution: "@babel/preset-typescript@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/plugin-transform-modules-commonjs": "npm:^7.23.0" - "@babel/plugin-transform-typescript": "npm:^7.22.15" + "@babel/plugin-syntax-jsx": "npm:^7.23.3" + "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" + "@babel/plugin-transform-typescript": "npm:^7.23.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fab17c24f737928e6e399425463808b4c4d850ea2cbe751c98cc2da86314e48d2f910da0f10d72525dad72a68aced5bd74edacf76b0f06db25abab07bec64b32 + checksum: c4add0f3fcbb3f4a305c48db9ccb32694f1308ed9971ccbc1a8a3c76d5a13726addb3c667958092287d7aa080186c5c83dbfefa55eacf94657e6cde39e172848 languageName: node linkType: hard @@ -3434,12 +4098,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.1, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.2 - resolution: "@babel/runtime@npm:7.23.2" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": + version: 7.23.4 + resolution: "@babel/runtime@npm:7.23.4" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: abdcbdd590c7e31762e1bdab94dd466823c8bcedd3ff2fde85eeb94dac7cccaef151ac37c428bda7018ededd27c9a82b4dfeb621f978ad934232475a902f8e3a + checksum: 6ef4f6dcc4ec4d74cb9f6c26a26e92d016b36debd167be48cae293fbd990b3157fb1d8d21c531285da15a5bda9ccb23e651b56234941e03d91c8af69d4c593a9 languageName: node linkType: hard @@ -3454,32 +4118,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.7.2": - version: 7.23.2 - resolution: "@babel/traverse@npm:7.23.2" +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/traverse@npm:7.23.4" dependencies: - "@babel/code-frame": "npm:^7.22.13" - "@babel/generator": "npm:^7.23.0" + "@babel/code-frame": "npm:^7.23.4" + "@babel/generator": "npm:^7.23.4" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.0" - "@babel/types": "npm:^7.23.0" + "@babel/parser": "npm:^7.23.4" + "@babel/types": "npm:^7.23.4" debug: "npm:^4.1.0" globals: "npm:^11.1.0" - checksum: e4fcb8f8395804956df4ae1301230a14b6eb35b74a7058a0e0b40f6f4be7281e619e6dafe400e833d4512da5d61cf17ea177d04b00a8f7cf3d8d69aff83ca3d8 + checksum: 0ff190a793d94c8ee3ff24bbe7d086c6401a84fa16f97d3c695c31aa42270916d937ae5994e315ba797e8f3728840e4d68866ad4d82a01132312d07ac45ca9d0 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.13, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.0 - resolution: "@babel/types@npm:7.23.0" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3, @babel/types@npm:^7.23.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.4 + resolution: "@babel/types@npm:7.23.4" dependencies: - "@babel/helper-string-parser": "npm:^7.22.5" + "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: ca5b896a26c91c5672254725c4c892a35567d2122afc47bd5331d1611a7f9230c19fc9ef591a5a6f80bf0d80737e104a9ac205c96447c74bee01d4319db58001 + checksum: acf791ead82bb220f35cc0cd53c852d96f3fbad14b20964719bae884737b6bb227bfe28c4d16274bee0c8cf0cf3c4c1882d20d894ffc9667dda6eb197ccb4262 languageName: node linkType: hard @@ -3497,15 +4161,24 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@blocksuite/block-std@npm:0.0.0-20231116023037-31273bb7-nightly": version: 0.0.0-20231116023037-31273bb7-nightly resolution: "@blocksuite/block-std@npm:0.0.0-20231116023037-31273bb7-nightly" dependencies: "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= +"@blocksuite/block-std@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/block-std@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary lz-string: "npm:^1.5.0" w3c-keyname: "npm:^2.2.8" zod: "npm:^3.22.4" peerDependencies: +<<<<<<< HEAD "@blocksuite/store": 0.0.0-20231116023037-31273bb7-nightly checksum: 1d246f4a7b4c8f5662c3536fd5da1087264b5b363f8c9ede7187ef28162ae0bb52af746f156906e69aa487876fd624b4f6ab5828ae7de77d06aba05e59a11567 languageName: node @@ -3520,6 +4193,22 @@ __metadata: "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/virgo": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/store": 0.0.0-20231122113751-6bf81eb3-nightly + checksum: 0b75b090cd676cc8ca5972fad73d1afa75f2624e9bf1c21f2b770bf9272b592f3b90e6d6e26695d4512c0c0c38f139199420525b68258d954281c89e7785fb45 + languageName: node + linkType: hard + +"@blocksuite/blocks@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/blocks@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/lit": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/virgo": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@floating-ui/dom": "npm:^1.5.3" "@toeverything/theme": "npm:^0.7.24" "@types/webfontloader": "npm:^1.6.36" @@ -3537,6 +4226,7 @@ __metadata: sortablejs: "npm:^1.15.0" webfontloader: "npm:^1.6.28" zod: "npm:^3.22.4" +<<<<<<< HEAD checksum: c08f62c95fd18b00e98a0bac2893a0d02514f3a49d379ca6dd26fa0170a0699abfd6c00676db735d9c9313edfb62ee19802dd237790557aee7c60521ebe4d2d2 languageName: node linkType: hard @@ -3561,19 +4251,46 @@ __metadata: dependencies: zod: "npm:^3.22.4" checksum: 0a8a0c9b2cc880dea28184d928dcadebff816fb70658df5e2eac09b23c49a062b05c02393f735036d206ecfae32d8723a442dc011fff4b5121854b3e7b838527 +======= + checksum: eab05e86fbe9a0e5b10d82ff6867af3a2987f56e5e5656874149d656ec3cecda0b5870ab59340e0f50c22843bc5f3fb7af3cb0399b8c65f58d76e02a1a08d2af languageName: node linkType: hard -"@blocksuite/icons@npm:2.1.35, @blocksuite/icons@npm:^2.1.33": - version: 2.1.35 - resolution: "@blocksuite/icons@npm:2.1.35" +"@blocksuite/editor@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/editor@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/lit": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@toeverything/theme": "npm:^0.7.24" + lit: "npm:^3.0.2" + checksum: 2792e80cc253926f5399d8e737ec6553a69ce74b1a881f4f7f5a8aeeb9ef54fe676a8bb522171f064b2f0638a551e1bbfd49668c63f810b23144313171809e47 + languageName: node + linkType: hard + +"@blocksuite/global@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/global@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + zod: "npm:^3.22.4" + checksum: ef0e6649c29290e4eb510cf019e83f0dcc0febc3b1cae24c982f20889534333ef44886f53a97540eb1c364c4eb4591ddf45cca4bcf6fbbe4fe15175bcc19eba2 +>>>>>>> canary + languageName: node + linkType: hard + +"@blocksuite/icons@npm:2.1.36, @blocksuite/icons@npm:^2.1.33": + version: 2.1.36 + resolution: "@blocksuite/icons@npm:2.1.36" peerDependencies: "@types/react": ^18.0.25 react: ^18.2.0 - checksum: 4a7c1d11ae573b5c2cd3fc0c570892ab3ea1b5108cf6c59759186f56022901ef99a7344d54df45d85d721d6a199c88aa12b22b5791c4357068ea3074318699c8 + checksum: a5118a2fdc8a4d94ec9cb0a3d0530f520172594572120bb447070975fd6e76ebc59ff5959d071bbef048c7e85344a770cd007e8a87d3404cd3c2a4d9eab394d4 languageName: node linkType: hard +<<<<<<< HEAD "@blocksuite/lit@npm:0.0.0-20231116023037-31273bb7-nightly": version: 0.0.0-20231116023037-31273bb7-nightly resolution: "@blocksuite/lit@npm:0.0.0-20231116023037-31273bb7-nightly" @@ -3594,9 +4311,30 @@ __metadata: dependencies: "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/virgo": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= +"@blocksuite/lit@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/lit@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/virgo": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + lit: "npm:^3.0.2" + peerDependencies: + "@blocksuite/block-std": 0.0.0-20231122113751-6bf81eb3-nightly + "@blocksuite/store": 0.0.0-20231122113751-6bf81eb3-nightly + checksum: 1a3d2d27823ecde0ca7453fe0d4216fa39b8623f0306486972e618b2ed9dd22f6b53a58e699f82ccc63cc001af113969eb3fa23ce7016a79d77c55d54fa8705c + languageName: node + linkType: hard + +"@blocksuite/store@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/store@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/virgo": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@types/flexsearch": "npm:^0.7.3" "@types/mdast": "npm:^4.0.2" - buffer: "npm:^6.0.3" flexsearch: "npm:0.7.21" idb-keyval: "npm:^6.2.1" lib0: "npm:^0.2.87" @@ -3612,6 +4350,7 @@ __metadata: peerDependencies: async-call-rpc: ^6 yjs: ^13 +<<<<<<< HEAD checksum: e8adf95d3c0aec3e65ed32839f5c17fc5337b46f293ff46e827d78ace264948360a4801093175579caa4cd4656c86f379ff3366441ec8dc7e8f2680b901eaef7 languageName: node linkType: hard @@ -3621,11 +4360,53 @@ __metadata: resolution: "@blocksuite/virgo@npm:0.0.0-20231116023037-31273bb7-nightly" dependencies: "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + checksum: 97132a465bb37383b851a278826e7ffd6e6b9dfdc64d3d34887c6837b432f0ed77816701d6f97f719896b48c6f259882cda429f1c6dff9de5ba0065d4a3b468e + languageName: node + linkType: hard + +"@blocksuite/virgo@npm:0.0.0-20231122113751-6bf81eb3-nightly": + version: 0.0.0-20231122113751-6bf81eb3-nightly + resolution: "@blocksuite/virgo@npm:0.0.0-20231122113751-6bf81eb3-nightly" + dependencies: + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary zod: "npm:^3.22.4" peerDependencies: lit: ^3.0.2 yjs: ^13 +<<<<<<< HEAD checksum: a12085ef5440e7db671293aca05c91f8cdb2d5fbac1650ab996754e17c5869f85845fedf06bd50948c1be66a5ce39b338cbca79a7fd86890179321b471868fc0 +======= + checksum: a18e632590306cf14c02e6d308b8604532dc7cb1085d53a99857076768eabc6999b677d0e1ba225051d75f7915cc5a4954d4a303fd459436a7b5a902dbd7b7f1 + languageName: node + linkType: hard + +"@bundled-es-modules/cookie@npm:^2.0.0": + version: 2.0.0 + resolution: "@bundled-es-modules/cookie@npm:2.0.0" + dependencies: + cookie: "npm:^0.5.0" + checksum: c8ef02aa5d3f6c786cfa407e1c93b4af29c600eb09990973f47a7a49e4771c1bec37c8f8e567638bb9cbc41f4e38d065ff1d8eaf9bf91f0c3613a6d60bc82c8c + languageName: node + linkType: hard + +"@bundled-es-modules/js-levenshtein@npm:^2.0.1": + version: 2.0.1 + resolution: "@bundled-es-modules/js-levenshtein@npm:2.0.1" + dependencies: + js-levenshtein: "npm:^1.1.6" + checksum: 13d0cbd2b00e563e09a797559dcff8c7e208c1f71e1787535a3d248f7e3d33ef3f0809b9f498d41788ab5fd399882dcca79917d70d97921b7dde94a282c1b7d8 + languageName: node + linkType: hard + +"@bundled-es-modules/statuses@npm:^1.0.1": + version: 1.0.1 + resolution: "@bundled-es-modules/statuses@npm:1.0.1" + dependencies: + statuses: "npm:^2.0.1" + checksum: 9bf6a2bcf040a66fb805da0e1446041fd9def7468bb5da29c5ce02adf121a3f7cec123664308059a62a46fcaee666add83094b76df6dce72e5cafa8e6bebe60d +>>>>>>> canary languageName: node linkType: hard @@ -3660,37 +4441,37 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-darwin-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-darwin-64@npm:1.20231025.0" +"@cloudflare/workerd-darwin-64@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "@cloudflare/workerd-darwin-64@npm:1.20231030.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@cloudflare/workerd-darwin-arm64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20231025.0" +"@cloudflare/workerd-darwin-arm64@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20231030.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@cloudflare/workerd-linux-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-linux-64@npm:1.20231025.0" +"@cloudflare/workerd-linux-64@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "@cloudflare/workerd-linux-64@npm:1.20231030.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@cloudflare/workerd-linux-arm64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-linux-arm64@npm:1.20231025.0" +"@cloudflare/workerd-linux-arm64@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "@cloudflare/workerd-linux-arm64@npm:1.20231030.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@cloudflare/workerd-windows-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-windows-64@npm:1.20231025.0" +"@cloudflare/workerd-windows-64@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "@cloudflare/workerd-windows-64@npm:1.20231030.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3702,15 +4483,15 @@ __metadata: languageName: node linkType: hard -"@commitlint/cli@npm:^17.8.0": - version: 17.8.0 - resolution: "@commitlint/cli@npm:17.8.0" +"@commitlint/cli@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/cli@npm:18.4.3" dependencies: - "@commitlint/format": "npm:^17.4.4" - "@commitlint/lint": "npm:^17.8.0" - "@commitlint/load": "npm:^17.8.0" - "@commitlint/read": "npm:^17.5.1" - "@commitlint/types": "npm:^17.4.4" + "@commitlint/format": "npm:^18.4.3" + "@commitlint/lint": "npm:^18.4.3" + "@commitlint/load": "npm:^18.4.3" + "@commitlint/read": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" execa: "npm:^5.0.0" lodash.isfunction: "npm:^3.0.9" resolve-from: "npm:5.0.0" @@ -3718,184 +4499,182 @@ __metadata: yargs: "npm:^17.0.0" bin: commitlint: cli.js - checksum: 390f9a052b449b14384f42a0b6b81bd0bf2b1328f4ceda5b7e3fd5c82cf01353a7f2733d41f285d07e880cdfd7e2f72b3dc2099d67e5d0cf28b8b4c2b36c4dc1 + checksum: 45f469eb53484a707fe97a48784ef92af75bd831a208ccc4c1d747c9b449f3a180dcdeb29bb9f2f0a6f0691403a1021cd36a762fe2a17f4c254f25f1332f677f languageName: node linkType: hard -"@commitlint/config-conventional@npm:^17.8.0": - version: 17.8.0 - resolution: "@commitlint/config-conventional@npm:17.8.0" +"@commitlint/config-conventional@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/config-conventional@npm:18.4.3" dependencies: - conventional-changelog-conventionalcommits: "npm:^6.1.0" - checksum: 33a6f7867e0ef6b39a34246a615a75ea4eaab76852d00ffee8c28560fe0786cf56a4f20d747d2f56b28a4bddc3637a5bf7948b465744edcd890b9c2337a2c741 + conventional-changelog-conventionalcommits: "npm:^7.0.2" + checksum: bb6c1559979002e79c5e7c575f57fd713638523cdadfa61754eaabb8aad042d688c859e82ccf58589bb9aa2a4497e820702744095c9b82f6018fbb3b5d75d08d languageName: node linkType: hard -"@commitlint/config-validator@npm:^17.6.7": - version: 17.6.7 - resolution: "@commitlint/config-validator@npm:17.6.7" +"@commitlint/config-validator@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/config-validator@npm:18.4.3" dependencies: - "@commitlint/types": "npm:^17.4.4" + "@commitlint/types": "npm:^18.4.3" ajv: "npm:^8.11.0" - checksum: e13e512ce9dc788f7ce1c84faf4d2e2d4d3b7c4dc18a7982ecbfc33faa5fe977793efdb868e228061d34ea8825cbbed5fc9e8e69fd5e4f0c0c08f60e21a9214e + checksum: e56aa321aa4f680ed78822f974e724e27c005c6c6b910ff59c3a2b0220c97ff4291e316674637ec28da6f8234952e2d20673d9851e049913474e8f24b4e2d376 languageName: node linkType: hard -"@commitlint/ensure@npm:^17.6.7": - version: 17.6.7 - resolution: "@commitlint/ensure@npm:17.6.7" +"@commitlint/ensure@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/ensure@npm:18.4.3" dependencies: - "@commitlint/types": "npm:^17.4.4" + "@commitlint/types": "npm:^18.4.3" lodash.camelcase: "npm:^4.3.0" lodash.kebabcase: "npm:^4.1.1" lodash.snakecase: "npm:^4.1.1" lodash.startcase: "npm:^4.4.0" lodash.upperfirst: "npm:^4.3.1" - checksum: 1ffdce807dbb303e8fa215511a965375abeea2702f64b4f1c4d7823f1e231cb343e82c97633d12d3c89b4f71d2eaf28169db08b4f1d3b052c26c942f4b9d9380 + checksum: 5c8c437ffef5b0d241a02d1c8967324765429d27e2ae882feb4fc96f53472e4c8d6ea6d86a64da7c97dd7efac07bc1f1c2a8babc1bbb56db48152a4f26f2ba69 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 +"@commitlint/execute-rule@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/execute-rule@npm:18.4.3" + checksum: 0f0e99e2f079872efe39915313f7d353a36dfac4432bb74ac60a526ca3c9b7bb55365a2e4627f99f4be3fb8ac4c6e745adcacfbdcbf940418f101ffaa10d5ae3 languageName: node linkType: hard -"@commitlint/format@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/format@npm:17.4.4" +"@commitlint/format@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/format@npm:18.4.3" dependencies: - "@commitlint/types": "npm:^17.4.4" + "@commitlint/types": "npm:^18.4.3" chalk: "npm:^4.1.0" - checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 + checksum: 244515c99e60ce1e2c4106ee076554a082ab3655225c59c2bb4fab412f47e1d5e44c5e72a9b8907996eb947243f913347d20640a8da9c01b52e4cf247f1a9f94 languageName: node linkType: hard -"@commitlint/is-ignored@npm:^17.8.0": - version: 17.8.0 - resolution: "@commitlint/is-ignored@npm:17.8.0" +"@commitlint/is-ignored@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/is-ignored@npm:18.4.3" dependencies: - "@commitlint/types": "npm:^17.4.4" + "@commitlint/types": "npm:^18.4.3" semver: "npm:7.5.4" - checksum: ae18943cae8370476049fcbf08c18256f44e2063c9be553eb282a81231ec50a8aff1b861e93108dc823fe6331e1aedcdd7c74c777b57e564308eeb7f7b9da33c + checksum: 01fd386bea9634dc7cee2a3f8f9916f4dabf9d3043d838b8ea3328ec622a777c4c637f4a80b639289e38429496535561cc7398b36e880b73fcc819d4f1427fb9 languageName: node linkType: hard -"@commitlint/lint@npm:^17.8.0": - version: 17.8.0 - resolution: "@commitlint/lint@npm:17.8.0" +"@commitlint/lint@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/lint@npm:18.4.3" dependencies: - "@commitlint/is-ignored": "npm:^17.8.0" - "@commitlint/parse": "npm:^17.7.0" - "@commitlint/rules": "npm:^17.7.0" - "@commitlint/types": "npm:^17.4.4" - checksum: 9d1fb7a9b8d866bd5cb4ba09d6a44cb0f14b7a384329902f60799992c7c7d291e27e534a71910c7d3800662142570f9d50c31bfbdcc157e502f6d321cb809150 + "@commitlint/is-ignored": "npm:^18.4.3" + "@commitlint/parse": "npm:^18.4.3" + "@commitlint/rules": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" + checksum: 800eba031df61addb7a8c36e8bb9e5585387eaa559d0156e74e591267462b7511cf4e051fb95ca54331624ed862a9f786282de57b93acc80b0bc552b5cb96028 languageName: node linkType: hard -"@commitlint/load@npm:^17.8.0": - version: 17.8.0 - resolution: "@commitlint/load@npm:17.8.0" +"@commitlint/load@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/load@npm:18.4.3" dependencies: - "@commitlint/config-validator": "npm:^17.6.7" - "@commitlint/execute-rule": "npm:^17.4.0" - "@commitlint/resolve-extends": "npm:^17.6.7" - "@commitlint/types": "npm:^17.4.4" - "@types/node": "npm:20.5.1" + "@commitlint/config-validator": "npm:^18.4.3" + "@commitlint/execute-rule": "npm:^18.4.3" + "@commitlint/resolve-extends": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" + "@types/node": "npm:^18.11.9" chalk: "npm:^4.1.0" - cosmiconfig: "npm:^8.0.0" - cosmiconfig-typescript-loader: "npm:^4.0.0" + cosmiconfig: "npm:^8.3.6" + cosmiconfig-typescript-loader: "npm:^5.0.0" lodash.isplainobject: "npm:^4.0.6" lodash.merge: "npm:^4.6.2" lodash.uniq: "npm:^4.5.0" resolve-from: "npm:^5.0.0" - ts-node: "npm:^10.8.1" - typescript: "npm:^4.6.4 || ^5.0.0" - checksum: 24287a9dfbf57f7d824ffc7f6a3df2f4771db501ce05219ed93abd00b68dc629a41a70c4d6c142ca05c4f29d38a1cf823353886c2378f5dd77d6e0cf2c540ffc + checksum: 8fb8652f00f739c75493d3c805d5cc09e5bef8398eff26b9fbfd8d2be2b6a47758bab72650a3ab5202427c9e1936ea36270c40aca39f87fade38c7293194ee21 languageName: node linkType: hard -"@commitlint/message@npm:^17.4.2": - version: 17.4.2 - resolution: "@commitlint/message@npm:17.4.2" - checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 +"@commitlint/message@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/message@npm:18.4.3" + checksum: b81d59f5a295d0cffbab0edd212b1fa4cdd4fd05cc242bc95d6919c038be9d7022db2d6c0d8132c2910ee409cdce5ce6e472e12ac9bb2d3f6acb7a3db7bbeb99 languageName: node linkType: hard -"@commitlint/parse@npm:^17.7.0": - version: 17.7.0 - resolution: "@commitlint/parse@npm:17.7.0" +"@commitlint/parse@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/parse@npm:18.4.3" dependencies: - "@commitlint/types": "npm:^17.4.4" - conventional-changelog-angular: "npm:^6.0.0" - conventional-commits-parser: "npm:^4.0.0" - checksum: d70d53932576fa30c078099fe9ab00190298ed6aec696648633ab16eb80386e0c1b407c44eb7c548b598573c260ed1bfa890dd8134166d28811f66ed436efbea + "@commitlint/types": "npm:^18.4.3" + conventional-changelog-angular: "npm:^7.0.0" + conventional-commits-parser: "npm:^5.0.0" + checksum: 696c60ecee20f9bfb5e19715ae777aca8e86b133ef709a66171c228b4f618ef15ba515e11274c46ff13df964ba69ab1ddec4055ddce1bc0a69f70b6d2301ccd5 languageName: node linkType: hard -"@commitlint/read@npm:^17.5.1": - version: 17.5.1 - resolution: "@commitlint/read@npm:17.5.1" +"@commitlint/read@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/read@npm:18.4.3" dependencies: - "@commitlint/top-level": "npm:^17.4.0" - "@commitlint/types": "npm:^17.4.4" + "@commitlint/top-level": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" fs-extra: "npm:^11.0.0" git-raw-commits: "npm:^2.0.11" minimist: "npm:^1.2.6" - checksum: 62ee4f7a47b22a8571ae313bca36b418805a248f4986557f38f06317c44b6d18072889f95e7bc22bbb33a2f2b08236f74596ff28e3dbd0894249477a9df367c3 + checksum: ebc815effe4920c769f879947608c367b452f334d9a8e8c3140b7685920bb4ba092d36c5416781522c2e50178a4b91092c5661044c13a0d62dace60091f39706 languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^17.6.7": - version: 17.6.7 - resolution: "@commitlint/resolve-extends@npm:17.6.7" +"@commitlint/resolve-extends@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/resolve-extends@npm:18.4.3" dependencies: - "@commitlint/config-validator": "npm:^17.6.7" - "@commitlint/types": "npm:^17.4.4" + "@commitlint/config-validator": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" import-fresh: "npm:^3.0.0" lodash.mergewith: "npm:^4.6.2" resolve-from: "npm:^5.0.0" resolve-global: "npm:^1.0.0" - checksum: 3717b4ccef6e46136f8d4a4b8d78d57184b4331401db07e27f89acb049a3903035bb2b0dbd4c07e3cdcc402cbe693b365c244a0da3df47e0f74cbf3ba76be9ec + checksum: ef321ae425385e720763019a1dcf39b5daf65a661f6af43d69b7aad04eda21ce43487c7552b65f5611c96b45bfefabe63c9eaef20352f223812b5c9d489a600a languageName: node linkType: hard -"@commitlint/rules@npm:^17.7.0": - version: 17.7.0 - resolution: "@commitlint/rules@npm:17.7.0" +"@commitlint/rules@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/rules@npm:18.4.3" dependencies: - "@commitlint/ensure": "npm:^17.6.7" - "@commitlint/message": "npm:^17.4.2" - "@commitlint/to-lines": "npm:^17.4.0" - "@commitlint/types": "npm:^17.4.4" + "@commitlint/ensure": "npm:^18.4.3" + "@commitlint/message": "npm:^18.4.3" + "@commitlint/to-lines": "npm:^18.4.3" + "@commitlint/types": "npm:^18.4.3" execa: "npm:^5.0.0" - checksum: bc6af55cb8fab82baac450f87e02fa51d91f44855aadced92d74d05f9af99ccfd90b08c67355b53ca6b4b45f386854bcf52e1a4e5bc003665f4873e785eb7c70 + checksum: 857c66c1e4d2d24bb3f07a16576626ac27d103ff589afe59ea36d84276c62bd49005ed2e81f43cb430bbd29eb86eb23ebbfec9c58796654249f0064802b9eb62 languageName: node linkType: hard -"@commitlint/to-lines@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/to-lines@npm:17.4.0" - checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b +"@commitlint/to-lines@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/to-lines@npm:18.4.3" + checksum: c9d47868284168fbe94764a2abe3526010bd2d43fa9a7ac3946648408998efc1279827299346042d019120eb8f5692cc5a5c12159f8da49585e4c885c2e628a6 languageName: node linkType: hard -"@commitlint/top-level@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/top-level@npm:17.4.0" +"@commitlint/top-level@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/top-level@npm:18.4.3" dependencies: find-up: "npm:^5.0.0" - checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 + checksum: b71581c9c485c2ca518b20021ed8d106ea6cd504453c9bed1436df2a620caec78a38bed1e3e8086c51e8b747a7ba6515569275ef29a6707349db6614cda70940 languageName: node linkType: hard -"@commitlint/types@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/types@npm:17.4.4" +"@commitlint/types@npm:^18.4.3": + version: 18.4.3 + resolution: "@commitlint/types@npm:18.4.3" dependencies: chalk: "npm:^4.1.0" - checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 + checksum: 52dfc0ee835f3030fff25e45b4568e83eef818126a30f60860637c74de4919c5f9f1eab157622bb70facf9483f07898cfcb47efa484caf6443dd866942e460ec languageName: node linkType: hard @@ -3932,28 +4711,28 @@ __metadata: languageName: node linkType: hard -"@dnd-kit/accessibility@npm:^3.0.0": - version: 3.0.1 - resolution: "@dnd-kit/accessibility@npm:3.0.1" +"@dnd-kit/accessibility@npm:^3.1.0": + version: 3.1.0 + resolution: "@dnd-kit/accessibility@npm:3.1.0" dependencies: tslib: "npm:^2.0.0" peerDependencies: react: ">=16.8.0" - checksum: cd25fb663af657b852363569e0d4fb0c1c89476083c47f21ca7b00205ff29fcbd08be2fe2728f3d1f20a217ec1713cd9f81e228c041ce1cf561c9621fb9c2200 + checksum: 750a0537877d5dde3753e9ef59d19628b553567e90fc3e3b14a79bded08f47f4a7161bc0d003d7cd6b3bd9e10aa233628dca07d2aa5a2120cac84555ba1653d8 languageName: node linkType: hard "@dnd-kit/core@npm:^6.0.8": - version: 6.0.8 - resolution: "@dnd-kit/core@npm:6.0.8" + version: 6.1.0 + resolution: "@dnd-kit/core@npm:6.1.0" dependencies: - "@dnd-kit/accessibility": "npm:^3.0.0" - "@dnd-kit/utilities": "npm:^3.2.1" + "@dnd-kit/accessibility": "npm:^3.1.0" + "@dnd-kit/utilities": "npm:^3.2.2" tslib: "npm:^2.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: bacb41fb7b22b3796b83e01dadf94b4b80e9d324611cb862de2725ab58c007bd1d605ecb4593766f2edc360fdd49b76f2144389bb2f43ed9d622cfcf367b6d83 + checksum: cf9e99763fbd9220cb6fdde2950c19fdf6248391234f5ee835601814124445fd8a6e4b3f5bc35543c802d359db8cc47f07d87046577adc41952ae981a03fbda0 languageName: node linkType: hard @@ -3970,37 +4749,37 @@ __metadata: languageName: node linkType: hard -"@dnd-kit/sortable@npm:^7.0.2": - version: 7.0.2 - resolution: "@dnd-kit/sortable@npm:7.0.2" +"@dnd-kit/sortable@npm:^8.0.0": + version: 8.0.0 + resolution: "@dnd-kit/sortable@npm:8.0.0" dependencies: - "@dnd-kit/utilities": "npm:^3.2.0" + "@dnd-kit/utilities": "npm:^3.2.2" tslib: "npm:^2.0.0" peerDependencies: - "@dnd-kit/core": ^6.0.7 + "@dnd-kit/core": ^6.1.0 react: ">=16.8.0" - checksum: e22e0f0146e371bff86fd88fdeeee980c58a9a6aca78c8ada2553d8cc1f45b8056a4fc1c1f06fce294b93e5a868659474085da21f2e4282e731fdb142e7ba0ff + checksum: e2e0d37ace13db2e6aceb65a803195ef29e1a33a37e7722a988d7a9c1aacce77472a93b2adcd8e6780ac98b3d5640c5481892f530177c2eb966df235726942ad languageName: node linkType: hard -"@dnd-kit/utilities@npm:^3.2.0, @dnd-kit/utilities@npm:^3.2.1": - version: 3.2.1 - resolution: "@dnd-kit/utilities@npm:3.2.1" +"@dnd-kit/utilities@npm:^3.2.1, @dnd-kit/utilities@npm:^3.2.2": + version: 3.2.2 + resolution: "@dnd-kit/utilities@npm:3.2.2" dependencies: tslib: "npm:^2.0.0" peerDependencies: react: ">=16.8.0" - checksum: f586a1d4537906eb005c62fc5e8ffcf93c6e7e8a5018146ea4bda3f2f4f5c05b18dd58cf6c7d2dbd944fda5e6dfa5b4ba4c723f53949b94163e5ad50673869ea + checksum: 6cfe46a5fcdaced943982e7ae66b08b89235493e106eb5bc833737c25905e13375c6ecc3aa0c357d136cb21dae3966213dba063f19b7a60b1235a29a7b05ff84 languageName: node linkType: hard -"@electron-forge/cli@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/cli@npm:6.4.2" +"@electron-forge/cli@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/cli@npm:7.1.0" dependencies: - "@electron-forge/core": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" - "@electron/get": "npm:^2.0.0" + "@electron-forge/core": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron/get": "npm:^3.0.0" chalk: "npm:^4.0.0" commander: "npm:^4.1.1" debug: "npm:^4.3.1" @@ -4011,15 +4790,15 @@ __metadata: electron-forge: dist/electron-forge.js electron-forge-vscode-nix: script/vscode.sh electron-forge-vscode-win: script/vscode.cmd - checksum: f0c6b698e45500a28af83c238ea94b9cace1217b958d3e2d7150788cc50208cb94c72e86a7526afe760c8152f681cd1a7e2651a2382a43d6fc307d49b55ffbfd + checksum: c73a1448578f3b8502c8b4f34076966dc40eee7adc26b27d361d62bbacfac4dde990532b67012805350d8b05ea9533713e5ae416b0d25abd461166feab728d54 languageName: node linkType: hard -"@electron-forge/core-utils@npm:6.4.2, @electron-forge/core-utils@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/core-utils@npm:6.4.2" +"@electron-forge/core-utils@npm:7.1.0, @electron-forge/core-utils@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/core-utils@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" "@electron/rebuild": "npm:^3.2.10" "@malept/cross-spawn-promise": "npm:^2.0.0" chalk: "npm:^4.0.0" @@ -4029,30 +4808,31 @@ __metadata: log-symbols: "npm:^4.0.0" semver: "npm:^7.2.1" yarn-or-npm: "npm:^3.0.1" - checksum: e34e0bf8f356b42ce4179046ab3b3ffa4511f3dd2064892b3264d6eb3f8ed58266746061e7f024aa58c6f4c3ce027b4617c5a029864ad4e8af2f499a0d8a31d7 + checksum: 6fd2310f275cda236fba4d6adf3166dc6f9fa9478183e6ed736b08b02d805f3acab2dc76a596c7f53bdd0fcb19ba73e21fb93bf69ca20a1ebf4ef9995939e38c languageName: node linkType: hard -"@electron-forge/core@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/core@npm:6.4.2" +"@electron-forge/core@npm:7.1.0, @electron-forge/core@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/core@npm:7.1.0" dependencies: - "@electron-forge/core-utils": "npm:6.4.2" - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/plugin-base": "npm:6.4.2" - "@electron-forge/publisher-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" - "@electron-forge/template-vite": "npm:6.4.2" - "@electron-forge/template-vite-typescript": "npm:6.4.2" - "@electron-forge/template-webpack": "npm:6.4.2" - "@electron-forge/template-webpack-typescript": "npm:6.4.2" - "@electron/get": "npm:^2.0.0" + "@electron-forge/core-utils": "npm:7.1.0" + "@electron-forge/maker-base": "npm:7.1.0" + "@electron-forge/plugin-base": "npm:7.1.0" + "@electron-forge/publisher-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron-forge/template-base": "npm:7.1.0" + "@electron-forge/template-vite": "npm:7.1.0" + "@electron-forge/template-vite-typescript": "npm:7.1.0" + "@electron-forge/template-webpack": "npm:7.1.0" + "@electron-forge/template-webpack-typescript": "npm:7.1.0" + "@electron-forge/tracer": "npm:7.1.0" + "@electron/get": "npm:^3.0.0" + "@electron/packager": "npm:^18.0.0" "@electron/rebuild": "npm:^3.2.10" "@malept/cross-spawn-promise": "npm:^2.0.0" chalk: "npm:^4.0.0" debug: "npm:^4.3.1" - electron-packager: "npm:^17.1.2" fast-glob: "npm:^3.2.7" filenamify: "npm:^4.1.0" find-up: "npm:^5.0.0" @@ -4071,216 +4851,194 @@ __metadata: sudo-prompt: "npm:^9.1.1" username: "npm:^5.1.0" yarn-or-npm: "npm:^3.0.1" - checksum: 4ac93bf7c7e50f4b4725c3c141f595efdd0d71366262d577becaf7f968baa69caf295eb4339fc56c0d5d9cf93240aba94f254d1e168919a731b8c602437b04f3 + checksum: 0f8dc243e3f70a065c6a4cfcb18bf995257f294e1360ee46aa2f63a68c1c4522d8c9db1e26e0f59b22ae1280aa9b8696f48f97ec606576a450b0e11f5660d4f6 languageName: node linkType: hard -"@electron-forge/core@patch:@electron-forge/core@npm%3A6.4.2#./.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch::locator=%40affine%2Fmonorepo%40workspace%3A.": - version: 6.4.2 - resolution: "@electron-forge/core@patch:@electron-forge/core@npm%3A6.4.2#./.yarn/patches/@electron-forge-core-npm-6.4.2-ab60c87e75.patch::version=6.4.2&hash=fab642&locator=%40affine%2Fmonorepo%40workspace%3A." +"@electron-forge/maker-base@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/maker-base@npm:7.1.0" dependencies: - "@electron-forge/core-utils": "npm:6.4.2" - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/plugin-base": "npm:6.4.2" - "@electron-forge/publisher-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" - "@electron-forge/template-vite": "npm:6.4.2" - "@electron-forge/template-vite-typescript": "npm:6.4.2" - "@electron-forge/template-webpack": "npm:6.4.2" - "@electron-forge/template-webpack-typescript": "npm:6.4.2" - "@electron/get": "npm:^2.0.0" - "@electron/rebuild": "npm:^3.2.10" - "@malept/cross-spawn-promise": "npm:^2.0.0" - chalk: "npm:^4.0.0" - debug: "npm:^4.3.1" - electron-packager: "npm:^17.1.2" - fast-glob: "npm:^3.2.7" - filenamify: "npm:^4.1.0" - find-up: "npm:^5.0.0" - fs-extra: "npm:^10.0.0" - got: "npm:^11.8.5" - interpret: "npm:^3.1.1" - listr2: "npm:^5.0.3" - lodash: "npm:^4.17.20" - log-symbols: "npm:^4.0.0" - node-fetch: "npm:^2.6.7" - progress: "npm:^2.0.3" - rechoir: "npm:^0.8.0" - resolve-package: "npm:^1.0.1" - semver: "npm:^7.2.1" - source-map-support: "npm:^0.5.13" - sudo-prompt: "npm:^9.1.1" - username: "npm:^5.1.0" - yarn-or-npm: "npm:^3.0.1" - checksum: deffa8356ad2845ea4465ad935dc2ce108bdbfbb31259b581fedc38bb6b07ebb16839218cd0dbe4bc62eb721c022e073cdd31246c5df2210404ef3ad441bdfe5 - languageName: node - linkType: hard - -"@electron-forge/maker-base@npm:6.4.2, @electron-forge/maker-base@npm:^6.0.4": - version: 6.4.2 - resolution: "@electron-forge/maker-base@npm:6.4.2" - dependencies: - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" fs-extra: "npm:^10.0.0" which: "npm:^2.0.2" - checksum: 4d80af9381322354a71be4f78003bb98a350c05367f70cc9e001bad6c448094d6167d7295f6ca113856c5d47be4b776d7b53a0a8dd0e511b632985419f3d5e81 + checksum: 8e00e6477adf292186d7fb26f15bb9806d8c5dfd7011e8beab9dcaca519f4139b67f3a297906eb73987f660e2dd0cb881036cedcb53d4b4e1ee7a099995b782e languageName: node linkType: hard -"@electron-forge/maker-deb@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/maker-deb@npm:6.4.2" +"@electron-forge/maker-deb@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/maker-deb@npm:7.1.0" dependencies: - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/maker-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" electron-installer-debian: "npm:^3.2.0" dependenciesMeta: electron-installer-debian: optional: true - checksum: 1d56d4ca905b1b8b6dcdc0ab2034f1a1193edb0405b284016edb3ced7978455cf8c7dac5436502fbb1b3e5b6ecc40bf1ee66590f774e1268996fe6e0fa90781c + checksum: 85b40ac7b1bde82cca33ac6a4c78b103dbe4bd18165effd48a140625ba3f18e382dc2402afbe9d4b00554a5485a5982c5fb47be4733cf5e9f992a010e5931315 languageName: node linkType: hard -"@electron-forge/maker-dmg@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/maker-dmg@npm:6.4.2" +"@electron-forge/maker-dmg@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/maker-dmg@npm:7.1.0" dependencies: - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/maker-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" electron-installer-dmg: "npm:^4.0.0" fs-extra: "npm:^10.0.0" dependenciesMeta: electron-installer-dmg: optional: true - checksum: c83689f929d19dee23fd34644f50b56eec93917a1f069243969621706e8267c3474aca50c457b1ce52aa4c0e2b0f6fc76fedd9b4cbd08cd070f9c4e161a51565 + checksum: 7a269bffa19bb010822efb3e51e7871c686416ddfab70df39e2d4637590d90f2f0b394a7d579cf0c6e38e1feacf085d9c259bc2d64e91496f51da61d0cf70dd4 languageName: node linkType: hard -"@electron-forge/maker-squirrel@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/maker-squirrel@npm:6.4.2" +"@electron-forge/maker-squirrel@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/maker-squirrel@npm:7.1.0" dependencies: - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/maker-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" electron-winstaller: "npm:^5.0.0" fs-extra: "npm:^10.0.0" dependenciesMeta: electron-winstaller: optional: true - checksum: 454ef0f55cff9b57656c468c6ea4436e51d47ebb5147be4432fb94aeb85ff71e3f73e9d966ae1e133bfd2300049140bf34fc3bc49a226c6de869df223eb4a43e + checksum: b4c22ace96b8bf204cc462e8c7b509a313ba4df1345bee26225f0a01243699cac04249194168bb7fc1e3c7a7a8eff562e507c038a6a85d4a297ff72bd06c5e1c languageName: node linkType: hard -"@electron-forge/maker-zip@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/maker-zip@npm:6.4.2" +"@electron-forge/maker-zip@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/maker-zip@npm:7.1.0" dependencies: - "@electron-forge/maker-base": "npm:6.4.2" - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/maker-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" cross-zip: "npm:^4.0.0" fs-extra: "npm:^10.0.0" got: "npm:^11.8.5" - checksum: 0a8d85ed20e5e335e0a6a885e1febcb0b667b2a756bc68b82acef6e3dec830e52c26cdd7bba754bc7f06f5ae79573bc01ddf45762a37dc5d5dcd91ecdf132bcc + checksum: ac7f751d8277e477bdcdc75bc75c590fb865b0eef8a0185fc2b9645f1d1fda281ceb186d4fffa2c7136ae38bf32c891fca6c3f28e808f618b5c7693f79fd817b languageName: node linkType: hard -"@electron-forge/plugin-base@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/plugin-base@npm:6.4.2" +"@electron-forge/plugin-auto-unpack-natives@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/plugin-auto-unpack-natives@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - checksum: e5ee02111198b5748347913c33015e8d2c9abc097b13dbdc918a42c0e8e660c8f1451e3b6e2ec4108911313be1c76a59682547087ae3052bbdc9c8b6c0953795 + "@electron-forge/plugin-base": "npm:7.1.0" + "@electron-forge/shared-types": "npm:7.1.0" + checksum: fb5c1c04af4152e75cb356989307182ac2582ee9ad193b7e646a80e6be7b847e89b5e7b1322d1c4db6ef45080fe010203d60fa2fe0831bdea46ef3b5d51f7638 languageName: node linkType: hard -"@electron-forge/publisher-base@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/publisher-base@npm:6.4.2" +"@electron-forge/plugin-base@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/plugin-base@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - checksum: fc70b713e8a8346d01f50b02987fec158d030cd59b4b8bf0a0f98de715049c41d8c6d86e28d5fd18aeed56b333ba8f3986e588444f7ea16fd109d2628b093a11 + "@electron-forge/shared-types": "npm:7.1.0" + checksum: c686c5b3fc4a26873a7e6a67386e465831123cafb1b61463eaa58c093507ad55d162cc7eb1e4c4279ba08850aeaa7765dffb166a5b8e7c4b2e149c2aa976200d languageName: node linkType: hard -"@electron-forge/shared-types@npm:6.4.2, @electron-forge/shared-types@npm:^6.4.2": - version: 6.4.2 - resolution: "@electron-forge/shared-types@npm:6.4.2" +"@electron-forge/publisher-base@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/publisher-base@npm:7.1.0" dependencies: + "@electron-forge/shared-types": "npm:7.1.0" + checksum: a8d231a129b5b3a7313c864455f5d4e9437c686b88fc80b5be6f3f6a5db0206ce92d28d003e6faf33552a9da33da3733a5af47df28e7969b5b8717565ac41f32 + languageName: node + linkType: hard + +"@electron-forge/shared-types@npm:7.1.0, @electron-forge/shared-types@npm:^7.1.0": + version: 7.1.0 + resolution: "@electron-forge/shared-types@npm:7.1.0" + dependencies: + "@electron-forge/tracer": "npm:7.1.0" + "@electron/packager": "npm:^18.0.0" "@electron/rebuild": "npm:^3.2.10" - electron-packager: "npm:^17.1.2" listr2: "npm:^5.0.3" - checksum: 063b2e2dd89cbfb2ee541fe26eaeb83836f20c6e4a0ac7f4ddafb41d9a3a4b07ab917025e469ea04894eadf639619b235bc58a358750e005b50edb5a8177ca39 + checksum: 24caf5e607d253a94a976b3495eaf063480ded669a3fa6ce6f29975c0554eeb98760f3d22150b9dee2e63839dcf9ffe013301e4a1d6b043ddb75c50a5e881a8b languageName: node linkType: hard -"@electron-forge/template-base@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/template-base@npm:6.4.2" +"@electron-forge/template-base@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/template-base@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" "@malept/cross-spawn-promise": "npm:^2.0.0" debug: "npm:^4.3.1" fs-extra: "npm:^10.0.0" username: "npm:^5.1.0" - checksum: 87ebf67296db774d699a3e1c8190be516f05706254a87dd7e7e2a8b6bad44889b2b9a20ad8012207c92ca8c44629162fb6bea4d158bf8fff316d5348ab8c8c8c + checksum: a01223886a7b9891a1ef618d601670e6edad214b029de9450944be18b4f259c26a0429a1ff0817f1ee766c95fe0fd3b400218e970681e5145dab06871159f143 languageName: node linkType: hard -"@electron-forge/template-vite-typescript@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/template-vite-typescript@npm:6.4.2" +"@electron-forge/template-vite-typescript@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/template-vite-typescript@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron-forge/template-base": "npm:7.1.0" fs-extra: "npm:^10.0.0" - checksum: 0a8085a7c009cb5577b7c1e2f313bcf18a7536f7c06fd27775bf5743c64921a7fef8ee2818a77385ddcc7d7d6a5a06cb46dffb6924bad0898a450bbb61c0c3a3 + checksum: d9343af750852cb99ea246ce9dfe92de74cff03b98c4ad226d4913410aa5eb454196a3e2f1af1ba691e954b9b1ee4adccd49fc04869165d1d13adc6b5af46641 languageName: node linkType: hard -"@electron-forge/template-vite@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/template-vite@npm:6.4.2" +"@electron-forge/template-vite@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/template-vite@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron-forge/template-base": "npm:7.1.0" fs-extra: "npm:^10.0.0" - checksum: 0ef062940029d847ee46ac7b30637cabefb81cab597f77fdd746ba4e020f98bd0ff78531f5c5568fdcffa814221395284faf26030c33f00da4d684d2cf0e78df + checksum: 2285cdc76f2d73c0dd76eefcf9c6371db611321e339efa6cd6fefc4339d36aaf58dcbd6f16c2d47c5daf4344abb0bfb289a536581c3d52087a5c5956d7187dd1 languageName: node linkType: hard -"@electron-forge/template-webpack-typescript@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/template-webpack-typescript@npm:6.4.2" +"@electron-forge/template-webpack-typescript@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/template-webpack-typescript@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron-forge/template-base": "npm:7.1.0" fs-extra: "npm:^10.0.0" - checksum: e2a48361ffe5af469d5c0654f0b4560ec2ca2f74a1d55ec0451c3a7645681701b4cc7941afeacebf9430fb0edcb7171e9a0cb25d3de05e0b7c5974066c829c82 + checksum: 6aed304f16e484bcedcdd2a36c0dd2bb2f75c950df7fd2fa3af8bccebc3be9901328f0e434e9dddd1ec33c4c5dd4dc293372ab67f82fb9f4d7a12ac647ae40df languageName: node linkType: hard -"@electron-forge/template-webpack@npm:6.4.2": - version: 6.4.2 - resolution: "@electron-forge/template-webpack@npm:6.4.2" +"@electron-forge/template-webpack@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/template-webpack@npm:7.1.0" dependencies: - "@electron-forge/shared-types": "npm:6.4.2" - "@electron-forge/template-base": "npm:6.4.2" + "@electron-forge/shared-types": "npm:7.1.0" + "@electron-forge/template-base": "npm:7.1.0" fs-extra: "npm:^10.0.0" - checksum: 4267c73eda0b9201c2244f25ab0e09b59c3a77bd338db0ce5dfd48b3e90fdf45677b7f881d147d5b715261816987a9b110364dde5c65eb2dc5d6ae7f41f2ca12 + checksum: c79748332478d1d4e354b424e95f22fb341a7271b70102270d2fd3d5d9e6452900782dcfc04690c79378f7311d015f38c21e71838911588b9a1554f51129ea0c + languageName: node + linkType: hard + +"@electron-forge/tracer@npm:7.1.0": + version: 7.1.0 + resolution: "@electron-forge/tracer@npm:7.1.0" + dependencies: + chrome-trace-event: "npm:^1.0.3" + checksum: d537a2de2605a5704530d62f04c339f033d230d1afcf72e0e678db5743c684deae8614c11072bff75682a917b99818a9658f0508bbb59ea3fecfd09b7a3251cb languageName: node linkType: hard "@electron/asar@npm:^3.2.1": - version: 3.2.7 - resolution: "@electron/asar@npm:3.2.7" + version: 3.2.8 + resolution: "@electron/asar@npm:3.2.8" dependencies: commander: "npm:^5.0.0" glob: "npm:^7.1.6" minimatch: "npm:^3.0.4" bin: asar: bin/asar.js - checksum: 98b4f5b28a68e41f3bcfc7e858380411ea6af5068614d1d1ad2e17f2910a4c6305f391b8e69212f76cf5859cbd39b90c23617825a73425727a654b69044cb3f2 + checksum: 61aa3a44eeb8e63f674ebf127f6cebde05a4603d24b6758d6cb422f706c73530c5a51b35d6d7ab964b1c0d6595a96a39d80cf21cfb8c47a67c63a21dc82d394e languageName: node linkType: hard @@ -4303,13 +5061,33 @@ __metadata: languageName: node linkType: hard -"@electron/notarize@npm:^1.2.3": - version: 1.2.4 - resolution: "@electron/notarize@npm:1.2.4" +"@electron/get@npm:^3.0.0": + version: 3.0.0 + resolution: "@electron/get@npm:3.0.0" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 1e92f10c1d50dde4be1a21c361101a5c7484b7ad7a3fe1ca60ba9405c314a18739c061dfca26e8bdbe6a12a2346817cc1fc711e8e8fe6ff1261104a4dfa92fc5 + languageName: node + linkType: hard + +"@electron/notarize@npm:^2.1.0": + version: 2.2.0 + resolution: "@electron/notarize@npm:2.2.0" dependencies: debug: "npm:^4.1.1" fs-extra: "npm:^9.0.1" - checksum: c0c163d85a5ded7438e746a194571eadccb0119193056d8949cb8351801e44a3ffae31d65b4094d7b8d7a0f655117b3a217a66f4c43e380310d7992c1204d62a + promise-retry: "npm:^2.0.1" + checksum: 31639c9ee54d5ff2be7882c24916716b678b3c931b90cdea359262826b643c4291853cbaba8ecfc7cfddd75331117ef120fbd9c6a7b87c7d099ad54b6a2b0427 languageName: node linkType: hard @@ -4330,9 +5108,38 @@ __metadata: languageName: node linkType: hard +"@electron/packager@npm:^18.0.0": + version: 18.0.0 + resolution: "@electron/packager@npm:18.0.0" + dependencies: + "@electron/asar": "npm:^3.2.1" + "@electron/get": "npm:^3.0.0" + "@electron/notarize": "npm:^2.1.0" + "@electron/osx-sign": "npm:^1.0.5" + "@electron/universal": "npm:^1.3.2" + cross-spawn-windows-exe: "npm:^1.2.0" + debug: "npm:^4.0.1" + extract-zip: "npm:^2.0.0" + filenamify: "npm:^4.1.0" + fs-extra: "npm:^11.1.0" + galactus: "npm:^1.0.0" + get-package-info: "npm:^1.0.0" + junk: "npm:^3.1.0" + parse-author: "npm:^2.0.0" + plist: "npm:^3.0.0" + rcedit: "npm:^4.0.0" + resolve: "npm:^1.1.6" + semver: "npm:^7.1.3" + yargs-parser: "npm:^21.1.1" + bin: + electron-packager: bin/electron-packager.js + checksum: d880f86e5ca825f2d958d88fec6b47f058eb11ef056c1a28afbc52f3dec2d95a258a04052b775add12ca59320a2a2d94c1778b9f1c4028b66c2592e069f05de2 + languageName: node + linkType: hard + "@electron/rebuild@npm:^3.2.10": - version: 3.3.0 - resolution: "@electron/rebuild@npm:3.3.0" + version: 3.3.1 + resolution: "@electron/rebuild@npm:3.3.1" dependencies: "@malept/cross-spawn-promise": "npm:^2.0.0" chalk: "npm:^4.0.0" @@ -4349,22 +5156,22 @@ __metadata: yargs: "npm:^17.0.1" bin: electron-rebuild: lib/cli.js - checksum: 1cb27eb6370b0ad94ab5e38208ab07cb9ba77c855b18c64d0d7b5bf15bb107ed242fccc2e99a5a7682699deb57da3404caee794b222da2dff8fad01fa4d46846 + checksum: 4e47ca542cd9429523456a81d1a6e9f1a13ef50a2dfbf8de2e3a71dc32b4411b357434bb64fdad13338173274930d6532e741655448f60bc32d96d2a49cbc15d languageName: node linkType: hard -"@electron/remote@npm:2.0.12": - version: 2.0.12 - resolution: "@electron/remote@npm:2.0.12" +"@electron/remote@npm:2.1.0": + version: 2.1.0 + resolution: "@electron/remote@npm:2.1.0" peerDependencies: electron: ">= 13.0.0" - checksum: 088dbeeea434e8ebd6748acbe7b2a34c3d7ce90c3238d7b819034940c4653eb7f440b19fd33cd98d633312f0f3786a04de1d3b7b9bc718ccf463b7333b58c1be + checksum: 205d3bd713b969f9452513275fa88cff0421cebde36d5154a802eb30eda0cbf8ad0062a3c8bdab1ef55e1a9767958dab3f850b7ac409cc8ea9740d9573bd36dd languageName: node linkType: hard "@electron/universal@npm:^1.3.2": - version: 1.4.2 - resolution: "@electron/universal@npm:1.4.2" + version: 1.5.1 + resolution: "@electron/universal@npm:1.5.1" dependencies: "@electron/asar": "npm:^3.2.1" "@malept/cross-spawn-promise": "npm:^1.1.0" @@ -4373,7 +5180,7 @@ __metadata: fs-extra: "npm:^9.0.1" minimatch: "npm:^3.0.4" plist: "npm:^3.0.4" - checksum: d9c0b567c0eaf38eb8844d679a0635d3b691cc0a83ba492bd281407e35300a6911b40896e8bb764acad21b6af977ee206a8f60ee2bd17afe92e2df720d0a9998 + checksum: 9e6cd5dbc05350c1a0e9a947651171de5d5e36976094f9dd2267451b872cd6b6759cb40cf222bf8b4383a7d86103cacb5eeeeb532f27c64c439c77ba50fa61f1 languageName: node linkType: hard @@ -4611,9 +5418,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-arm64@npm:0.19.5" +"@esbuild/android-arm64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/android-arm64@npm:0.19.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -4639,9 +5446,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-arm@npm:0.19.5" +"@esbuild/android-arm@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/android-arm@npm:0.19.7" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -4667,9 +5474,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-x64@npm:0.19.5" +"@esbuild/android-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/android-x64@npm:0.19.7" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -4695,9 +5502,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/darwin-arm64@npm:0.19.5" +"@esbuild/darwin-arm64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/darwin-arm64@npm:0.19.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -4723,9 +5530,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/darwin-x64@npm:0.19.5" +"@esbuild/darwin-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/darwin-x64@npm:0.19.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -4751,9 +5558,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/freebsd-arm64@npm:0.19.5" +"@esbuild/freebsd-arm64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/freebsd-arm64@npm:0.19.7" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -4779,9 +5586,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/freebsd-x64@npm:0.19.5" +"@esbuild/freebsd-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/freebsd-x64@npm:0.19.7" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -4807,9 +5614,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-arm64@npm:0.19.5" +"@esbuild/linux-arm64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-arm64@npm:0.19.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -4835,9 +5642,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-arm@npm:0.19.5" +"@esbuild/linux-arm@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-arm@npm:0.19.7" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -4863,9 +5670,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-ia32@npm:0.19.5" +"@esbuild/linux-ia32@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-ia32@npm:0.19.7" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -4891,9 +5698,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-loong64@npm:0.19.5" +"@esbuild/linux-loong64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-loong64@npm:0.19.7" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -4919,9 +5726,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-mips64el@npm:0.19.5" +"@esbuild/linux-mips64el@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-mips64el@npm:0.19.7" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -4947,9 +5754,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-ppc64@npm:0.19.5" +"@esbuild/linux-ppc64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-ppc64@npm:0.19.7" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -4975,9 +5782,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-riscv64@npm:0.19.5" +"@esbuild/linux-riscv64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-riscv64@npm:0.19.7" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -5003,9 +5810,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-s390x@npm:0.19.5" +"@esbuild/linux-s390x@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-s390x@npm:0.19.7" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -5031,9 +5838,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-x64@npm:0.19.5" +"@esbuild/linux-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/linux-x64@npm:0.19.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -5059,9 +5866,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/netbsd-x64@npm:0.19.5" +"@esbuild/netbsd-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/netbsd-x64@npm:0.19.7" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -5087,9 +5894,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/openbsd-x64@npm:0.19.5" +"@esbuild/openbsd-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/openbsd-x64@npm:0.19.7" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -5115,9 +5922,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/sunos-x64@npm:0.19.5" +"@esbuild/sunos-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/sunos-x64@npm:0.19.7" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -5143,9 +5950,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-arm64@npm:0.19.5" +"@esbuild/win32-arm64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/win32-arm64@npm:0.19.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -5171,9 +5978,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-ia32@npm:0.19.5" +"@esbuild/win32-ia32@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/win32-ia32@npm:0.19.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -5199,9 +6006,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-x64@npm:0.19.5" +"@esbuild/win32-x64@npm:0.19.7": + version: 0.19.7 + resolution: "@esbuild/win32-x64@npm:0.19.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5218,15 +6025,15 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.9.1 - resolution: "@eslint-community/regexpp@npm:4.9.1" - checksum: 8f1ba51fa5dedd93f01623382d006c838a436aaea85561c7e540b15600988350843bf746a60e2aaefa79ee4904c9dc0a2f3f00e025b162112c76520ffb34805d + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" +"@eslint/eslintrc@npm:^2.1.3": + version: 2.1.3 + resolution: "@eslint/eslintrc@npm:2.1.3" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" @@ -5237,14 +6044,14 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: fa25638f2666cac6810f98ee7d0f4b912f191806467c1b40d72bac759fffef0b3357f12a1869817286837b258e4de3517e0c7408520e156ca860fc53a1fbaed9 + checksum: 77b70a89232fe702c2f765b5b92970f5e4224b55363b923238b996c66fcd991504f40d3663c0543ae17d6c5049ab9b07ab90b65d7601e6f25e8bcd4caf69ac75 languageName: node linkType: hard -"@eslint/js@npm:8.51.0": - version: 8.51.0 - resolution: "@eslint/js@npm:8.51.0" - checksum: 1641f02c787a6477bf4b054afb8113abdca552b8c222520b5ee44d85352294dafd4a34f0e510b1e38a02fc27c1f68547cb6c2abbea891d20688f474440266af3 +"@eslint/js@npm:8.54.0": + version: 8.54.0 + resolution: "@eslint/js@npm:8.54.0" + checksum: 4d491ff234cd94b54499428cb3435623270ff8cc59950e13e6e1ac2fa350ec60502dac7bfd4f486523fee65ad7a358034570fe776b81b14dbfe5525d1e26e1d8 languageName: node linkType: hard @@ -5255,10 +6062,10 @@ __metadata: languageName: node linkType: hard -"@faker-js/faker@npm:^8.2.0": - version: 8.2.0 - resolution: "@faker-js/faker@npm:8.2.0" - checksum: 8be9ce50538b12abdd9c2c94a9e23b991826b42f4706cb703f1d37cac8c9042d6549905959f3fd9abdd3a22f7b6095ddbae6f4269250158bd35a4ca1a5de55e8 +"@faker-js/faker@npm:^8.3.1": + version: 8.3.1 + resolution: "@faker-js/faker@npm:8.3.1" + checksum: 66b25cb82af907ff127767b54a5d6e95919c8051cd2de9131a6f5dd45dc539ebfbafad66e590e603e347e4c411f0f83c28e70043024af66faebba49d9868c263 languageName: node linkType: hard @@ -5270,9 +6077,9 @@ __metadata: linkType: hard "@fastify/busboy@npm:^2.0.0": - version: 2.0.0 - resolution: "@fastify/busboy@npm:2.0.0" - checksum: 6a2366d06b82aac1069b8323792f76f7a8fca02533cb3745fcd218d8f0f953dc4dbef057287237414658cd43f8dede0846ef33398999e3dbe54ddaeefec71c0a + version: 2.1.0 + resolution: "@fastify/busboy@npm:2.1.0" + checksum: f22c1e5c52dc350ddf9ba8be9f87b48d3ea5af00a37fd0a0d1e3e4b37f94d96763e514c68a350c7f570260fdd2f08b55ee090cdd879f92a03249eb0e3fd19113 languageName: node linkType: hard @@ -5325,15 +6132,15 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.2": - version: 2.0.2 - resolution: "@floating-ui/react-dom@npm:2.0.2" +"@floating-ui/react-dom@npm:^2.0.0": + version: 2.0.4 + resolution: "@floating-ui/react-dom@npm:2.0.4" dependencies: "@floating-ui/dom": "npm:^1.5.1" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 63a26f3c36f00a2bdede202cb7a3be74b3c6599463c0a069745f6aed3181a33ce72936158209f6fd1c284d85fd494aa656e6cbc4266c096f3189ce1c13f83dfe + checksum: 4240a718502c797fd2e174cd06dcd7321a6eda9c8966dbaf61864b9e16445e95649a59bfe7c19ee13f68c11f3693724d7970c7e618089a3d3915bd343639cfae languageName: node linkType: hard @@ -5358,6 +6165,13 @@ __metadata: languageName: node linkType: hard +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 052dd232140fa60e81588000cbe729a40146579b361f1070bce63e2a761388a22a16d00beeffc504bd3601cb8e055c57b21a185448b3ed550cf50716f4fd442e + languageName: node + linkType: hard + "@golevelup/nestjs-discovery@npm:4.0.0": version: 4.0.0 resolution: "@golevelup/nestjs-discovery@npm:4.0.0" @@ -5612,17 +6426,17 @@ __metadata: linkType: hard "@graphql-tools/code-file-loader@npm:^8.0.0": - version: 8.0.2 - resolution: "@graphql-tools/code-file-loader@npm:8.0.2" + version: 8.0.3 + resolution: "@graphql-tools/code-file-loader@npm:8.0.3" dependencies: - "@graphql-tools/graphql-tag-pluck": "npm:8.0.2" + "@graphql-tools/graphql-tag-pluck": "npm:8.1.0" "@graphql-tools/utils": "npm:^10.0.0" globby: "npm:^11.0.3" tslib: "npm:^2.4.0" unixify: "npm:^1.0.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 02d2b3a11788072c8b70d75bb04f686b63952090f4d373c68eca7b01b6cd4235811bd905912924ec5520c9fcddffba273d1271375341ca707cc2dc9685ecb5ae + checksum: 602a6eeeea5b1d912f5347084d32f119f3708a1d3622ce7f36149de0682bae5cdd797aa28dd85559cd401d689daff34f02724903b9bafc410bfca1bff09b30e0 languageName: node linkType: hard @@ -5643,8 +6457,8 @@ __metadata: linkType: hard "@graphql-tools/executor-graphql-ws@npm:^1.0.0": - version: 1.1.0 - resolution: "@graphql-tools/executor-graphql-ws@npm:1.1.0" + version: 1.1.1 + resolution: "@graphql-tools/executor-graphql-ws@npm:1.1.1" dependencies: "@graphql-tools/utils": "npm:^10.0.2" "@types/ws": "npm:^8.0.0" @@ -5654,7 +6468,7 @@ __metadata: ws: "npm:^8.13.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fa76de4020de49ba2309341f5ee9b0fbf05c6a16e7e9ecf99fad2dea734021122576a7ad82f697299f10c2e2ea8da2e3f30a31c5da1edb0938c9769adfe5c646 + checksum: 30d29e2ef8fbedf07d7c279218f31a7279e714328f6c24d28ea76536fb4c5ed857ab5e486922000fcf9f85b83a9f3e995b8fd066b01ea4ab31d35efaa770c133 languageName: node linkType: hard @@ -5706,10 +6520,10 @@ __metadata: linkType: hard "@graphql-tools/git-loader@npm:^8.0.0": - version: 8.0.2 - resolution: "@graphql-tools/git-loader@npm:8.0.2" + version: 8.0.3 + resolution: "@graphql-tools/git-loader@npm:8.0.3" dependencies: - "@graphql-tools/graphql-tag-pluck": "npm:8.0.2" + "@graphql-tools/graphql-tag-pluck": "npm:8.1.0" "@graphql-tools/utils": "npm:^10.0.0" is-glob: "npm:4.0.3" micromatch: "npm:^4.0.4" @@ -5717,7 +6531,7 @@ __metadata: unixify: "npm:^1.0.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: f6fd736ff72df43d51f9a120e00fda5b7d638ee0fb75b5bf7a6ce1da77717d87a8fe1c0a746096f8ab785ba98e04d69c80198579981185664fbbc73c80a247e4 + checksum: b09718e7b6c4a9c5f0ce784f1e9d955c2d0dbc0a4c633bb2a334110ff6f985c00ca27acdc60d9cc34f70a7d04b0f50c937e174e557bed3147d092e1f639d9cfe languageName: node linkType: hard @@ -5753,9 +6567,9 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/graphql-tag-pluck@npm:8.0.2, @graphql-tools/graphql-tag-pluck@npm:^8.0.0": - version: 8.0.2 - resolution: "@graphql-tools/graphql-tag-pluck@npm:8.0.2" +"@graphql-tools/graphql-tag-pluck@npm:8.1.0, @graphql-tools/graphql-tag-pluck@npm:^8.0.0": + version: 8.1.0 + resolution: "@graphql-tools/graphql-tag-pluck@npm:8.1.0" dependencies: "@babel/core": "npm:^7.22.9" "@babel/parser": "npm:^7.16.8" @@ -5766,7 +6580,7 @@ __metadata: tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 46a7722449be830863b2772798dc444e9284b9f3c5ae6812b9f1174a7051929e2135c967357227d1756bec79ebe8b77755633971f71ce438a89f04896d52b472 + checksum: b9ce616ba3cc4915da701e84a726ef908c1a9bd612e51e94da4eab1fefb474642d9aeac6818fc6121dcba4a0351ae1311cdaf016650ce5cdd277aeb9c0577b74 languageName: node linkType: hard @@ -5847,11 +6661,11 @@ __metadata: linkType: hard "@graphql-tools/prisma-loader@npm:^8.0.0": - version: 8.0.1 - resolution: "@graphql-tools/prisma-loader@npm:8.0.1" + version: 8.0.2 + resolution: "@graphql-tools/prisma-loader@npm:8.0.2" dependencies: "@graphql-tools/url-loader": "npm:^8.0.0" - "@graphql-tools/utils": "npm:^10.0.0" + "@graphql-tools/utils": "npm:^10.0.8" "@types/js-yaml": "npm:^4.0.0" "@types/json-stable-stringify": "npm:^1.0.32" "@whatwg-node/fetch": "npm:^0.9.0" @@ -5861,7 +6675,7 @@ __metadata: graphql-request: "npm:^6.0.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.0" - jose: "npm:^4.11.4" + jose: "npm:^5.0.0" js-yaml: "npm:^4.0.0" json-stable-stringify: "npm:^1.0.1" lodash: "npm:^4.17.20" @@ -5870,7 +6684,7 @@ __metadata: yaml-ast-parser: "npm:^0.0.43" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: a4b285fec2006e9b34b71f8e96f63f866411a53f95758e8b67942ea999925c6e843e3ecc2d2c9f2ccf722488d481e29fcec11dc87a4189188501e0948d41aa95 + checksum: 38a7d88b60bd9476c8b90f64f5eaf704470926ccf4c5a91529a437a62468a7466041f4bc987b245d4fe2028269570c320292bf2b6cb89ca2a7b31fffde12ef48 languageName: node linkType: hard @@ -5887,7 +6701,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:10.0.0, @graphql-tools/schema@npm:^10.0.0": +"@graphql-tools/schema@npm:10.0.0": version: 10.0.0 resolution: "@graphql-tools/schema@npm:10.0.0" dependencies: @@ -5901,6 +6715,20 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/schema@npm:^10.0.0": + version: 10.0.1 + resolution: "@graphql-tools/schema@npm:10.0.1" + dependencies: + "@graphql-tools/merge": "npm:^9.0.0" + "@graphql-tools/utils": "npm:^10.0.9" + tslib: "npm:^2.4.0" + value-or-promise: "npm:^1.0.12" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 314283995b9e83a398dbd8b46be00056d1737d60868b88732fa651902d914f8458901efda64a976d53ff6498e4f023dfa47ed80eb451d03e5d2dda8aea42ed8b + languageName: node + linkType: hard + "@graphql-tools/schema@npm:^9.0.0": version: 9.0.19 resolution: "@graphql-tools/schema@npm:9.0.19" @@ -5938,29 +6766,31 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:10.0.6": - version: 10.0.6 - resolution: "@graphql-tools/utils@npm:10.0.6" +"@graphql-tools/utils@npm:10.0.8": + version: 10.0.8 + resolution: "@graphql-tools/utils@npm:10.0.8" dependencies: "@graphql-typed-document-node/core": "npm:^3.1.1" + cross-inspect: "npm:1.0.0" dset: "npm:^3.1.2" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 88bfb6967fd9ea56479d916d2f7aef1687c2de56c236e1c5df28039a5d830089c26980baf35043153893e4b52838ed053eb4ce3c5b2144e7833b9e44931d7666 + checksum: 3dc84eec5622048fc2c5618179975a2f8465119a02ef88fe98c3be34bdf6d23e93fba29de2c5ec36f1c0c63467de902df85b0a2b2dbe0304b6cb0e7ededbd739 languageName: node linkType: hard -"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.2, @graphql-tools/utils@npm:^10.0.5": - version: 10.0.7 - resolution: "@graphql-tools/utils@npm:10.0.7" +"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.2, @graphql-tools/utils@npm:^10.0.5, @graphql-tools/utils@npm:^10.0.8, @graphql-tools/utils@npm:^10.0.9": + version: 10.0.9 + resolution: "@graphql-tools/utils@npm:10.0.9" dependencies: "@graphql-typed-document-node/core": "npm:^3.1.1" + cross-inspect: "npm:1.0.0" dset: "npm:^3.1.2" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 50383782f7e2667f44891f060a0b91f1c551becccf919f041e0ce70bafd42021bf8b446273ce2b3efcd2de53d0b59b99f954c2f4094041fba86d478f616a30ea + checksum: f11e4b3289bf4c48c25e2dfbb53bb59395a4599c75234e4bb9a9bbe6d28469a3ae2248bf3c9705ed354e47817cdff7abdb6e66adcabcba6cb4a58eafe96d6fc1 languageName: node linkType: hard @@ -6001,12 +6831,12 @@ __metadata: linkType: hard "@grpc/grpc-js@npm:^1.1.8, @grpc/grpc-js@npm:^1.7.1": - version: 1.9.5 - resolution: "@grpc/grpc-js@npm:1.9.5" + version: 1.9.11 + resolution: "@grpc/grpc-js@npm:1.9.11" dependencies: "@grpc/proto-loader": "npm:^0.7.8" "@types/node": "npm:>=12.12.47" - checksum: 5499d964d29601ad1850e45aaeccbfaa980dfffbe6bd4fdd587ef3cf4cc62d69dadf2ee8eb1d6220c468607cef70ae55d24eccfc57a51f453e965a82a3fd1f77 + checksum: 71b8517b4ff1b3e518bc20b4366c0a7363cb925158eb8f4c99a233a3268ccf7effd0e6ec600429ff7c3f58463c612ec3bab82e40255f632c85a4de88d647e9ec languageName: node linkType: hard @@ -6040,14 +6870,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" dependencies: - "@humanwhocodes/object-schema": "npm:^1.2.1" + "@humanwhocodes/object-schema": "npm:^2.0.1" debug: "npm:^4.1.1" minimatch: "npm:^3.0.5" - checksum: 4aad64bc4c68ec99a72c91ad9a8a9070e8da47e8fc4f51eefa2eaf56f4b0cae17dfc3ff82eb9268298f687b5bb3b68669ff542203c77bcd400dc27924d56cad6 + checksum: 9f655e1df7efa5a86822cd149ca5cef57240bb8ffd728f0c07cc682cc0a15c6bdce68425fbfd58f9b3e8b16f79b3fd8cb1e96b10c434c9a76f20b2a89f213272 languageName: node linkType: hard @@ -6058,10 +6888,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: b48a8f87fcd5fdc4ac60a31a8bf710d19cc64556050575e6a35a4a48a8543cf8cde1598a65640ff2cdfbfd165b38f9db4fa3782bea7848eb585cc3db824002e6 +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: dbddfd0465aecf92ed845ec30d06dba3f7bb2496d544b33b53dac7abc40370c0e46b8787b268d24a366730d5eeb5336ac88967232072a183905ee4abf7df4dab languageName: node linkType: hard @@ -6106,20 +6936,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/console@npm:28.1.3" - dependencies: - "@jest/types": "npm:^28.1.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - slash: "npm:^3.0.0" - checksum: 82153eb24e61bd442bff350a7537d598e7c49097aabd9545b340582dcf1f17e5749baa342a67e564816a3a6ce746038b618ed9f66702140264bfa1e1d5cc9e5e - languageName: node - linkType: hard - "@jest/console@npm:^29.7.0": version: 29.7.0 resolution: "@jest/console@npm:29.7.0" @@ -6134,37 +6950,36 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/core@npm:28.1.3" +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" dependencies: - "@jest/console": "npm:^28.1.3" - "@jest/reporters": "npm:^28.1.3" - "@jest/test-result": "npm:^28.1.3" - "@jest/transform": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" "@types/node": "npm:*" ansi-escapes: "npm:^4.2.1" chalk: "npm:^4.0.0" ci-info: "npm:^3.2.0" exit: "npm:^0.1.2" graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^28.1.3" - jest-config: "npm:^28.1.3" - jest-haste-map: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-regex-util: "npm:^28.0.2" - jest-resolve: "npm:^28.1.3" - jest-resolve-dependencies: "npm:^28.1.3" - jest-runner: "npm:^28.1.3" - jest-runtime: "npm:^28.1.3" - jest-snapshot: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - jest-validate: "npm:^28.1.3" - jest-watcher: "npm:^28.1.3" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" micromatch: "npm:^4.0.4" - pretty-format: "npm:^28.1.3" - rimraf: "npm:^3.0.0" + pretty-format: "npm:^29.7.0" slash: "npm:^3.0.0" strip-ansi: "npm:^6.0.0" peerDependencies: @@ -6172,7 +6987,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 72b56c7591dd1ec325c40e9f60f8111e17d4a09c918b7e5882de58ed1c656d6d34f085dfbdb49f65e6ac95b49919976c7b07821663cbcccd7f3a55c29db542b9 + checksum: ab6ac2e562d083faac7d8152ec1cc4eccc80f62e9579b69ed40aedf7211a6b2d57024a6cd53c4e35fd051c39a236e86257d1d99ebdb122291969a0a04563b51e languageName: node linkType: hard @@ -6185,72 +7000,73 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/environment@npm:28.1.3" +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" dependencies: - "@jest/fake-timers": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" "@types/node": "npm:*" - jest-mock: "npm:^28.1.3" - checksum: 63a8efd099f8d5cd70398c7608d45fc91a5796b14d8f9f8c7fdb3a529e42004e3b60cf0c6e117cc88305d18ab7bb453f803a737e09293e9027a1e76ce835da57 + jest-mock: "npm:^29.7.0" + checksum: 90b5844a9a9d8097f2cf107b1b5e57007c552f64315da8c1f51217eeb0a9664889d3f145cdf8acf23a84f4d8309a6675e27d5b059659a004db0ea9546d1c81a8 languageName: node linkType: hard -"@jest/expect-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect-utils@npm:28.1.3" +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" dependencies: - jest-get-type: "npm:^28.0.2" - checksum: f48e4c5b267438a565b6e4c00a06f2bd566dc65d8bb6114d57276ec1fa4f4cded548371e45caffe37c58e5cf3716dbec715c10cfacdae35c4c04b755d83fac96 + jest-get-type: "npm:^29.6.3" + checksum: ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee languageName: node linkType: hard -"@jest/expect@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect@npm:28.1.3" +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" dependencies: - expect: "npm:^28.1.3" - jest-snapshot: "npm:^28.1.3" - checksum: 31ea089e83a4c24f850043a97dfd777a352dd28a936819785f3d0de6e0bd537bfbfa8fd2df081db1adc68a6a55699e7d4ab3990d6a54e41753d86e5d2b66df2f + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: fea6c3317a8da5c840429d90bfe49d928e89c9e89fceee2149b93a11b7e9c73d2f6e4d7cdf647163da938fc4e2169e4490be6bae64952902bc7a701033fd4880 languageName: node linkType: hard -"@jest/fake-timers@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/fake-timers@npm:28.1.3" +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" dependencies: - "@jest/types": "npm:^28.1.3" - "@sinonjs/fake-timers": "npm:^9.1.2" + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" "@types/node": "npm:*" - jest-message-util: "npm:^28.1.3" - jest-mock: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - checksum: 4002208f6637adc374175c97e845a19783f58874e9503fb956b801061ba1869a218964cf4631e1ac348e06e1667e982ceb94734db63ccfafdf37508f6b59be17 + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 9b394e04ffc46f91725ecfdff34c4e043eb7a16e1d78964094c9db3fde0b1c8803e45943a980e8c740d0a3d45661906de1416ca5891a538b0660481a3a828c27 languageName: node linkType: hard -"@jest/globals@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/globals@npm:28.1.3" +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" dependencies: - "@jest/environment": "npm:^28.1.3" - "@jest/expect": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 languageName: node linkType: hard -"@jest/reporters@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/reporters@npm:28.1.3" +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" dependencies: "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^28.1.3" - "@jest/test-result": "npm:^28.1.3" - "@jest/transform": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - "@jridgewell/trace-mapping": "npm:^0.3.13" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" "@types/node": "npm:*" chalk: "npm:^4.0.0" collect-v8-coverage: "npm:^1.0.0" @@ -6258,24 +7074,23 @@ __metadata: glob: "npm:^7.1.3" graceful-fs: "npm:^4.2.9" istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^5.1.0" + istanbul-lib-instrument: "npm:^6.0.0" istanbul-lib-report: "npm:^3.0.0" istanbul-lib-source-maps: "npm:^4.0.0" istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - jest-worker: "npm:^28.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" slash: "npm:^3.0.0" string-length: "npm:^4.0.1" strip-ansi: "npm:^6.0.0" - terminal-link: "npm:^2.0.0" v8-to-istanbul: "npm:^9.0.1" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: bdce58bf1cf1fc0f7fb0c2ae02b5a9a1da32da83ee4697b2b23b8a5b0ac056af55dac07dcf7e869f963943e935da3bd26a788c478b6d52064c77320530d95a89 + checksum: a17d1644b26dea14445cedd45567f4ba7834f980be2ef74447204e14238f121b50d8b858fde648083d2cd8f305f81ba434ba49e37a5f4237a6f2a61180cc73dc languageName: node linkType: hard @@ -6297,26 +7112,14 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^28.1.2": - version: 28.1.2 - resolution: "@jest/source-map@npm:28.1.2" +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.13" + "@jridgewell/trace-mapping": "npm:^0.3.18" callsites: "npm:^3.0.0" graceful-fs: "npm:^4.2.9" - checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a - languageName: node - linkType: hard - -"@jest/test-result@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-result@npm:28.1.3" - dependencies: - "@jest/console": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: d343f08e6e4971e8132540014711c5d29887651b036f03db8c7e9d6509fe9801316f0a6a393cd0af0431c50e6d1c1d310957f06b6cc20c08cab2e67b66a00c88 + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb languageName: node linkType: hard @@ -6332,42 +7135,19 @@ __metadata: languageName: node linkType: hard -"@jest/test-sequencer@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-sequencer@npm:28.1.3" +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" dependencies: - "@jest/test-result": "npm:^28.1.3" + "@jest/test-result": "npm:^29.7.0" graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^28.1.3" + jest-haste-map: "npm:^29.7.0" slash: "npm:^3.0.0" - checksum: a2f05475c39a8e3e446a0f98c6830aa2492daffe8286db58c95e1870479ed4c2a74e2e51fac1d8b2958858aeb194331145c217d04482fb9312ba1a9e7dded171 + checksum: 4420c26a0baa7035c5419b0892ff8ffe9a41b1583ec54a10db3037cd46a7e29dd3d7202f8aa9d376e9e53be5f8b1bc0d16e1de6880a6d319b033b01dc4c8f639 languageName: node linkType: hard -"@jest/transform@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/transform@npm:28.1.3" - dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/types": "npm:^28.1.3" - "@jridgewell/trace-mapping": "npm:^0.3.13" - babel-plugin-istanbul: "npm:^6.1.1" - chalk: "npm:^4.0.0" - convert-source-map: "npm:^1.4.0" - fast-json-stable-stringify: "npm:^2.0.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^28.1.3" - jest-regex-util: "npm:^28.0.2" - jest-util: "npm:^28.1.3" - micromatch: "npm:^4.0.4" - pirates: "npm:^4.0.4" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^4.0.1" - checksum: 89bc17ca22d5e81eb35e9549beaa5778da0209c12c108552322b72fa7b41a387d119168dea28fd9415f16883fc6dd7a811690654ebb958375e70158b4d0e2965 - languageName: node - linkType: hard - -"@jest/transform@npm:^29.3.1": +"@jest/transform@npm:^29.3.1, @jest/transform@npm:^29.7.0": version: 29.7.0 resolution: "@jest/transform@npm:29.7.0" dependencies: @@ -6403,20 +7183,6 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" - dependencies: - "@jest/schemas": "npm:^28.1.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: a90e636df760799b6c3d91e34e539e701ea803e80312257e674e345a3c23a7c892df7a301afbc7883ec1d623daf3ba266cde57c5965e0692e5f1e61915d3524b - languageName: node - linkType: hard - "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -6438,9 +7204,9 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.2.1": - version: 0.2.1 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.2.1" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.3.0": + version: 0.3.0 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.3.0" dependencies: glob: "npm:^7.2.0" glob-promise: "npm:^4.2.0" @@ -6448,11 +7214,11 @@ __metadata: react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" - vite: ^3.0.0 || ^4.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 484856634934d2ed430506bf1ff71d85e0a90ab356358cc7e4e14c4b2634c64e1fdeb318895fe3bee3209249c817172a89a3c5b0a4b018a53717f65748b3a0c7 + checksum: 9237499394b1f5f1320c9a489dbf5db2ba4b1d68081bf767a08895b70d0d0830adb9f0f1e2c5c94202e5bee63fe031ea2b91870a6bc806ed5e370be6b06df2e8 languageName: node linkType: hard @@ -6508,13 +7274,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 06a2a4e26e3cc369c41144fad7cbee29ba9ea6aca85acc565ec8f2110e298fdbf93986e17da815afae94539dcc03115cdbdbb575d3bea356e167da6987531e4d + checksum: 683117e4e6707ef50c725d6d0ec4234687ff751f36fa46c2b3068931eb6a86b49af374d3030200777666579a992b7470d1bd1c591e9bf64d764dda5295f33093 languageName: node linkType: hard @@ -6565,11 +7331,11 @@ __metadata: linkType: hard "@lit/reactive-element@npm:^2.0.0": - version: 2.0.1 - resolution: "@lit/reactive-element@npm:2.0.1" + version: 2.0.2 + resolution: "@lit/reactive-element@npm:2.0.2" dependencies: "@lit-labs/ssr-dom-shim": "npm:^1.1.2" - checksum: 83b5efacf47af5933fd5d0ffbdbdcfcb60bb69d477ffdf706bd8df89a6c353ca0256a2c86b065156fb75e4090f417c9c49122ccd5c2fb7658d2361021e1d32de + checksum: 2b74234f041740a8e0ab65980e2ac949533f067e43a6a512171a2b5f8ecd2116996f728776adc8ab94c1dddb679235cceb463a9c9ceb0f34a00fe95966646eff languageName: node linkType: hard @@ -6679,12 +7445,12 @@ __metadata: linkType: hard "@marsidev/react-turnstile@npm:^0.3.1": - version: 0.3.1 - resolution: "@marsidev/react-turnstile@npm:0.3.1" + version: 0.3.2 + resolution: "@marsidev/react-turnstile@npm:0.3.2" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 1ce6644ce9408f450b08c82d56e06b62c0d78def2ef1fe2f595bfca85d43f5b28a805cd480b96f97643437970ed9d7ddd2cf1fbb6227e560b9ddfc9d25f0f0e8 + checksum: ca23e2a182210f13f0609352d8d48247ad725773e52898335b9712d8328a995df8d3721ca979bd56dd48338057671373787b76b5a4e86cf4ae7aa84827a3a8bb languageName: node linkType: hard @@ -6712,15 +7478,15 @@ __metadata: linkType: hard "@microsoft/api-extractor@npm:^7.36.4": - version: 7.38.0 - resolution: "@microsoft/api-extractor@npm:7.38.0" + version: 7.38.3 + resolution: "@microsoft/api-extractor@npm:7.38.3" dependencies: "@microsoft/api-extractor-model": "npm:7.28.2" "@microsoft/tsdoc": "npm:0.14.2" "@microsoft/tsdoc-config": "npm:~0.16.1" "@rushstack/node-core-library": "npm:3.61.0" "@rushstack/rig-package": "npm:0.5.1" - "@rushstack/ts-command-line": "npm:4.16.1" + "@rushstack/ts-command-line": "npm:4.17.1" colors: "npm:~1.2.1" lodash: "npm:~4.17.15" resolve: "npm:~1.22.1" @@ -6729,7 +7495,7 @@ __metadata: typescript: "npm:~5.0.4" bin: api-extractor: bin/api-extractor - checksum: 73c3ff349cf9dfde4720c0996f0b0d8aa0b02e3f5e50b4acd3c6d12281c6e0c38cec4b5e0ace788dd6b00d0306334f58a60ffdfdb7eb1291c300388d11ecc009 + checksum: e40f964693dc5aaaf6e0a653faac6565ec05eac572619ca03fc91bdde85edc16a3db898dac7ff389041a6cc9edd22fc1d7e9aeab792a4cb76f932d5155c165c0 languageName: node linkType: hard @@ -6752,234 +7518,33 @@ __metadata: languageName: node linkType: hard -"@mswjs/cookies@npm:^0.2.2": - version: 0.2.2 - resolution: "@mswjs/cookies@npm:0.2.2" - dependencies: - "@types/set-cookie-parser": "npm:^2.4.0" - set-cookie-parser: "npm:^2.4.6" - checksum: f1b3b82a6821219494390d77d86383febc5f9d5bc21b0f47cc4d57d11af08cac1952d845011d8842ec6448a95e49efd0f35f6d56650c76a98848d70d9c78466d +"@mswjs/cookies@npm:^1.1.0": + version: 1.1.0 + resolution: "@mswjs/cookies@npm:1.1.0" + checksum: 168ed1966e579a4f454e6d2af5a015150cca570ac4c660f5b656e7bc021afacbf0b3d4ed3d03e9293550f3965c28ce1e293fa7037c6cf46ed7e268e21a1053a4 languageName: node linkType: hard -"@mswjs/interceptors@npm:^0.17.10": - version: 0.17.10 - resolution: "@mswjs/interceptors@npm:0.17.10" +"@mswjs/interceptors@npm:^0.25.11": + version: 0.25.12 + resolution: "@mswjs/interceptors@npm:0.25.12" dependencies: - "@open-draft/until": "npm:^1.0.3" - "@types/debug": "npm:^4.1.7" - "@xmldom/xmldom": "npm:^0.8.3" - debug: "npm:^4.3.3" - headers-polyfill: "npm:3.2.5" + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/logger": "npm:^0.3.0" + "@open-draft/until": "npm:^2.0.0" + is-node-process: "npm:^1.2.0" outvariant: "npm:^1.2.1" - strict-event-emitter: "npm:^0.2.4" - web-encoding: "npm:^1.1.5" - checksum: 0bbadfc3c925016d9f26f5bc0aa8833a1ec0065a04933c30f5d7b1f636f39c3458f5dc653d6418e5733523846626e84049a72ec913f70282d7b53bfef2a1aa81 + strict-event-emitter: "npm:^0.5.1" + checksum: e8c71cbf46eb12d20c19a0efc323e3a447bdfc2c003787c4af815e6c928c01718af851f7d95cd924342ef157c7b95174e2fe1791b1352b02414463d9da63a8e5 languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.19": - version: 5.0.0-beta.19 - resolution: "@mui/base@npm:5.0.0-beta.19" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@floating-ui/react-dom": "npm:^2.0.2" - "@mui/types": "npm:^7.2.6" - "@mui/utils": "npm:^5.14.13" - "@popperjs/core": "npm:^2.11.8" - clsx: "npm:^2.0.0" - prop-types: "npm:^15.8.1" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 4ed42c07aa2da31449c337da8535ab38068e1613e85fc69d4b8d60a1d3a270431c32cf0a9e753ae5d11cf4ea197221acda9fd7ad1f93992edc22c7c170a334f4 - languageName: node - linkType: hard - -"@mui/base@npm:5.0.0-beta.20": - version: 5.0.0-beta.20 - resolution: "@mui/base@npm:5.0.0-beta.20" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@floating-ui/react-dom": "npm:^2.0.2" - "@mui/types": "npm:^7.2.6" - "@mui/utils": "npm:^5.14.13" - "@popperjs/core": "npm:^2.11.8" - clsx: "npm:^2.0.0" - prop-types: "npm:^15.8.1" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 5926ae342f2a95a73a8ec3cf5fd9d4d8920b3c8f1faaa396349bd1d16f95e2f6639f049a7838a536d02a1d7a6f805378c0a6c384ad18c33c6eb3c00f50011905 - languageName: node - linkType: hard - -"@mui/core-downloads-tracker@npm:^5.14.14": - version: 5.14.14 - resolution: "@mui/core-downloads-tracker@npm:5.14.14" - checksum: 93a1f16141e3ef4ef63985079dabf6b6196b8f7581f2d71338fca5c00e5834bcecb65ee0ad6a20fc61bbdce33a55b3f02d18c37e1c9937106d65d67b6fa25acd - languageName: node - linkType: hard - -"@mui/icons-material@npm:^5.14.14": - version: 5.14.14 - resolution: "@mui/icons-material@npm:5.14.14" - dependencies: - "@babel/runtime": "npm:^7.23.1" - peerDependencies: - "@mui/material": ^5.0.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: a5ea6d8942f25f1389ac8921e9f960fd38e793b9851e8d5bf535a8b342be4c9f081f62390891636570495a0d6f4bd69fc6fea80a0b76efee7ee4b29627af16a4 - languageName: node - linkType: hard - -"@mui/material@npm:^5.14.14": - version: 5.14.14 - resolution: "@mui/material@npm:5.14.14" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@mui/base": "npm:5.0.0-beta.20" - "@mui/core-downloads-tracker": "npm:^5.14.14" - "@mui/system": "npm:^5.14.14" - "@mui/types": "npm:^7.2.6" - "@mui/utils": "npm:^5.14.13" - "@types/react-transition-group": "npm:^4.4.7" - clsx: "npm:^2.0.0" - csstype: "npm:^3.1.2" - prop-types: "npm:^15.8.1" - react-is: "npm:^18.2.0" - react-transition-group: "npm:^4.4.5" - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: 637ad369efb4b5173ca6dc267fb865fe267b9d90c09721ac3084ce5a4b61d1f9ae658b5352b877faff335299f2a7cdbe70155c2870fd50f37209b3a0b0482550 - languageName: node - linkType: hard - -"@mui/private-theming@npm:^5.14.14": - version: 5.14.14 - resolution: "@mui/private-theming@npm:5.14.14" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@mui/utils": "npm:^5.14.13" - prop-types: "npm:^15.8.1" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 23fc5a901ea655d60fab30b5c85ea5f8e62e6813f3d89f648f94c8da9437787554adc1a997bf0dc81890a4b706062d43652f9bdbbaddab0c23ef35d6ee07d4e9 - languageName: node - linkType: hard - -"@mui/styled-engine@npm:^5.14.13": - version: 5.14.13 - resolution: "@mui/styled-engine@npm:5.14.13" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@emotion/cache": "npm:^11.11.0" - csstype: "npm:^3.1.2" - prop-types: "npm:^15.8.1" - peerDependencies: - "@emotion/react": ^11.4.1 - "@emotion/styled": ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - checksum: 0ac6efb025d2e2d3d288c83e55dd152c9d42bb3521dc9c225dc78be37228f023853c19558141d650b4104b2099ba31a5680df0fc32ca9b24463c3ab4e4a83ada - languageName: node - linkType: hard - -"@mui/system@npm:^5.14.14": - version: 5.14.14 - resolution: "@mui/system@npm:5.14.14" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@mui/private-theming": "npm:^5.14.14" - "@mui/styled-engine": "npm:^5.14.13" - "@mui/types": "npm:^7.2.6" - "@mui/utils": "npm:^5.14.13" - clsx: "npm:^2.0.0" - csstype: "npm:^3.1.2" - prop-types: "npm:^15.8.1" - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: f748caa2572e86f97950ddd182907c1d434440c17b64aefdde935eeed7cb59dc77b42a1a8ca17e554b74cb6b87422efb2e16101bf4cdac78404c9ba5a2971cbf - languageName: node - linkType: hard - -"@mui/types@npm:^7.2.6": - version: 7.2.6 - resolution: "@mui/types@npm:7.2.6" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 3701cac48e14150a4dfbf6ebdcd59bf93f3b8c9b7b35aeb81737e6802cb98a41daa374596ba09a66756fc78d838fc5b4f4b748e6d0d35ebdcf86f14da952ef68 - languageName: node - linkType: hard - -"@mui/utils@npm:^5.14.13": - version: 5.14.13 - resolution: "@mui/utils@npm:5.14.13" - dependencies: - "@babel/runtime": "npm:^7.23.1" - "@types/prop-types": "npm:^15.7.7" - prop-types: "npm:^15.8.1" - react-is: "npm:^18.2.0" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 461dd7f9a3bf9c469aca32ca95b1806cc26cd6a00c90539ebede4555e80a14209f47c7026ddc46712f135ea9139abdf1b5c91d980a463b15f3ac10a1fef85339 - languageName: node - linkType: hard - -"@napi-rs/cli@npm:^2.16.3": - version: 2.16.3 - resolution: "@napi-rs/cli@npm:2.16.3" +"@napi-rs/cli@npm:^2.16.5": + version: 2.16.5 + resolution: "@napi-rs/cli@npm:2.16.5" bin: napi: scripts/index.js - checksum: c418c2c509c6f22d963218660b2c0e3874edc463c1906a15751c7bf32a1961dd457b8551997760a1ee08ed12b45fe78b21c84f86c44258cde989237ff4a5e011 + checksum: 37c16d900887970d080e5a3dd5656463d27e5d4c78f3c50d8382af0b4c51752c705e4713c18b46a83ff54a3c58d5d146aabc82ac7b7bbda8134adb7325bb9fa1 languageName: node linkType: hard @@ -7332,9 +7897,9 @@ __metadata: languageName: node linkType: hard -"@nestjs/apollo@npm:^12.0.9": - version: 12.0.9 - resolution: "@nestjs/apollo@npm:12.0.9" +"@nestjs/apollo@npm:^12.0.11": + version: 12.0.11 + resolution: "@nestjs/apollo@npm:12.0.11" dependencies: "@apollo/server-plugin-landing-page-graphql-playground": "npm:4.0.0" iterall: "npm:1.3.0" @@ -7356,13 +7921,13 @@ __metadata: optional: true "@as-integrations/fastify": optional: true - checksum: 566fa8f54fdea4f6e1b18c476c48b8020779cda31d8c52ad7114bd842ca8308fa3d5dd2f98339d0f9a2f21b583354662fe8a6207b11aa7a24a0c6e3b0dc54251 + checksum: 0994f2d12b31cdcd8ce558d4d16dfd2ca0aca6ea524dc512a577c193dee0e6a60517e2aea5072d4525611ebda205311e9a43fc42438b594d6841a1b08d9c1722 languageName: node linkType: hard -"@nestjs/common@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/common@npm:10.2.7" +"@nestjs/common@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/common@npm:10.2.10" dependencies: iterare: "npm:1.2.1" tslib: "npm:2.6.2" @@ -7377,13 +7942,13 @@ __metadata: optional: true class-validator: optional: true - checksum: 0d1a1ddeeb97493eb71e49fa2db8f312b90434627e60e92f86fcd144100ec81901a0649bcd5558604455436ca60288405f2699825e57702b65d0057aa4f5ad4e + checksum: d2db41c86b7197e5a21ee8c3eac0a50ed419b0139a9d31542877cd05188024d55e53edad52fd33c933683063265d4c2acc6c158481d5b8ab22ed182350f91a96 languageName: node linkType: hard -"@nestjs/core@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/core@npm:10.2.7" +"@nestjs/core@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/core@npm:10.2.10" dependencies: "@nuxtjs/opencollective": "npm:0.3.2" fast-safe-stringify: "npm:2.1.1" @@ -7405,41 +7970,41 @@ __metadata: optional: true "@nestjs/websockets": optional: true - checksum: 4e6a5096a7dc3c4e63e210f857eb1d103d53d48406728a7bfb7d097a343a60b3b200e761493133eab9475150a0d99c06b89bc7ae95346b15b23bb2630dea69a4 + checksum: d01d4e1de5b0865288eb56d4f5044f43006f5736a60eceff544cee41cca53e08f251b87a5a1006ce857b79d377fe6b7d9ef3ab7785ef482f6832a9d356963968 languageName: node linkType: hard -"@nestjs/event-emitter@npm:^2.0.2": - version: 2.0.2 - resolution: "@nestjs/event-emitter@npm:2.0.2" +"@nestjs/event-emitter@npm:^2.0.3": + version: 2.0.3 + resolution: "@nestjs/event-emitter@npm:2.0.3" dependencies: eventemitter2: "npm:6.4.9" peerDependencies: "@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 "@nestjs/core": ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 - checksum: 9c7d2645b14bef5a9d26a8fbafb5963e18c9c15e267980c55abd913c8af9215ae363b8c0fc78711c22126e0a973f80aec8b8e962a64e699f523128d11c033894 + checksum: a37910ef59ea417c3826906e94acaa039c017092950e9dfb361029df51e018feaacb97c15da77c34c853ab40eff3267317137c0a0190b5f023ffd5cd3c128738 languageName: node linkType: hard -"@nestjs/graphql@npm:^12.0.9": - version: 12.0.9 - resolution: "@nestjs/graphql@npm:12.0.9" +"@nestjs/graphql@npm:^12.0.11": + version: 12.0.11 + resolution: "@nestjs/graphql@npm:12.0.11" dependencies: "@graphql-tools/merge": "npm:9.0.0" "@graphql-tools/schema": "npm:10.0.0" - "@graphql-tools/utils": "npm:10.0.6" + "@graphql-tools/utils": "npm:10.0.8" "@nestjs/mapped-types": "npm:2.0.2" chokidar: "npm:3.5.3" - fast-glob: "npm:3.3.1" + fast-glob: "npm:3.3.2" graphql-tag: "npm:2.12.6" - graphql-ws: "npm:5.14.0" + graphql-ws: "npm:5.14.2" lodash: "npm:4.17.21" normalize-path: "npm:3.0.0" subscriptions-transport-ws: "npm:0.11.0" tslib: "npm:2.6.2" - uuid: "npm:9.0.0" - ws: "npm:8.13.0" + uuid: "npm:9.0.1" + ws: "npm:8.14.2" peerDependencies: "@apollo/subgraph": ^2.0.0 "@nestjs/common": ^9.3.8 || ^10.0.0 @@ -7448,7 +8013,7 @@ __metadata: class-validator: "*" graphql: ^16.6.0 reflect-metadata: ^0.1.13 - ts-morph: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + ts-morph: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 peerDependenciesMeta: "@apollo/subgraph": optional: true @@ -7458,7 +8023,7 @@ __metadata: optional: true ts-morph: optional: true - checksum: 51991f5b0ac15aa45587b189e469eeda8d8705a7a7f38934c9a97fa15b2b6b0552a635c97b9514d0b79f392a97b3d725a0f7f75361262c89ef720ea18cbc0d88 + checksum: b71a87c7977eec2df8e188812d7906887fb982992670da6786aa23a46b0d6a861533f982edbda601c2b30d8609ec6cf6e135a7c9411f4e91d006e8ded4081354 languageName: node linkType: hard @@ -7479,9 +8044,9 @@ __metadata: languageName: node linkType: hard -"@nestjs/platform-express@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/platform-express@npm:10.2.7" +"@nestjs/platform-express@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/platform-express@npm:10.2.10" dependencies: body-parser: "npm:1.20.2" cors: "npm:2.8.5" @@ -7491,13 +8056,13 @@ __metadata: peerDependencies: "@nestjs/common": ^10.0.0 "@nestjs/core": ^10.0.0 - checksum: f72970fb8552d215a924d73af6854d0ca73f48bc82f93357aa10562b8c1773fd2ebefe29df02563a6cfc2b4c41facede6ced9ab9319f3e89057f63ec05b3d126 + checksum: 4dab3986ce783c4aff8dfb8ac4de02860bcc7f214cb916d3dccafcf2db7752cb82c9bf9d6c28ba19ae68de5ab4179af18036ca35769b10a5d53dd8f0d1cc34ab languageName: node linkType: hard -"@nestjs/platform-socket.io@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/platform-socket.io@npm:10.2.7" +"@nestjs/platform-socket.io@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/platform-socket.io@npm:10.2.10" dependencies: socket.io: "npm:4.7.2" tslib: "npm:2.6.2" @@ -7505,13 +8070,27 @@ __metadata: "@nestjs/common": ^10.0.0 "@nestjs/websockets": ^10.0.0 rxjs: ^7.1.0 - checksum: 3b0c1fd95f5b8b685a2e32e78c826aba264458c75b167d4dfebf0dbe7aaa608a17418b04c69ddb4a436e1ff64943b41518dcec25490b065910115a2084cde80f + checksum: 09194e87487dfa54bdf921e0a1b3a19b377b5337ba49ded44e5110844d493b53a082ecc2bef82c3518473d9ecd9c0f04e095afb6782a48426f59864dc035b25b languageName: node linkType: hard -"@nestjs/testing@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/testing@npm:10.2.7" +"@nestjs/schedule@npm:^4.0.0": + version: 4.0.0 + resolution: "@nestjs/schedule@npm:4.0.0" + dependencies: + cron: "npm:3.1.3" + uuid: "npm:9.0.1" + peerDependencies: + "@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 + "@nestjs/core": ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.12 + checksum: 85598ef37e80b6dd511ae12a5ad9016ef223b4d1e3a5369d9226cc7449c9b1991049ad79b6cc76615da9f15f87de078200344a7afacf8d8fd0af05ea529cca11 + languageName: node + linkType: hard + +"@nestjs/testing@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/testing@npm:10.2.10" dependencies: tslib: "npm:2.6.2" peerDependencies: @@ -7524,26 +8103,26 @@ __metadata: optional: true "@nestjs/platform-express": optional: true - checksum: eb19d33f0f36d2dcb478dff4824b13c77af66612d9e8d4c93b5e19e7a875bc93cdf7715c5592ca8ba14246580d8f68423a0a4d65f0fd50b9f3185a822081efe5 + checksum: 9e3d6050f385cfdd14d6742a7175a9affb6a4646ee73f2d27e404d48168c8473e9900958095fb05b0389c4bdf50aaba014676c45d5e145265b5755cc7cb1c0e3 languageName: node linkType: hard -"@nestjs/throttler@npm:^5.0.0": - version: 5.0.0 - resolution: "@nestjs/throttler@npm:5.0.0" +"@nestjs/throttler@npm:^5.0.1": + version: 5.0.1 + resolution: "@nestjs/throttler@npm:5.0.1" dependencies: md5: "npm:^2.2.1" peerDependencies: "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 "@nestjs/core": ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.13 - checksum: 12b6683b15b789b124fd6e2b50d27d2445358c47bcb9ac540adf4b2862b54492a11e1bc1a5771bf8b7e8a4a3c8f672ad99f581e83f9f28c83a6bd06833fcb876 + checksum: 9f8bbc5799eadd1107c2ee71287e23f69c293c77ccd960b508ede57d9d1f5f6601e96bc0f4fc1e72f6c6ef48d2aaebc789932546896c704c1896ac01358efcf4 languageName: node linkType: hard -"@nestjs/websockets@npm:^10.2.7": - version: 10.2.7 - resolution: "@nestjs/websockets@npm:10.2.7" +"@nestjs/websockets@npm:^10.2.10": + version: 10.2.10 + resolution: "@nestjs/websockets@npm:10.2.10" dependencies: iterare: "npm:1.2.1" object-hash: "npm:3.0.0" @@ -7557,7 +8136,7 @@ __metadata: peerDependenciesMeta: "@nestjs/platform-socket.io": optional: true - checksum: 4667bcc38e297743e8994dd3fceb2094cfe8426899ff67bfc3044c810b5ff0f62b91ae58ae13ae43ad4cdef73e6fe118a62362bdc2743c1145d9977ae84b8d06 + checksum: f0304df8df39245d98b0da3ec039691f2a08aa6b1db1025c7436539c069ed661157b75b2d3d14c9c16e0d1ae5018aa750d85f88932ff96d3a9a581d4ca45361b languageName: node linkType: hard @@ -8002,6 +8581,36 @@ __metadata: languageName: node linkType: hard +"@nolyfill/shared@npm:1.0.24": + version: 1.0.24 + resolution: "@nolyfill/shared@npm:1.0.24" + checksum: d945b67a65ab31299a5ff54fe21d68d4b55973b23421d035185c70fd27278e56debf1531657b6106146034023a5af29fef72e9f8ae744b8673fa695f7e5db0c4 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 822ea077553cd9cfc5cbd6d92380b0950fcb054a7027cd1b63a33bd0cbb16b0c6626ea75d95ec0e804643c8904472d3361d2da8c2444b1fb02a9b525d9c07c41 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": "npm:^1.1.3" + semver: "npm:^7.3.5" + checksum: c5d4dfee80de2236e1e4ed595d17e217aada72ebd8215183fc46096fa010f583dd2aaaa486758de7cc0b89440dbc31cfe8b276269d75d47af35c716e896f78ec + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.0 resolution: "@npmcli/fs@npm:3.1.0" @@ -8011,21 +8620,31 @@ __metadata: languageName: node linkType: hard -"@nrwl/devkit@npm:16.10.0": - version: 16.10.0 - resolution: "@nrwl/devkit@npm:16.10.0" +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" dependencies: - "@nx/devkit": "npm:16.10.0" - checksum: 2727b9927f8a7f3561c5eae72d3ca91d3ff0ea7c47da1d096d1654c85763acd580bbabb182db9e6f4f5df93152ae0972a0df7393f2dbad9d17b68549af313769 + mkdirp: "npm:^1.0.4" + rimraf: "npm:^3.0.2" + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 languageName: node linkType: hard -"@nrwl/js@npm:16.10.0": - version: 16.10.0 - resolution: "@nrwl/js@npm:16.10.0" +"@nrwl/devkit@npm:17.1.3": + version: 17.1.3 + resolution: "@nrwl/devkit@npm:17.1.3" dependencies: - "@nx/js": "npm:16.10.0" - checksum: 0ac5dd1eb8d342979f5f494fb555e0ca44ef571177fd48b4565f0e212c706daa83aa8d4d2547d5631477444be982f819973547cb6c1fe2736f3a6176a6a7e94e + "@nx/devkit": "npm:17.1.3" + checksum: a70d95b980206b0e24ba129037d66379c5e261263223cc024471453744a9e40c86de2717874fde1f0fbf12354dd89f2904db00c289bbd1ef059780d954d5f67c + languageName: node + linkType: hard + +"@nrwl/js@npm:17.1.3": + version: 17.1.3 + resolution: "@nrwl/js@npm:17.1.3" + dependencies: + "@nx/js": "npm:17.1.3" + checksum: bf456cf0442ed425a7ace59f1fc4d6d21382e45f8b9a6a6aed0e90d575cb4c269a3fd21dd2f6b03b459a0973dec43c66fe004109828e7107f931b01e9473ae93 languageName: node linkType: hard @@ -8038,33 +8657,33 @@ __metadata: languageName: node linkType: hard -"@nrwl/tao@npm:16.10.0": - version: 16.10.0 - resolution: "@nrwl/tao@npm:16.10.0" +"@nrwl/tao@npm:17.1.3": + version: 17.1.3 + resolution: "@nrwl/tao@npm:17.1.3" dependencies: - nx: "npm:16.10.0" + nx: "npm:17.1.3" tslib: "npm:^2.3.0" bin: tao: index.js - checksum: df495b60f98112ffbeb19ae3d9385ecc18b3b9a2dbde1c50a91d5111408afba218c32ba55e6a3adf7c935262f4c18417672712e14185de2ec61beb5ef23186dc + checksum: 2f51db66bb8d4d141f8eee73dd8caf1f3ab6f5d5123af0b7eea4a2b935aa196e6063d8de278e63bf82a9fc81d24da65893b6ea4f31d8024d609d1f2f62c5643e languageName: node linkType: hard -"@nrwl/vite@npm:16.10.0": - version: 16.10.0 - resolution: "@nrwl/vite@npm:16.10.0" +"@nrwl/vite@npm:17.1.3": + version: 17.1.3 + resolution: "@nrwl/vite@npm:17.1.3" dependencies: - "@nx/vite": "npm:16.10.0" - checksum: da06ca69a4018e0966b36a7b37012692476b5c4f727abd0b1eefae110bdd6389a9997200ba25256137c2d44b75a117eafd1dc1c6abdf5a627be533491f12f661 + "@nx/vite": "npm:17.1.3" + checksum: 8473593ef8280e11d57e9a46b098267119db90211a9342bf6053bfda51a6326cf22b0dbd206cce32b8f776ce52ae1c8bd288db909a64902d1b9a0eca81f89248 languageName: node linkType: hard -"@nrwl/workspace@npm:16.10.0": - version: 16.10.0 - resolution: "@nrwl/workspace@npm:16.10.0" +"@nrwl/workspace@npm:17.1.3": + version: 17.1.3 + resolution: "@nrwl/workspace@npm:17.1.3" dependencies: - "@nx/workspace": "npm:16.10.0" - checksum: 7e6b4ad32cb9e1585c5b74b6c8f58bd7c1b18eb167faf1d5ec620814a2869b4154999f29d4d1d3c091807b02242d0fe6b895c1ccce0b49d22cc8deab8c86d490 + "@nx/workspace": "npm:17.1.3" + checksum: 837c4c1d5785d1986ae9cbb011fe0a9a4b64081fea545326f4ff27641e7c23de65b889566be1b6825b696ba1fc463be3d91f23b661812fcde493a7a238faa487 languageName: node linkType: hard @@ -8081,11 +8700,11 @@ __metadata: languageName: node linkType: hard -"@nx/devkit@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/devkit@npm:16.10.0" +"@nx/devkit@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/devkit@npm:17.1.3" dependencies: - "@nrwl/devkit": "npm:16.10.0" + "@nrwl/devkit": "npm:17.1.3" ejs: "npm:^3.1.7" enquirer: "npm:~2.3.6" ignore: "npm:^5.0.4" @@ -8093,25 +8712,25 @@ __metadata: tmp: "npm:~0.2.1" tslib: "npm:^2.3.0" peerDependencies: - nx: ">= 15 <= 17" - checksum: d703e74d8360395dcafdc531e81c25ac6bbe46142169a5185f841067336b7dadce7f2102cfc2ef1c1826e3f9b92ca5b740a62ca4c32064265494dcd5a359ee21 + nx: ">= 16 <= 18" + checksum: 77363232e0690d7fb11ece04e551fcb4d6182d71f5c4f9f48b8572c85443d32cb8738a6a9c4130d3118ffdf03b394d3948e274a905eb50746fc92cd8662fb4d0 languageName: node linkType: hard -"@nx/js@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/js@npm:16.10.0" +"@nx/js@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/js@npm:17.1.3" dependencies: "@babel/core": "npm:^7.22.9" - "@babel/plugin-proposal-class-properties": "npm:^7.18.6" "@babel/plugin-proposal-decorators": "npm:^7.22.7" + "@babel/plugin-transform-class-properties": "npm:^7.22.5" "@babel/plugin-transform-runtime": "npm:^7.22.9" "@babel/preset-env": "npm:^7.22.9" "@babel/preset-typescript": "npm:^7.22.5" "@babel/runtime": "npm:^7.22.6" - "@nrwl/js": "npm:16.10.0" - "@nx/devkit": "npm:16.10.0" - "@nx/workspace": "npm:16.10.0" + "@nrwl/js": "npm:17.1.3" + "@nx/devkit": "npm:17.1.3" + "@nx/workspace": "npm:17.1.3" "@phenomnomnominal/tsquery": "npm:~5.0.1" babel-plugin-const-enum: "npm:^1.0.1" babel-plugin-macros: "npm:^2.8.0" @@ -8137,87 +8756,87 @@ __metadata: peerDependenciesMeta: verdaccio: optional: true - checksum: b2c1831261afd4e5e2c76e498bc2858f8b01708ff4da7edf4ea6e5237b291b17bdc696abbeae048956bcb3db0f33fb302655e1866075a2bb94b6a71745d70252 + checksum: e7ce896ff768673ca65017ea4779ed5441d343478b1fb18f6b570b0f0a1615216d4f7601a439d860c93226a5ad53761f39f3f6122fa56b89cd3d6a544973c478 languageName: node linkType: hard -"@nx/nx-darwin-arm64@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-darwin-arm64@npm:16.10.0" +"@nx/nx-darwin-arm64@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-darwin-arm64@npm:17.1.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@nx/nx-darwin-x64@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-darwin-x64@npm:16.10.0" +"@nx/nx-darwin-x64@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-darwin-x64@npm:17.1.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@nx/nx-freebsd-x64@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-freebsd-x64@npm:16.10.0" +"@nx/nx-freebsd-x64@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-freebsd-x64@npm:17.1.3" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@nx/nx-linux-arm-gnueabihf@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.10.0" +"@nx/nx-linux-arm-gnueabihf@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:17.1.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@nx/nx-linux-arm64-gnu@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-linux-arm64-gnu@npm:16.10.0" +"@nx/nx-linux-arm64-gnu@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-linux-arm64-gnu@npm:17.1.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-arm64-musl@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-linux-arm64-musl@npm:16.10.0" +"@nx/nx-linux-arm64-musl@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-linux-arm64-musl@npm:17.1.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@nx/nx-linux-x64-gnu@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-linux-x64-gnu@npm:16.10.0" +"@nx/nx-linux-x64-gnu@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-linux-x64-gnu@npm:17.1.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-x64-musl@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-linux-x64-musl@npm:16.10.0" +"@nx/nx-linux-x64-musl@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-linux-x64-musl@npm:17.1.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@nx/nx-win32-arm64-msvc@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-win32-arm64-msvc@npm:16.10.0" +"@nx/nx-win32-arm64-msvc@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-win32-arm64-msvc@npm:17.1.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@nx/nx-win32-x64-msvc@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/nx-win32-x64-msvc@npm:16.10.0" +"@nx/nx-win32-x64-msvc@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/nx-win32-x64-msvc@npm:17.1.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@nx/vite@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/vite@npm:16.10.0" +"@nx/vite@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/vite@npm:17.1.3" dependencies: - "@nrwl/vite": "npm:16.10.0" - "@nx/devkit": "npm:16.10.0" - "@nx/js": "npm:16.10.0" + "@nrwl/vite": "npm:17.1.3" + "@nx/devkit": "npm:17.1.3" + "@nx/js": "npm:17.1.3" "@phenomnomnominal/tsquery": "npm:~5.0.1" "@swc/helpers": "npm:~0.5.0" enquirer: "npm:~2.3.6" @@ -8225,222 +8844,223 @@ __metadata: peerDependencies: vite: ^4.3.4 vitest: ">=0.31.0 <1.0.0" - checksum: e1a491d5ea36483c03ac48c5f4b92b679349e3d18f84bf83b1cde1aa6d8ac40054436538f4de56bdc8b4fee6805f2b05489b3fed9c21eca07caf787a689718e6 + checksum: 7f15fc9c021876e68cc21c89be32b5218caa8f3a31263d297fe20a86cca462eca2d5c9a2c9e5f454ebe8e16786697cc9f530bbed23e134a8496b707ec33de783 languageName: node linkType: hard -"@nx/workspace@npm:16.10.0": - version: 16.10.0 - resolution: "@nx/workspace@npm:16.10.0" +"@nx/workspace@npm:17.1.3": + version: 17.1.3 + resolution: "@nx/workspace@npm:17.1.3" dependencies: - "@nrwl/workspace": "npm:16.10.0" - "@nx/devkit": "npm:16.10.0" + "@nrwl/workspace": "npm:17.1.3" + "@nx/devkit": "npm:17.1.3" chalk: "npm:^4.1.0" enquirer: "npm:~2.3.6" - ignore: "npm:^5.0.4" - nx: "npm:16.10.0" - rxjs: "npm:^7.8.0" + nx: "npm:17.1.3" tslib: "npm:^2.3.0" yargs-parser: "npm:21.1.1" - checksum: a5c097d8fee62f112a17cab65c9f3b8a8a0b21509ca75052d3e7f95b6a873500d2d073b962adec652919c5f6e20493c56a012846bfe9e529abea711dc604da4b + checksum: 2670ae0636cab77beeb0a285e3495b7cd7a8e395b23b555d1e0ffdb59ed91c159fadf36915559e50fb7d064b7a4b87c04e937549ea4b024f05075760d9b09bcf languageName: node linkType: hard -"@open-draft/until@npm:^1.0.3": - version: 1.0.3 - resolution: "@open-draft/until@npm:1.0.3" - checksum: 323e92ebef0150ed0f8caedc7d219b68cdc50784fa4eba0377eef93533d3f46514eb2400ced83dda8c51bddc3d2c7b8e9cf95e5ec85ab7f62dfc015d174f62f2 +"@open-draft/deferred-promise@npm:^2.2.0": + version: 2.2.0 + resolution: "@open-draft/deferred-promise@npm:2.2.0" + checksum: bc3bb1668a555bb87b33383cafcf207d9561e17d2ca0d9e61b7ce88e82b66e36a333d3676c1d39eb5848022c03c8145331fcdc828ba297f88cb1de9c5cef6c19 languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/api-logs@npm:0.44.0" +"@open-draft/logger@npm:^0.3.0": + version: 0.3.0 + resolution: "@open-draft/logger@npm:0.3.0" + dependencies: + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.0" + checksum: 7a280f170bcd4e91d3eedbefe628efd10c3bd06dd2461d06a7fdbced89ef457a38785847f88cc630fb4fd7dfa176d6f77aed17e5a9b08000baff647433b5ff78 + languageName: node + linkType: hard + +"@open-draft/until@npm:^2.0.0, @open-draft/until@npm:^2.1.0": + version: 2.1.0 + resolution: "@open-draft/until@npm:2.1.0" + checksum: 622be42950afc8e89715d0fd6d56cbdcd13e36625e23b174bd3d9f06f80e25f9adf75d6698af93bca1e1bf465b9ce00ec05214a12189b671fb9da0f58215b6f4 + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/api-logs@npm:0.45.1" dependencies: "@opentelemetry/api": "npm:^1.0.0" - checksum: 58fb110a4b4ad9700dbd9f4bcb96c9a8685da5e2eb94c8e6a117ed0afeee4cb5d0bd1538f14fad43e63b27ea1862df64aae9a3e6af3080886e06ed57f8291d90 + checksum: 0f78a131d640a09f2a4c837014378f6b5f6db1e32d90a70a7f4c5191dc2f767330887fc16126d7ae788b122e828e4f3b1aec09be284f633a151d6a319e03e2a4 languageName: node linkType: hard -"@opentelemetry/api@npm:1.6.0, @opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.6.0": - version: 1.6.0 - resolution: "@opentelemetry/api@npm:1.6.0" - checksum: b8daefad2c862ed4e1e6b50df8946f08339a27aa83ac3b081bd4ed92e9ae2c365ecfc200f936ce08a1278b9a3c4103b5f33c2c19a495f68e245f727bba41af75 +"@opentelemetry/api@npm:1.7.0, @opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.7.0": + version: 1.7.0 + resolution: "@opentelemetry/api@npm:1.7.0" + checksum: bcf7afa7051dcd4583898a68f8a57fb4c85b5cedddf7b6eb3616595c0b3bcd7f5448143b8355b00935a755de004d6285489f8e132f34127efe7b1be404622a3e languageName: node linkType: hard -"@opentelemetry/context-async-hooks@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/context-async-hooks@npm:1.17.1" +"@opentelemetry/context-async-hooks@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/context-async-hooks@npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: c0e77552551d9e179adb2eea4a8e5ac16a8e0564992790fb57382e70e23f4e6c7f1f0d46f5a626cc4f847ee53b7af07e46828cb28f22c0edf7faa71fd156ca36 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: d83dbb8773fbfb12834f9c8885d16d7bcbe7020e37c22476ac34b8312ec797da49a1afb3bf7429b74c559d938a187ed52cf35a94b81f2c8074f5d54d0026af53 languageName: node linkType: hard -"@opentelemetry/core@npm:1.17.0": - version: 1.17.0 - resolution: "@opentelemetry/core@npm:1.17.0" +"@opentelemetry/core@npm:1.18.0": + version: 1.18.0 + resolution: "@opentelemetry/core@npm:1.18.0" dependencies: - "@opentelemetry/semantic-conventions": "npm:1.17.0" + "@opentelemetry/semantic-conventions": "npm:1.18.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: 809b4754faad1f51b352834a791299e73443c28a30821757233388d812aa2df9a61bd61254a9e580207e501b1be511c178e0414e5de5e2428ee559dc329ebb03 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: 0e9d19ef3508552f8798f031c4175fa1a046f284814a1fd56c0ae77cecf555884c84cf05b99906e8835b8b658260a00c5c332267d88a33bc6a7a162bf941a65c languageName: node linkType: hard -"@opentelemetry/core@npm:1.17.1, @opentelemetry/core@npm:^1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/core@npm:1.17.1" +"@opentelemetry/core@npm:1.18.1, @opentelemetry/core@npm:^1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/core@npm:1.18.1" dependencies: - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: c0be1257b7c7fce2f66d75aae15b7d20a5a6d73f1285ccf92704b6912f26f6c5133e67933ee8ee3d313cf26857b7f5a33facabc4352169bb93f9b2c06ed668b2 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: b8c08c40d07d8b2afefc3c97ea83d8e8dc2e5e5a139007ba7fc4cc25fc38b6fe0d1380d4bdaf390381f114dbfbed5b3c45a395972cf25a1a174c8e5b0bd830fb languageName: node linkType: hard -"@opentelemetry/exporter-jaeger@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/exporter-jaeger@npm:1.17.1" - dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" - "@opentelemetry/semantic-conventions": "npm:1.17.1" - jaeger-client: "npm:^3.15.0" - peerDependencies: - "@opentelemetry/api": ^1.0.0 - checksum: 0f24736c70f922b5c25b47be4019b06e1edd105ade572594d02f95d693e71537d1c6188c35fae40c65680cc4e967c1bfd978748f42f0e27e5fea34d265f709de - languageName: node - linkType: hard - -"@opentelemetry/exporter-trace-otlp-grpc@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.44.0" +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.45.1" dependencies: "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.44.0" - "@opentelemetry/otlp-transformer": "npm:0.44.0" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/otlp-grpc-exporter-base": "npm:0.45.1" + "@opentelemetry/otlp-transformer": "npm:0.45.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: c2957ecfc2f97009311b7ed5b9f9d30a63135a6ab7175c7b90ea160143f20e1b3a24f2e13ce66d7b73ec4717c3b5c420361e7485870c06fed708423515d939f4 + checksum: 68445d912683152f81a13169938be63c12be6ff51e7a0a85466faffb496cd09b15ea5d7ffa914182e31c02d3136c46bdebd17a4c4e3f95bf882e1aff710053e3 languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-http@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.44.0" +"@opentelemetry/exporter-trace-otlp-http@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/otlp-exporter-base": "npm:0.44.0" - "@opentelemetry/otlp-transformer": "npm:0.44.0" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/otlp-exporter-base": "npm:0.45.1" + "@opentelemetry/otlp-transformer": "npm:0.45.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 9b451a49bf13b6ff2e7d382cb95d0c0a14d71df4fc77b2c366c00c5fb5b371e1fb8cbeaa79b29ffec0eb32d6f00581d305b4250cf2db823a9c1aa60dd8c11954 + checksum: 69a5ca9760ff78cb8b39ed9792f0fc55ef45a695c304ae5ed21b5aab18bc1719e25a4ad90a3e02e765b00fd846b8af96450d5ad7648420644aafed9ccec2db90 languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-proto@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.44.0" +"@opentelemetry/exporter-trace-otlp-proto@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/otlp-exporter-base": "npm:0.44.0" - "@opentelemetry/otlp-proto-exporter-base": "npm:0.44.0" - "@opentelemetry/otlp-transformer": "npm:0.44.0" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/otlp-exporter-base": "npm:0.45.1" + "@opentelemetry/otlp-proto-exporter-base": "npm:0.45.1" + "@opentelemetry/otlp-transformer": "npm:0.45.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 19c869d8d9ad09ac2bddba5bac1364b5a4217302c7beeea894fc8269905b18824992e969b3deb0e554a53fb370254bf60eada76644f359874484d90be6cf4776 + checksum: 93540064df2326f2a1daba075c1664915110b86522eb2094b1fb476912877a143615fbf8bf19ba1b785ac1030e637433151bbdb82c59f55fc74ffa8208e07f8b languageName: node linkType: hard -"@opentelemetry/exporter-zipkin@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/exporter-zipkin@npm:1.17.1" +"@opentelemetry/exporter-zipkin@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/exporter-zipkin@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: a3978ff372d68486d519b9d543610623aa8c9b07561894c5b0147ba1c72377a16e4f64d78c78f5fb0f0512fb18fdeae2aac384d0393929f3a4ec8aee80af9f04 + checksum: 67b51b17e51a227528fcdbeceb5a594c2c73ddd280aac7c9f5efe0acfb8508696dedd7adc0db65352addc9095e4c1adc9cb86472fd9003435ae3fa88b9a9cca8 languageName: node linkType: hard -"@opentelemetry/instrumentation-graphql@npm:^0.35.2": - version: 0.35.2 - resolution: "@opentelemetry/instrumentation-graphql@npm:0.35.2" +"@opentelemetry/instrumentation-graphql@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.36.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.44.0" + "@opentelemetry/instrumentation": "npm:^0.45.1" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: a5786d3309f51f2ca3e731d135077a6f8915894f02231eeb18299d5a9866ddb17a8102ab02ee23ab64b2d1026fdd5487b1f29926ccd541cd79c8d68c06581416 + checksum: 2409f17de65eb053b99ad820c2d26e23e771035351c8b3fda887c9a301cfe768a54a3fe624e96aa07719ae92527f4009faeb68d261a2b296ad9e3c7459952c0d languageName: node linkType: hard -"@opentelemetry/instrumentation-http@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation-http@npm:0.44.0" +"@opentelemetry/instrumentation-http@npm:^0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/instrumentation-http@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/instrumentation": "npm:0.44.0" - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/instrumentation": "npm:0.45.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" semver: "npm:^7.5.2" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: be8dd2dadab0f84090fca5fffc0a5b137f90db56f7a4df05a8d52528c2a2b17f3d5bdb900826659cafde1034b3c6b348c60bf87976bc8f35d5a26af638013f90 + checksum: b7c8522ab43084d4aef47cfc48ced15837b8b0b1cdecb0ac8d33537f510221eb258bc6b8d4d2b7371230ac4295c3491433b66308d1b9a0fbce0027ee67a511a4 languageName: node linkType: hard -"@opentelemetry/instrumentation-ioredis@npm:^0.35.2": - version: 0.35.2 - resolution: "@opentelemetry/instrumentation-ioredis@npm:0.35.2" +"@opentelemetry/instrumentation-ioredis@npm:^0.35.3": + version: 0.35.3 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.35.3" dependencies: - "@opentelemetry/instrumentation": "npm:^0.44.0" + "@opentelemetry/instrumentation": "npm:^0.45.1" "@opentelemetry/redis-common": "npm:^0.36.1" "@opentelemetry/semantic-conventions": "npm:^1.0.0" "@types/ioredis4": "npm:@types/ioredis@^4.28.10" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 5f7f0400c1518cffc235a50963fd1749ed8bbc85f6f5b0b5b7029db72761443d8a1ae7177355e6da38a9a3e116a06b3b4ce0dc43ae6c0edf66097cbc0bee9e00 + checksum: 25cb843ef0315751cae577fa6cf275d0eaae1d7bffa2c723e25ad140e9a505cfef0297db12069b5ed685e6907392e3b048c016691e48a9c49a66001ff16cd9b8 languageName: node linkType: hard -"@opentelemetry/instrumentation-nestjs-core@npm:^0.33.2": - version: 0.33.2 - resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.33.2" +"@opentelemetry/instrumentation-nestjs-core@npm:^0.33.3": + version: 0.33.3 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.33.3" dependencies: - "@opentelemetry/instrumentation": "npm:^0.44.0" + "@opentelemetry/instrumentation": "npm:^0.45.1" "@opentelemetry/semantic-conventions": "npm:^1.0.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 54d09efe39b931dd7099debe9f37f55922cfd52c20f64a07dd71e7078c4901d4b7a7fbc60b06d7714d9c74af22f8c4e306e128ff6eeff5cf6f7e731cae8e1a7e + checksum: 7446072437dcdcfcbef233c9ed63e5c6fe0bfc42a84b148d45b65a51efff17518e851089f8b48fbfe67be741628fcf6d33e0492b7321c6c48c7c6f3eed10cfa4 languageName: node linkType: hard -"@opentelemetry/instrumentation-socket.io@npm:^0.34.2": - version: 0.34.2 - resolution: "@opentelemetry/instrumentation-socket.io@npm:0.34.2" +"@opentelemetry/instrumentation-socket.io@npm:^0.34.3": + version: 0.34.4 + resolution: "@opentelemetry/instrumentation-socket.io@npm:0.34.4" dependencies: - "@opentelemetry/instrumentation": "npm:^0.44.0" + "@opentelemetry/instrumentation": "npm:^0.45.1" "@opentelemetry/semantic-conventions": "npm:^1.0.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: a101999aab58652b2e6909756b2e3711715aeba7574f9135c59f9a4bc52b4cc538c304651c4ecba7b5f1a18743432c748ad3b4eb5f3c111ad64b9f3c2bcd6b6b + checksum: 7b2555c84490d19eae8bd6b885f3fd23681715c4f10b8e7291cf12c2d1025ffbcd787717bfaceff73c6d59f6de6fa583fcbc580cc6a37d746044570b0079cf25 languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.43.0": - version: 0.43.0 - resolution: "@opentelemetry/instrumentation@npm:0.43.0" +"@opentelemetry/instrumentation@npm:0.45.0": + version: 0.45.0 + resolution: "@opentelemetry/instrumentation@npm:0.45.0" dependencies: "@types/shimmer": "npm:^1.0.2" import-in-the-middle: "npm:1.4.2" @@ -8449,13 +9069,13 @@ __metadata: shimmer: "npm:^1.2.1" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 776d566dc42154b9161797d7489c5e3697abe761537a103fd19d9e2221931076fbbe9c6ddd16696fa39c16feae2e75deedc2d3ed75d82abc0506ef1299557992 + checksum: 488289d26ff6a65968d85d20071e762ee0df3a36f0d82823f10c3e0505b5988b32a2bab71b22d6d5a04f5ce7f108beaa6ed4459e782ce78a0ceca5667d9df900 languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.44.0, @opentelemetry/instrumentation@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/instrumentation@npm:0.44.0" +"@opentelemetry/instrumentation@npm:0.45.1, @opentelemetry/instrumentation@npm:^0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/instrumentation@npm:0.45.1" dependencies: "@types/shimmer": "npm:^1.0.2" import-in-the-middle: "npm:1.4.2" @@ -8464,83 +9084,83 @@ __metadata: shimmer: "npm:^1.2.1" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 05bbbbfc56acc295909955789daca07a22a62c436f2bd54c40f8749584254e1b6d1f1f886a043e5a4579827c6feea483a768a8e9d8cc8f3d0706a3cb6fd2ab21 + checksum: 8a2178eae72758d21fce22355aba8fce6e7e24680d5b179383edefc787c654fbe8416777b21baa661fbcb155eeeefa940b53bc36c4392b1bde11f3b01dbfdfa2 languageName: node linkType: hard -"@opentelemetry/otlp-exporter-base@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/otlp-exporter-base@npm:0.44.0" +"@opentelemetry/otlp-exporter-base@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 4967a6157b48412ed56488fd019f43135f94592f9be88a13fac606567983ba61ae2bf345ae0395ab068552b7b65d761c7d32bdc6323c1d05362eb9e015f6dbb6 + checksum: 472225c69667feb5cc38de9b7ece4ce5bb197d520c6935aae238007936855cd6aee225f8d482d7aac5945d2ea6718c8beefdaacf1eed55cf467bb3c66b3f0f17 languageName: node linkType: hard -"@opentelemetry/otlp-grpc-exporter-base@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.44.0" +"@opentelemetry/otlp-grpc-exporter-base@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.45.1" dependencies: "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/otlp-exporter-base": "npm:0.44.0" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/otlp-exporter-base": "npm:0.45.1" protobufjs: "npm:^7.2.3" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: d276aa06bd5ab00203b4cfe976079d5380913e7337e5e8df1337ab2d88f7c11b180f7e4ec66575805439bf52da3732780134560ea656f38e10bf89601f9110c4 + checksum: 8d3106c64ceef849258c676dc9b8e5738eb39241e237405d2db47b7b9a2beb1d544a78b524119e4c8b3614c2abd6c96a0999a33d1beb20a601b79857a3c80a33 languageName: node linkType: hard -"@opentelemetry/otlp-proto-exporter-base@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.44.0" +"@opentelemetry/otlp-proto-exporter-base@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/otlp-exporter-base": "npm:0.44.0" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/otlp-exporter-base": "npm:0.45.1" protobufjs: "npm:^7.2.3" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: c661d785865d32351b3c8205eaf21ae619129a03ab7470ede885d5e3155dfae3f8cec4a3613d090e1c3182440d84d34361688f843294d62420f8735e2dbad07a + checksum: b189b041e58ca519cc67c3f43ea02eddf7205240d340ec680514b5faa9c18695ef38f6827d58dab886ffdf6e19fd3f331814ceaddb3ae15c996187ff44ed8086 languageName: node linkType: hard -"@opentelemetry/otlp-transformer@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/otlp-transformer@npm:0.44.0" +"@opentelemetry/otlp-transformer@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/otlp-transformer@npm:0.45.1" dependencies: - "@opentelemetry/api-logs": "npm:0.44.0" - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-logs": "npm:0.44.0" - "@opentelemetry/sdk-metrics": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" + "@opentelemetry/api-logs": "npm:0.45.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-logs": "npm:0.45.1" + "@opentelemetry/sdk-metrics": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.7.0" - checksum: a22be3278390003ca39f85e515b4806bb2910d3f7e465ac71e0a8ca296d334ef679fc7e70590e2a7b3dde03220ed803fc28ceaf71c06242c32a1bfc379f74df9 + "@opentelemetry/api": ">=1.3.0 <1.8.0" + checksum: fadc67d1f4ff613d6b737a4400a286afe34a460f47374b16b34d9344d4ff89ce308ba79e22774c2dd8e00cb5fc76d034cb9369fe09e0e4af6ba49588a5647816 languageName: node linkType: hard -"@opentelemetry/propagator-b3@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/propagator-b3@npm:1.17.1" +"@opentelemetry/propagator-b3@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/propagator-b3@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: c469d3f256abb96f515920f891d1a4532cc9f5acfca75a373aecb6bebf5288e63670ceb4e5aebe84810307bcee7748dd027902ac456a2c74805f0cf2e4619a3c + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: 8f20735ae7ee984f1e1cf2ca848ec583292036c5ed89137c9e7472229eab7475c57f90ba69804446c4f226407e984138e67f177e24bfed6afa277d39971fb992 languageName: node linkType: hard -"@opentelemetry/propagator-jaeger@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/propagator-jaeger@npm:1.17.1" +"@opentelemetry/propagator-jaeger@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/propagator-jaeger@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: ddae97cf9f1af188186f9196f96dd9e2f20faf16c5781bf98a866f5463ac7af0f1e1db19a07a10a0dbe4b0c2bf6af81e210ed84f687d53321ae5adf347aab708 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: 2307a37ac4a2097b54618a44fc578e1daef8cd479798ae7602f7281935d19f1a4db7240d981f814259ffc4aebe319e68a15dbe2805385a237a88099c0379e2d5 languageName: node linkType: hard @@ -8551,154 +9171,142 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resources@npm:1.17.0": - version: 1.17.0 - resolution: "@opentelemetry/resources@npm:1.17.0" +"@opentelemetry/resources@npm:1.18.0": + version: 1.18.0 + resolution: "@opentelemetry/resources@npm:1.18.0" dependencies: - "@opentelemetry/core": "npm:1.17.0" - "@opentelemetry/semantic-conventions": "npm:1.17.0" + "@opentelemetry/core": "npm:1.18.0" + "@opentelemetry/semantic-conventions": "npm:1.18.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: c3555c49a43addbbf2eb24c379195f295250eb163060aca01f662194e973070cabf006d0d9d6e1ed19008442bae46a765c16c23d9ca0d7ba7c4a7988c0047af2 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: a9a843ac414be6e379201148f9817b82b9377b93422ff8729056787d1e3908537dc805ffe141b2e70f3211daca2687f39df62105bc4203489fc0435028526dba languageName: node linkType: hard -"@opentelemetry/resources@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/resources@npm:1.17.1" +"@opentelemetry/resources@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/resources@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: 4acd00237a0ac1d3bdfae6aaca45f2e73f1ad937046da5fa488c8a07dbc76ed9ec6a36a27abb09e5688c67b87276ef1d8c75ab2bf1c8e7ae94381a00ff42271c + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: f7d168a82c2fc602364a54977f41ce9f873b5156d5e36bf0f078b289f6bb1c41eaae700bcdddb7f32d15cb7e937d81239eb0301c7d0aa9b2a6c85a4cb0ff5ded languageName: node linkType: hard -"@opentelemetry/sdk-logs@npm:0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/sdk-logs@npm:0.44.0" +"@opentelemetry/sdk-logs@npm:0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/sdk-logs@npm:0.45.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/resources": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/resources": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.4.0 <1.7.0" + "@opentelemetry/api": ">=1.4.0 <1.8.0" "@opentelemetry/api-logs": ">=0.39.1" - checksum: f59198225548507b878e62bbf4b24494b5c7b1519bb61ed594e18050e09e3dff0b2a91705fc15eeee08c5d5abf56e42de215b50709c9615cb1a2ab1152c43d49 + checksum: 47cc1aa1d867bf6b0fe5120fa5e7839620a5843a93b1725ae7f35bdf10f6998fe89376c9524eff438f92b74733a751e1c6e7c0e90ec13aa6a1bfa8ca28d1f2e4 languageName: node linkType: hard -"@opentelemetry/sdk-metrics@npm:1.17.1, @opentelemetry/sdk-metrics@npm:^1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/sdk-metrics@npm:1.17.1" +"@opentelemetry/sdk-metrics@npm:1.18.1, @opentelemetry/sdk-metrics@npm:^1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/sdk-metrics@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/resources": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/resources": "npm:1.18.1" lodash.merge: "npm:^4.6.2" peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.7.0" - checksum: 205472776d63b67c78b41ef93b89869a890c4134e514fcd68f056010a1b71415732ef45d934acd892d28072288ae34f912747a0af87e475c048cbec805b1dbe5 + "@opentelemetry/api": ">=1.3.0 <1.8.0" + checksum: fe728c7383b5c7e7647bf7ea9881c41f4e11f48a57cf9e81efeda5eaaf784b092e1df3684e1101b34410a9401ba36e63e81bed1da5da048da5ad91acbaf51606 languageName: node linkType: hard -"@opentelemetry/sdk-node@npm:^0.44.0": - version: 0.44.0 - resolution: "@opentelemetry/sdk-node@npm:0.44.0" +"@opentelemetry/sdk-node@npm:^0.45.1": + version: 0.45.1 + resolution: "@opentelemetry/sdk-node@npm:0.45.1" dependencies: - "@opentelemetry/api-logs": "npm:0.44.0" - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/exporter-jaeger": "npm:1.17.1" - "@opentelemetry/exporter-trace-otlp-grpc": "npm:0.44.0" - "@opentelemetry/exporter-trace-otlp-http": "npm:0.44.0" - "@opentelemetry/exporter-trace-otlp-proto": "npm:0.44.0" - "@opentelemetry/exporter-zipkin": "npm:1.17.1" - "@opentelemetry/instrumentation": "npm:0.44.0" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/sdk-logs": "npm:0.44.0" - "@opentelemetry/sdk-metrics": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" - "@opentelemetry/sdk-trace-node": "npm:1.17.1" - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/api-logs": "npm:0.45.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/exporter-trace-otlp-grpc": "npm:0.45.1" + "@opentelemetry/exporter-trace-otlp-http": "npm:0.45.1" + "@opentelemetry/exporter-trace-otlp-proto": "npm:0.45.1" + "@opentelemetry/exporter-zipkin": "npm:1.18.1" + "@opentelemetry/instrumentation": "npm:0.45.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/sdk-logs": "npm:0.45.1" + "@opentelemetry/sdk-metrics": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" + "@opentelemetry/sdk-trace-node": "npm:1.18.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.7.0" - checksum: 3be73d7abab3e97bd4bb584055f6a9abb6bf54e4f0a7c90b0238b216dac521c25fba3506b97e7749f3041f11c1f8e4241ae59ab51b65728c8c1903831232e538 + "@opentelemetry/api": ">=1.3.0 <1.8.0" + checksum: 28f694599c88307631b03c780f6ced6ffc507fecba3e837221fb0812fee685dd1eb309a5167d51d6dcde9cf052f0d084ff8e77571d61caccd3e7340e6e32c403 languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.17.0": - version: 1.17.0 - resolution: "@opentelemetry/sdk-trace-base@npm:1.17.0" +"@opentelemetry/sdk-trace-base@npm:1.18.0": + version: 1.18.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.18.0" dependencies: - "@opentelemetry/core": "npm:1.17.0" - "@opentelemetry/resources": "npm:1.17.0" - "@opentelemetry/semantic-conventions": "npm:1.17.0" + "@opentelemetry/core": "npm:1.18.0" + "@opentelemetry/resources": "npm:1.18.0" + "@opentelemetry/semantic-conventions": "npm:1.18.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: 5c269dd97387b5daf538288c17eee83a3623194f6184f4305fcae5e9af5eeca4313b70031587ffa4b7298944e7ef8a395fb065008179f03546f37845666b0e12 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: f36b38c746acf6646a0ff7d6b72e0ccf5cec0153f04f77315a1d7b39ff02b2407a0c853b83ac014456076efa6149cef4e7534d650260ac7213c944bd81f6ec21 languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/sdk-trace-base@npm:1.17.1" +"@opentelemetry/sdk-trace-base@npm:1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/sdk-trace-base@npm:1.18.1" dependencies: - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/resources": "npm:1.17.1" - "@opentelemetry/semantic-conventions": "npm:1.17.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/resources": "npm:1.18.1" + "@opentelemetry/semantic-conventions": "npm:1.18.1" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: 9b659ccd7012cd97484fdd894de367010b71dd4f538df8773c07dc94482cdf95e5b1e6b3791a7e35b92e83877dafd28e50b021a5646294073bce2f71ed9c04d5 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: 99e576f538a06feff11e1a7c63224864ef4875e36bd0b7284087307f6dd87554aa2089f0a51f8a4cdc55c44f298befedf94b40987af9a0875e931bd3fe2e77c5 languageName: node linkType: hard -"@opentelemetry/sdk-trace-node@npm:1.17.1, @opentelemetry/sdk-trace-node@npm:^1.17.1": - version: 1.17.1 - resolution: "@opentelemetry/sdk-trace-node@npm:1.17.1" +"@opentelemetry/sdk-trace-node@npm:1.18.1, @opentelemetry/sdk-trace-node@npm:^1.18.1": + version: 1.18.1 + resolution: "@opentelemetry/sdk-trace-node@npm:1.18.1" dependencies: - "@opentelemetry/context-async-hooks": "npm:1.17.1" - "@opentelemetry/core": "npm:1.17.1" - "@opentelemetry/propagator-b3": "npm:1.17.1" - "@opentelemetry/propagator-jaeger": "npm:1.17.1" - "@opentelemetry/sdk-trace-base": "npm:1.17.1" + "@opentelemetry/context-async-hooks": "npm:1.18.1" + "@opentelemetry/core": "npm:1.18.1" + "@opentelemetry/propagator-b3": "npm:1.18.1" + "@opentelemetry/propagator-jaeger": "npm:1.18.1" + "@opentelemetry/sdk-trace-base": "npm:1.18.1" semver: "npm:^7.5.2" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.7.0" - checksum: 947e8a7cb733180ec5ea52d2b906b4b51c1ee35ad4bbccc2c1e7fd98c1ebda61c2bad791d2aebfdf643c0b38a83c46c0052c98ea35f1c8c4ea3381e469f90e33 + "@opentelemetry/api": ">=1.0.0 <1.8.0" + checksum: a0838cf786cc55fdedb9eb0f548b53539307d7ccf92c50732cfc91d84bca734a4487046b017199508423600db0834e9484fffceecb225e508a157ab5dc698a34 languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.17.0": - version: 1.17.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.17.0" - checksum: 1f6bbd4d543ad529ddb3f6b55e08940995b5958fa990bc54bfa50136fc0a93d12a9bfed7f3addb5d84b1afaade8bd4b9afc36d2fe2d65a3f6325511b3a29d851 +"@opentelemetry/semantic-conventions@npm:1.18.0": + version: 1.18.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.18.0" + checksum: 0409c698376a9279f3ef489762d288b00dd1dae84812e211813f97960ff8cea23c086d9bce585b03fe1b16b8137ed9b180462aeb6250d827fab4dd45573b94c3 languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.17.1, @opentelemetry/semantic-conventions@npm:^1.0.0": - version: 1.17.1 - resolution: "@opentelemetry/semantic-conventions@npm:1.17.1" - checksum: 1abbb47c8511371372e7703eaaf4ab7639bca3a041e04351c515886b5aab4af8b0a28ae5232f1bb050d6273a470ae61aa0b3a8e783c78afaddc13e4b99c1e6a8 +"@opentelemetry/semantic-conventions@npm:1.18.1, @opentelemetry/semantic-conventions@npm:^1.0.0": + version: 1.18.1 + resolution: "@opentelemetry/semantic-conventions@npm:1.18.1" + checksum: 00d46e3b61eeac8a6752d50a0fb55ddf32f6f716a7fe4bf35b6d001da89398b4d8a5623a17044b24ab159acb892b2ac2586731b375176b94806cb0013f629dd5 languageName: node linkType: hard -"@panva/hkdf@npm:^1.0.2, @panva/hkdf@npm:^1.0.4": +"@panva/hkdf@npm:^1.0.2, @panva/hkdf@npm:^1.1.1": version: 1.1.1 resolution: "@panva/hkdf@npm:1.1.1" checksum: f0dd12903751d8792420353f809ed3c7de860cf506399759fff5f59f7acfef8a77e2b64012898cee7e5b047708fa0bd91dff5ef55a502bf8ea11aad9842160da languageName: node linkType: hard -"@parcel/watcher@npm:2.0.4": - version: 2.0.4 - resolution: "@parcel/watcher@npm:2.0.4" - dependencies: - node-addon-api: "npm:^3.2.1" - node-gyp: "npm:latest" - node-gyp-build: "npm:^4.3.0" - checksum: ec3ba32c16856c34460d79bc95887f68869201e0cae68c5d1d4cd1f0358673d76dea56e194ede1e83af78656bde4eef2b17716a7396b54f63a40e4655c7a63c4 - languageName: node - linkType: hard - "@pdf-lib/standard-fonts@npm:^1.0.0": version: 1.0.0 resolution: "@pdf-lib/standard-fonts@npm:1.0.0" @@ -8718,13 +9326,13 @@ __metadata: linkType: hard "@peculiar/asn1-schema@npm:^2.3.6": - version: 2.3.6 - resolution: "@peculiar/asn1-schema@npm:2.3.6" + version: 2.3.8 + resolution: "@peculiar/asn1-schema@npm:2.3.8" dependencies: asn1js: "npm:^3.0.5" - pvtsutils: "npm:^1.3.2" - tslib: "npm:^2.4.0" - checksum: 09e8292b19cca0952629fb26b897de02fd16d1ef897fa7257de350220223b1e544a398f3487e6e2022495ef7c5d186320b8e65c3f640886409c946bbdc277c96 + pvtsutils: "npm:^1.3.5" + tslib: "npm:^2.6.2" + checksum: da349985cff73ae7ea52b6b66c6b4b339a768d5eb9164ad03e73c30985ec0a1c94849b323a826b00a049d7de3840368f77bebe84193205a77565cdfdac6ed524 languageName: node linkType: hard @@ -8872,14 +9480,14 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.39.0": - version: 1.39.0 - resolution: "@playwright/test@npm:1.39.0" +"@playwright/test@npm:^1.39.0, @playwright/test@npm:^1.40.0": + version: 1.40.0 + resolution: "@playwright/test@npm:1.40.0" dependencies: - playwright: "npm:1.39.0" + playwright: "npm:1.40.0" bin: playwright: cli.js - checksum: 5d039234609395f3eab46b5954b259bdd80dacf79efe531369c1633647dcafce25a78d497e61e671d661274bf66076426a1bd46be585c44addf23bb5bfaa15a2 + checksum: 46ebd396d37b3e438019229f5c84bf4a8614f455245a51fd2d77a05f6065aefc41af30f26882415607c9e4adc2bb1511bd1f1ba06d7870fae0b5525768240acb languageName: node linkType: hard @@ -8950,42 +9558,42 @@ __metadata: languageName: node linkType: hard -"@prisma/client@npm:^5.4.2": - version: 5.4.2 - resolution: "@prisma/client@npm:5.4.2" +"@prisma/client@npm:^5.6.0": + version: 5.6.0 + resolution: "@prisma/client@npm:5.6.0" dependencies: - "@prisma/engines-version": "npm:5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574" + "@prisma/engines-version": "npm:5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" peerDependencies: prisma: "*" peerDependenciesMeta: prisma: optional: true - checksum: 8cba5ebbe6ce76643505e03becf60057835c475edae9316ebb8241b60af6555a902841459673e0dd66511a55f48a6a82bcfc6251a38803004e3a75032231c541 + checksum: eb784095ed27921bf859cd4b72b1a7e8d8f98dac0ebc782d94eecb4f4abaaa5de26d99bf9ef4e4d7b620d6f449d806884a315332766b3c040a97ef06150ba8f4 languageName: node linkType: hard -"@prisma/engines-version@npm:5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574": - version: 5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574 - resolution: "@prisma/engines-version@npm:5.4.1-2.ac9d7041ed77bcc8a8dbd2ab6616b39013829574" - checksum: fb1f98fdb4eb9baa61409dc6fa9bcfcce3d6984121be28d57bc54f670b6fdc2ff2fc1a8bba096fcf206554f6ae8b67bdb5c2f2d984441de72b587ed92d88263c +"@prisma/engines-version@npm:5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee": + version: 5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee + resolution: "@prisma/engines-version@npm:5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" + checksum: 0a6248f702855775fab9fe277a98acdc558c3929101c8d56010f8dba708e35c42eb9879af3bd2e2a9446a68776a3e8b609ffb0e1835de083334cb492d236f101 languageName: node linkType: hard -"@prisma/engines@npm:5.4.2": - version: 5.4.2 - resolution: "@prisma/engines@npm:5.4.2" - checksum: 4fdb9a44c69de6261301cfbcb9a0cd5caf67bbb96a5a2a2364757ed5a45581f3b6e96a371abeb84a6e98b94d8d4b6494218a10b2037500fbd98bab14827006b6 +"@prisma/engines@npm:5.6.0": + version: 5.6.0 + resolution: "@prisma/engines@npm:5.6.0" + checksum: 01ce51dd6ceec68097b8f15e5f9895649ba4080eb7fc1ec1476131a3d2898d47dfe594255244dd021de4b26af8c91cdbd6c1600efdb3a242867061fbea1f2027 languageName: node linkType: hard -"@prisma/instrumentation@npm:^5.4.2": - version: 5.4.2 - resolution: "@prisma/instrumentation@npm:5.4.2" +"@prisma/instrumentation@npm:^5.6.0": + version: 5.6.0 + resolution: "@prisma/instrumentation@npm:5.6.0" dependencies: - "@opentelemetry/api": "npm:1.6.0" - "@opentelemetry/instrumentation": "npm:0.43.0" - "@opentelemetry/sdk-trace-base": "npm:1.17.0" - checksum: 2b0135301fd7d5f8d89e8e1ba319292d3b7fad9bf80b7c209d54d2d418c0c3fcb130a7ce956977cb923aedd1c0b76f9124162179aba539b7d02fa87accd424cb + "@opentelemetry/api": "npm:1.7.0" + "@opentelemetry/instrumentation": "npm:0.45.0" + "@opentelemetry/sdk-trace-base": "npm:1.18.0" + checksum: 0d7eebe19f2eab2c2b82119c29accf2b3e46638c5331c69a531fdb4ee16c6ef99fdd63b905319c02258082975e579e059aa5a5109e5299be889ff5aa836af4e7 languageName: node linkType: hard @@ -10263,14 +10871,14 @@ __metadata: linkType: hard "@redux-devtools/extension@npm:^3.2.5": - version: 3.2.5 - resolution: "@redux-devtools/extension@npm:3.2.5" + version: 3.2.6 + resolution: "@redux-devtools/extension@npm:3.2.6" dependencies: - "@babel/runtime": "npm:^7.20.7" - immutable: "npm:^4.2.2" + "@babel/runtime": "npm:^7.23.2" + immutable: "npm:^4.3.4" peerDependencies: redux: ^3.1.0 || ^4.0.0 - checksum: abd623e57c0cc3fd3a3d9292bbae76447c25ae23b8d20fd1b2947c88e2e8848f75347fefd5c0bff0f6a3d2cefb645f458f28ffc9f1e6a5d87c08c58e77de76b7 + checksum: bac42880d1a08f5d9c746c47e30b32472ed1e249d841041276a41d3cd8fcc849a41396e01a3f67f5b2ba3542df38f3c9dca5c19c7a77e34103a7950f7d0c9381 languageName: node linkType: hard @@ -10286,31 +10894,21 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.10.0": - version: 1.10.0 - resolution: "@remix-run/router@npm:1.10.0" - checksum: 61f5e6374f2d0edd177a61c8a44715290d9197a61362505fb0784f948a39e8353d9604ce3747151f837fc7b950e1fbd71bc797b161643325c545037ffbedd134 +"@remix-run/router@npm:1.12.0": + version: 1.12.0 + resolution: "@remix-run/router@npm:1.12.0" + checksum: f984e42cfe855991e1d3067f686f857614f12e8c1c45168a2d98e3fc3a427e232fd0b6cf145173b7cd132faf070702b532c34230a825d933908c54c85077fc69 languageName: node linkType: hard "@repeaterjs/repeater@npm:^3.0.4": - version: 3.0.4 - resolution: "@repeaterjs/repeater@npm:3.0.4" - checksum: 8ce723ca07c6bf42b8de7bf7e3380eab2efc083cadf1f814d188c6c813af1461dfe46051a57bb54116113c0338473df64d6c17314ceeb7f4323437fff54da872 + version: 3.0.5 + resolution: "@repeaterjs/repeater@npm:3.0.5" + checksum: 7478df13bd4631729021b2f43524fe71a4ed04b3c1c2125315078e3954f059f2ff4da5776f9be8f76008df9849e866e5ec56120f41b8bf66d2ec1a7c7bc53229 languageName: node linkType: hard -"@rollup/pluginutils@npm:^4.2.1": - version: 4.2.1 - resolution: "@rollup/pluginutils@npm:4.2.1" - dependencies: - estree-walker: "npm:^2.0.1" - picomatch: "npm:^2.2.2" - checksum: 503a6f0a449e11a2873ac66cfdfb9a3a0b77ffa84c5cad631f5e4bc1063c850710e8d5cd5dab52477c0d66cda2ec719865726dbe753318cd640bab3fff7ca476 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.0.2": +"@rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.0.5": version: 5.0.5 resolution: "@rollup/pluginutils@npm:5.0.5" dependencies: @@ -10356,35 +10954,34 @@ __metadata: languageName: node linkType: hard -"@rushstack/ts-command-line@npm:4.16.1": - version: 4.16.1 - resolution: "@rushstack/ts-command-line@npm:4.16.1" +"@rushstack/ts-command-line@npm:4.17.1": + version: 4.17.1 + resolution: "@rushstack/ts-command-line@npm:4.17.1" dependencies: "@types/argparse": "npm:1.0.38" argparse: "npm:~1.0.9" colors: "npm:~1.2.1" string-argv: "npm:~0.3.1" - checksum: 8acbe3c634a436b0d18a9aa6e326f546a99e388fce484e347a2ca0d1aab6f345c4a23f788c135bddb4559c3a71a7022087fd7a0c99502fb62066f20005bb6edd + checksum: 75407f6a42fda364ec9f945ebd346c632a23dd97d7ed5ad108c264d72ee0370d3d912cc6c16af6973bbc3f5f92b845b63fb13da75a077d61f7e34e69f00b8823 languageName: node linkType: hard -"@sentry-internal/tracing@npm:7.74.0": - version: 7.74.0 - resolution: "@sentry-internal/tracing@npm:7.74.0" +"@sentry-internal/tracing@npm:7.81.1": + version: 7.81.1 + resolution: "@sentry-internal/tracing@npm:7.81.1" dependencies: - "@sentry/core": "npm:7.74.0" - "@sentry/types": "npm:7.74.0" - "@sentry/utils": "npm:7.74.0" - tslib: "npm:^2.4.1 || ^1.9.3" - checksum: 783b6fd3edbd0bcd72ac349a861b266f803615e799b9b6adc1ca8b5254e68a87f595f33b64fb53690a7db06377617d80e69f9caeb5e7ba78873fff0fb1263296 + "@sentry/core": "npm:7.81.1" + "@sentry/types": "npm:7.81.1" + "@sentry/utils": "npm:7.81.1" + checksum: 2bae510d77024898a828bf7e3c51e01670e68b5a4506c47e678b05b32e1c2721e5f6149be9c83c8cee3793746cf69e7242f13b4999aa9902150bee17b1282292 languageName: node linkType: hard -"@sentry/bundler-plugin-core@npm:2.8.0": - version: 2.8.0 - resolution: "@sentry/bundler-plugin-core@npm:2.8.0" +"@sentry/bundler-plugin-core@npm:2.10.1": + version: 2.10.1 + resolution: "@sentry/bundler-plugin-core@npm:2.10.1" dependencies: - "@sentry/cli": "npm:^2.21.2" + "@sentry/cli": "npm:^2.21.4" "@sentry/node": "npm:^7.60.0" "@sentry/utils": "npm:^7.60.0" dotenv: "npm:^16.3.1" @@ -10392,13 +10989,13 @@ __metadata: glob: "npm:9.3.2" magic-string: "npm:0.27.0" unplugin: "npm:1.0.1" - checksum: 3b76e1868d34b001d99cb4d52939fd46dcc461575ce6f8918ac4edc63b9eab790c1a7a4d3532e4e1d76b3af13ea852ceab309682428b6099a92ab7076d5a7433 + checksum: 2391558c1fc27cdc9247ea4823323b68ce9b03568da28c87b9f41bfeb0eb66abad0d017e28101f5edc8de9e33aed9cd92badcc10f496d7635d6831f4bfadbdce languageName: node linkType: hard -"@sentry/cli@npm:^2.21.2": - version: 2.21.2 - resolution: "@sentry/cli@npm:2.21.2" +"@sentry/cli@npm:^2.21.4": + version: 2.21.5 + resolution: "@sentry/cli@npm:2.21.5" dependencies: https-proxy-agent: "npm:^5.0.0" node-fetch: "npm:^2.6.7" @@ -10407,64 +11004,59 @@ __metadata: which: "npm:^2.0.2" bin: sentry-cli: bin/sentry-cli - checksum: 7b253cabbefbc201fe4b5f903163ef5855020759758767ee94bd7725eb29378342457a097d164c529b61e9eb88747342c5546dac3ad52e477cb5e0c6916d8189 + checksum: c1164b96f324f82d22b3b0b29db004241f38049659087a5c70f7cfab8876e4c6250d2f23880fdcf7b75f9b6ff8aa4454fd4747051d2c22a6e0d418f5e46da089 languageName: node linkType: hard -"@sentry/core@npm:7.74.0": - version: 7.74.0 - resolution: "@sentry/core@npm:7.74.0" +"@sentry/core@npm:7.81.1": + version: 7.81.1 + resolution: "@sentry/core@npm:7.81.1" dependencies: - "@sentry/types": "npm:7.74.0" - "@sentry/utils": "npm:7.74.0" - tslib: "npm:^2.4.1 || ^1.9.3" - checksum: f1fd6753d85d426fef6803231b85ba9dd8399403b2e95dfeebed27cb010723126c5027999a921784501a289ac3165258ca41ae8b808182722932495303f84bb5 + "@sentry/types": "npm:7.81.1" + "@sentry/utils": "npm:7.81.1" + checksum: 3bb001c147f9425b4d93f780260eb928d486dec3772ec6bc3648f882a8ef9f8e69d71eaaf5fcce80b50316de7d10cdec54e6926a335c3361a1e7009d2d1b4ea4 languageName: node linkType: hard "@sentry/node@npm:^7.60.0": - version: 7.74.0 - resolution: "@sentry/node@npm:7.74.0" + version: 7.81.1 + resolution: "@sentry/node@npm:7.81.1" dependencies: - "@sentry-internal/tracing": "npm:7.74.0" - "@sentry/core": "npm:7.74.0" - "@sentry/types": "npm:7.74.0" - "@sentry/utils": "npm:7.74.0" - cookie: "npm:^0.5.0" + "@sentry-internal/tracing": "npm:7.81.1" + "@sentry/core": "npm:7.81.1" + "@sentry/types": "npm:7.81.1" + "@sentry/utils": "npm:7.81.1" https-proxy-agent: "npm:^5.0.0" - lru_map: "npm:^0.3.3" - tslib: "npm:^2.4.1 || ^1.9.3" - checksum: 98a3349aa209166e9ab37cc1c5e7a05c5a33b73bb5f46664a28a869377a7af9b57b95c1c5007a6b8a44475569b1c5ac8910ab98c48653715a6cc03162cd752f7 + checksum: 372d5660a0879388e7338daf166ec9cd9fb7a27bc4d202cf8bd019aac48b474a7fa3f658e4c0a20743d93688029780153dd5b7fa5455c46aefebb8f95f3bc0f0 languageName: node linkType: hard -"@sentry/types@npm:7.74.0": - version: 7.74.0 - resolution: "@sentry/types@npm:7.74.0" - checksum: 7b120a73f235b4261032cd5e718a49d87ad32807a9cff0196d2c6b7c3da8dc47ed4f7812843f93cdde395003a92fc5718b523863be686a587005e2f3b8794f1f +"@sentry/types@npm:7.81.1": + version: 7.81.1 + resolution: "@sentry/types@npm:7.81.1" + checksum: 26164e48ae8322218a1c081217de97bd50856b554604c5ffb0328f5356fed64c8ddfa9b155c4bbe4f66264c0881a017face36d53a0fc230fc1aa5e7948ffecc5 languageName: node linkType: hard -"@sentry/utils@npm:7.74.0, @sentry/utils@npm:^7.60.0": - version: 7.74.0 - resolution: "@sentry/utils@npm:7.74.0" +"@sentry/utils@npm:7.81.1, @sentry/utils@npm:^7.60.0": + version: 7.81.1 + resolution: "@sentry/utils@npm:7.81.1" dependencies: - "@sentry/types": "npm:7.74.0" - tslib: "npm:^2.4.1 || ^1.9.3" - checksum: f461a3effe28353c3117627ecac35b60d5ddf3ec2554f4e756de39b3ad990fb5a72b2bec0e468b276150e812e182962aedd24a621be325b9f3916db72339b9fa + "@sentry/types": "npm:7.81.1" + checksum: 12a13adced1c2ca87bc93d0adb66c8fe9f5f2b9247c7cd2773c2e26edf8dd6437ab1f316af4afdd8e9ee912bdfabbaed89757a427a0c84e42a483b65ea790cdc languageName: node linkType: hard "@sentry/webpack-plugin@npm:^2.8.0": - version: 2.8.0 - resolution: "@sentry/webpack-plugin@npm:2.8.0" + version: 2.10.1 + resolution: "@sentry/webpack-plugin@npm:2.10.1" dependencies: - "@sentry/bundler-plugin-core": "npm:2.8.0" + "@sentry/bundler-plugin-core": "npm:2.10.1" unplugin: "npm:1.0.1" uuid: "npm:^9.0.0" peerDependencies: webpack: ">=4.40.0" - checksum: 79b78f78d3eb495ec59e0d6d87b68f5033688b4113fb757560060164e364bf5c7e9afca0da1f0385fe419213ac1dd2a32f69b792a0d49ce2c0b8f11f1800c2ef + checksum: 7d7ef3dc0763850557bc7233229a5ab34307b4d6cd90eeefa591016b4a9e656ae4bbd949e62c2e3257cb946446436da07685ff5f95463d0516f4fdef30d314ed languageName: node linkType: hard @@ -10512,15 +11104,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^1.7.0": - version: 1.8.6 - resolution: "@sinonjs/commons@npm:1.8.6" - dependencies: - type-detect: "npm:4.0.8" - checksum: 51987338fd8b4d1e135822ad593dd23a3288764aa41d83c695124d512bc38b87eece859078008651ecc7f1df89a7e558a515dc6f02d21a93be4ba50b39a28914 - languageName: node - linkType: hard - "@sinonjs/commons@npm:^2.0.0": version: 2.0.0 resolution: "@sinonjs/commons@npm:2.0.0" @@ -10539,7 +11122,7 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^10.0.2, @sinonjs/fake-timers@npm:^10.3.0": +"@sinonjs/fake-timers@npm:^10.0.2": version: 10.3.0 resolution: "@sinonjs/fake-timers@npm:10.3.0" dependencies: @@ -10548,12 +11131,12 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^9.1.2": - version: 9.1.2 - resolution: "@sinonjs/fake-timers@npm:9.1.2" +"@sinonjs/fake-timers@npm:^11.2.2": + version: 11.2.2 + resolution: "@sinonjs/fake-timers@npm:11.2.2" dependencies: - "@sinonjs/commons": "npm:^1.7.0" - checksum: 033c74ad389b0655b6af2fa1af31dddf45878e65879f06c5d1940e0ceb053a234f2f46c728dcd97df8ee9312431e45dd7aedaee3a69d47f73a2001a7547fc3d6 + "@sinonjs/commons": "npm:^3.0.0" + checksum: da7dfa677b2362bc5a321fc1563184755b5c62fbb1a72457fb9e901cd187ba9dc834f9e8a0fb5a4e1d1e6e6ad4c5b54e90900faa44dd6c82d3c49c92ec23ecd4 languageName: node linkType: hard @@ -10575,23 +11158,23 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/abort-controller@npm:2.0.12" +"@smithy/abort-controller@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/abort-controller@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: ade23e7e6d3b30615cb376e2578b7f9545a2e0c1ab67f570a76ce5dde3547c6dde0964976e3e914f4844df0dd0ddf9ddc38820ba69f61eed2fffe6e563d0c4e4 + checksum: ec0334438bcbcdbeee0c1005b95ca10f79f8e03f145ac854183cba1963cba368380d3dfd44eca208a7c6cd627597edea1dafbc99e269e29201a61dec08aa6987 languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/chunked-blob-reader-native@npm:2.0.0" +"@smithy/chunked-blob-reader-native@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/chunked-blob-reader-native@npm:2.0.1" dependencies: - "@smithy/util-base64": "npm:^2.0.0" + "@smithy/util-base64": "npm:^2.0.1" tslib: "npm:^2.5.0" - checksum: 7f8c3946d59299092e8724f242d5896ce5fb7fca6ea7e3b21cf819c33318038214cd6b774317c3b2a9c1c8d54185f3020879a2f3a832f9951112b726525d0228 + checksum: 3e3e1a9004336ab6853efe024aee053ee63e833b5f5e812d877fd4c7be74d7f8123c0352d749de77713d1152cf390991814c01e42d1ee5e349cf6816789a3109 languageName: node linkType: hard @@ -10604,142 +11187,142 @@ __metadata: languageName: node linkType: hard -"@smithy/config-resolver@npm:^2.0.16": - version: 2.0.16 - resolution: "@smithy/config-resolver@npm:2.0.16" +"@smithy/config-resolver@npm:^2.0.16, @smithy/config-resolver@npm:^2.0.18, @smithy/config-resolver@npm:^2.0.19": + version: 2.0.19 + resolution: "@smithy/config-resolver@npm:2.0.19" dependencies: - "@smithy/node-config-provider": "npm:^2.1.3" - "@smithy/types": "npm:^2.4.0" + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/types": "npm:^2.6.0" "@smithy/util-config-provider": "npm:^2.0.0" - "@smithy/util-middleware": "npm:^2.0.5" + "@smithy/util-middleware": "npm:^2.0.7" tslib: "npm:^2.5.0" - checksum: 94665f89600ff481e9591c3932789c2af02c9f96785b88ee1ffb6f2510ce7013758937f5d092114104b6143033b6323a7ce79511722f61cb6827038602faea6f + checksum: c2d7dc945df3a3d8e4e14e371bdb4653b75d3c481e680cc559ae15ef3464d7c44a35de936a982726c4cc04a87d918e5af5ef9efe10115f9d3fff112aee604222 languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^2.0.0, @smithy/credential-provider-imds@npm:^2.0.18": - version: 2.0.18 - resolution: "@smithy/credential-provider-imds@npm:2.0.18" +"@smithy/credential-provider-imds@npm:^2.0.0, @smithy/credential-provider-imds@npm:^2.1.2": + version: 2.1.2 + resolution: "@smithy/credential-provider-imds@npm:2.1.2" dependencies: - "@smithy/node-config-provider": "npm:^2.1.3" - "@smithy/property-provider": "npm:^2.0.13" - "@smithy/types": "npm:^2.4.0" - "@smithy/url-parser": "npm:^2.0.12" + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/property-provider": "npm:^2.0.15" + "@smithy/types": "npm:^2.6.0" + "@smithy/url-parser": "npm:^2.0.14" tslib: "npm:^2.5.0" - checksum: 76665cb083e25b5869b79c20714100328173fabb6c73f32662117c9b01c2bad00141cb73c10238fa1cd87f831079de6960925be99be9c5c1398c1cc0e0395794 + checksum: 632d023515bb436e80d6d82268dadf1cb86721e086d027bcf33fa7cfefa2f4bcae8aa7171f6ad07bab7e0476f74e05c5b381bccaf759da25c9ec8406802d06cb languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^2.0.11, @smithy/eventstream-codec@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/eventstream-codec@npm:2.0.12" +"@smithy/eventstream-codec@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/eventstream-codec@npm:2.0.14" dependencies: "@aws-crypto/crc32": "npm:3.0.0" - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" "@smithy/util-hex-encoding": "npm:^2.0.0" tslib: "npm:^2.5.0" - checksum: e2be23189422e75b8a735249e7b65e9ebc709ca305e232606f0f328ca4c98b959bc443cb82921412b79f1e3df8d38e606bf245a2664437c0ac1544476641e3bc + checksum: a124898d3138ac43bdd65af5fef5eba4e7270e9d1d93602ea4101e3648b6d3f56ed348e759772c007f0b253c542a01e5161cdbe3d4414d82abef5daf4fe5bed3 languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/eventstream-serde-browser@npm:2.0.12" +"@smithy/eventstream-serde-browser@npm:^2.0.12, @smithy/eventstream-serde-browser@npm:^2.0.13": + version: 2.0.14 + resolution: "@smithy/eventstream-serde-browser@npm:2.0.14" dependencies: - "@smithy/eventstream-serde-universal": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/eventstream-serde-universal": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 6dbd214f7580597293f8aa58083e3dbd6b3346349fc68525428a706706c38839f1ff15d61b257354c9e0100a5d160fa4fb16a50bff054648cac2c9b6a5be4d27 + checksum: e7caaf6ad57c646329a0b9f061ae0a623f09f3818154bf495b3bf8be5c375e5c93e2a0a1b4f8bb421212ffe28a63c20f2bc13d35e5700146f6c81a8b4f9b30f1 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/eventstream-serde-config-resolver@npm:2.0.12" +"@smithy/eventstream-serde-config-resolver@npm:^2.0.12, @smithy/eventstream-serde-config-resolver@npm:^2.0.13": + version: 2.0.14 + resolution: "@smithy/eventstream-serde-config-resolver@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 869959136f26047e834f824c90cce714fd785915b3d98b9519e086cd401b22d696be871a9e7a79efa47013255db8cd95dd72768f89d44b635195ad72927719c4 + checksum: 47540c64f5d847736419e086eee9ead42ea42d262e8f6565b859e7d5bd7e1416cef1bc7c489cd6d8ee781017d5cd0d66c6a42b54521f3846e26fa1374ebec5ca languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/eventstream-serde-node@npm:2.0.12" +"@smithy/eventstream-serde-node@npm:^2.0.12, @smithy/eventstream-serde-node@npm:^2.0.13": + version: 2.0.14 + resolution: "@smithy/eventstream-serde-node@npm:2.0.14" dependencies: - "@smithy/eventstream-serde-universal": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/eventstream-serde-universal": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: fb4fab3b5d4644921ca0650ec68cf97f86ef24bbbd28ade44d28fd0e7688ea87489c99a93093692d1344c611d035120619c1a4c88b0185ec27c868509d3060dd + checksum: cdd3d44296377422a4e61a54a795fde5d7675f068c00b2199c2a28245ae89ec39b9171419873427549a423f1ba20139f7572d2945a93d18dac14743bdbb15dea languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/eventstream-serde-universal@npm:2.0.12" +"@smithy/eventstream-serde-universal@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/eventstream-serde-universal@npm:2.0.14" dependencies: - "@smithy/eventstream-codec": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/eventstream-codec": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 5de9fe4eab5bacb43a32d43cd36ce08f41645ce50f91e4b6ca36dc4af1fa35262eb1829602dee6032e8f44283e31c1db68fa872c1218e0060915bcf004175f27 + checksum: e4f90a7caf6604e62955a6524082eb25e94d9c1514f0cea9474cf9b33f252ec4d3d48a50cfeac75399a99a492b21f671b24ae5abb4935b0aa2c849a789139031 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^2.2.4": - version: 2.2.4 - resolution: "@smithy/fetch-http-handler@npm:2.2.4" +"@smithy/fetch-http-handler@npm:^2.2.4, @smithy/fetch-http-handler@npm:^2.2.6, @smithy/fetch-http-handler@npm:^2.2.7": + version: 2.2.7 + resolution: "@smithy/fetch-http-handler@npm:2.2.7" dependencies: - "@smithy/protocol-http": "npm:^3.0.8" - "@smithy/querystring-builder": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" - "@smithy/util-base64": "npm:^2.0.0" + "@smithy/protocol-http": "npm:^3.0.10" + "@smithy/querystring-builder": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-base64": "npm:^2.0.1" tslib: "npm:^2.5.0" - checksum: 0151a1b7f4d723315cd849a8a069185d160a35f11181c70facb62a75aa89d0158e9b1d37aceb9ba42c659b99a3ef99965c272fb7565511184a3f1dae2e816601 + checksum: 73f868d456d7b5aa7a116f35d13e45bf93f0936ec10dac48cce04d866130f3335cf545eb0d16a4c248aa48d6f5b7a1ba5666ba912d6a8f0295c2cd37d1ec3196 languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/hash-blob-browser@npm:2.0.12" +"@smithy/hash-blob-browser@npm:^2.0.12, @smithy/hash-blob-browser@npm:^2.0.14": + version: 2.0.15 + resolution: "@smithy/hash-blob-browser@npm:2.0.15" dependencies: "@smithy/chunked-blob-reader": "npm:^2.0.0" - "@smithy/chunked-blob-reader-native": "npm:^2.0.0" - "@smithy/types": "npm:^2.4.0" + "@smithy/chunked-blob-reader-native": "npm:^2.0.1" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: d0147b28604440ceca760a58aff9b28b4b6edc2c4bf054ed68d77fba29520c6de795c2babb2da60fb9c5378568c3f5aff0fbc60f64d208d54cbe23d8a7ae7676 + checksum: cb554c61996bbb0d0c92e67602c96959f7f07789aa49a3bdb385383e528d14310a121d9b5c3b319a0555843f7144ee0f7e3cbf0e84adf2c800cb5fc5410d21f8 languageName: node linkType: hard -"@smithy/hash-node@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/hash-node@npm:2.0.12" +"@smithy/hash-node@npm:^2.0.12, @smithy/hash-node@npm:^2.0.15": + version: 2.0.16 + resolution: "@smithy/hash-node@npm:2.0.16" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" "@smithy/util-buffer-from": "npm:^2.0.0" - "@smithy/util-utf8": "npm:^2.0.0" + "@smithy/util-utf8": "npm:^2.0.2" tslib: "npm:^2.5.0" - checksum: 73d8a5121acdf6225053c929499bf6d097f1dd5f235e553489486299c809a9d1e4ec4603bb97969fa3f7b0fa1b28dd3d34ed8a6dc40d41b0f80ab70a3a75461a + checksum: 740e0794d20a9553095c705a307bfe8fa384519b98e2df515b5b0873752913e33845620a541ba299a9cdd7fd9fad588a6573f801aa86a4644408fd086da7cc07 languageName: node linkType: hard -"@smithy/hash-stream-node@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/hash-stream-node@npm:2.0.12" +"@smithy/hash-stream-node@npm:^2.0.12, @smithy/hash-stream-node@npm:^2.0.15": + version: 2.0.16 + resolution: "@smithy/hash-stream-node@npm:2.0.16" dependencies: - "@smithy/types": "npm:^2.4.0" - "@smithy/util-utf8": "npm:^2.0.0" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-utf8": "npm:^2.0.2" tslib: "npm:^2.5.0" - checksum: bcc24b615b3e2693fe9dda4391f2c0ddcd43b926479a90460b4951a7f1c2b2429183e3dd76b21424b8ec20eabb3f408aef39ac2040d7407e8d03fc35091a0242 + checksum: cb8c4382a85dc14e0eb97de11de0032398ae604577315a80f39fb2367adf31918661ee1e55ea3402326a56de2844f2138ae7a9f6508fd3d3faace2ee4303f8c9 languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/invalid-dependency@npm:2.0.12" +"@smithy/invalid-dependency@npm:^2.0.12, @smithy/invalid-dependency@npm:^2.0.13": + version: 2.0.14 + resolution: "@smithy/invalid-dependency@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 4749da004afdb2d189379ee245b415b7f2cab98c86847aa97612989b9ab6849810c1c96f7b671c4c117d9b754a46cca0fc71ea17385efc1fbc29e7909ade4fff + checksum: cdb7f4de939ef7bb5a666fa47fb6d65bb4684855a4d97056a0457697e0caf276b735f6409df90b96d9b51560aca7ba45bf08cc3288fb23619179c4ab3ba7c1b0 languageName: node linkType: hard @@ -10752,219 +11335,219 @@ __metadata: languageName: node linkType: hard -"@smithy/md5-js@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/md5-js@npm:2.0.12" +"@smithy/md5-js@npm:^2.0.12, @smithy/md5-js@npm:^2.0.15": + version: 2.0.16 + resolution: "@smithy/md5-js@npm:2.0.16" dependencies: - "@smithy/types": "npm:^2.4.0" - "@smithy/util-utf8": "npm:^2.0.0" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-utf8": "npm:^2.0.2" tslib: "npm:^2.5.0" - checksum: aca6a6087148374a9ff0c723f67e29983e54a16326ed4f3e601e83ac3d3d610b712ba29852ee6a8f3361688fd39db51b20ae3e37952524e2e8abaf13f64b63e4 + checksum: fb37d9dc48b486660f48059e745c74d8f3a9e400e3520e7cc78ffb3f46b517227157455a008ea09a60319d5ea7072133ebd2e570bb020f0361f1a190887b82c8 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^2.0.14": - version: 2.0.14 - resolution: "@smithy/middleware-content-length@npm:2.0.14" +"@smithy/middleware-content-length@npm:^2.0.14, @smithy/middleware-content-length@npm:^2.0.15": + version: 2.0.16 + resolution: "@smithy/middleware-content-length@npm:2.0.16" dependencies: - "@smithy/protocol-http": "npm:^3.0.8" - "@smithy/types": "npm:^2.4.0" + "@smithy/protocol-http": "npm:^3.0.10" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 0a2d091368020ef2896eb184e6fe2b8860ba66bd235fc74c4685d8c3d009fb8941bc37607f0572dccbcaa6776d8241dfc2440d14163a58709c9d86002efc6865 + checksum: 32db634c119907f4ed3b27b4ad26cde1affb20d5d7dd09af450c82419c23b652c248222aab5de3dbc5ecd10dda1fc27844dba88f77ff7d5be75287d69fdcd3f7 languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^2.1.3": - version: 2.1.3 - resolution: "@smithy/middleware-endpoint@npm:2.1.3" +"@smithy/middleware-endpoint@npm:^2.1.3, @smithy/middleware-endpoint@npm:^2.2.0": + version: 2.2.1 + resolution: "@smithy/middleware-endpoint@npm:2.2.1" dependencies: - "@smithy/middleware-serde": "npm:^2.0.12" - "@smithy/node-config-provider": "npm:^2.1.3" - "@smithy/shared-ini-file-loader": "npm:^2.2.2" - "@smithy/types": "npm:^2.4.0" - "@smithy/url-parser": "npm:^2.0.12" - "@smithy/util-middleware": "npm:^2.0.5" + "@smithy/middleware-serde": "npm:^2.0.14" + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/shared-ini-file-loader": "npm:^2.2.5" + "@smithy/types": "npm:^2.6.0" + "@smithy/url-parser": "npm:^2.0.14" + "@smithy/util-middleware": "npm:^2.0.7" tslib: "npm:^2.5.0" - checksum: a82b2b1aeda50587ed18496ca34827db9fb4dd2520662e70d5f0776964e364e13158583b2be8e0f7f159ec754e6a4565f0eb998663b31758827064d044a367ac + checksum: 2ed4d12be8c7c846e7f68f8421bb74daf43632d1276ca09d5215d8bf9033c54df7b59cfd0390a9c3e630fac9ddb456baa28f531a197eb753cad54e6b7795b5ca languageName: node linkType: hard -"@smithy/middleware-retry@npm:^2.0.18": - version: 2.0.18 - resolution: "@smithy/middleware-retry@npm:2.0.18" +"@smithy/middleware-retry@npm:^2.0.18, @smithy/middleware-retry@npm:^2.0.20": + version: 2.0.21 + resolution: "@smithy/middleware-retry@npm:2.0.21" dependencies: - "@smithy/node-config-provider": "npm:^2.1.3" - "@smithy/protocol-http": "npm:^3.0.8" - "@smithy/service-error-classification": "npm:^2.0.5" - "@smithy/types": "npm:^2.4.0" - "@smithy/util-middleware": "npm:^2.0.5" - "@smithy/util-retry": "npm:^2.0.5" + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/protocol-http": "npm:^3.0.10" + "@smithy/service-error-classification": "npm:^2.0.7" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-middleware": "npm:^2.0.7" + "@smithy/util-retry": "npm:^2.0.7" tslib: "npm:^2.5.0" uuid: "npm:^8.3.2" - checksum: e18d0733525633e26e4a26783d0848de0a9cfacbcf37d6daee63bc6ea3627da969029ca0fd7794285a7aa848e37e6ca50074b3ff7976f8457ce80d0bd0beb9f2 + checksum: 61de5f151315c26919f117d019f1a971f78365ee7d3de1c0b32425b4962f04199521df771037790e4026c550aceed77041430cc247ec0e05e9c14bb24ae4d4ea languageName: node linkType: hard -"@smithy/middleware-serde@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/middleware-serde@npm:2.0.12" +"@smithy/middleware-serde@npm:^2.0.12, @smithy/middleware-serde@npm:^2.0.13, @smithy/middleware-serde@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/middleware-serde@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 18406d220390483aab88d1dab64b0a2abdd54d71498c64f5b08f03003d617c7c3dee2807257a8436c37e17a5e4d28c193dd3f39cb248afb83b20bf1c83098960 + checksum: 6343405b1844aaa01ebb254bdddfec37b617d28bcac09dfaf80940410f767cd4a79784609e4522e459e2e1e5db2c52a2e5b0547f7d7b2831b63324db2f519586 languageName: node linkType: hard -"@smithy/middleware-stack@npm:^2.0.6": - version: 2.0.6 - resolution: "@smithy/middleware-stack@npm:2.0.6" +"@smithy/middleware-stack@npm:^2.0.6, @smithy/middleware-stack@npm:^2.0.7, @smithy/middleware-stack@npm:^2.0.8": + version: 2.0.8 + resolution: "@smithy/middleware-stack@npm:2.0.8" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: f98dcd7688f648703c84ce229536b7e39b1c39700df8813b31788a81d1eba59bee4796f444775fe028df682beae67ba497f833b13dbc9a023d2bcba82d17ef0c + checksum: 55ad4d0513eb635a8983b3ae3fdd75dee527ac9975b1bb9cca2276f52f8f3ffcac723dcf0a4373ed4938879581ccb0df769ea9210708374e73b0797d3904f480 languageName: node linkType: hard -"@smithy/node-config-provider@npm:^2.1.3": - version: 2.1.3 - resolution: "@smithy/node-config-provider@npm:2.1.3" +"@smithy/node-config-provider@npm:^2.1.3, @smithy/node-config-provider@npm:^2.1.5, @smithy/node-config-provider@npm:^2.1.6": + version: 2.1.6 + resolution: "@smithy/node-config-provider@npm:2.1.6" dependencies: - "@smithy/property-provider": "npm:^2.0.13" - "@smithy/shared-ini-file-loader": "npm:^2.2.2" - "@smithy/types": "npm:^2.4.0" + "@smithy/property-provider": "npm:^2.0.15" + "@smithy/shared-ini-file-loader": "npm:^2.2.5" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: f53d0cda8c33d5afd4341459cb5a061d8e8d40593158ec5f0a0e85663b257c43fb22236c29fbb4f67f7d45aad03683194f13560bd3765d64abfd2e6421b24725 + checksum: 01d69eba3f1ce86cc1e9951fe344da43546612c8e1c981ee0f42b551b30a0b7ff435d9653d74dde42be331fba3f7a9f5afedbb62f800a32725151377f6957b7d languageName: node linkType: hard -"@smithy/node-http-handler@npm:^2.1.8": - version: 2.1.8 - resolution: "@smithy/node-http-handler@npm:2.1.8" +"@smithy/node-http-handler@npm:^2.1.10, @smithy/node-http-handler@npm:^2.1.8, @smithy/node-http-handler@npm:^2.1.9": + version: 2.1.10 + resolution: "@smithy/node-http-handler@npm:2.1.10" dependencies: - "@smithy/abort-controller": "npm:^2.0.12" - "@smithy/protocol-http": "npm:^3.0.8" - "@smithy/querystring-builder": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/abort-controller": "npm:^2.0.14" + "@smithy/protocol-http": "npm:^3.0.10" + "@smithy/querystring-builder": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: aca079234edc6d8946df0408949af3eee0f862225e6ebafcd72123b96f087213e2a4f7bb71d6d6a21eebc78dae636f5c999c91700f7577c6ba61998f05b070ae + checksum: 22af345a37cdba4973d496654bd32ab01f5ec176d312b50e0ae44a27c4857b18729f3acc2517ecc78925f28592b05ae104963d963bb1517bb4bcec30bd0e0d4e languageName: node linkType: hard -"@smithy/property-provider@npm:^2.0.0, @smithy/property-provider@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/property-provider@npm:2.0.13" +"@smithy/property-provider@npm:^2.0.0, @smithy/property-provider@npm:^2.0.15": + version: 2.0.15 + resolution: "@smithy/property-provider@npm:2.0.15" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 5b9469d17e175e38aca6d2932140033252cdf515a225caf5c67fd506e2c7ef2e15dc880906f5c2a7437ce6583ec33a992a560e5ccf3c61d236d06360b0d0f299 + checksum: 672e7730ca541a95d74e1a698790aea7c5c64994eff941e7b932f6dd60a66aa8fa8e594f00710df94d9f8b4f34882f2ddaf93e349ef01d6bb30fe39d7ccfb38a languageName: node linkType: hard -"@smithy/protocol-http@npm:^3.0.8": - version: 3.0.8 - resolution: "@smithy/protocol-http@npm:3.0.8" +"@smithy/protocol-http@npm:^3.0.10, @smithy/protocol-http@npm:^3.0.8, @smithy/protocol-http@npm:^3.0.9": + version: 3.0.10 + resolution: "@smithy/protocol-http@npm:3.0.10" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 014df5fe50231434b5227b8359f31d925de77c581d576170b4d62fdd64cb3c24b35aeec636f229aba3cd303f32a12e0c1be3355af883dbe73f995e4b975ac0f7 + checksum: 8efbdad96105fd0c29abfd2396f0b1e9e08747b1275a8e147e0bbcdffdd95b6deb06ac8354bca9ba9c0b82a0bbb5b98b16331e0c5f87d069c515b04126c5c12f languageName: node linkType: hard -"@smithy/querystring-builder@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/querystring-builder@npm:2.0.12" +"@smithy/querystring-builder@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/querystring-builder@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" "@smithy/util-uri-escape": "npm:^2.0.0" tslib: "npm:^2.5.0" - checksum: e3ba93e7195b6240b052ff88833685f926ee14191880214bf7c073aae5315e4956b57762a96745e2bd2f1d2bc7f2fa66f797400a739fdde7c13bed83d2c56cdf + checksum: 7ee2ac4ea48a75a3e63af90bd3b8b3f508bae3b257a0037ba6e767e19b60536558cc0ee5a54761b413ada64b0c970fc01b063b8c2d22275a85a4572498a88798 languageName: node linkType: hard -"@smithy/querystring-parser@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/querystring-parser@npm:2.0.12" +"@smithy/querystring-parser@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/querystring-parser@npm:2.0.14" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: e491478c979fb26e2328c2b024c3961e28bd720d5bee6b670de021e81d12f0b02983e618773dc87289b5cdf80e68f988171d933aca9b6144d7d915dd3a1ef5ba + checksum: 19c3633ebc852b7ebfe28bfae4438b7f1d3e6bc998fd2c08ff99662f3127e5784905240395833202ed59051bf80505c78d93f34a3945f382d30847dee55cb449 languageName: node linkType: hard -"@smithy/service-error-classification@npm:^2.0.5": - version: 2.0.5 - resolution: "@smithy/service-error-classification@npm:2.0.5" +"@smithy/service-error-classification@npm:^2.0.7": + version: 2.0.7 + resolution: "@smithy/service-error-classification@npm:2.0.7" dependencies: - "@smithy/types": "npm:^2.4.0" - checksum: fcd3e267deecd03e532362fa92a571322e9cb8024e4333457cfd88e7afbe0c80f777a635f666a0bcfbb8b8ac2cf9206b8a327c9842ee068bd8dc56be82d4ab3c + "@smithy/types": "npm:^2.6.0" + checksum: 930c63fc88c6cc97a28dd13ae2d4a4bac41b2d6d61a84b99ab9005cccff665b126c264912d0a0250e3f3d9e152061b34df3323159f0bad7b47055dffd476bc06 languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^2.0.6, @smithy/shared-ini-file-loader@npm:^2.2.2": - version: 2.2.2 - resolution: "@smithy/shared-ini-file-loader@npm:2.2.2" +"@smithy/shared-ini-file-loader@npm:^2.0.6, @smithy/shared-ini-file-loader@npm:^2.2.5": + version: 2.2.5 + resolution: "@smithy/shared-ini-file-loader@npm:2.2.5" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: ee3b6a9b0f0433d3559b5c30ec90f85c60772f24791a1e08a9faea6772b6735469547182d3e91ac781a88a13d3923dd68f0947ef0b996ffeb0a8109eebfb1129 + checksum: 6dfc2d7146da7be5570c08709e4065d428573068d5863b7ddd481b6574c7e18e19ecfad8a0e01780c84bb1bdff38a1de56d7eff68b7a8c9797702c405aedceb9 languageName: node linkType: hard "@smithy/signature-v4@npm:^2.0.0": - version: 2.0.11 - resolution: "@smithy/signature-v4@npm:2.0.11" + version: 2.0.16 + resolution: "@smithy/signature-v4@npm:2.0.16" dependencies: - "@smithy/eventstream-codec": "npm:^2.0.11" + "@smithy/eventstream-codec": "npm:^2.0.14" "@smithy/is-array-buffer": "npm:^2.0.0" - "@smithy/types": "npm:^2.3.5" + "@smithy/types": "npm:^2.6.0" "@smithy/util-hex-encoding": "npm:^2.0.0" - "@smithy/util-middleware": "npm:^2.0.4" + "@smithy/util-middleware": "npm:^2.0.7" "@smithy/util-uri-escape": "npm:^2.0.0" - "@smithy/util-utf8": "npm:^2.0.0" + "@smithy/util-utf8": "npm:^2.0.2" tslib: "npm:^2.5.0" - checksum: 180ac8cb2721b8bfa7aec1e4f0f669e738bc1372202b8f962a9e566cf4e0faf79837a1c79e67dfa3d9b8a010cf99d110b6e7a31c07f41314dd3953ba49c7669e + checksum: d99bf7cdc1e4cb9a38bbc20c5fce285bc0b36be22a92f23c2f3fff217248c47f239e6a9bb41eea7d07a1f060a431691513e4f48887fad6ab51160bce2be03312 languageName: node linkType: hard -"@smithy/smithy-client@npm:^2.1.12": - version: 2.1.12 - resolution: "@smithy/smithy-client@npm:2.1.12" +"@smithy/smithy-client@npm:^2.1.12, @smithy/smithy-client@npm:^2.1.15, @smithy/smithy-client@npm:^2.1.16": + version: 2.1.16 + resolution: "@smithy/smithy-client@npm:2.1.16" dependencies: - "@smithy/middleware-stack": "npm:^2.0.6" - "@smithy/types": "npm:^2.4.0" - "@smithy/util-stream": "npm:^2.0.17" + "@smithy/middleware-stack": "npm:^2.0.8" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-stream": "npm:^2.0.21" tslib: "npm:^2.5.0" - checksum: 78ad4c65995bd5b7cf6a5d1b2d74e8aeab4e481a12890fb3fe7e6ffb0e11aeeb0c0e261c7f6c8a7814a5bb8802449934ee2d3bc37ea68d323f3187f13960a7c2 + checksum: daca467424bb742d64e077cb33cb9874c59aa11fa66d0e502aa6a453c85d7b1104056e388891fd4e954f832ff2bb14b267307e168ee974c92e1290fced49dcff languageName: node linkType: hard -"@smithy/types@npm:^2.3.5, @smithy/types@npm:^2.4.0": - version: 2.4.0 - resolution: "@smithy/types@npm:2.4.0" +"@smithy/types@npm:^2.4.0, @smithy/types@npm:^2.5.0, @smithy/types@npm:^2.6.0": + version: 2.6.0 + resolution: "@smithy/types@npm:2.6.0" dependencies: tslib: "npm:^2.5.0" - checksum: d8998f754c6ffbdb4de30914b1d03341a9bfa735694c6148eaa16fa2a566f66ebadcb1280987856cc1485310e1be9f36c9bbc290bb2ad94a24920471cf665e5e + checksum: 15e147838ab1997ef1a795b844f67e307c66fd8337d5ef9e17787a58b6a04ec0bd064b91f3fba5406f525e4205ca23ceb6c19aa7673777abcb3f6263b4e39b29 languageName: node linkType: hard -"@smithy/url-parser@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/url-parser@npm:2.0.12" +"@smithy/url-parser@npm:^2.0.12, @smithy/url-parser@npm:^2.0.13, @smithy/url-parser@npm:^2.0.14": + version: 2.0.14 + resolution: "@smithy/url-parser@npm:2.0.14" dependencies: - "@smithy/querystring-parser": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/querystring-parser": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 636e2548f7474552139738987bd165b80a7903ce8e20ee53101e67a955ba3a55ffcc62449c8f2a83bb6cde430d2c8d1c3f028293251cb2cd1453fd4726ae4142 + checksum: d379bfc899dc0130f46c20a1c6c75041d4d27bebbfd0f29a4d2978b524bb21fa4471133da283bff7002f8c41a7a26d385f4f264b602b7363cdba6a8308c5bbae languageName: node linkType: hard -"@smithy/util-base64@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-base64@npm:2.0.0" +"@smithy/util-base64@npm:^2.0.0, @smithy/util-base64@npm:^2.0.1": + version: 2.0.1 + resolution: "@smithy/util-base64@npm:2.0.1" dependencies: "@smithy/util-buffer-from": "npm:^2.0.0" tslib: "npm:^2.5.0" - checksum: 1e99afde11eea39c5400e89ae51e940bc4295d8823b4d362223f26c825bdb78b7f96df1834518f6484a272c6c44ac82ec49cb3fd5cf40108940133a208e6eedf + checksum: 6c71765396e7c36229f78b3ab7404d86390b4191350955b3af3ca6e3e42f67428801722706153f5593571be51f3b418843c49326d894cd4445eb9ed9a04844a7 languageName: node linkType: hard @@ -11005,31 +11588,42 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^2.0.16": - version: 2.0.16 - resolution: "@smithy/util-defaults-mode-browser@npm:2.0.16" +"@smithy/util-defaults-mode-browser@npm:^2.0.16, @smithy/util-defaults-mode-browser@npm:^2.0.19": + version: 2.0.20 + resolution: "@smithy/util-defaults-mode-browser@npm:2.0.20" dependencies: - "@smithy/property-provider": "npm:^2.0.13" - "@smithy/smithy-client": "npm:^2.1.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/property-provider": "npm:^2.0.15" + "@smithy/smithy-client": "npm:^2.1.16" + "@smithy/types": "npm:^2.6.0" bowser: "npm:^2.11.0" tslib: "npm:^2.5.0" - checksum: 388444a93ea53f386eb851816cd41ee4a7113461b03fa89eacc9ea98949330dfe82674e1c8b970f92aec07c0b775c93bda53faa43b89b4d350584fff5c9fc90a + checksum: 43f4f7a186f1a8fb7aeb0c6dbcde4d84c00edcc5ca9700500f003da9a02a89a913bd5ef6759a9eac9a7f8ce4400cf4827ffdba957f033051e989cca2306e7ee6 languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^2.0.21": - version: 2.0.21 - resolution: "@smithy/util-defaults-mode-node@npm:2.0.21" +"@smithy/util-defaults-mode-node@npm:^2.0.21, @smithy/util-defaults-mode-node@npm:^2.0.25": + version: 2.0.26 + resolution: "@smithy/util-defaults-mode-node@npm:2.0.26" dependencies: - "@smithy/config-resolver": "npm:^2.0.16" - "@smithy/credential-provider-imds": "npm:^2.0.18" - "@smithy/node-config-provider": "npm:^2.1.3" - "@smithy/property-provider": "npm:^2.0.13" - "@smithy/smithy-client": "npm:^2.1.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/config-resolver": "npm:^2.0.19" + "@smithy/credential-provider-imds": "npm:^2.1.2" + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/property-provider": "npm:^2.0.15" + "@smithy/smithy-client": "npm:^2.1.16" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: f0efa3e3517c88e59eab29097c753266d05483b8ba65651832c0799a8d8f4939b70a34e1eae5c50bad644065556a870e9cf00e5f7e85e92cc067a00c8d79adf7 + checksum: 5ef44082a7ddfe9994e3ecbba169bbfbf9ba7340b766edd1c7d31ad63a5adcbcabe9d22b3e53fe4238ce6527bf6fdeb44cc9fcef7812f8e8fbacde077a078086 + languageName: node + linkType: hard + +"@smithy/util-endpoints@npm:^1.0.4": + version: 1.0.5 + resolution: "@smithy/util-endpoints@npm:1.0.5" + dependencies: + "@smithy/node-config-provider": "npm:^2.1.6" + "@smithy/types": "npm:^2.6.0" + tslib: "npm:^2.5.0" + checksum: 65e97429d2e9e15465043a9227378555579e05a4be0d4835f82bed5a3ce795e3f51201f4f55ed3c89fa9bde250f36e858fb3cf62004294fddee54d01fe5647d8 languageName: node linkType: hard @@ -11042,40 +11636,40 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^2.0.4, @smithy/util-middleware@npm:^2.0.5": - version: 2.0.5 - resolution: "@smithy/util-middleware@npm:2.0.5" +"@smithy/util-middleware@npm:^2.0.5, @smithy/util-middleware@npm:^2.0.6, @smithy/util-middleware@npm:^2.0.7": + version: 2.0.7 + resolution: "@smithy/util-middleware@npm:2.0.7" dependencies: - "@smithy/types": "npm:^2.4.0" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 13dc6d8ee92131f79ea99f482e5e24ebe495d14846101d0fbc3726963c3a0f052440514b157311b57764ea2548e5cd43506d5b4353a024d51a01d358e56f1d9c + checksum: 053ee434d72d57c5629076adc42aad4357da7aab480f70fddda2b852205c4371465da450025d9719019c8e5900ff613b82332b6b050ea841d5f49dd060e135c6 languageName: node linkType: hard -"@smithy/util-retry@npm:^2.0.5": - version: 2.0.5 - resolution: "@smithy/util-retry@npm:2.0.5" +"@smithy/util-retry@npm:^2.0.5, @smithy/util-retry@npm:^2.0.6, @smithy/util-retry@npm:^2.0.7": + version: 2.0.7 + resolution: "@smithy/util-retry@npm:2.0.7" dependencies: - "@smithy/service-error-classification": "npm:^2.0.5" - "@smithy/types": "npm:^2.4.0" + "@smithy/service-error-classification": "npm:^2.0.7" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: 83019b0b926fc9bc7ec19392bbc386bcb56671e8c005b11769d6567f15dc5e3c89937be1b8eefcd782f3344cf04220752dff0e78666b00975e2e30d6ab5a2e4f + checksum: 6ee41e84d4b87f4bdbf7ee45666387b13723230b3a1c3b86f51988e0ca878fa89c068f6c12640d52e85a8c825565ebf658620ba9a158d61fb4a2d698ecb0c2d8 languageName: node linkType: hard -"@smithy/util-stream@npm:^2.0.17": - version: 2.0.17 - resolution: "@smithy/util-stream@npm:2.0.17" +"@smithy/util-stream@npm:^2.0.17, @smithy/util-stream@npm:^2.0.20, @smithy/util-stream@npm:^2.0.21": + version: 2.0.21 + resolution: "@smithy/util-stream@npm:2.0.21" dependencies: - "@smithy/fetch-http-handler": "npm:^2.2.4" - "@smithy/node-http-handler": "npm:^2.1.8" - "@smithy/types": "npm:^2.4.0" - "@smithy/util-base64": "npm:^2.0.0" + "@smithy/fetch-http-handler": "npm:^2.2.7" + "@smithy/node-http-handler": "npm:^2.1.10" + "@smithy/types": "npm:^2.6.0" + "@smithy/util-base64": "npm:^2.0.1" "@smithy/util-buffer-from": "npm:^2.0.0" "@smithy/util-hex-encoding": "npm:^2.0.0" - "@smithy/util-utf8": "npm:^2.0.0" + "@smithy/util-utf8": "npm:^2.0.2" tslib: "npm:^2.5.0" - checksum: 3d55c712db1d0ccd6da40460c80e5c90e481f94520d24d6acdd1d4fa03f2939c767d81b72a6ce6c2b1c3ca5237003e86e80a12e293f4a84a973e5c82f477e7c1 + checksum: 69fe2403f1d32fd7aa9a5a71f0638b31e5aed870c5fa0b15dbf6fabb11e068e9a6c5bc85629a40b5822e521355de57e76ebee022db947120670ea96f65990cee languageName: node linkType: hard @@ -11088,24 +11682,24 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-utf8@npm:2.0.0" +"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.0.2": + version: 2.0.2 + resolution: "@smithy/util-utf8@npm:2.0.2" dependencies: "@smithy/util-buffer-from": "npm:^2.0.0" tslib: "npm:^2.5.0" - checksum: 43c924be7883287937d91a1f042196b1e7f9400e9114759c2ac5b4fedb6756063faf2e684b153a96573b0039b745c196968ce53ae9f38a2aeb690ad0c3c27ea8 + checksum: 9356200ac7ccef414cd924b4fd2bfeb1d0a2e7992b4c924f0328205ab9bb8c688bc4b5c271c237db90ea75fb448f32c1f76c6e8883c2f088ea0559737ea99d9d languageName: node linkType: hard -"@smithy/util-waiter@npm:^2.0.12": - version: 2.0.12 - resolution: "@smithy/util-waiter@npm:2.0.12" +"@smithy/util-waiter@npm:^2.0.12, @smithy/util-waiter@npm:^2.0.13": + version: 2.0.14 + resolution: "@smithy/util-waiter@npm:2.0.14" dependencies: - "@smithy/abort-controller": "npm:^2.0.12" - "@smithy/types": "npm:^2.4.0" + "@smithy/abort-controller": "npm:^2.0.14" + "@smithy/types": "npm:^2.6.0" tslib: "npm:^2.5.0" - checksum: bc5a5d1ce240d235e143f820dd3527ffa57f7b37248e1b3e0415a06c8c79e33b9b89358b8f0a70a5f3c97186e2d6e26c7693c5c70e0d1af8c4cbd526d2b44452 + checksum: 782143eb2c622787bea4ef485b872fc4726d3aee83150607bb726a717de920833645ae5ecc58edd8d7101f6c6a5632e23272d5892eca9a93d53dcb9a72b1dccd languageName: node linkType: hard @@ -11136,18 +11730,18 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:7.4.6, @storybook/addon-actions@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-actions@npm:7.4.6" +"@storybook/addon-actions@npm:7.5.3, @storybook/addon-actions@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-actions@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" polished: "npm:^4.2.2" @@ -11164,22 +11758,22 @@ __metadata: optional: true react-dom: optional: true - checksum: 1f117d4035d6f9598f06eebe035d931274f58903349de150b7dafe348486ad4f4fff1f8248b99ed0f1763a128ad1678490ef64ed02f2b30677a0ae0ff27febd1 + checksum: c98c63334d7c7bd8668ee5d88320fbd6f7b7a7a61ab873ec7a01b36a8180c43877900a561c2c5e7ee6af74cb41f6704b27829e379fa6f4d0dc65d879753f55fd languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-backgrounds@npm:7.4.6" +"@storybook/addon-backgrounds@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-backgrounds@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" memoizerific: "npm:^1.11.3" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -11190,24 +11784,24 @@ __metadata: optional: true react-dom: optional: true - checksum: ae0e0c00c4d1bd00981a561dd1d9f96b3910ce801098ea3b98b3ce797aae97369ff368bfd635e857f2130275e18ac4305f00aeeb773a7dfb5f13051ca3a9c4fe + checksum: 2cd6dc41c6531d9e6ade1a1ec8a310a251ee12be66435fc5f6c5c011f405b1801a65bcbd67a72df0103cfa1f75650a39ca455c13aaf643f5a5482434227a99fe languageName: node linkType: hard -"@storybook/addon-controls@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-controls@npm:7.4.6" +"@storybook/addon-controls@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-controls@npm:7.5.3" dependencies: - "@storybook/blocks": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/blocks": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" lodash: "npm:^4.17.21" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -11218,29 +11812,29 @@ __metadata: optional: true react-dom: optional: true - checksum: 51b4f2a5323fd1ebe11739e703deee1e1b7293721da7bd405e50706bf761eaf6372b169bf9bfeab868c804c493f9f05a1ce7609b675938180f27b8b119c1b77d + checksum: 818adf6158c4f4cf9dbb78247ae9796b0b478ad18ace39b0e71142cf10aaf59be4d000070aae6e22b9645f3903aa93803be2227ae12a57cf75ed493a1976a6aa languageName: node linkType: hard -"@storybook/addon-docs@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-docs@npm:7.4.6" +"@storybook/addon-docs@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-docs@npm:7.5.3" dependencies: "@jest/transform": "npm:^29.3.1" "@mdx-js/react": "npm:^2.1.5" - "@storybook/blocks": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/csf-plugin": "npm:7.4.6" - "@storybook/csf-tools": "npm:7.4.6" + "@storybook/blocks": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/csf-plugin": "npm:7.5.3" + "@storybook/csf-tools": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" "@storybook/mdx2-csf": "npm:^1.0.0" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/postinstall": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/react-dom-shim": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/postinstall": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/react-dom-shim": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" fs-extra: "npm:^11.1.0" remark-external-links: "npm:^8.0.0" remark-slug: "npm:^6.0.0" @@ -11248,60 +11842,60 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 44d726c6389d5423523eb9a648e2ab8522e28009a380fce57512ec0d18bb94788cf1b98b68a466365e686544faea09d275fff58e52d484320d387916f038a57a + checksum: 94923d1f9350ab87907848656fc4741b744909fc5397fdf72f0cecba33a2bd7993b8229a9da22c3b57dd1e213f0b1f41f17579aeb2c33ae34c1bdae98de9082f languageName: node linkType: hard -"@storybook/addon-essentials@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-essentials@npm:7.4.6" +"@storybook/addon-essentials@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-essentials@npm:7.5.3" dependencies: - "@storybook/addon-actions": "npm:7.4.6" - "@storybook/addon-backgrounds": "npm:7.4.6" - "@storybook/addon-controls": "npm:7.4.6" - "@storybook/addon-docs": "npm:7.4.6" - "@storybook/addon-highlight": "npm:7.4.6" - "@storybook/addon-measure": "npm:7.4.6" - "@storybook/addon-outline": "npm:7.4.6" - "@storybook/addon-toolbars": "npm:7.4.6" - "@storybook/addon-viewport": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" + "@storybook/addon-actions": "npm:7.5.3" + "@storybook/addon-backgrounds": "npm:7.5.3" + "@storybook/addon-controls": "npm:7.5.3" + "@storybook/addon-docs": "npm:7.5.3" + "@storybook/addon-highlight": "npm:7.5.3" + "@storybook/addon-measure": "npm:7.5.3" + "@storybook/addon-outline": "npm:7.5.3" + "@storybook/addon-toolbars": "npm:7.5.3" + "@storybook/addon-viewport": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" ts-dedent: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 163657bf4a5f8079f55ca245c997b06565f9aa4a343918f8677f08cbab87a9a7807df6c146730d8ca29a6349652223130a81dbc6c56c951c27693de6113d0438 + checksum: b3e0b317c7f24885ca997960a55ed5e09fa9d0c0a9d8ada0ac30914c6ffd2ab5d71e95a5c54e697674fa6cb90e53c5a90616a13ce2e402f8ceb98b881edc90be languageName: node linkType: hard -"@storybook/addon-highlight@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-highlight@npm:7.4.6" +"@storybook/addon-highlight@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-highlight@npm:7.5.3" dependencies: - "@storybook/core-events": "npm:7.4.6" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.4.6" - checksum: 95d6a9d7e465c133682bac3dd541f4dfd007cedf604e44c8a536c1559a4e1a57f99940678e6f7aa766cb2fa3d65172454606bfc8f91f49cf0e7a383924889f86 + "@storybook/preview-api": "npm:7.5.3" + checksum: 3f066154a6c1d89b1ffdf97a4fe64491e6a977ff21857f70e10fa64d279943a65993b5edee51595eb1995ab2425cbc6f15638ccb93b80180b66f181cfc0569c7 languageName: node linkType: hard -"@storybook/addon-interactions@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-interactions@npm:7.4.6" +"@storybook/addon-interactions@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-interactions@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/instrumenter": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/instrumenter": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" jest-mock: "npm:^27.0.6" polished: "npm:^4.2.2" ts-dedent: "npm:^2.2.0" @@ -11313,22 +11907,22 @@ __metadata: optional: true react-dom: optional: true - checksum: 529ac4e509f971e46e844d7a7376e7b203c7995de2f80e463b75649086164ef98bd02ac8095874988f49879a57b7db614cef8ad5dc2d29c5cfe26560dfb05415 + checksum: e2da11748d3866043690afc9192e66fd3d3c1766967f094e7633333520dc45299ca30ad7cf5c261ed8250da39439f9ee628ecaa6541be84a65291047600f0733 languageName: node linkType: hard -"@storybook/addon-links@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-links@npm:7.4.6" +"@storybook/addon-links@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-links@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/router": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/router": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" prop-types: "npm:^15.7.2" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -11339,21 +11933,21 @@ __metadata: optional: true react-dom: optional: true - checksum: dfbe79fdf95a3c496d439c159fa38ffd1f5d42d66d5aea81653514bc3a8f2a05d28a049a1fc1de6d1c9c35adf9c8fbd79137d2ca3d061e8ffa496acf130f0f7f + checksum: 8917d4e3f75f032e595a9a4980a1f68b5490d0bca73fa661654fc1dd9775fb321635a936ce69e2065b7169e35fb338ef84c71e811d9a883b60b7304fbe8cf4cb languageName: node linkType: hard -"@storybook/addon-measure@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-measure@npm:7.4.6" +"@storybook/addon-measure@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-measure@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" tiny-invariant: "npm:^1.3.1" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11363,21 +11957,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 023fbba8b4a710f18ac93c18cd4ca8d6c4f43113add9f405195cbcc40d420a3a205d6bcfa50d989247532119a466637618032403e318a8616b11dc7787cb7a57 + checksum: daf0b3e536714c834f3b9f418783b58bcad68334d065c3ce88a4c41bd8e91fd46b103400b803ee5f771dfaa2cafc172168ae359eb6616aee5119779c826af316 languageName: node linkType: hard -"@storybook/addon-outline@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-outline@npm:7.4.6" +"@storybook/addon-outline@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-outline@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" ts-dedent: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11387,21 +11981,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 8b8d6dcc3b3d7bd560d3a16d0dd0163282df86c3432e4aaa97e4684a02615ea58e1f1776d255695431851f797abb1b5364b389203e57e4493155d733a9fc4516 + checksum: d3232cee9875bd7243cd07d693f36790dc5372c00e9bba310fd54c51a94cdf8a8bf9cf15f55bb24806383d186151531e1d82c10836c666409bade957c915f3b1 languageName: node linkType: hard -"@storybook/addon-storysource@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-storysource@npm:7.4.6" +"@storybook/addon-storysource@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-storysource@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/router": "npm:7.4.6" - "@storybook/source-loader": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/router": "npm:7.5.3" + "@storybook/source-loader": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" estraverse: "npm:^5.2.0" prop-types: "npm:^15.7.2" react-syntax-highlighter: "npm:^15.5.0" @@ -11414,19 +12008,19 @@ __metadata: optional: true react-dom: optional: true - checksum: 05ef284e053a853af3f0c116dcecccacc882e6e6e7b2a5524655b07032b9ea4afc980070e7b2fb73e650460e512fc674d6e43ff800564fdc45402e09b07b814b + checksum: a6bf566e63567f1e30406f355b4a08e9dd6d5e93618bf3701a29b8706379398f1eb2e03184ec58f1c8133a1de86d26dd26e66d2d012f2f84dc543031a8344437 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-toolbars@npm:7.4.6" +"@storybook/addon-toolbars@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-toolbars@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11435,21 +12029,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 0fe933b901812c8c93efe215d654dea803f0dcb5a56bfbd8a1d41159011bbafb47e3447235c70e40ce38a32b853754df313baf3dff794997c9f041d435c9cbc8 + checksum: 75af8111b5efddd75a10d6bdacb5a74184ecb0926ea3e0ccd36a3794b26dafca59d2443c29199a5fac4e6121904cccaa3e66096034b771a987e457b923a317b2 languageName: node linkType: hard -"@storybook/addon-viewport@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/addon-viewport@npm:7.4.6" +"@storybook/addon-viewport@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/addon-viewport@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" memoizerific: "npm:^1.11.3" prop-types: "npm:^15.7.2" peerDependencies: @@ -11460,30 +12054,30 @@ __metadata: optional: true react-dom: optional: true - checksum: fe31b56240dd3a809dc5e4fd7b37a0240dba98fa745388c1bd03efee5ba169043a82ab1ca2024b81fd9170ea3ba30556c8165e2752d4e36f6d703b2b4917c9d7 + checksum: fad017ff48446e8430bc876a06e23d52d935c69ab657d4e439965ebb3bd7121031c354258976ab92a8a5b33ab54bbdb1bcca92b6c6c8958217e6b269bcdc8e3d languageName: node linkType: hard "@storybook/addons@npm:^7.0.0": - version: 7.4.6 - resolution: "@storybook/addons@npm:7.4.6" + version: 7.5.3 + resolution: "@storybook/addons@npm:7.5.3" dependencies: - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 97bf45cf81b78102a55b5b2da3d37525d6ba58a2fc2fe4140fdcd9307c3296912b13f91fc64a22dcefea677be5c910f7e0d9f89473d586586580148e4f7ad181 + checksum: 9e620e538d9d3c055a34f2a58c1ccc4fa338297a243414b4467ccfb6f9bba097c126fbe8e2e0810fc38ae29c75c0ac063c59f56422f5e30314471bcaec10b3a0 languageName: node linkType: hard "@storybook/api@npm:^7.0.0": - version: 7.4.6 - resolution: "@storybook/api@npm:7.4.6" + version: 7.5.3 + resolution: "@storybook/api@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/manager-api": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/manager-api": "npm:7.5.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11492,25 +12086,25 @@ __metadata: optional: true react-dom: optional: true - checksum: 4e2121623146b8699be8eaf9f703c9c699f47a5c76abea9143a7ea5b8678a3cf11a4b277d72d953aa36a4ec9630ccb45c39909b7812b5331f7769b8a438f1972 + checksum: 14c28a8564811001d82e2e8c4c2be0120d181bae9d8ad278c3b60f01d28857bcdf6e84c9c57d3efa1335173635346a212fac36d9cfb441622c0c556417b3e71d languageName: node linkType: hard -"@storybook/blocks@npm:7.4.6, @storybook/blocks@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/blocks@npm:7.4.6" +"@storybook/blocks@npm:7.5.3, @storybook/blocks@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/blocks@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/components": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/components": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" - "@storybook/docs-tools": "npm:7.4.6" + "@storybook/docs-tools": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager-api": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/lodash": "npm:^4.14.167" color-convert: "npm:^2.0.1" dequal: "npm:^2.0.2" @@ -11526,18 +12120,18 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 01896cd6fd227ca5c9fb2586799a8057b3ce15e046dd82ac40e8177d8ff5e9e84465b3052cce848bb800f3b5c89b6d24dbbe419865c8d10e5db74786ab7b31ef + checksum: 68d981f833a44bd35a3ca9b97bc9db8e25b9961fcc9b81ef490aaee69c7dfcf9f745d9a98226985bd1daa9ee14c9a9fed8bf4002c5c4d9f3996a97f9d7bd3047 languageName: node linkType: hard -"@storybook/builder-manager@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/builder-manager@npm:7.4.6" +"@storybook/builder-manager@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/builder-manager@npm:7.5.3" dependencies: "@fal-works/esbuild-plugin-global-externals": "npm:^2.1.2" - "@storybook/core-common": "npm:7.4.6" - "@storybook/manager": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" + "@storybook/core-common": "npm:7.5.3" + "@storybook/manager": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" "@types/ejs": "npm:^3.1.1" "@types/find-cache-dir": "npm:^3.2.1" "@yarnpkg/esbuild-plugin-pnp": "npm:^3.0.0-rc.10" @@ -11550,23 +12144,22 @@ __metadata: fs-extra: "npm:^11.1.0" process: "npm:^0.11.10" util: "npm:^0.12.4" - checksum: 04bb70f3813002372cc5996e9c751c3b6f59c9871b70dd23b0b2cdefd50bb4abed0ad15ad751cbb1fefcf4926713e1e5d9389c220c39df031ca3a063128c592d + checksum: 1fb537b6be2a978be23b7a187a0756e6ae350c50083177a360dbcbe66374ef70334835086fbd3af5cba37dc6004962ccca773f413c5fc4bfb940839ed646d444 languageName: node linkType: hard -"@storybook/builder-vite@npm:7.4.6, @storybook/builder-vite@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/builder-vite@npm:7.4.6" +"@storybook/builder-vite@npm:7.5.3, @storybook/builder-vite@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/builder-vite@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/csf-plugin": "npm:7.4.6" - "@storybook/mdx2-csf": "npm:^1.0.0" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/preview": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/csf-plugin": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/preview": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/find-cache-dir": "npm:^3.2.1" browser-assert: "npm:^1.2.1" es-module-lexer: "npm:^0.9.3" @@ -11574,13 +12167,11 @@ __metadata: find-cache-dir: "npm:^3.0.0" fs-extra: "npm:^11.1.0" magic-string: "npm:^0.30.0" - remark-external-links: "npm:^8.0.0" - remark-slug: "npm:^6.0.0" rollup: "npm:^2.25.0 || ^3.3.0" peerDependencies: "@preact/preset-vite": "*" typescript: ">= 4.3.x" - vite: ^3.0.0 || ^4.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 vite-plugin-glimmerx: "*" peerDependenciesMeta: "@preact/preset-vite": @@ -11589,40 +12180,40 @@ __metadata: optional: true vite-plugin-glimmerx: optional: true - checksum: 74f92796defef56b24b43a51aa1ab223705b5e9b9735ebe7c62cc8d2df55155a160ae12644e4542b30153ed03afaf6282935a5dbf9157d7ef2ae104c10e3c3f9 + checksum: 32e2d580d0bb73dba3c91c074ab92236f5239f20a3e0e2a5dc5316a42be9cf950bb32acd62cc8c6f1331d33ceebfc31ddd467a78c2f34cea8e0cdba32b4ac876 languageName: node linkType: hard -"@storybook/channels@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/channels@npm:7.4.6" +"@storybook/channels@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/channels@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" qs: "npm:^6.10.0" telejson: "npm:^7.2.0" tiny-invariant: "npm:^1.3.1" - checksum: 51ac0ba3207e48e785d48dcac3b24dd6bf414cdb0a139ed153c4121fb10a1ba8c90085ba3399f8954cba869321d6aee3399c5f85741dfd0091f9f6c7f7611ce8 + checksum: d8268a646c33eefd5498e99c4f7cdcfac19d8eef212a689ac6284e122770ddf01b3fe859d4e6ebb5eb0ac35d427e0532d955b7948d4118c9abf2d796794b4b19 languageName: node linkType: hard -"@storybook/cli@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/cli@npm:7.4.6" +"@storybook/cli@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/cli@npm:7.5.3" dependencies: "@babel/core": "npm:^7.22.9" "@babel/preset-env": "npm:^7.22.9" "@babel/types": "npm:^7.22.5" "@ndelangen/get-tarball": "npm:^3.0.7" - "@storybook/codemod": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" - "@storybook/core-server": "npm:7.4.6" - "@storybook/csf-tools": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/telemetry": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/codemod": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" + "@storybook/core-server": "npm:7.5.3" + "@storybook/csf-tools": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/telemetry": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/semver": "npm:^7.3.4" "@yarnpkg/fslib": "npm:2.10.3" "@yarnpkg/libzip": "npm:2.3.0" @@ -11655,30 +12246,30 @@ __metadata: bin: getstorybook: ./bin/index.js sb: ./bin/index.js - checksum: a221585ea9d2e8c0c5d598c18713aef67dc76765fb6a56e2387e6c1ffd65f4ccaab10c5b4af1a89f0f74a92eeb11ade17f64ed436151215f03f71e14ce46cafa + checksum: 07dcd8e96ea2e6b42a3c1fea7c030a3cfd36bc5ce88bc3c356a36e8fc928f972ba73aa34f2f00c1dfefd1bb51497342e492fb41cdc745606ab48668f9e1aed21 languageName: node linkType: hard -"@storybook/client-logger@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/client-logger@npm:7.4.6" +"@storybook/client-logger@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/client-logger@npm:7.5.3" dependencies: "@storybook/global": "npm:^5.0.0" - checksum: d15bb15d94bb6dd59b5ad24edb28c3d2b216cd90033e9428c939330d4b31df5ea59b9397f304a4d0ebac1cc4a8363c13503450786d0792e341d49fff4525c1de + checksum: 5a33ceb276125bd324f21ad974c91e56e9320a02864e1e7419fb9eb37f08c4817e1ae4c0fbdf30d20b63df07f73631ad350f0fbe45b27491f7c82b253e58278a languageName: node linkType: hard -"@storybook/codemod@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/codemod@npm:7.4.6" +"@storybook/codemod@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/codemod@npm:7.5.3" dependencies: "@babel/core": "npm:^7.22.9" "@babel/preset-env": "npm:^7.22.9" "@babel/types": "npm:^7.22.5" "@storybook/csf": "npm:^0.1.0" - "@storybook/csf-tools": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/csf-tools": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/cross-spawn": "npm:^6.0.2" cross-spawn: "npm:^7.0.3" globby: "npm:^11.0.2" @@ -11686,55 +12277,55 @@ __metadata: lodash: "npm:^4.17.21" prettier: "npm:^2.8.0" recast: "npm:^0.23.1" - checksum: 8b47ed177a4d1895b549a922aa0caa49ab4fe01f042c594808f1e54231aeb8b7ecd8d43f9146cc7bbbd10d7e3d0a747f0c9b2d830d4567da38740ebbccbdf2cb + checksum: d927a373939386812c33ee1d71e8447fcc0424c91861259ce005806815d8dfc99d493f280d36bbe321e61a88680f1b5f4fbd2b7f674d2c4fa451555c5d427ea5 languageName: node linkType: hard -"@storybook/components@npm:7.4.6, @storybook/components@npm:^7.0.0": - version: 7.4.6 - resolution: "@storybook/components@npm:7.4.6" +"@storybook/components@npm:7.5.3, @storybook/components@npm:^7.0.0": + version: 7.5.3 + resolution: "@storybook/components@npm:7.5.3" dependencies: "@radix-ui/react-select": "npm:^1.2.2" "@radix-ui/react-toolbar": "npm:^1.0.4" - "@storybook/client-logger": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" memoizerific: "npm:^1.11.3" use-resize-observer: "npm:^9.1.0" util-deprecate: "npm:^1.0.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: eb5bea6a13963a693c2dc0b4339a42914d9076c55a9b13c8d64547cf9b12e4b22ca805c474a3acd8de3e323296265c126c42bd80eb03008b312feacde03a2b4a + checksum: 1f7e1e417a16add1ebe574ddc58c1ab4ef063c09d75798ad5b3da9b09b2df3a3b075bb7274b037279d71e0d80b5d11c7566415ccac3c697a6d3f890f12cc59a3 languageName: node linkType: hard -"@storybook/core-client@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/core-client@npm:7.4.6" +"@storybook/core-client@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/core-client@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - checksum: de12826db46b596c4dc062fe37be3c6c4749e30abef51dde91180290998b37dd35ff4cb016d584bbe52372ce96333e214d435d88562e2c0681eafd63fa4936e2 + "@storybook/client-logger": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + checksum: 28677d292551c18094eb3045b773555ba843747ffe08fc4659f20acc273b3fd62e9b32bc186baad8320bb4147505884ee6141ce1db8bccc02a58b00de955e69c languageName: node linkType: hard -"@storybook/core-common@npm:7.4.6, @storybook/core-common@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": - version: 7.4.6 - resolution: "@storybook/core-common@npm:7.4.6" +"@storybook/core-common@npm:7.5.3, @storybook/core-common@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": + version: 7.5.3 + resolution: "@storybook/core-common@npm:7.5.3" dependencies: - "@storybook/core-events": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/core-events": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/find-cache-dir": "npm:^3.2.1" - "@types/node": "npm:^16.0.0" + "@types/node": "npm:^18.0.0" "@types/node-fetch": "npm:^2.6.4" "@types/pretty-hrtime": "npm:^1.0.0" chalk: "npm:^4.1.0" esbuild: "npm:^0.18.0" - esbuild-register: "npm:^3.4.0" + esbuild-register: "npm:^3.5.0" file-system-cache: "npm:2.3.0" find-cache-dir: "npm:^3.0.0" find-up: "npm:^5.0.0" @@ -11748,40 +12339,40 @@ __metadata: pretty-hrtime: "npm:^1.0.3" resolve-from: "npm:^5.0.0" ts-dedent: "npm:^2.0.0" - checksum: 83c1fafbab929e0645ee843cd0e556f307c5232b06ce65a975c7462707e68db6989c8515c9f75f47d8e1462e88c7b7fef2cf88b922f3a71256efb034b5a5248e + checksum: 9c76da72bdac62f0828975a08f7a4b304085b82877f5af2244a32208971f92c70bd23f8436a6e471b6f7b633bb430d2c2abf2c48e700c62eeaa71733d6ee52c1 languageName: node linkType: hard -"@storybook/core-events@npm:7.4.6, @storybook/core-events@npm:^7.0.0": - version: 7.4.6 - resolution: "@storybook/core-events@npm:7.4.6" +"@storybook/core-events@npm:7.5.3, @storybook/core-events@npm:^7.0.0": + version: 7.5.3 + resolution: "@storybook/core-events@npm:7.5.3" dependencies: ts-dedent: "npm:^2.0.0" - checksum: f7275a35f09acf26bb2ced1d7bc8ec075d53f0edfac4cc9840fa9c9f00caae5eae00e2b815d0fa496512b2dd87e7b46d38d66edb321de26366fabd7ae4b7ba70 + checksum: a48dac4c1f8ae2fd3995f02e1ab485ebcb1e21c3abaf96fde396acf88570ec3463d2bde1a3d05718847f7fbeffb70cff7cba3311545dca3c0937e55f4a7a34e6 languageName: node linkType: hard -"@storybook/core-server@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/core-server@npm:7.4.6" +"@storybook/core-server@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/core-server@npm:7.5.3" dependencies: "@aw-web-design/x-default-browser": "npm:1.4.126" "@discoveryjs/json-ext": "npm:^0.5.3" - "@storybook/builder-manager": "npm:7.4.6" - "@storybook/channels": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/builder-manager": "npm:7.5.3" + "@storybook/channels": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" - "@storybook/csf-tools": "npm:7.4.6" + "@storybook/csf-tools": "npm:7.5.3" "@storybook/docs-mdx": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/manager": "npm:7.4.6" - "@storybook/node-logger": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/telemetry": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/manager": "npm:7.5.3" + "@storybook/node-logger": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/telemetry": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/detect-port": "npm:^1.3.0" - "@types/node": "npm:^16.0.0" + "@types/node": "npm:^18.0.0" "@types/pretty-hrtime": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" better-opn: "npm:^3.0.2" @@ -11806,34 +12397,34 @@ __metadata: util-deprecate: "npm:^1.0.2" watchpack: "npm:^2.2.0" ws: "npm:^8.2.3" - checksum: feb74c39cd3d25f0aeb05f94cfddefcc19a77360f2a89fc6b16d626fbf6da010140d21bae150601f4e8b1307260478a8bd5e505be9e117eee745c6ffccec125b + checksum: 96e8a4c7a21778f0f8e86abcde9d990362e240e6bb2d18950f2d5a0f3a2b09a02df7093feec8e9c5d5be59dc23d8e7eb1de0ca1c5de8cc9bc33357ef3fb45954 languageName: node linkType: hard -"@storybook/csf-plugin@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/csf-plugin@npm:7.4.6" +"@storybook/csf-plugin@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/csf-plugin@npm:7.5.3" dependencies: - "@storybook/csf-tools": "npm:7.4.6" + "@storybook/csf-tools": "npm:7.5.3" unplugin: "npm:^1.3.1" - checksum: 591b5600964038884ca09b32daeb541dd2f39b6f3c02756ccc569e93699227a717ee3d59e4ecd12a423d20ba3db6b470258af3eb1539b1ede27831f68b94a8d5 + checksum: 3252d8834e60b73fcb81601035e48b3847a1fdbef6ccce040b2685b100ca37c9faee4789124367c97e0a4cc018db323aa4f639ca1200b7921ef450276dd5d60e languageName: node linkType: hard -"@storybook/csf-tools@npm:7.4.6, @storybook/csf-tools@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": - version: 7.4.6 - resolution: "@storybook/csf-tools@npm:7.4.6" +"@storybook/csf-tools@npm:7.5.3, @storybook/csf-tools@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": + version: 7.5.3 + resolution: "@storybook/csf-tools@npm:7.5.3" dependencies: "@babel/generator": "npm:^7.22.9" "@babel/parser": "npm:^7.22.7" "@babel/traverse": "npm:^7.22.8" "@babel/types": "npm:^7.22.5" "@storybook/csf": "npm:^0.1.0" - "@storybook/types": "npm:7.4.6" + "@storybook/types": "npm:7.5.3" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.1" ts-dedent: "npm:^2.0.0" - checksum: 33a3331378f0c8332243e4f723e812004a72092c68c00a270be3ab3e23156435b84de388c0715f72cbb35e31b51dc89bb7b6ff16d8a61d826af4a9c3d4f5d354 + checksum: a6adc7f66ebd5ab39172c651587a8cf6efbeddf5ff82fb49494b7b1f090dde6f2fd30581bf236c88225ca480ba028ddbf2d06d68724b60daab475f58df51b8cc languageName: node linkType: hard @@ -11853,17 +12444,17 @@ __metadata: languageName: node linkType: hard -"@storybook/docs-tools@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/docs-tools@npm:7.4.6" +"@storybook/docs-tools@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/docs-tools@npm:7.5.3" dependencies: - "@storybook/core-common": "npm:7.4.6" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/core-common": "npm:7.5.3" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/doctrine": "npm:^0.0.3" doctrine: "npm:^3.0.0" lodash: "npm:^4.17.21" - checksum: b073126838b03e25288e706bd4d4c4485d45e83922c287ad5ebf512a628afd0dce66ecc6c8b895f3663f429edcd9dc7f26b8d43725110fe7873a2298a2ebcd5a + checksum: f388cf81c01a2d9728346a5955e4e4017665b667729d0d8cc05c9f4c42c249e76fa9c7918e660a2ffa041ed1b71b2a901f497d5f95f129b120abf9401b8162af languageName: node linkType: hard @@ -11883,16 +12474,16 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/instrumenter@npm:7.4.6" +"@storybook/instrumenter@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/instrumenter@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.4.6" - checksum: f49e3f9eb32b2fe9cecd050221ad9129c7dadc094e3d4d74a051dab140d1e552f1eec670666001c93c8cdcf0cc61b82f9d222d838d0f4e3fbc122e67bf849b7a + "@storybook/preview-api": "npm:7.5.3" + checksum: 58a0961538dd0a08dff03eea854b8848ab557dfd71ef316d2faa64b002e572eb5ae01419283519fdc56f410c5cb221a134643cea91c1dfbe180bc6ba33dded0a languageName: node linkType: hard @@ -11908,18 +12499,18 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-api@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/manager-api@npm:7.4.6" +"@storybook/manager-api@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/manager-api@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/router": "npm:7.4.6" - "@storybook/theming": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/router": "npm:7.5.3" + "@storybook/theming": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" memoizerific: "npm:^1.11.3" @@ -11930,14 +12521,14 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 55b2e704f94fd9075d070f7d856bcd044bd9266acb557c04ea6b81d572303d45f7abb2e6f033de05077fccc0ec9ff21325b52b7ab3d48248a399ca90234331da + checksum: 9806bc02d8575a8b5c5e9b31d12478f67ca7a4150330c7237b11395882cf9449e3d6100ddcf4f18cbb1f1e00af331bb9175a1a698e6eaf1d2bcf65a9eacae6dd languageName: node linkType: hard -"@storybook/manager@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/manager@npm:7.4.6" - checksum: 4c9b1f2e49490423dfc35323fc48dce31b6b5d1b596af98056d7827320523b5deb9759199b4ff633e347dcb3cfc06f34504a76d8173330724b7b6e22b209fba6 +"@storybook/manager@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/manager@npm:7.5.3" + checksum: fb89da17538107985352ed33d286c3546eb2e9f290165b40c818de00fa9f0e86ad7979890573566a446f082bd876a91ce318e58e56657df0bfea7351331b75b2 languageName: node linkType: hard @@ -11948,30 +12539,30 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/node-logger@npm:7.4.6" - checksum: cbceff3b8afe4db7a482e2c1fce237938b99391eccd12636c8d3894cf3d1bae5d33eecd5eb99344071b8e3185e4ff8fe3f0c1207b674a7344fba7156f454138f +"@storybook/node-logger@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/node-logger@npm:7.5.3" + checksum: 93a41db101d38c8682ced9f1b3ce2ae78d5feb3583e08f5527312f2b3d4babeabd4af66a29f1e64a9e6e9c5744f7e6a68295486524cd325a3f5b16db4d084709 languageName: node linkType: hard -"@storybook/postinstall@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/postinstall@npm:7.4.6" - checksum: a73257512028364a657c0588fa1e0fe44e88a24c507b109fbcbf6cf70c63f0f9b4cda37fb58add40fadec6c5b094aa6567d22c235c241e592a62f98e61f451cc +"@storybook/postinstall@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/postinstall@npm:7.5.3" + checksum: c9440e0c2e5f53b0ee7655717c67a52d5208acaf822ff6615e83b9babb7c0a4f3598d44ec1b7ce0781e4730e4112d88be2c6f930a772c2dca1ae7edd8d6da99f languageName: node linkType: hard -"@storybook/preview-api@npm:7.4.6, @storybook/preview-api@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": - version: 7.4.6 - resolution: "@storybook/preview-api@npm:7.4.6" +"@storybook/preview-api@npm:7.5.3, @storybook/preview-api@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": + version: 7.5.3 + resolution: "@storybook/preview-api@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-events": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-events": "npm:7.5.3" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/types": "npm:7.4.6" + "@storybook/types": "npm:7.5.3" "@types/qs": "npm:^6.9.5" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" @@ -11980,61 +12571,60 @@ __metadata: synchronous-promise: "npm:^2.0.15" ts-dedent: "npm:^2.0.0" util-deprecate: "npm:^1.0.2" - checksum: ad839afe2e7bdafef80ed9cc082c59bc3b60925c8a98761f3ec467757b781a943973885cafcc94f06a5bb88a715f299965055d9ca7901be588fc7c25e21fafb5 + checksum: e8b23e58624f01f0b644b2faeddd1a9d7309ca5069fd5e5e38c6e22c805bc145019ac84ce19c2ad8ec28b430bdb18fe10c2880dd763e450fad9b9bb417526d31 languageName: node linkType: hard -"@storybook/preview@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/preview@npm:7.4.6" - checksum: fc9f6558a650a2d98849195b6f42a72d7ff57272ed84097082af1b022d214ed23d69f94bb1a4a6085698722a27bb59f333adbd74ae868cdf2a5bd81c925abdbe +"@storybook/preview@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/preview@npm:7.5.3" + checksum: 5565d0c24ed9668d41e3430b4884911b8aa0586f6e93efd37f3554cdb26726548f2e2f86211294e4c9fadb05f367c51bf663d133fa9b3f1f9697726e6ad52eac languageName: node linkType: hard -"@storybook/react-dom-shim@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/react-dom-shim@npm:7.4.6" +"@storybook/react-dom-shim@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/react-dom-shim@npm:7.5.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 14195c42849e1987db5b7b3ff1f49c5dd98f22f1bcc1f3cf66c0414bebad94dd5726f0fbbcbcb5581395703a3661a498437d81621e3fbdd1cb3cdaf8ee373ff1 + checksum: a5eacbedc2467daa5fb26f404fcbed3c6583eeaa7c5cf0aff45c297c5c64d0459883b0abfe68a2a3073a312787d0cf2308138ba1c33ac6bb60ae222240be8679 languageName: node linkType: hard -"@storybook/react-vite@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/react-vite@npm:7.4.6" +"@storybook/react-vite@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/react-vite@npm:7.5.3" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.2.1" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.3.0" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:7.4.6" - "@storybook/react": "npm:7.4.6" + "@storybook/builder-vite": "npm:7.5.3" + "@storybook/react": "npm:7.5.3" "@vitejs/plugin-react": "npm:^3.0.1" - ast-types: "npm:^0.14.2" magic-string: "npm:^0.30.0" - react-docgen: "npm:6.0.0-alpha.3" + react-docgen: "npm:^6.0.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - vite: ^3.0.0 || ^4.0.0 - checksum: 0cb9cc05e8ee7930434fdc640e08bc49687cd99d10534457c0868b147cc422dc7ea60f7e69d279f29844bf33055c09e278391f681b36c8076ab40343f2517872 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: 72a5c0bd45cda7b909e691eea653c33d19a124b2d1917bec87a154039df35ae5001518669c387292d8642d95606b8a3a14fcfe858247609f4879711e796856e7 languageName: node linkType: hard -"@storybook/react@npm:7.4.6, @storybook/react@npm:^7.4.6": - version: 7.4.6 - resolution: "@storybook/react@npm:7.4.6" +"@storybook/react@npm:7.5.3, @storybook/react@npm:^7.5.3": + version: 7.5.3 + resolution: "@storybook/react@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-client": "npm:7.4.6" - "@storybook/docs-tools": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-client": "npm:7.5.3" + "@storybook/docs-tools": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.4.6" - "@storybook/react-dom-shim": "npm:7.4.6" - "@storybook/types": "npm:7.4.6" + "@storybook/preview-api": "npm:7.5.3" + "@storybook/react-dom-shim": "npm:7.5.3" + "@storybook/types": "npm:7.5.3" "@types/escodegen": "npm:^0.0.6" "@types/estree": "npm:^0.0.51" - "@types/node": "npm:^16.0.0" + "@types/node": "npm:^18.0.0" acorn: "npm:^7.4.1" acorn-jsx: "npm:^5.3.1" acorn-walk: "npm:^7.2.0" @@ -12053,59 +12643,59 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5c811660b7e1c4b62b07164bbce77ee1e59e409345a5123a3f455f1ec82645cd07e03a1708daf6d3c92e0061f478602ab53542405a5eacb596cd7e5e2422b0ce + checksum: cc88bc53f0a96aebb76cda7d166426f76efcd02bb28d5fc4e34fddc92857579dc6e259548e5e61e95e32cec24a413a7ac27d40dabbdb3dd61a36e27e78637ba8 languageName: node linkType: hard -"@storybook/router@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/router@npm:7.4.6" +"@storybook/router@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/router@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" memoizerific: "npm:^1.11.3" qs: "npm:^6.10.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 7e317d5bd9be4195fc133ba060c25953827857fefa2e8c297d34774698ed047a9209dbd444597506fb9e81c7318fe9a0c0a07f6c9096dd2b97461b9bac782a1f + checksum: a3749dfd2ceaaea72bbc7fc47c11f7325b3d3e5aa131783e5485952bbf700210d52f4dae5e3dacd594953b7375fd5a1ac81f9ca296e40b17a808584fd4c66ceb languageName: node linkType: hard -"@storybook/source-loader@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/source-loader@npm:7.4.6" +"@storybook/source-loader@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/source-loader@npm:7.5.3" dependencies: "@storybook/csf": "npm:^0.1.0" - "@storybook/types": "npm:7.4.6" + "@storybook/types": "npm:7.5.3" estraverse: "npm:^5.2.0" lodash: "npm:^4.17.21" prettier: "npm:^2.8.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 5a50dfad63d67c97ad6613f2a41bf37a8d01177f9c2435594ac8ede8fd408d61a5544be4d98df82208a16851cce1f787fcbafeef523513ebf0eccf2ddfdd7c45 + checksum: f5415006d7125ad61471a2532d631342e265f11e88b653dc65bc853939bed19adb0e7bb96f344de472b3f90684ee0d30854e799b2dc9dfebf1752adb3f38f8f6 languageName: node linkType: hard -"@storybook/telemetry@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/telemetry@npm:7.4.6" +"@storybook/telemetry@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/telemetry@npm:7.5.3" dependencies: - "@storybook/client-logger": "npm:7.4.6" - "@storybook/core-common": "npm:7.4.6" - "@storybook/csf-tools": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" + "@storybook/core-common": "npm:7.5.3" + "@storybook/csf-tools": "npm:7.5.3" chalk: "npm:^4.1.0" detect-package-manager: "npm:^2.0.1" fetch-retry: "npm:^5.0.2" fs-extra: "npm:^11.1.0" read-pkg-up: "npm:^7.0.1" - checksum: e014a2d1551209306c5e3432678727ca8bb14d5fe6d4b0f829f421cfcb6e5b34e8ad0d3e3966222b8d3dfe147bb3aa07f4c5fd45c323b43932eaa5828acc5bd9 + checksum: a884642e4bf83cf0105c5fc251372e03644452ad9f1a155670f672f15825ab4c75fc3fd252de92f7c0d75b297b2b25b45b1e9a0327db4101d119bfb8de828b42 languageName: node linkType: hard -"@storybook/test-runner@npm:^0.13.0": - version: 0.13.0 - resolution: "@storybook/test-runner@npm:0.13.0" +"@storybook/test-runner@npm:^0.15.2": + version: 0.15.2 + resolution: "@storybook/test-runner@npm:0.15.2" dependencies: "@babel/core": "npm:^7.22.5" "@babel/generator": "npm:^7.22.5" @@ -12121,12 +12711,12 @@ __metadata: commander: "npm:^9.0.0" expect-playwright: "npm:^0.8.0" glob: "npm:^10.2.2" - jest: "npm:^28.0.0" - jest-circus: "npm:^28.0.0" - jest-environment-node: "npm:^28.0.0" - jest-junit: "npm:^14.0.0" - jest-playwright-preset: "npm:^2.0.0" - jest-runner: "npm:^28.0.0" + jest: "npm:^29.6.4" + jest-circus: "npm:^29.6.4" + jest-environment-node: "npm:^29.6.4" + jest-junit: "npm:^16.0.0" + jest-playwright-preset: "npm:^3.0.1" + jest-runner: "npm:^29.6.4" jest-serializer-html: "npm:^7.1.0" jest-watch-typeahead: "npm:^2.0.0" node-fetch: "npm:^2" @@ -12136,7 +12726,7 @@ __metadata: ts-dedent: "npm:^2.0.0" bin: test-storybook: dist/test-storybook.js - checksum: fecb84f8e020e133823311a2b81daa98d3750172149d96d9edbf2127207b6b72c6c66d6752bc7421ed922b9baf9947e6779a8c1b01f4a8209771dc95e9b2bad5 + checksum: 4a77bd2795ac28a0154bf36e79c185e6f273ece7840f45709294a4395e90cad6134f4719e1b742484d08e5aaaf5eab6c06d11d41ad8c36c171fa2c2f6a906941 languageName: node linkType: hard @@ -12151,30 +12741,30 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:7.4.6, @storybook/theming@npm:^7.0.0": - version: 7.4.6 - resolution: "@storybook/theming@npm:7.4.6" +"@storybook/theming@npm:7.5.3, @storybook/theming@npm:^7.0.0": + version: 7.5.3 + resolution: "@storybook/theming@npm:7.5.3" dependencies: "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.0" - "@storybook/client-logger": "npm:7.4.6" + "@storybook/client-logger": "npm:7.5.3" "@storybook/global": "npm:^5.0.0" memoizerific: "npm:^1.11.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: e6ef23d2d51e876bf9e916cf2debe358d700f23cd7a72d15bc984507d4710f169cd028fe604ae134dc68a9046c9d113479d94778041faf59593e75854ee9de5b + checksum: c2155b80142e021f6caa84b8e13495671e63aa0b9c5749bb3d65ca9e15c3c63aa285952cc6ec0099d463e14233a690aa6d82698d8e7c4698c1e7e11678b72734 languageName: node linkType: hard -"@storybook/types@npm:7.4.6": - version: 7.4.6 - resolution: "@storybook/types@npm:7.4.6" +"@storybook/types@npm:7.5.3": + version: 7.5.3 + resolution: "@storybook/types@npm:7.5.3" dependencies: - "@storybook/channels": "npm:7.4.6" + "@storybook/channels": "npm:7.5.3" "@types/babel__core": "npm:^7.0.0" "@types/express": "npm:^4.7.0" file-system-cache: "npm:2.3.0" - checksum: 775e16283024659fcff35a6fd1d4b79e66ee38e8779805241d5ef8c07f9e2b54a1e835e3e1294da18b754233af3baa0644ba118a22d14c7222fd7e08f52143c9 + checksum: c049b44f57bf9c49dab4807a55b2ff74667d92e6dbb16b243c6e4de7853e900f3191ae854a4a71d3dda04fbb5ce7fb1bab71b62506afaadd59aed7bf256de301 languageName: node linkType: hard @@ -12334,90 +12924,82 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-darwin-arm64@npm:1.3.93" +"@swc/core-darwin-arm64@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-darwin-arm64@npm:1.3.99" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-darwin-x64@npm:1.3.93" +"@swc/core-darwin-x64@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-darwin-x64@npm:1.3.99" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.93" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@swc/core-linux-arm64-gnu@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.93" +"@swc/core-linux-arm64-gnu@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.99" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.93" +"@swc/core-linux-arm64-musl@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.99" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.93" +"@swc/core-linux-x64-gnu@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.99" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-linux-x64-musl@npm:1.3.93" +"@swc/core-linux-x64-musl@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-linux-x64-musl@npm:1.3.99" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.93" +"@swc/core-win32-arm64-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.99" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.93" +"@swc/core-win32-ia32-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.99" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.93": - version: 1.3.93 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.93" +"@swc/core-win32-x64-msvc@npm:1.3.99": + version: 1.3.99 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.99" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.18, @swc/core@npm:^1.3.85, @swc/core@npm:^1.3.93": - version: 1.3.93 - resolution: "@swc/core@npm:1.3.93" +"@swc/core@npm:^1.3.18, @swc/core@npm:^1.3.93, @swc/core@npm:^1.3.96": + version: 1.3.99 + resolution: "@swc/core@npm:1.3.99" dependencies: - "@swc/core-darwin-arm64": "npm:1.3.93" - "@swc/core-darwin-x64": "npm:1.3.93" - "@swc/core-linux-arm-gnueabihf": "npm:1.3.93" - "@swc/core-linux-arm64-gnu": "npm:1.3.93" - "@swc/core-linux-arm64-musl": "npm:1.3.93" - "@swc/core-linux-x64-gnu": "npm:1.3.93" - "@swc/core-linux-x64-musl": "npm:1.3.93" - "@swc/core-win32-arm64-msvc": "npm:1.3.93" - "@swc/core-win32-ia32-msvc": "npm:1.3.93" - "@swc/core-win32-x64-msvc": "npm:1.3.93" + "@swc/core-darwin-arm64": "npm:1.3.99" + "@swc/core-darwin-x64": "npm:1.3.99" + "@swc/core-linux-arm64-gnu": "npm:1.3.99" + "@swc/core-linux-arm64-musl": "npm:1.3.99" + "@swc/core-linux-x64-gnu": "npm:1.3.99" + "@swc/core-linux-x64-musl": "npm:1.3.99" + "@swc/core-win32-arm64-msvc": "npm:1.3.99" + "@swc/core-win32-ia32-msvc": "npm:1.3.99" + "@swc/core-win32-x64-msvc": "npm:1.3.99" "@swc/counter": "npm:^0.1.1" "@swc/types": "npm:^0.1.5" peerDependencies: @@ -12427,8 +13009,6 @@ __metadata: optional: true "@swc/core-darwin-x64": optional: true - "@swc/core-linux-arm-gnueabihf": - optional: true "@swc/core-linux-arm64-gnu": optional: true "@swc/core-linux-arm64-musl": @@ -12446,7 +13026,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 0c28523abea3509d0fff7b2940667c9b5bf76b2505deb3ede8ab3ca8505d880cf563fb9d985483bc16065e79e51927001976d0a5e14449fb28715e5b4c6e0ffd + checksum: 76926583e7826741c3ea048e6c75f0e46049ca80189b2367ecc3346d569505af08d91bcddc4d79e944af1aa574a0a60c0dcaf0fb7902656a7948801901962c83 languageName: node linkType: hard @@ -12549,9 +13129,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^14.0.0": - version: 14.0.0 - resolution: "@testing-library/react@npm:14.0.0" +"@testing-library/react@npm:^14.0.0, @testing-library/react@npm:^14.1.2": + version: 14.1.2 + resolution: "@testing-library/react@npm:14.1.2" dependencies: "@babel/runtime": "npm:^7.12.5" "@testing-library/dom": "npm:^9.0.0" @@ -12559,7 +13139,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 1f2a4f78d107e741b35671e9c7dd992d5c9f49b48ee24112ccfe636179be72f3c62a65b1405901b59eb6cde996176ebc2c99099e04d9f14575641e46688747f0 + checksum: 1664990ad9673403ee1d74c1c1b60ec30591d42a3fe1e2175c28cb935cd49bc9a4ba398707f702acc3278c3b0cb492ee57fe66f41ceb040c5da57de98cba5414 languageName: node linkType: hard @@ -12596,19 +13176,27 @@ __metadata: dependencies: "@affine/debug": "workspace:*" "@affine/env": "workspace:*" +<<<<<<< HEAD "@blocksuite/block-std": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/block-std": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@testing-library/react": "npm:^14.0.0" "@types/image-blob-reduce": "npm:^4.1.3" "@types/lodash.debounce": "npm:^4.0.7" fake-indexeddb: "npm:^5.0.0" foxact: "npm:^0.2.20" image-blob-reduce: "npm:^4.1.0" - jotai: "npm:^2.4.3" + jotai: "npm:^2.5.1" lodash.debounce: "npm:^4.0.8" p-queue: "npm:^7.4.1" react: "npm:18.2.0" @@ -12621,7 +13209,6 @@ __metadata: "@blocksuite/blocks": "*" "@blocksuite/editor": "*" "@blocksuite/global": "*" - "@blocksuite/lit": "*" "@blocksuite/store": "*" y-provider: "workspace:*" peerDependenciesMeta: @@ -12635,8 +13222,6 @@ __metadata: optional: true "@blocksuite/global": optional: true - "@blocksuite/lit": - optional: true "@blocksuite/store": optional: true y-provider: @@ -12651,29 +13236,35 @@ __metadata: "@affine-test/fixtures": "workspace:*" "@affine/sdk": "workspace:*" "@affine/templates": "workspace:*" +<<<<<<< HEAD "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/editor": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/global": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/lit": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/editor": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/global": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary "@testing-library/react": "npm:^14.0.0" async-call-rpc: "npm:^6.3.1" electron: "link:../../frontend/electron/node_modules/electron" - jotai: "npm:^2.4.3" - jotai-effect: "npm:^0.2.2" - nanoid: "npm:^5.0.1" + jotai: "npm:^2.5.1" + jotai-effect: "npm:^0.2.3" + nanoid: "npm:^5.0.3" react: "npm:^18.2.0" rxjs: "npm:^7.8.1" tinykeys: "npm:^2.1.0" vite: "npm:^4.4.11" vite-plugin-dts: "npm:3.6.0" vitest: "npm:0.34.6" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" zod: "npm:^3.22.4" peerDependencies: "@affine/templates": "*" "@blocksuite/editor": "*" - "@blocksuite/lit": "*" async-call-rpc: "*" electron: "*" react: "*" @@ -12683,8 +13274,6 @@ __metadata: optional: true "@blocksuite/editor": optional: true - "@blocksuite/lit": - optional: true async-call-rpc: optional: true electron: @@ -12696,10 +13285,17 @@ __metadata: languageName: unknown linkType: soft +<<<<<<< HEAD "@toeverything/theme@npm:^0.7.24": version: 0.7.24 resolution: "@toeverything/theme@npm:0.7.24" checksum: faa97dad2a411e895090497ff6cbb83836e9be963e608cbc7f3421c4a933d86393551250fa015d4b9060778f0abb0e122a41d12a70e6f7fb7c9eadc2324a6035 +======= +"@toeverything/theme@npm:^0.7.20, @toeverything/theme@npm:^0.7.24": + version: 0.7.26 + resolution: "@toeverything/theme@npm:0.7.26" + checksum: be895af99318af5ea2d624a78b4c8b7d0ce3cf00e825a593e75d2e3c3c394fd0501213f99968424021462d10d89bdb3a66a7f50e2e6a6e1c8981513b4b15ad72 +>>>>>>> canary languageName: node linkType: hard @@ -12707,17 +13303,22 @@ __metadata: version: 0.0.0-use.local resolution: "@toeverything/y-indexeddb@workspace:packages/common/y-indexeddb" dependencies: +<<<<<<< HEAD "@blocksuite/blocks": "npm:0.0.0-20231116023037-31273bb7-nightly" "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/blocks": "npm:0.0.0-20231122113751-6bf81eb3-nightly" + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary fake-indexeddb: "npm:^5.0.0" idb: "npm:^7.1.1" - nanoid: "npm:^5.0.1" + nanoid: "npm:^5.0.3" vite: "npm:^4.4.11" vite-plugin-dts: "npm:3.6.0" vitest: "npm:0.34.6" y-indexeddb: "npm:^9.0.11" y-provider: "workspace:*" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" peerDependencies: yjs: ^13 languageName: unknown @@ -12783,11 +13384,11 @@ __metadata: linkType: hard "@types/accepts@npm:*": - version: 1.3.5 - resolution: "@types/accepts@npm:1.3.5" + version: 1.3.7 + resolution: "@types/accepts@npm:1.3.7" dependencies: "@types/node": "npm:*" - checksum: 3984edd631d9e308ef10286454a05e2388812a740d404abf93522a3bc3d10032ae6a60816e8cc4ae1bc96367db39e543d3ef862944cea53d1eea48be1f624fc2 + checksum: 7678cf74976e16093aff6e6f9755826faf069ac1e30179276158ce46ea246348ff22ca6bdd46cef08428881337d9ceefbf00bab08a7731646eb9fc9449d6a1e7 languageName: node linkType: hard @@ -12808,92 +13409,92 @@ __metadata: linkType: hard "@types/aria-query@npm:^5.0.1": - version: 5.0.2 - resolution: "@types/aria-query@npm:5.0.2" - checksum: 34129209a951b5eb0133a523fd30ff7963fd357c5b73840aded8a7c5470bfd53b32dcc538fc87b756eddc52615f4d6c5e78d5085b022a558640d036d22bb1358 + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: c0084c389dc030daeaf0115a92ce43a3f4d42fc8fef2d0e22112d87a42798d4a15aac413019d4a63f868327d52ad6740ab99609462b442fe6b9286b172d2e82e languageName: node linkType: hard -"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.2": - version: 7.20.2 - resolution: "@types/babel__core@npm:7.20.2" +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.4": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: "@babel/parser": "npm:^7.20.7" "@babel/types": "npm:^7.20.7" "@types/babel__generator": "npm:*" "@types/babel__template": "npm:*" "@types/babel__traverse": "npm:*" - checksum: 78aede009117ff6c95ef36db19e27ad15ecdcb5cfc9ad57d43caa5d2f44127105691a3e6e8d1806fd305484db8a74fdec5640e88da452c511f6351353f7ac0c8 + checksum: c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 languageName: node linkType: hard "@types/babel__generator@npm:*": - version: 7.6.5 - resolution: "@types/babel__generator@npm:7.6.5" + version: 7.6.7 + resolution: "@types/babel__generator@npm:7.6.7" dependencies: "@babel/types": "npm:^7.0.0" - checksum: 168bbfab7662353c472e03b06c4c10d3d4134756d2b15129bed987ebaaccd52d17f0c53a9bc6522cdc50babb41ed1c8e219953acbe4c27382ccffd6cb9d8a0c2 + checksum: 11d36fdcee9968a7fa05e5e5086bcc349ad32b7d7117728334be76b82444b5e1c89c0efe15205a3f47f299a4864912165e6f0d31ba285fc4f05dbbafcb83e9b6 languageName: node linkType: hard "@types/babel__template@npm:*": - version: 7.4.2 - resolution: "@types/babel__template@npm:7.4.2" + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" dependencies: "@babel/parser": "npm:^7.1.0" "@babel/types": "npm:^7.0.0" - checksum: 0fe977b45a3269336c77f3ae4641a6c48abf0fa35ab1a23fb571690786af02d6cec08255a43499b0b25c5633800f7ae882ace450cce905e3060fa9e6995047ae + checksum: d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.2 - resolution: "@types/babel__traverse@npm:7.20.2" +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6, @types/babel__traverse@npm:^7.18.0": + version: 7.20.4 + resolution: "@types/babel__traverse@npm:7.20.4" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 4f950a5d66ff266e70e01ae0c5277efb543221da2087dc3e86b1e0c8e74431364110d1c765ab875d06d02a357962a7419270a3115a7d23421d5ad788f41d92d0 + checksum: 927073e3a2ca4d24b95acf96d9c91d6fd1c44826d440e5f9b486de421857945b679045710ebf886be2af30d13877d86f9fbd15a383f72a2b07da322af1c1a321 languageName: node linkType: hard "@types/base16@npm:^1.0.2": - version: 1.0.3 - resolution: "@types/base16@npm:1.0.3" - checksum: a2c314d4a67d02d6c7e42ad1b148299b8e471645fc38a9fc7b742447b37e62d9fa8857725837844c57a2a2953d3687ed0f4b0c48aa089d47257c8856359b5f49 + version: 1.0.5 + resolution: "@types/base16@npm:1.0.5" + checksum: caa391944e9af95d395ad8a489ad7e6bc3b358f73f876215313e8a2f97a18d109d8ab3d6d92bd473d9a1c782639a82921a3c30124922f2492082b550a2e9f6a6 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.3 - resolution: "@types/body-parser@npm:1.19.3" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: 932fa71437c275023799123680ef26ffd90efd37f51a1abe405e6ae6e5b4ad9511b7a3a8f5a12877ed1444a02b6286c0a137a98e914b3c61932390c83643cc2c + checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 languageName: node linkType: hard "@types/bonjour@npm:^3.5.9": - version: 3.5.11 - resolution: "@types/bonjour@npm:3.5.11" + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: "@types/node": "npm:*" - checksum: 12fb86a1bb4a610f16ef6d7d68f85e7c31070029f02b6622073794a271e75abcf58230ed205a2ae23c53be2c08b9e507d3b91fa0dc9dfe76c4b1f5e19e9370cb + checksum: e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee languageName: node linkType: hard "@types/busboy@npm:^1.5.0": - version: 1.5.1 - resolution: "@types/busboy@npm:1.5.1" + version: 1.5.3 + resolution: "@types/busboy@npm:1.5.3" dependencies: "@types/node": "npm:*" - checksum: 686a1ff076dc35c69307c7214911989e1fa1d718120f212756ce7370bb1957d6586047ea60ea3bb0b416608c6ad8b989c0e676dbee42500c74729c1dbe554a73 + checksum: 9ec0a125723e594816d06f6ddf5a4f8dda4855734719bb6e38bdc6fdaf59416f270744862ee54c755075af26e9f5467cc00db803ae1d88f45c1431f61a48ae58 languageName: node linkType: hard "@types/bytes@npm:^3.1.3": - version: 3.1.3 - resolution: "@types/bytes@npm:3.1.3" - checksum: c636b74d5a6f4925f1030382d8afcfe271e329da7c8103d175a874688118b60b0b1523e23477554e29456d024e5a180df1ba99d88c49b3a51433b714acffdac9 + version: 3.1.4 + resolution: "@types/bytes@npm:3.1.4" + checksum: 645732b37404847df9db7ae2af8b4bbdc21c966e9bbf8a5494d7fa95cbaee8bd7b9d65c68bbc2ec4277856d874e2e011b3b2b9479d981cd57d5136b0f41526e9 languageName: node linkType: hard @@ -12910,53 +13511,53 @@ __metadata: linkType: hard "@types/chai-subset@npm:^1.3.3": - version: 1.3.3 - resolution: "@types/chai-subset@npm:1.3.3" + version: 1.3.5 + resolution: "@types/chai-subset@npm:1.3.5" dependencies: "@types/chai": "npm:*" - checksum: c83bb9ae7174b47dbef62cb2054c26019d5f32e6f7bd3655039f84bc299a6bdee095bdfba8b6bce91cc9cc201ad6cc6efb78ab93fba79f9d7939b5039de590c8 + checksum: 715c46d3e90f87482c2769389d560456bb257b225716ff44c275c231bdb62c8a30629f355f412bac0ecab07ebc036c1806d9ed9dde9792254f8ef4f07f76033b languageName: node linkType: hard "@types/chai@npm:*, @types/chai@npm:^4.3.5": - version: 4.3.8 - resolution: "@types/chai@npm:4.3.8" - checksum: 57827e577bfda1e3a80f6b00a6c7838062a1312402a539f7eb50a27b60b6480e23fa5a6dddf175991cabe365e202f761f4943500a8b0e1c2b7743c1d0fb50282 + version: 4.3.11 + resolution: "@types/chai@npm:4.3.11" + checksum: c83a00359684bf06114d5ad0ffa62c78b2fbfe09a985eda56e55cd3c191fe176052aef6e297a8c8a3608efb8ea7a44598cf7e0ae1a3a9311af892417e95b0b28 languageName: node linkType: hard "@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.1 - resolution: "@types/connect-history-api-fallback@npm:1.5.1" + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: "@types/express-serve-static-core": "npm:*" "@types/node": "npm:*" - checksum: bc5e46663300eba56eaf8ef242156256e2bdadc52bb7d6543f4b37f2945b6a810901c245711f8321fce7d94c7b588b308a86519f3e1f87a80eb87841d808dbdc + checksum: e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.36 - resolution: "@types/connect@npm:3.4.36" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "npm:*" - checksum: 4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172 + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard "@types/content-disposition@npm:*": - version: 0.5.6 - resolution: "@types/content-disposition@npm:0.5.6" - checksum: da07798d52cc8fc46a8843d768b48d54c70f1a44c861dc2c73c4c25a1e08af859709629ab0e4d23d5198107b8926bb48c593df436ba68123d87191f5e25fe4bc + version: 0.5.8 + resolution: "@types/content-disposition@npm:0.5.8" + checksum: eeea868fb510ae7a32aa2d7de680fba79d59001f3e758a334621e10bc0a6496d3a42bb79243a5e53b9c63cb524522853ccc144fe1ab160c4247d37cdb81146c4 languageName: node linkType: hard -"@types/cookie-parser@npm:^1.4.4": - version: 1.4.4 - resolution: "@types/cookie-parser@npm:1.4.4" +"@types/cookie-parser@npm:^1.4.6": + version: 1.4.6 + resolution: "@types/cookie-parser@npm:1.4.6" dependencies: "@types/express": "npm:*" - checksum: 5c81ac4b7d90a567e0c7a904ecbc09c82c43e30c6b5b507aee5147bc06bc8c6418e6719d63fcf68e6a83c71870485ab3fc579a30891b56a0be05d64753e3f74a + checksum: b1bbb17bc4189c0e953d4996b3b58bfa20161c27db21f98353e237032e7559aec733735d8902c283300e0a4cded20e62b1a5086af608608ef30a45387e080360 languageName: node linkType: hard @@ -12968,55 +13569,55 @@ __metadata: linkType: hard "@types/cookiejar@npm:*": - version: 2.1.2 - resolution: "@types/cookiejar@npm:2.1.2" - checksum: f6e1903454007f86edd6c3520cbb4d553e1d4e17eaf1f77f6f75e3270f48cc828d74397a113a36942f5fe52f9fa71067bcfa738f53ad468fcca0bc52cb1cbd28 + version: 2.1.5 + resolution: "@types/cookiejar@npm:2.1.5" + checksum: 04d5990e87b6387532d15a87d9ec9b2eb783039291193863751dcfd7fc723a3b3aa30ce4c06b03975cba58632e933772f1ff031af23eaa3ac7f94e71afa6e073 languageName: node linkType: hard "@types/cookies@npm:*": - version: 0.7.8 - resolution: "@types/cookies@npm:0.7.8" + version: 0.7.10 + resolution: "@types/cookies@npm:0.7.10" dependencies: "@types/connect": "npm:*" "@types/express": "npm:*" "@types/keygrip": "npm:*" "@types/node": "npm:*" - checksum: 00005c8fbf5b6fb698f402ddcf927eb79f5ee361eb1f0ff7729a0016021a9ee77a880c6d4d12979ceb618c8d3ebcb939939544e22a7bbc4296f6c9b181344dd1 + checksum: 85d4b434bac9a971d8a4122d5a7c947dcaaca98fee26e90e0b792b1046da1de414dc37ea164b1693653b9b59f72c501927de90412a3a1dff2c7bdb6abadc3608 languageName: node linkType: hard "@types/cors@npm:^2.8.12": - version: 2.8.14 - resolution: "@types/cors@npm:2.8.14" + version: 2.8.17 + resolution: "@types/cors@npm:2.8.17" dependencies: "@types/node": "npm:*" - checksum: 119b8ea5760db58542cc66635e8b98b9e859d615e9fc7bfd520c0e2c94063e87759033a4242360e2aa66df2d7d092a406838ac35e8ca7034debf1c69abc27811 + checksum: 469bd85e29a35977099a3745c78e489916011169a664e97c4c3d6538143b0a16e4cc72b05b407dc008df3892ed7bf595f9b7c0f1f4680e169565ee9d64966bde languageName: node linkType: hard "@types/cross-spawn@npm:^6.0.2": - version: 6.0.3 - resolution: "@types/cross-spawn@npm:6.0.3" + version: 6.0.6 + resolution: "@types/cross-spawn@npm:6.0.6" dependencies: "@types/node": "npm:*" - checksum: 06d50fa1e1370ef60b9c9085b76adec7d7bc20728fbb02b3c2061d4d922312acf1ba56a7c94d88c27a22fc6241ab6b970c936f3294038a9c97a719fbc8eb8a76 + checksum: b4172927cd1387cf037c3ade785ef46c87537b7bc2803d7f6663b4904d0c5d6f726415d1adb2fee4fecb21746738f11336076449265d46be4ce110cc3a8c8436 languageName: node linkType: hard -"@types/debug@npm:^4.0.0, @types/debug@npm:^4.1.7, @types/debug@npm:^4.1.9": - version: 4.1.10 - resolution: "@types/debug@npm:4.1.10" +"@types/debug@npm:^4.0.0, @types/debug@npm:^4.1.9": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" dependencies: "@types/ms": "npm:*" - checksum: 938f79c5b610f851da9c67ecd8641a09b33ce9cb38fe4c9f4d20ee743d6bccb5d8e9a833a4cd23e0684a316622af67a0634fa706baea5a01f5219961d1976314 + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 languageName: node linkType: hard "@types/detect-port@npm:^1.3.0": - version: 1.3.3 - resolution: "@types/detect-port@npm:1.3.3" - checksum: 0dadb520286a5cfd2832d12189dc795cc3589dfd9166d1b033453fb94b0212c4067a847045833e85b0f7c73135c944cb4ccb49c8e683491845c2e8a3da5d5c1c + version: 1.3.5 + resolution: "@types/detect-port@npm:1.3.5" + checksum: 923cf04c6a05af59090743baeb9948f1938ceb98c1f7ea93db7ac310210426b385aa00005d23039ebb8019a9d13e141f5246e9c733b290885018d722a4787921 languageName: node linkType: hard @@ -13027,26 +13628,33 @@ __metadata: languageName: node linkType: hard +"@types/doctrine@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/doctrine@npm:0.0.6" + checksum: 55dabc8aa85cffbc9e2352732a7551cbda9c5f9b6ba301a3cc0fdcec59353a8643c3b1861bd392c78df2fcc9f8354ee60361580abdff30ee415241952296398c + languageName: node + linkType: hard + "@types/ejs@npm:^3.1.1": - version: 3.1.3 - resolution: "@types/ejs@npm:3.1.3" - checksum: f595b453d798eb7775720dd480f27e66400cf257b75793db46a7b36d1771bfaef35f4cd180d5615295a6e477e7fd885c0625878346f6a9d5f3a3a054bfaad582 + version: 3.1.5 + resolution: "@types/ejs@npm:3.1.5" + checksum: 918898fd279108087722c1713e2ddb0c152ab839397946d164db8a18b5bbd732af9746373882a9bcf4843d35c6b191a8f569a7a4e51e90726d24501b39f40367 languageName: node linkType: hard "@types/emscripten@npm:^1.39.6": - version: 1.39.8 - resolution: "@types/emscripten@npm:1.39.8" - checksum: 1102c28ba259316b154ea524c2b8da82242839364df930dd305942daf7742da4081aeff437b7c9335ed838d3a42f5338cb4b24c87cd856c1853959c3310ccf10 + version: 1.39.10 + resolution: "@types/emscripten@npm:1.39.10" + checksum: 6ed97aa115761e83665897b3d5d259895db60c10d2378c1bf84f94746c3c178715004812f5f42bcfb6e439664144f812318e8175103c76806aa6eaaf126a94f0 languageName: node linkType: hard -"@types/engine.io@npm:^3.1.8": - version: 3.1.8 - resolution: "@types/engine.io@npm:3.1.8" +"@types/engine.io@npm:^3.1.10": + version: 3.1.10 + resolution: "@types/engine.io@npm:3.1.10" dependencies: "@types/node": "npm:*" - checksum: 479bf1f617c403e4d78329887d7bceff016a51f1a57c699e180b45c839a645966b8815fa4aaf02b0e93f9fe6209ee20681b564e0c3dfbb35d3bee96716300318 + checksum: b8e0ec0910be8d5c27ba7b70297db287f91da208ce8bd510a2d598fb0709626fca6d8642183498d4d019f1434e4fd4d1f8bf31a748b15e8ba0ea581bb5cd50fa languageName: node linkType: hard @@ -13058,29 +13666,29 @@ __metadata: linkType: hard "@types/eslint-scope@npm:^3.7.3": - version: 3.7.5 - resolution: "@types/eslint-scope@npm:3.7.5" + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: "@types/eslint": "npm:*" "@types/estree": "npm:*" - checksum: e91ce335c3791c2cf6084caa0073f90d5b7ae3fcf27785ade8422b7d896159fa14a5a3f1efd31ef03e9ebc1ff04983288280dfe8c9a5579a958539f59df8cc9f + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e languageName: node linkType: hard -"@types/eslint@npm:*, @types/eslint@npm:^8.44.4": - version: 8.44.4 - resolution: "@types/eslint@npm:8.44.4" +"@types/eslint@npm:*, @types/eslint@npm:^8.44.7": + version: 8.44.7 + resolution: "@types/eslint@npm:8.44.7" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 8508e33126b19a4d5d84cfeccf838f383c2880ef5d96fd2a85634c33cdbf2154af7c40268cc3042c69f4cddadf07b0a96fb9f6c057903010861d282b213e3c99 + checksum: 3bb9415f5db98bc33f033e2d07503096ffd26046f95e6a4cf4d4a537c8b16398452f3059793e03b0fedbb0e35f0da68a4c68e6ac50d8fef9d555bdd074afb9fb languageName: node linkType: hard "@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/estree@npm:1.0.2" - checksum: 01e5bf0f827b93f8d0156d38b98b7db2fa4db169d437389cd0286f913db97dd4b1cd16d01d4a4150f4e411680ddb6be4de9fa1a8c34ceb15b82c38b485ddc115 + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 languageName: node linkType: hard @@ -13092,26 +13700,26 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.37 - resolution: "@types/express-serve-static-core@npm:4.17.37" + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: bb88921d147dd38bfcc286271378384fbbdde1fdd452b092518a8dd425057f0a6368b615320f300d7011a02ec5d925ab55da1c1b3997710dec3869a67506a611 + checksum: 7647e19d9c3d57ddd18947d2b161b90ef0aedd15875140e5b824209be41c1084ae942d4fb43cd5f2051a6a5f8c044519ef6c9ac1b2ad86b9aa546b4f1f023303 languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.19, @types/express@npm:^4.7.0": - version: 4.17.19 - resolution: "@types/express@npm:4.17.19" +"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.21, @types/express@npm:^4.7.0": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: c51de5e2fed424e7d89db2fe186b00bb00265cc0b715e31275d983eb1f14122f214a200b88f1586e16f5dd038b59a3b044ea44142d3cf06d0906167716d44caa + checksum: 7a6d26cf6f43d3151caf4fec66ea11c9d23166e4f3102edfe45a94170654a54ea08cf3103d26b3928d7ebcc24162c90488e33986b7e3a5f8941225edd5eb18c7 languageName: node linkType: hard @@ -13123,19 +13731,19 @@ __metadata: linkType: hard "@types/flexsearch@npm:^0.7.3": - version: 0.7.4 - resolution: "@types/flexsearch@npm:0.7.4" - checksum: 1949dbab1d3b2767f73f0eb6bd58bdc3d979572d39f45d6aebda0d8d08c388cd0db90522eecf72b05b8ed32652e5a9ac432c503baa90361284734cff317b44a1 + version: 0.7.6 + resolution: "@types/flexsearch@npm:0.7.6" + checksum: 93aaed91f5847a0c85e19b339147067897c92385de842071c959bf3f1efb8c7095acce460385aa285c75c67022d78979b4cae6ecb754bdb74348bf4976160ae3 languageName: node linkType: hard "@types/fs-extra@npm:^11.0.2": - version: 11.0.2 - resolution: "@types/fs-extra@npm:11.0.2" + version: 11.0.4 + resolution: "@types/fs-extra@npm:11.0.4" dependencies: "@types/jsonfile": "npm:*" "@types/node": "npm:*" - checksum: d490ab47449e921c5ba3f4646113b444081c64e87040de92f26cc6dd1f43c93744e547e4c063ec8e4f14936b5738fc6270facd8fa6df818701fffefe95e2a99d + checksum: acc4c1eb0cde7b1f23f3fe6eb080a14832d8fa9dc1761aa444c5e2f0f6b6fa657ed46ebae32fb580a6700fc921b6165ce8ac3e3ba030c3dd15f10ad4dd4cae98 languageName: node linkType: hard @@ -13159,32 +13767,33 @@ __metadata: linkType: hard "@types/graceful-fs@npm:^4.1.3": - version: 4.1.7 - resolution: "@types/graceful-fs@npm:4.1.7" + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" dependencies: "@types/node": "npm:*" - checksum: 8b97e208f85c9efd02a6003a582c77646dd87be0af13aec9419a720771560a8a87a979eaca73ae193d7c73127f34d0a958403a9b5d6246e450289fd8c79adf09 + checksum: 79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 languageName: node linkType: hard -"@types/graphql-upload@npm:^16.0.3": - version: 16.0.3 - resolution: "@types/graphql-upload@npm:16.0.3" +"@types/graphql-upload@npm:^16.0.5": + version: 16.0.5 + resolution: "@types/graphql-upload@npm:16.0.5" dependencies: "@types/express": "npm:*" "@types/koa": "npm:*" + "@types/node": "npm:*" fs-capacitor: "npm:^8.0.0" graphql: "npm:0.13.1 - 16" - checksum: bbe54d87a38af7a1957f616e847c59809ee42c4e76b10964ebbec09127611fca0770a2586afe852cc938eb609182d6f24d15a98121e8b7a0cebf251603c81eb9 + checksum: aae8d9844af6acbb47c8af3c1f29a24d90576205517df5e501723f65ea51f54ed4bfdf1f35c0984c352e0b573ae626144dff636ff88a08c6d979e99d51798ca4 languageName: node linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.6 - resolution: "@types/hast@npm:2.3.6" + version: 2.3.8 + resolution: "@types/hast@npm:2.3.8" dependencies: "@types/unist": "npm:^2" - checksum: c004372f6ab919ec92a2de43e4380707e27b76fe371c7d06ab26547c1e851dfba2a7c740c544218df8c7e0a94443458793c43730ad563a39e3fdc1a48904d7f5 + checksum: 4c3b3efb7067d32a568a9bf5d2a7599f99ec08c2eaade3aaeb579b7a31bcdf8f6475f56c1ac5bc3f4e4e07b84a93a9b1cf1ef9a8b52b39e3deabea7989e5dd4b languageName: node linkType: hard @@ -13196,41 +13805,41 @@ __metadata: linkType: hard "@types/http-assert@npm:*": - version: 1.5.3 - resolution: "@types/http-assert@npm:1.5.3" - checksum: 9553e5a0b8bcfdac4b51d3fa3b89a91b5450171861a667a5b4c47204e0f4a1ca865d97396e6ceaf220e87b64d06b7a8bad7bfba15ef97acb41a87507c9940dbc + version: 1.5.5 + resolution: "@types/http-assert@npm:1.5.5" + checksum: cd6bb7fd42cc6e2a702cb55370b8b25231954ad74c04bcd185b943a74ded3d4c28099c30f77b26951df2426441baff41718816c60b5af80efe2b8888d900bf93 languageName: node linkType: hard "@types/http-cache-semantics@npm:*": - version: 4.0.2 - resolution: "@types/http-cache-semantics@npm:4.0.2" - checksum: 6cf83a583a559ecaa95bae6d122d854028c0b0e0e3ad70fb46c0bcb1f447235fcf2e9516993b45bbb41e4dd5b54719cb1614b2e0057278a86b689a75cb732561 + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: a59566cff646025a5de396d6b3f44a39ab6a74f2ed8150692e0f31cc52f3661a68b04afe3166ebe0d566bd3259cb18522f46e949576d5204781cd6452b7fe0c5 languageName: node linkType: hard "@types/http-errors@npm:*": - version: 2.0.2 - resolution: "@types/http-errors@npm:2.0.2" - checksum: d7f14045240ac4b563725130942b8e5c8080bfabc724c8ff3f166ea928ff7ae02c5194763bc8f6aaf21897e8a44049b0492493b9de3e058247e58fdfe0f86692 + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 languageName: node linkType: hard "@types/http-proxy@npm:^1.17.10, @types/http-proxy@npm:^1.17.8": - version: 1.17.12 - resolution: "@types/http-proxy@npm:1.17.12" + version: 1.17.14 + resolution: "@types/http-proxy@npm:1.17.14" dependencies: "@types/node": "npm:*" - checksum: b7e28c8c9a266d026e93f769c59ffe00f599bddb04cfcd8d323d2fe69b8e0dd40f5433e5f42567a6f0ec8df05f4045436c40a9562060db5ad507d18a30243cb3 + checksum: aa1a3e66cd43cbf06ea5901bf761d2031200a0ab42ba7e462a15c752e70f8669f21fb3be7c2f18fefcb83b95132dfa15740282e7421b856745598fbaea8e3a42 languageName: node linkType: hard "@types/image-blob-reduce@npm:^4.1.3": - version: 4.1.3 - resolution: "@types/image-blob-reduce@npm:4.1.3" + version: 4.1.4 + resolution: "@types/image-blob-reduce@npm:4.1.4" dependencies: "@types/pica": "npm:*" - checksum: bb7bb308b0e9ab519117e23c6e87f2c95e518268d74a3de92b34758a7c1b482c993a2215233faddc44ffb67effdf02b0d229a80933360acebcacff6d66599dfd + checksum: 2d0cc73cd24495c995f1f343e85caacb1f8e23510accab8b52c54c2e7fd2e7be055ce5a60ce5e0a170672f0aaff930dd265376b96ddde8355cede50406f22176 languageName: node linkType: hard @@ -13244,27 +13853,27 @@ __metadata: linkType: hard "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 languageName: node linkType: hard "@types/istanbul-lib-report@npm:*": - version: 3.0.1 - resolution: "@types/istanbul-lib-report@npm:3.0.1" + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" dependencies: "@types/istanbul-lib-coverage": "npm:*" - checksum: d50e7271901b1366b2a9965fc425a8e4c2b749cc913f34d4257395fe390553852df33b5e9f54a0f8522eafded7d898cbf96bcba2f6a75c731476fd578c08041d + checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 languageName: node linkType: hard "@types/istanbul-reports@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/istanbul-reports@npm:3.0.2" + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: "@types/istanbul-lib-report": "npm:*" - checksum: f52028d6fe4d28f0085dd7ed66ccfa6af632579e9a4091b90928ffef93d4dbec0bacd49e9caf1b939d05df9eafc5ac1f5939413cdf8ac59fbe4b29602d4d0939 + checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 languageName: node linkType: hard @@ -13279,30 +13888,30 @@ __metadata: linkType: hard "@types/js-levenshtein@npm:^1.1.1": - version: 1.1.1 - resolution: "@types/js-levenshtein@npm:1.1.1" - checksum: 1d1ff1ee2ad551909e47f3ce19fcf85b64dc5146d3b531c8d26fc775492d36e380b32cf5ef68ff301e812c3b00282f37aac579ebb44498b94baff0ace7509769 + version: 1.1.3 + resolution: "@types/js-levenshtein@npm:1.1.3" + checksum: eb338696da976925ea8448a42d775d7615a14323dceeb08909f187d0b3d3b4c1f67a1c36ef586b1c2318b70ab141bba8fc58311ba1c816711704605aec09db8b languageName: node linkType: hard "@types/js-yaml@npm:^4.0.0": - version: 4.0.7 - resolution: "@types/js-yaml@npm:4.0.7" - checksum: 4bf4fbd6a64cf9ffbff648bb8bc0d4065575ac8ec4e0a06004d6107b2fc192b28431e68d52309dc804b6862f3460d6c5c44cffed009746a7809c20973e36e351 + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: a0ce595db8a987904badd21fc50f9f444cb73069f4b95a76cc222e0a17b3ff180669059c763ec314bc4c3ce284379177a9da80e83c5f650c6c1310cafbfaa8e6 languageName: node linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 24000f93d34b3848053b8eb36bbbcfb6b465f691d61186ddac9596b6f1fb105ae84a8be63c0c0f3b6d8f7eb6f891f6cdf3c34910aefc756a1971164c4262de1a + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard "@types/json-stable-stringify@npm:^1.0.32": - version: 1.0.34 - resolution: "@types/json-stable-stringify@npm:1.0.34" - checksum: 45767ecef0f6aae5680c3be6488d5c493f16046e34f182d7e6a2c69a667aab035799752c6f03017c883b134ad3f80e3f78d7e7da81a9c1f3d01676126baf5d0e + version: 1.0.36 + resolution: "@types/json-stable-stringify@npm:1.0.36" + checksum: 765b07589e11a3896c3d06bb9e3a9be681e7edd95adf27370df0647a91bd2bfcfaf0e091fd4a13729343b388973f73f7e789d6cc62ab988240518a2d27c4a4e2 languageName: node linkType: hard @@ -13314,18 +13923,18 @@ __metadata: linkType: hard "@types/jsonfile@npm:*": - version: 6.1.2 - resolution: "@types/jsonfile@npm:6.1.2" + version: 6.1.4 + resolution: "@types/jsonfile@npm:6.1.4" dependencies: "@types/node": "npm:*" - checksum: 3e020944de09e54ef7c4200dfbbedba76da417a58c712611ff9d30921e214dfabbe81dadd4d6608647a3ee8900d445407d7336dd991b8fe6df4249320ad4a1b4 + checksum: 309fda20eb5f1cf68f2df28931afdf189c5e7e6bec64ac783ce737bb98908d57f6f58757ad5da9be37b815645a6f914e2d4f3ac66c574b8fe1ba6616284d0e97 languageName: node linkType: hard "@types/keygrip@npm:*": - version: 1.0.3 - resolution: "@types/keygrip@npm:1.0.3" - checksum: adee9a3efda3db9c64466af1c7c91a6d049420ee50589500cfd36e3e38d6abefdd858da88e6da63ed186e588127af3e862c1dc64fb0ad45c91870e6c35fe3be0 + version: 1.0.6 + resolution: "@types/keygrip@npm:1.0.6" + checksum: d157f60bf920492347791d2b26d530d5069ce05796549fbacd4c24d66ffbebbcb0ab67b21e7a1b80a593b9fd4b67dc4843dec04c12bbc2e0fddfb8577a826c41 languageName: node linkType: hard @@ -13348,17 +13957,17 @@ __metadata: linkType: hard "@types/koa-compose@npm:*": - version: 3.2.6 - resolution: "@types/koa-compose@npm:3.2.6" + version: 3.2.8 + resolution: "@types/koa-compose@npm:3.2.8" dependencies: "@types/koa": "npm:*" - checksum: 1204c5bfa4c69448b692aba29c566ef6bedbdbe5842fa180450267a23d3606faa13ef209876fd0c989edb5bc381812a66610fcfeac196ce4e76364354756ba1f + checksum: 95c32bdee738ac7c10439bbf6342ca3b9f0aafd7e8118739eac7fb0fa703a23cfe4c88f63e13a69a16fbde702e0bcdc62b272aa734325fc8efa7e5625479752e languageName: node linkType: hard "@types/koa@npm:*": - version: 2.13.9 - resolution: "@types/koa@npm:2.13.9" + version: 2.13.12 + resolution: "@types/koa@npm:2.13.12" dependencies: "@types/accepts": "npm:*" "@types/content-disposition": "npm:*" @@ -13368,32 +13977,32 @@ __metadata: "@types/keygrip": "npm:*" "@types/koa-compose": "npm:*" "@types/node": "npm:*" - checksum: 190f63491e9a006e19e931a8e37c56883c1045e41d7c9286c67ded1d514a8ad8fa68d1ec6588e96dff81b4a51a18c71dd7784e74ca38e58b232e3cac36ca6e54 + checksum: d148fb02aa25cb239d5179211cd66f19275e7fc2563532dd2bc347163332f771dea224b7555209530abf6777afa5b5c7a2d650e752fb1126ce362fbdde4ec214 languageName: node linkType: hard -"@types/lodash-es@npm:^4.17.6, @types/lodash-es@npm:^4.17.9": - version: 4.17.9 - resolution: "@types/lodash-es@npm:4.17.9" +"@types/lodash-es@npm:^4.17.11, @types/lodash-es@npm:^4.17.6, @types/lodash-es@npm:^4.17.9": + version: 4.17.12 + resolution: "@types/lodash-es@npm:4.17.12" dependencies: "@types/lodash": "npm:*" - checksum: 5e3a8a74134e67c37f1b8eb4a2897c88038f1b1bd7f508feec9e5561b52787d7efcc30c18981e9c6edec2b894f127b60312a431d98b84e12e785bea9cb5d1d40 + checksum: 56b9a433348b11c31051c6fa9028540a033a08fb80b400c589d740446c19444d73b217cf1471d4036448ef686a83e8cf2a35d1fadcb3f2105f26701f94aebb07 languageName: node linkType: hard "@types/lodash.debounce@npm:^4.0.7": - version: 4.0.7 - resolution: "@types/lodash.debounce@npm:4.0.7" + version: 4.0.9 + resolution: "@types/lodash.debounce@npm:4.0.9" dependencies: "@types/lodash": "npm:*" - checksum: e873b2d77f89010876baba3437ef826b17221b98948e00b5590828334a481dea1c8f9d28543210e564adc53199584f42c3cb171f8b6c3614fefc0b4e0888679c + checksum: 8183a152e01928e3b97ca773f6ae6038b8695e76493ba8bf6b743ec143948a62294fbc9d49fa4a78b52265b3ba4892ef57534e0c13d04aa0f111671b5a944feb languageName: node linkType: hard "@types/lodash@npm:*, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.178, @types/lodash@npm:^4.14.182, @types/lodash@npm:^4.14.191": - version: 4.14.199 - resolution: "@types/lodash@npm:4.14.199" - checksum: 340aabe9b023553d64e47f2af7f2010814c1178ce3a2b256e8dd54c444578d5e6e937d70c7117ee1fac5c0fc429b592ab9f6d69a966f0a1222ebcbbe6d516c4a + version: 4.14.202 + resolution: "@types/lodash@npm:4.14.202" + checksum: 1bb9760a5b1dda120132c4b987330d67979c95dbc22612678682cd61b00302e190f4207228f3728580059cdab5582362262e3819aea59960c1017bd2b9fb26f6 languageName: node linkType: hard @@ -13404,6 +14013,13 @@ __metadata: languageName: node linkType: hard +"@types/luxon@npm:~3.3.0": + version: 3.3.5 + resolution: "@types/luxon@npm:3.3.5" + checksum: be2aede1787f437e0ec3e2d1b964c5831fed1838d10cc60d824f814d0c0659dfa8874ffa81bec116004845279bdee2e5127046bb4fd64dc71cce8c0c25f6c25f + languageName: node + linkType: hard + "@types/marked@npm:^6.0.0": version: 6.0.0 resolution: "@types/marked@npm:6.0.0" @@ -13414,39 +14030,39 @@ __metadata: linkType: hard "@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": - version: 4.0.2 - resolution: "@types/mdast@npm:4.0.2" + version: 4.0.3 + resolution: "@types/mdast@npm:4.0.3" dependencies: "@types/unist": "npm:*" - checksum: cb2915c71eb94319880a0185459cac89b73f14f903998e1b088055cc51b71de91d7c76bda46c584e5d9c2d21d817680a3b2de56ebb737c14c641f81ad30028ed + checksum: 6d2d8f00ffaff6663dd67ea9ab999a5e52066c001432a9b99947fa9e76bccba819dfca40e419588a637a70d42cd405071f5b76efd4ddeb1dc721353b7cc73623 languageName: node linkType: hard "@types/mdx@npm:^2.0.0": - version: 2.0.8 - resolution: "@types/mdx@npm:2.0.8" - checksum: 742e8805c25bc37c55140daf445a5599244e4845265796183beefb2a9fd0491c71c2790ad5a4692fc958bafcf363ade564a2a2d1df28efed63ac7ce2ecc652b7 + version: 2.0.10 + resolution: "@types/mdx@npm:2.0.10" + checksum: 9e4ac676d191142e5cd33bb5f07f57f1ea0138ce943ad971df8a47be907def83daad0c351825fdd59fe94fc94a58579fb329185b8def8ce5478d1fb378ec7ac2 languageName: node linkType: hard "@types/mime-types@npm:^2.1.0": - version: 2.1.2 - resolution: "@types/mime-types@npm:2.1.2" - checksum: 9e3c78f1c63211e0450901212566a046da68d4438a5e543333ec9b0be3259bd5d01532734dc51ead40104889b98d12c7663b65212a318aafad3e34c98204e9e1 + version: 2.1.4 + resolution: "@types/mime-types@npm:2.1.4" + checksum: f8c521c54ee0c0b9f90a65356a80b1413ed27ccdc94f5c7ebb3de5d63cedb559cd2610ea55b4100805c7349606a920d96e54f2d16b2f0afa6b7cd5253967ccc9 languageName: node linkType: hard "@types/mime@npm:*": - version: 3.0.2 - resolution: "@types/mime@npm:3.0.2" - checksum: 09cf74f6377d1b27f4a24512cb689ad30af59880ac473ed6f7bc5285ecde88bbe8fe500789340ad57810da9d6fe1704f86e8bfe147b9ea76d58925204a60b906 + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843 languageName: node linkType: hard "@types/mime@npm:^1": - version: 1.3.3 - resolution: "@types/mime@npm:1.3.3" - checksum: 7e27dede6517c1d604821a8a5412d6b7131decc8397ad4bac9216fc90dea26c9571426623ebeea2a9b89dbfb89ad98f7370a3c62cd2be8896c6e897333b117c9 + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard @@ -13458,109 +14074,99 @@ __metadata: linkType: hard "@types/minimist@npm:^1.2.0": - version: 1.2.3 - resolution: "@types/minimist@npm:1.2.3" - checksum: 666ea4f8c39dcbdfbc3171fe6b3902157c845cc9cb8cee33c10deb706cda5e0cc80f98ace2d6d29f6774b0dc21180c96cd73c592a1cbefe04777247c7ba0e84b + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 languageName: node linkType: hard "@types/ms@npm:*": - version: 0.7.32 - resolution: "@types/ms@npm:0.7.32" - checksum: 610744605c5924aa2657c8a62d307052af4f0e38e2aa015f154ef03391fabb4fd903f9c9baacb41f6e5798b8697e898463c351e5faf638738603ed29137b5254 + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a languageName: node linkType: hard "@types/node-fetch@npm:^2.6.1, @types/node-fetch@npm:^2.6.4": - version: 2.6.6 - resolution: "@types/node-fetch@npm:2.6.6" + version: 2.6.9 + resolution: "@types/node-fetch@npm:2.6.9" dependencies: "@types/node": "npm:*" form-data: "npm:^4.0.0" - checksum: ed3ccfe5ad000e55e42835e620c8854033457d475d341177509a32306f530fe6671c966634b1aae3942e93ac377c0960abd878863a9fe06f958a6035e088052e + checksum: fc46141516191699b5f34fdf3516d3bd67421ad18da9f14785252abd22c1aa7a80ea5bcde835531b33df681f2b0d671786c3e987941547532fb447d77ebb8588 languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:>=8.1.0": - version: 20.8.6 - resolution: "@types/node@npm:20.8.6" - dependencies: - undici-types: "npm:~5.25.1" - checksum: cdfe0a2d90005323bbaf8fa4002607af98d49016c81898cd7f574d9ec6fc980580ea1b97f7b6ecaa8614be8004cd03898766e99e1869428ba6ed3bcd66a15354 - languageName: node - linkType: hard - -"@types/node@npm:20.5.1": - version: 20.5.1 - resolution: "@types/node@npm:20.5.1" - checksum: e91034ba7eda82171dff73d3b30f584941400a5611b45d73a4d8159dc1fc309d4f1a423fbe84fd22d1ba7833383ee299c81ace6fab035c17affd0f4f0cbe7a89 - languageName: node - linkType: hard - -"@types/node@npm:^16.0.0": - version: 16.18.58 - resolution: "@types/node@npm:16.18.58" - checksum: 57c5618eb3c8ac0e14adf665811980f4780d2b7bed6f830438d199147279949e1395fd9019b77346935257a9700c2afff60d357f67d373a4f8dcff4319d769ab - languageName: node - linkType: hard - -"@types/node@npm:^18.11.18, @types/node@npm:^18.18.5": - version: 18.18.5 - resolution: "@types/node@npm:18.18.5" - checksum: a7363aab9f402290799d3e2696fbc70c76a8a65e2354f72b8f399c38edc346f600066f8ac59dde985cfc64160cfeb63ed7fc917aecdfe7ec469345d3ce029bda - languageName: node - linkType: hard - -"@types/nodemailer@npm:^6.4.11": - version: 6.4.11 - resolution: "@types/nodemailer@npm:6.4.11" +"@types/node-forge@npm:^1.3.0": + version: 1.3.10 + resolution: "@types/node-forge@npm:1.3.10" dependencies: "@types/node": "npm:*" - checksum: a24b78bca0746da4d005c348b89000156c2c3a672571325f23fbc9642349a6d7e5d2b71828c49495f0890e293b8d4aa27983f92abb9e521696a2a083e02d2858 + checksum: 111520ac4db33bba4e46fcb75e9c29234ca78e2ece32fc929e7382798cdb7985e01da7e8f70c32769f42996e8d06f347d34d90308951cf2d004f418135ac7735 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:>=8.1.0, @types/node@npm:^20.9.3": + version: 20.9.4 + resolution: "@types/node@npm:20.9.4" + dependencies: + undici-types: "npm:~5.26.4" + checksum: d567855b48e453b443499c17fc6c939d154732b54319a05b9b31db6e475e6458f053838635b201b1bb493d349d9b1af0aecc58b28fd6062e564e9fbf593199eb + languageName: node + linkType: hard + +"@types/node@npm:^18.0.0, @types/node@npm:^18.11.18, @types/node@npm:^18.11.9": + version: 18.18.12 + resolution: "@types/node@npm:18.18.12" + dependencies: + undici-types: "npm:~5.26.4" + checksum: bd32120a52e7bdbf38dafa0f9cdb0c322115fc7fe38890b6c151507199d307652905077b878f0173c375389c87400d78f25a12fc8517b8f829547c95df37ef4e + languageName: node + linkType: hard + +"@types/nodemailer@npm:^6.4.14": + version: 6.4.14 + resolution: "@types/nodemailer@npm:6.4.14" + dependencies: + "@types/node": "npm:*" + checksum: 0f7e93a7fda5cc72ca3214ad2780fc251f7dcfb9a5b2d0616927fa4a700c82b024ce0a5134dfac52429f4d08429d1af027002e9ed385bd3cb6224c890598bf03 languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.2 - resolution: "@types/normalize-package-data@npm:2.4.2" - checksum: 2132e4054711e6118de967ae3a34f8c564e58d71fbcab678ec2c34c14659f638a86c35a0fd45237ea35a4a03079cf0a485e3f97736ffba5ed647bfb5da086b03 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 languageName: node linkType: hard "@types/object-path@npm:^0.11.1": - version: 0.11.2 - resolution: "@types/object-path@npm:0.11.2" - checksum: f97e1233e5d4840a33921c6aa2794f17da78dba68a93c560626383188eab0b0c4b10b53c3e8add61683623685c7534168713c19c9374cffdfe7c071848607c28 + version: 0.11.4 + resolution: "@types/object-path@npm:0.11.4" + checksum: 7f1f5cb18b651d21e7861da176d8f87526c936ed949a8126a2692195cbe65734ed1a1a22c06a24a54afe1890483a3d6b074b402ebfca7a7567c1c287b588f563 languageName: node linkType: hard -"@types/on-headers@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/on-headers@npm:1.0.1" +"@types/on-headers@npm:^1.0.3": + version: 1.0.3 + resolution: "@types/on-headers@npm:1.0.3" dependencies: "@types/node": "npm:*" - checksum: 8780b7f97c6e0da8fa5512fcaad15b05faa129ef5567bfa7623f5e0087a32fae3acb64caa365ebf609edd11d04544e589ce9cb1891fcbb453dfcadd341163227 + checksum: cc3878fada3ef4cdbd08332b4f814f7b33c5b481e96f802ca580325a462220a43dc01ce5025edc947724148eb20300bfef733e74930fb11e4ab5b546776aa733 languageName: node linkType: hard "@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: 4df9de98150d2978afc2161482a3a8e6617883effba3223324f079de97ba7eabd7d84b90ced11c3f82b0c08d4a8383f678c9f73e9c41258f769b3fa234a2bb4f + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 languageName: node linkType: hard "@types/pica@npm:*": - version: 9.0.3 - resolution: "@types/pica@npm:9.0.3" - checksum: b58795431bfe0bbbd32f64767ab6d620f82f38a7405db6e00598065f215d72b201ad411fa0c70072526e1bf1c752d0732a79bf5c88c5b3621c58500dd736b870 - languageName: node - linkType: hard - -"@types/prettier@npm:^2.1.5": - version: 2.7.3 - resolution: "@types/prettier@npm:2.7.3" - checksum: cda84c19acc3bf327545b1ce71114a7d08efbd67b5030b9e8277b347fa57b05178045f70debe1d363ff7efdae62f237260713aafc2d7217e06fc99b048a88497 + version: 9.0.4 + resolution: "@types/pica@npm:9.0.4" + checksum: fd1954400cb45a191a8f05da5009ebfafe4b5e173cc1ed2806d263de48250e303cfa06207d8da36091a834a29b34ffe65d386a35788831e9f906b7f6670ce9c3 languageName: node linkType: hard @@ -13574,49 +14180,49 @@ __metadata: linkType: hard "@types/pretty-hrtime@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/pretty-hrtime@npm:1.0.1" - checksum: a6cdee417eea6f7af914e4fcd13e05822864ce10b5d7646525632e86d69b79123eec55a5d3fff0155ba46b61902775e1644bcb80e1e4dffdac28e7febb089083 + version: 1.0.3 + resolution: "@types/pretty-hrtime@npm:1.0.3" + checksum: 288061dff992c8107d5c7b5a1277bbb0a314a27eb10087dea628a08fa37694a655191a69e25a212c95e61e498363c48ad9e281d23964a448f6c14100a6be0910 languageName: node linkType: hard -"@types/pretty-time@npm:^1.1.3": - version: 1.1.3 - resolution: "@types/pretty-time@npm:1.1.3" - checksum: ba7c41eb4b0f0a87a7121072129066806a5c3f830d27708707f7a6ace5f3f7d95c09f6adf92781d854c38b88ab9ad1f097ab73c0c310d78bfa4b8e617d3d80f5 +"@types/pretty-time@npm:^1.1.5": + version: 1.1.5 + resolution: "@types/pretty-time@npm:1.1.5" + checksum: 16bb03d6719fbe3590bf6d97d78ba8280223a9b5b929b562e6aa9d0199a403b515dbb04c099ef595a8256a5a2f89fd1e13c8371e35f86e9131049db497800759 languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.7.7": - version: 15.7.8 - resolution: "@types/prop-types@npm:15.7.8" - checksum: 61dfad79da8b1081c450bab83b77935df487ae1cdd4660ec7df6be8e74725c15fa45cf486ce057addc956ca4ae78300b97091e2a25061133d1b9a1440bc896ae +"@types/prop-types@npm:*": + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 languageName: node linkType: hard "@types/qs@npm:*, @types/qs@npm:^6.9.5": - version: 6.9.8 - resolution: "@types/qs@npm:6.9.8" - checksum: c28e07d00d07970e5134c6eed184a0189b8a4649e28fdf36d9117fe671c067a44820890de6bdecef18217647a95e9c6aebdaaae69f5fe4b0bec9345db885f77e + version: 6.9.10 + resolution: "@types/qs@npm:6.9.10" + checksum: 3e479ee056bd2b60894baa119d12ecd33f20a25231b836af04654e784c886f28a356477630430152a86fba253da65d7ecd18acffbc2a8877a336e75aa0272c67 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.5 - resolution: "@types/range-parser@npm:1.2.5" - checksum: db9aaa04a02d019395a9a4346475669a2864a32a6477ad0fc457bd2ef39a167cabe742f55a8a3fa8bc90abac795b716c22b37348bc3e19313ebe6c9310815233 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a languageName: node linkType: hard "@types/react-datepicker@npm:^4.19.0": - version: 4.19.0 - resolution: "@types/react-datepicker@npm:4.19.0" + version: 4.19.3 + resolution: "@types/react-datepicker@npm:4.19.3" dependencies: "@popperjs/core": "npm:^2.9.2" "@types/react": "npm:*" date-fns: "npm:^2.0.1" react-popper: "npm:^2.2.5" - checksum: 5fa086551b286e31f83d964897ed36d801cc6e465841f2b39a962407db7154a775b5a7cb1454e6004d196aa732b68a448a2b9fcf2b304beb16d453ff7b6f7cf7 + checksum: 98305c01186a1e42bda2a5002de70b27e1328b79ef3114842068c7de42d2c22f5eb96ff11d763173be7b4ba23f74e5bedb7337500a3fa1bd584232b7fb4e180e languageName: node linkType: hard @@ -13630,40 +14236,38 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.13": - version: 18.2.13 - resolution: "@types/react-dom@npm:18.2.13" + version: 18.2.17 + resolution: "@types/react-dom@npm:18.2.17" dependencies: "@types/react": "npm:*" - checksum: 0355d036d062bfa69345851282a555817c57be44d909250926296383bcc82fb4b79df08ecc882c519883e5ab8d179961d4cd245157a5c5977a7247714757b0ac - languageName: node - linkType: hard - -"@types/react-transition-group@npm:^4.4.7": - version: 4.4.7 - resolution: "@types/react-transition-group@npm:4.4.7" - dependencies: - "@types/react": "npm:*" - checksum: 7bbd52516c79d5a0b621366115c161a625293c179c1c44f02301634f3f6aab32c0c484e8f109d0d1e20d158ed471aaaf3140b26c21dc52398c335fc0981027a0 + checksum: fe0dbb3224b48515da8fe25559e3777d756a27c3f22903f0b1b020de8d68bd57eb1f0af62b52ee65d9632637950afed8cbad24d158c4f3d910d083d49bd73fba languageName: node linkType: hard "@types/react@npm:*, @types/react@npm:>=16, @types/react@npm:^18.2.28": - version: 18.2.28 - resolution: "@types/react@npm:18.2.28" + version: 18.2.38 + resolution: "@types/react@npm:18.2.38" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 213828dae911f15c02fc313b9173b42e71fb128ec03561ac8d2e5260a706bfd9c78bcacf0cd0a2d40fb7c2deccdae6316d99f0a5fe0a40928dc9d3b4f5199a3c + checksum: 9f9b9925c979e848d572dce6fff34951708127ba6b1fd4306c93fbcab74f5c6cff2b2e47d4222339eeb6c19d264e93450cb2ad6b255c73c536d0a1e2093cc98a + languageName: node + linkType: hard + +"@types/resolve@npm:^1.20.2": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: dc35f5517606b6687cd971c0281ac58bdee2c50c051b030f04647d3991688be2259c304ee97e5b5d4b9936072c36767eb5933b54611a407d6557972bb6fea4f6 languageName: node linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/responselike@npm:1.0.1" + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" dependencies: "@types/node": "npm:*" - checksum: ae8c36c9354aaedfa462dab655aa17613529d545a418acc54ba0214145fc1d0454be2ae107031a1b2c24768f19f2af7e4096a85d1e604010becd0bec2355cb0e + checksum: 6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 languageName: node linkType: hard @@ -13675,150 +14279,148 @@ __metadata: linkType: hard "@types/scheduler@npm:*": - version: 0.16.4 - resolution: "@types/scheduler@npm:0.16.4" - checksum: a57b0f10da1b021e6bd5eeef8a1917dd3b08a8715bd8029e2ded2096d8f091bb1bb1fef2d66e139588a983c4bfbad29b59e48011141725fa83c76e986e1257d7 + version: 0.16.8 + resolution: "@types/scheduler@npm:0.16.8" + checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d languageName: node linkType: hard "@types/semver@npm:^7.3.4, @types/semver@npm:^7.5.0": - version: 7.5.3 - resolution: "@types/semver@npm:7.5.3" - checksum: 452c2f37b16358805efcae2d9888a2cfe696b7fb9962451eb0fb46b0fa0bbd68924977cfd28afca91507eb6e3fc19909855a4f7fe4b1f1221d5aeed780e800ae + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: e77282b17f74354e17e771c0035cccb54b94cc53d0433fa7e9ba9d23fd5d7edcd14b6c8b7327d58bbd89e83b1c5eda71dfe408e06b929007e2b89586e9b63459 languageName: node linkType: hard "@types/send@npm:*": - version: 0.17.2 - resolution: "@types/send@npm:0.17.2" + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 2e7c21870da7684a9ac1db401f44d05533463cd374014bf5dcaf173e5a1074ee00d6085e7e0aba9cab345d95cb3aaaaf09a07b25e4a67344e1edc4d94eef2d17 + checksum: 28320a2aa1eb704f7d96a65272a07c0bf3ae7ed5509c2c96ea5e33238980f71deeed51d3631927a77d5250e4091b3e66bce53b42d770873282c6a20bb8b0280d languageName: node linkType: hard "@types/serve-index@npm:^1.9.1": - version: 1.9.2 - resolution: "@types/serve-index@npm:1.9.2" + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" dependencies: "@types/express": "npm:*" - checksum: 4fd0a8fcdd6e2b2d7704a539b7c1e0d143e9e00be4c3992394fe2ef7e9b67283d74b43db3f92b0e0717d779aa51184168bbae617d30456357cb95ec58aa59ea8 + checksum: 72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 languageName: node linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.3 - resolution: "@types/serve-static@npm:1.15.3" + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: "@types/http-errors": "npm:*" "@types/mime": "npm:*" "@types/node": "npm:*" - checksum: 9b759cf03e0896e9434df6d2d528c3e0016a2cef54e66775fb67f8fa6f9e78eed693adc95b3d6a18aacf629d8d596ad71c1d3eee5ecf95402b766cb012061ca2 - languageName: node - linkType: hard - -"@types/set-cookie-parser@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/set-cookie-parser@npm:2.4.4" - dependencies: - "@types/node": "npm:*" - checksum: db6f16639fba5645332d7e1c9c2c35b9466be55622c3e1a376e1dc0d5253c970aa2e67e868788e5c0d3483d7c8b6ab500eca25713717fb674285346959dc5bfd + checksum: 49aa21c367fffe4588fc8c57ea48af0ea7cbadde7418bc53cde85d8bd57fd2a09a293970d9ea86e79f17a87f8adeb3e20da76aab38e1c4d1567931fa15c8af38 languageName: node linkType: hard "@types/shimmer@npm:^1.0.2": - version: 1.0.3 - resolution: "@types/shimmer@npm:1.0.3" - checksum: 339c432e2bff10fe320199177cab738afb92e231ea537188b34b7e07c657f876310fb05fd36d29e8c8a8fa2b68b355158dd011d9fe806da156275c6dee7ac971 + version: 1.0.5 + resolution: "@types/shimmer@npm:1.0.5" + checksum: f6b0c950dc9187464c5393faf4f4e2b7b44b16665bb49196da28affecceb4fdcd9749af15cbe50f1a2de39f3a84b7523e73445f117f6b48bdbd61b892568364a languageName: node linkType: hard -"@types/sinon@npm:^10.0.19": - version: 10.0.19 - resolution: "@types/sinon@npm:10.0.19" +"@types/sinon@npm:^17.0.2": + version: 17.0.2 + resolution: "@types/sinon@npm:17.0.2" dependencies: "@types/sinonjs__fake-timers": "npm:*" - checksum: a61969cb73207980634e921c9ef7a9bb046336ba1a1e8a5f7928ce0e1efc0539fd05998d6bc0561f9bd4da671fd2d919c0d1077b6ffca4d68a4e6c779eba71f1 + checksum: 03e4c99f249123e8fd2f1f7a74a084c0a09420b06b4d9a385989eb14276ec7ca8ef8415dcf70292140b3e9d7c2fb04ab923b0218a2f7f70c8276d3ff5649df97 languageName: node linkType: hard "@types/sinonjs__fake-timers@npm:*": - version: 8.1.3 - resolution: "@types/sinonjs__fake-timers@npm:8.1.3" - checksum: 4c5bb22ae18a9eeb964d92bf93d6d966c9506c37bc89672a2c2af4adfbf34c3e6fdef4f761552fd4bac0a052d823e2a194a2b5a09404d16efbde5ed69f450654 + version: 8.1.5 + resolution: "@types/sinonjs__fake-timers@npm:8.1.5" + checksum: 3a0b285fcb8e1eca435266faa27ffff206608b69041022a42857274e44d9305822e85af5e7a43a9fae78d2ab7dc0fcb49f3ae3bda1fa81f0203064dbf5afd4f6 languageName: node linkType: hard "@types/sockjs@npm:^0.3.33": - version: 0.3.34 - resolution: "@types/sockjs@npm:0.3.34" + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: "@types/node": "npm:*" - checksum: 1d38b1976a97f5895a6be00cead1b2a59d842f023b6e35450b7eec8a3131c860c447aba3f7ea3c880c066d8277b0c76fae9d080be1aad475811b568ed6079d49 + checksum: b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc languageName: node linkType: hard "@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 + languageName: node + linkType: hard + +"@types/statuses@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/statuses@npm:2.0.4" + checksum: 3a806c3b96d1845e3e7441fbf0839037e95f717334760ddb7c29223c9a34a7206b68e2998631f89f1a1e3ef5b67b15652f6e8fa14987ebd7f6d38587c1bffd18 languageName: node linkType: hard "@types/superagent@npm:*": - version: 4.1.19 - resolution: "@types/superagent@npm:4.1.19" + version: 4.1.22 + resolution: "@types/superagent@npm:4.1.22" dependencies: "@types/cookiejar": "npm:*" "@types/node": "npm:*" - checksum: 809d2099dfdc740ff1ff3e1be6d7f5e01eece88d78d767897ff02a101df7eb151a35b8d2dd5db1ec389940c9f418af23adc01e01336d80a7d420d17c9d2424eb + checksum: f847c3e681e8a9cc6b3cf5f72b24e5ee50bef1715a46b0258e51edd506be556ee342e636c40c123d5b005739e2f1f0090564f9197a18715410e7b6cf0498ed82 languageName: node linkType: hard -"@types/supertest@npm:^2.0.14": - version: 2.0.14 - resolution: "@types/supertest@npm:2.0.14" +"@types/supertest@npm:^2.0.16": + version: 2.0.16 + resolution: "@types/supertest@npm:2.0.16" dependencies: "@types/superagent": "npm:*" - checksum: 9f6850a22b8f0fd4c26a6dfd9b64771a66476b1a4f841a3b84a9da843ce69463efbf37594fe107297dd14a225d199b802464d48d70e9413238c637903d392137 + checksum: 2fc998ea698e0467cdbe3bea0ebce2027ea3a45a13e51a6cecb0435f44b486faecf99c34d8702d2d7fe033e6e09fdd2b374af52ecc8d0c69a1deec66b8c0dd52 languageName: node linkType: hard "@types/trusted-types@npm:^2.0.2": - version: 2.0.4 - resolution: "@types/trusted-types@npm:2.0.4" - checksum: 5256c4576cd1c90d33ddd9cc9cbd4f202b39c98cbe8b7f74963298f9eb2159c285ea5c25a6181b4c594d8d75641765bff85d72c2d251ad076e6529ce0eeedd1c + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 languageName: node linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/unist@npm:3.0.0" - checksum: e9d21a8fb5e332be0acef29192d82632875b2ef3e700f1bc64fdfc1520189542de85c3d4f3bcfbc2f4afdb210f4c23f68061f3fbf10744e920d4f18430d19f49 + version: 3.0.2 + resolution: "@types/unist@npm:3.0.2" + checksum: 3d04d0be69316e5f14599a0d993a208606c12818cf631fd399243d1dc7a9bd8a3917d6066baa6abc290814afbd744621484756803c80cba892c39cd4b4a85616 languageName: node linkType: hard "@types/unist@npm:^2, @types/unist@npm:^2.0.0": - version: 2.0.8 - resolution: "@types/unist@npm:2.0.8" - checksum: f4852d10a6752dc70df363917ef74453e5d2fd42824c0f6d09d19d530618e1402193977b1207366af4415aaec81d4e262c64d00345402020c4ca179216e553c7 + version: 2.0.10 + resolution: "@types/unist@npm:2.0.10" + checksum: e2924e18dedf45f68a5c6ccd6015cd62f1643b1b43baac1854efa21ae9e70505db94290434a23da1137d9e31eb58e54ca175982005698ac37300a1c889f6c4aa languageName: node linkType: hard -"@types/uuid@npm:^9.0.1, @types/uuid@npm:^9.0.5": - version: 9.0.5 - resolution: "@types/uuid@npm:9.0.5" - checksum: 7577940949619768303c0bf0a7cc235fac3cfae1c0bb4a2e85bfb87b2eb1024955ab446f775394d259442cd769b663b6ce43c39bdfc955d946bf833804ddb421 +"@types/uuid@npm:^9.0.1, @types/uuid@npm:^9.0.5, @types/uuid@npm:^9.0.7": + version: 9.0.7 + resolution: "@types/uuid@npm:9.0.7" + checksum: c7321194aeba9ea173efd1e721403bdf4e7ae6945f8f8cdbc87c791f4b505ccf3dbc4a8883d90b394ef13b7c2dc778045792b05dbb23b3c746f8ea347804d448 languageName: node linkType: hard "@types/wait-on@npm:^5.2.0": - version: 5.3.2 - resolution: "@types/wait-on@npm:5.3.2" + version: 5.3.4 + resolution: "@types/wait-on@npm:5.3.4" dependencies: "@types/node": "npm:*" - checksum: 410914741d0b098446185d5b72ec7ca38b877835346aa35a101c646a41b36e485350956093c76c328f5783592abce68284cae0c94b2f400dcad7d0ac1539c2ff + checksum: 2711a9ef4af3995efd442acb806d3bba0a03ef3a7eb07b1734ddd8a42b6682414f6b57ed7536fb6a5df6c6449ca24c3d42924a9d896ae3eb1065b2abbe988a18 languageName: node linkType: hard @@ -13830,71 +14432,71 @@ __metadata: linkType: hard "@types/webfontloader@npm:^1.6.36": - version: 1.6.36 - resolution: "@types/webfontloader@npm:1.6.36" - checksum: 7f429fc253446f0f11f0aea5d88dfc67d272668277d8a1be7691277de76717b9435d9a65676267c9e5562634a7efbb366bc24fc68f5b507c6f1be9fd1a93bb2f + version: 1.6.38 + resolution: "@types/webfontloader@npm:1.6.38" + checksum: 2be3d1e43837ddeea8ea0390d0952fc735abc6d713b2b87843ad0a6d4acd6628b2ce8f0280ec81d48144a23e358d1bd22c16e4717cc8d67f75c1cd1ddc2d0f27 languageName: node linkType: hard "@types/webpack-env@npm:^1.18.2": - version: 1.18.2 - resolution: "@types/webpack-env@npm:1.18.2" - checksum: 8ddd69069a03e0961910a0492b919252528c929a44ca5a097289de3bedda3c5464617cf1abcde2005f56ab08e0f8f7e91b94d2d178fa1d8d55301b0eb99185e4 + version: 1.18.4 + resolution: "@types/webpack-env@npm:1.18.4" + checksum: a1c37f8eb93fa86077b2406d3b8dd50c7505cd2b6ec46044786aa9681b0114ad6c3c3cd6402f8ecce9e4de6626c2fd91e5acda62d5d450c1f531533c3812b7c0 languageName: node linkType: hard -"@types/ws@npm:^8.0.0, @types/ws@npm:^8.5.5, @types/ws@npm:^8.5.7": - version: 8.5.7 - resolution: "@types/ws@npm:8.5.7" +"@types/ws@npm:^8.0.0, @types/ws@npm:^8.5.10, @types/ws@npm:^8.5.5, @types/ws@npm:^8.5.7": + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" dependencies: "@types/node": "npm:*" - checksum: 48e426be74d6bdc176c06f98cc96f7fc91dba10aaf88c87108b57e1dba588f4607dcd062d7a83686a3857dc7af09fdd420d8a816c0306cb0362ece2f0e37983c + checksum: 9b414dc5e0b6c6f1ea4b1635b3568c58707357f68076df9e7cd33194747b7d1716d5189c0dbdd68c8d2521b148e88184cf881bac7429eb0e5c989b001539ed31 languageName: node linkType: hard "@types/yargs-parser@npm:*": - version: 21.0.1 - resolution: "@types/yargs-parser@npm:21.0.1" - checksum: b9e1a5758af6adbefcc04677d6387e48e5f35977fa83d8487aea9c1fe562876e3f266f60c5853e9ae55f91559528354494693c24993495ae74a18e9cee98edaa + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: a794eb750e8ebc6273a51b12a0002de41343ffe46befef460bdbb57262d187fdf608bc6615b7b11c462c63c3ceb70abe2564c8dd8ee0f7628f38a314f74a9b9b languageName: node linkType: hard "@types/yargs@npm:^16.0.0": - version: 16.0.6 - resolution: "@types/yargs@npm:16.0.6" + version: 16.0.9 + resolution: "@types/yargs@npm:16.0.9" dependencies: "@types/yargs-parser": "npm:*" - checksum: a1908b4344d34b918bb99b6157b3ee87f8441dc6d697c7787b779374d9118f69d979a93a44eec134ff20f25479d1fa460caac3d5a8e66e4af09c2cb261d2352d + checksum: 8f31cbfcd5c3ac67c27e26026d8b9af0c37770fb2421b661939ba06d136f5a4fa61528a5d0f495d5802fbf1d9244b499e664d8d884e3eb3c36d556fb7c278f18 languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.28 - resolution: "@types/yargs@npm:17.0.28" + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" dependencies: "@types/yargs-parser": "npm:*" - checksum: e43a902385676c81c486adfbdc12194f7ccdd05779c61ca6bd3cfeb7f319f265c2d1666cc16082ddffe8a681ee03a580072906a9fccc4dc59c5053c8ea7cb61b + checksum: 1e2b2673847011ce43607df690d392f137d95a2d6ea85aa319403eadda2ef4277365efd4982354d8843f2611ef3846c88599660aaeb537fa9ccddae83c2a89de languageName: node linkType: hard "@types/yauzl@npm:^2.9.1": - version: 2.10.1 - resolution: "@types/yauzl@npm:2.10.1" + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" dependencies: "@types/node": "npm:*" - checksum: 3377916a2d493cb2422b167fb7dfff8cb3ea045a9489dab4955858719bf7fe6808e5f6a51ee819904fb7f623f7ac092b87f9d6a857ea1214a45070d19c8b3d7e + checksum: 5ee966ea7bd6b2802f31ad4281c92c4c0b6dfa593c378a2582c58541fa113bec3d70eb0696b34ad95e8e6861a884cba6c3e351285816693ed176222f840a8c08 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.7.5": - version: 6.8.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.8.0" +"@typescript-eslint/eslint-plugin@npm:^6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.12.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.8.0" - "@typescript-eslint/type-utils": "npm:6.8.0" - "@typescript-eslint/utils": "npm:6.8.0" - "@typescript-eslint/visitor-keys": "npm:6.8.0" + "@typescript-eslint/scope-manager": "npm:6.12.0" + "@typescript-eslint/type-utils": "npm:6.12.0" + "@typescript-eslint/utils": "npm:6.12.0" + "@typescript-eslint/visitor-keys": "npm:6.12.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -13907,44 +14509,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: dd830b5185e2860ab57d9b81c39184054eb1df2a35650a304e091e696217358d0d5bc1edc4ea578b4f17eda91585e294a4ade8a7590803f4dc583d8cab52573d + checksum: 1b9d2bb88f3e793067d7ec1e24e11b9d22891314bd5ebdef80a11a0ddde19f5c052b341e2f2c8a466b3af48e492f1028023566feaeb10a826d3928380c3d3d88 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.7.5": - version: 6.8.0 - resolution: "@typescript-eslint/parser@npm:6.8.0" +"@typescript-eslint/parser@npm:^6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/parser@npm:6.12.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.8.0" - "@typescript-eslint/types": "npm:6.8.0" - "@typescript-eslint/typescript-estree": "npm:6.8.0" - "@typescript-eslint/visitor-keys": "npm:6.8.0" + "@typescript-eslint/scope-manager": "npm:6.12.0" + "@typescript-eslint/types": "npm:6.12.0" + "@typescript-eslint/typescript-estree": "npm:6.12.0" + "@typescript-eslint/visitor-keys": "npm:6.12.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: a487e15f788515353022153851a385ddc88cbf6279f48ee5d40f62c81baa6cad6e3b2a7bd0af59e88d2fc77f57aaf104ab37d6f0805d50e16cc2f995e6c07613 + checksum: 2e33b581bcf882336bd4734e90a90dc3618960f8c07f5f7d16e4f3a0f00af97d3b3c8adc366170e1d9c8afd922068b3cfc5e9e997fd4ca6ebcb7c46a9e5b30a1 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/scope-manager@npm:6.8.0" +"@typescript-eslint/scope-manager@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/scope-manager@npm:6.12.0" dependencies: - "@typescript-eslint/types": "npm:6.8.0" - "@typescript-eslint/visitor-keys": "npm:6.8.0" - checksum: cd5fe9587792a1e61aa280566294643361de8f96990fbdc2b400b26e4fe579e0d5a791fd6732eb0f76a8f7c6b27b6582141be9e4ab4397150974149fd0ce1f99 + "@typescript-eslint/types": "npm:6.12.0" + "@typescript-eslint/visitor-keys": "npm:6.12.0" + checksum: 46c4a5575fbbb70a800934c93e89795cceef268a140b786a8d22615a0577a5356e42e316dfb23dbb43cec7271b480e712e3127ba33642040bd292fbb6a5de278 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/type-utils@npm:6.8.0" +"@typescript-eslint/type-utils@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/type-utils@npm:6.12.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.8.0" - "@typescript-eslint/utils": "npm:6.8.0" + "@typescript-eslint/typescript-estree": "npm:6.12.0" + "@typescript-eslint/utils": "npm:6.12.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -13952,7 +14554,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 976196864a404f3825ea1bf97cbcfde0fb9f541df927c203ce5d9e95379e947a0680e755b10349bc82a3566962421b3ff02a1c35860eac5acea2c1ba19502d4f + checksum: e92709a0ea5d5aee86def3da40fe4190235d3560f41e77a73d4bc10f6f59e0df367d5a1263d4e05aa44af4deb158ca6f37b09e483248e341a38fd5e2e8b70f72 languageName: node linkType: hard @@ -13970,19 +14572,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/types@npm:6.8.0" - checksum: 958534ac84d6d6cda6918ae46cb2f521b2e8736a12c0e697d00f02453f3acf9e7089cdbcfa57e6ddc18ae1536b2c157b7818903e4e632c773168146c327664ed +"@typescript-eslint/types@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/types@npm:6.12.0" + checksum: e52f12d01e2f543927fde985d709616dec1ef310da3a00e3d239874752ba7635e04d325e2a7cf6403d19977282f15fed7629d2477aeeb57df9140fa424f530fe languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.8.0" +"@typescript-eslint/typescript-estree@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.12.0" dependencies: - "@typescript-eslint/types": "npm:6.8.0" - "@typescript-eslint/visitor-keys": "npm:6.8.0" + "@typescript-eslint/types": "npm:6.12.0" + "@typescript-eslint/visitor-keys": "npm:6.12.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -13991,7 +14593,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 856b4ae4bfedfb938f98ad0c683e7087c28129a0b89f92f1cb65e4dfa73020ba896031ec6e66034edc5b5a36c0a7201d876ba6ec6af600d9c780486799628057 + checksum: 16f327faf736becb145894380e059a68a993b14fdf6dab50c5b79ff3c027a1e1a61274742f44f6ecd9ebbfadfc55559f94fad52e1596e1ed2656a3053367de85 languageName: node linkType: hard @@ -14031,20 +14633,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/utils@npm:6.8.0" +"@typescript-eslint/utils@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/utils@npm:6.12.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.8.0" - "@typescript-eslint/types": "npm:6.8.0" - "@typescript-eslint/typescript-estree": "npm:6.8.0" + "@typescript-eslint/scope-manager": "npm:6.12.0" + "@typescript-eslint/types": "npm:6.12.0" + "@typescript-eslint/typescript-estree": "npm:6.12.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: d4bb23b3d511a6e62d749d33eb41655301664ded8e43ac65e7a382059ff4cedf4e9b621f4c144ae2472244d2b96b6fc95c2d0de606bc78a9a88bb018ce52e9a0 + checksum: 84091ddc0f0cceb5d0a2e366139d65413867cf648f805355ab4a42ee273cdd691b9083084d1c1feb9cb3c1934c1ed338fbf92146c738a96b84de3d2ec2dfdec5 languageName: node linkType: hard @@ -14068,13 +14670,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.8.0" +"@typescript-eslint/visitor-keys@npm:6.12.0": + version: 6.12.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.12.0" dependencies: - "@typescript-eslint/types": "npm:6.8.0" + "@typescript-eslint/types": "npm:6.12.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 9a4245c1737863d57dadc8093fa3eb46c194a73b1979cedc947036df287fe800c6ee5294668ef461f826d62f673ec78f8809dafa41b2f22a73cf8c86d48fed1d + checksum: edf3537c8176059e8fdea680c10f85a635e427fb5caa6f88473077f50edbec7b011b0dc1e4499543519085559268d30a166b1cb160d30a1315ef818fc181a6a4 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 languageName: node linkType: hard @@ -14087,13 +14696,12 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/css@npm:^1.10.0, @vanilla-extract/css@npm:^1.13.0": - version: 1.13.0 - resolution: "@vanilla-extract/css@npm:1.13.0" +"@vanilla-extract/css@npm:^1.13.0, @vanilla-extract/css@npm:^1.14.0": + version: 1.14.0 + resolution: "@vanilla-extract/css@npm:1.14.0" dependencies: "@emotion/hash": "npm:^0.9.0" "@vanilla-extract/private": "npm:^1.0.3" - ahocorasick: "npm:1.0.2" chalk: "npm:^4.1.1" css-what: "npm:^6.1.0" cssesc: "npm:^3.0.0" @@ -14101,28 +14709,29 @@ __metadata: deep-object-diff: "npm:^1.1.9" deepmerge: "npm:^4.2.2" media-query-parser: "npm:^2.0.2" + modern-ahocorasick: "npm:^1.0.0" outdent: "npm:^0.8.0" - checksum: adaea5ee4dcab83660eadb533efa3e85920edefdd887db4624626abd38e2d97615c65cd95fa333253ee52c5e19a12d1dc6df8373332409ca4b15da10891ab2d7 + checksum: b708fa88705c72db4a4ed5246247910ca0297a6ef1edb3c64aa1ace3d4aee4bb739afcf5cf190ea4398f800aa96586c4ed4013b794924afa851b68723655cfb5 languageName: node linkType: hard "@vanilla-extract/dynamic@npm:^2.0.3": - version: 2.0.3 - resolution: "@vanilla-extract/dynamic@npm:2.0.3" + version: 2.1.0 + resolution: "@vanilla-extract/dynamic@npm:2.1.0" dependencies: "@vanilla-extract/private": "npm:^1.0.3" - checksum: a4d7d9894cc2f7896f3dc2216da813c61356a40281e00f5f1cbc9b28d2b26a87ab7532a30131b699222f3a5d54d2f3e168bc8d51a808f2704faf8f81bb601929 + checksum: c4a49e20485889967bb1c71fc4d208ff5c500f61bf6390a03453d51a691736c85807f47727d10de55ac66260a3ac2a4a9df76354f10c75ce127f0c00e49fd64b languageName: node linkType: hard -"@vanilla-extract/integration@npm:^6.0.0, @vanilla-extract/integration@npm:^6.0.2, @vanilla-extract/integration@npm:^6.2.0": - version: 6.2.2 - resolution: "@vanilla-extract/integration@npm:6.2.2" +"@vanilla-extract/integration@npm:^6.0.0, @vanilla-extract/integration@npm:^6.2.0, @vanilla-extract/integration@npm:^6.2.4": + version: 6.2.4 + resolution: "@vanilla-extract/integration@npm:6.2.4" dependencies: "@babel/core": "npm:^7.20.7" "@babel/plugin-syntax-typescript": "npm:^7.20.0" "@vanilla-extract/babel-plugin-debug-ids": "npm:^1.0.2" - "@vanilla-extract/css": "npm:^1.10.0" + "@vanilla-extract/css": "npm:^1.14.0" esbuild: "npm:0.17.6" eval: "npm:0.1.8" find-up: "npm:^5.0.0" @@ -14132,7 +14741,7 @@ __metadata: outdent: "npm:^0.8.0" vite: "npm:^4.1.4" vite-node: "npm:^0.28.5" - checksum: 31c0a536f5ac22d79eb9dfd5ebe80d0204d0603dcaa95557a4e938a0422e5ec469b937c9f5d2ad557b8f9b010f5bcd0dd7c38c62dbb9e08f35b5e623717dc650 + checksum: 9dd2dfe59b9e690480388a813c5ab7efa378dd293c60d7117edc0899c34dd25257926c78c059a97f7aed53976c0ee883da2b5f9ba4f3c7403bd3d98b2d8dc666 languageName: node linkType: hard @@ -14154,17 +14763,17 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/vite-plugin@npm:^3.9.0": - version: 3.9.0 - resolution: "@vanilla-extract/vite-plugin@npm:3.9.0" +"@vanilla-extract/vite-plugin@npm:^3.9.2": + version: 3.9.2 + resolution: "@vanilla-extract/vite-plugin@npm:3.9.2" dependencies: - "@vanilla-extract/integration": "npm:^6.0.2" + "@vanilla-extract/integration": "npm:^6.2.4" outdent: "npm:^0.8.0" postcss: "npm:^8.3.6" - postcss-load-config: "npm:^3.1.0" + postcss-load-config: "npm:^4.0.1" peerDependencies: - vite: ^2.2.3 || ^3.0.0 || ^4.0.3 - checksum: 038a9d7ad54f47948a8ed8fe6edbcd1ea8ed1c12cd6cbc56562b45f6819a190fad8ba8b9c66447a851e0bcd546867a5d9f7d3fd63d73fe5197e37aeabf0d31df + vite: ^2.2.3 || ^3.0.0 || ^4.0.3 || ^5.0.0 + checksum: ec0649678d58a7bef23afdf2a7e8685cf17343cce0a330fb858407d355e80e5372ce6f4a4911326939e90ca4d0024801d40c2590044c61c57c8466b2d50a3365 languageName: node linkType: hard @@ -14182,14 +14791,14 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react-swc@npm:^3.4.0": - version: 3.4.0 - resolution: "@vitejs/plugin-react-swc@npm:3.4.0" +"@vitejs/plugin-react-swc@npm:^3.5.0": + version: 3.5.0 + resolution: "@vitejs/plugin-react-swc@npm:3.5.0" dependencies: - "@swc/core": "npm:^1.3.85" + "@swc/core": "npm:^1.3.96" peerDependencies: - vite: ^4 - checksum: f39c90379c26c25387d60b30c20f156a09745f5a1e639f5d29c22afad358c0d78d5943a60bb5a08c43a1d0640bf3458c86181980361d9e708dd495ba5fe725a2 + vite: ^4 || ^5 + checksum: ca3315e2000303aa6da35b6bedc3a5c57550c5576dfa12e12d097a2f69f8c7bc68e6ce7a068685ae13fcbe121d43c133b47a0d4637ac58e366471dd6645bf8ac languageName: node linkType: hard @@ -14208,28 +14817,28 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^4.1.0": - version: 4.1.0 - resolution: "@vitejs/plugin-react@npm:4.1.0" +"@vitejs/plugin-react@npm:^4.2.0": + version: 4.2.0 + resolution: "@vitejs/plugin-react@npm:4.2.0" dependencies: - "@babel/core": "npm:^7.22.20" - "@babel/plugin-transform-react-jsx-self": "npm:^7.22.5" - "@babel/plugin-transform-react-jsx-source": "npm:^7.22.5" - "@types/babel__core": "npm:^7.20.2" + "@babel/core": "npm:^7.23.3" + "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" + "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" + "@types/babel__core": "npm:^7.20.4" react-refresh: "npm:^0.14.0" peerDependencies: - vite: ^4.2.0 - checksum: 97cdc60c572c1c9081f498723fc4ed4353dead01d649325b6cd7a8ae3cedc5ecdcfb7e3deacfe814cb10825a1e96bed2a853d1f2109057c0033fe68d6cd78020 + vite: ^4.2.0 || ^5.0.0 + checksum: 989d465f92588ed16902b822e1efe5c33bb13594b25d8d9d2ec4e7b23dd54847ff232b4318c0309c08acf38e1f27c182774bccf37122a4d04d0cba41c2ef7e67 languageName: node linkType: hard "@vitejs/plugin-vue@npm:^4.4.0": - version: 4.4.0 - resolution: "@vitejs/plugin-vue@npm:4.4.0" + version: 4.5.0 + resolution: "@vitejs/plugin-vue@npm:4.5.0" peerDependencies: - vite: ^4.0.0 + vite: ^4.0.0 || ^5.0.0 vue: ^3.2.25 - checksum: d1ce98135f3b38a3daa57993f429c40cc20259ea6b9b303f65d1787a8c08edad17ae470cc2e85f9802b1d507af0c5ee01e6ed54da30bac0dc1a548d0c549d892 + checksum: 15be17e5792eb7cfcf0ab0439eb40f53c0b6248ac32dbd01a2b1a315deb74724232ece7f607e1c2cd36241f6e2e9bdfc96dfdb495bfac8d272926e28e841a5ab languageName: node linkType: hard @@ -14320,92 +14929,93 @@ __metadata: languageName: node linkType: hard -"@volar/language-core@npm:1.10.4, @volar/language-core@npm:~1.10.4": - version: 1.10.4 - resolution: "@volar/language-core@npm:1.10.4" +"@volar/language-core@npm:1.10.10, @volar/language-core@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/language-core@npm:1.10.10" dependencies: - "@volar/source-map": "npm:1.10.4" - checksum: 7e29e322bf2209dfa51ae69a3597a562eca4cade64c5d938bcc7eccbed0ebe907977c946c905e8a56f1b989721f2bc829b53b461b9f75b915486820279f57a9a + "@volar/source-map": "npm:1.10.10" + checksum: 550ad7c527c8805b01430a2b060862553b9987f4e81dbc6b0300b1614b75b57757fc3433a61df7ba1badde1afa0213be2f1518b7ed5dc743185c4d58b2152d41 languageName: node linkType: hard -"@volar/source-map@npm:1.10.4, @volar/source-map@npm:~1.10.4": - version: 1.10.4 - resolution: "@volar/source-map@npm:1.10.4" +"@volar/source-map@npm:1.10.10, @volar/source-map@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/source-map@npm:1.10.10" dependencies: muggle-string: "npm:^0.3.1" - checksum: c31879552c23e7b8ac01eb70497f5a014c67d21061a90d30f4252bc8e44a2cb5dbe78e7548c1ea92d86ae5d04c5c0d7416f9f97e763a50a5196e06f1a7d62b69 + checksum: 33f54d289ad38934e7824e52b47f4a4e704415aba17f7500a20151e3579072deff9d6195da332b30f260a7da55fbc321867d8d6ad5482e901da7bf448a947b82 languageName: node linkType: hard -"@volar/typescript@npm:~1.10.4": - version: 1.10.4 - resolution: "@volar/typescript@npm:1.10.4" +"@volar/typescript@npm:~1.10.5": + version: 1.10.10 + resolution: "@volar/typescript@npm:1.10.10" dependencies: - "@volar/language-core": "npm:1.10.4" - checksum: bf320fc2aba5c758832dd278c4fae999c4465e57e1ba9a0244eaa7f7e234fa5ce451212ae6157320a11cd28e275387356443c4c6d13134641c59d2e621668fae + "@volar/language-core": "npm:1.10.10" + path-browserify: "npm:^1.0.1" + checksum: 624744abb5ca13873535833202936ac2e9ad0124b2f38762e5fae09aac32beffcc41dac3cfba4a7e3db4fbc0b7c9e416f3a11c081dd8e1a0a7f5350d9cdac376 languageName: node linkType: hard -"@vue/compiler-core@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/compiler-core@npm:3.3.4" +"@vue/compiler-core@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/compiler-core@npm:3.3.8" dependencies: - "@babel/parser": "npm:^7.21.3" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.0" + "@vue/shared": "npm:3.3.8" estree-walker: "npm:^2.0.2" source-map-js: "npm:^1.0.2" - checksum: bce178d7b12ca4a7e9397911f936e427c787779a8905804a124b53f899d68f7cb7b73223843ae920e413376bc0ecfbca7980af11fbeeb56c3e05490e9a48dcb2 + checksum: 47c46441b4d8b8b4258a34cfad7853f4b7bc45f10e04bf22256da3719e81c3c9b68c69c17434f48a733fd20f5dc5f48e972039e16125747655082b52f0674fc4 languageName: node linkType: hard -"@vue/compiler-dom@npm:3.3.4, @vue/compiler-dom@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/compiler-dom@npm:3.3.4" +"@vue/compiler-dom@npm:3.3.8, @vue/compiler-dom@npm:^3.3.0": + version: 3.3.8 + resolution: "@vue/compiler-dom@npm:3.3.8" dependencies: - "@vue/compiler-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: c85d5480472c36cca988359167eb5af3f00ccd1d61aa8643313977f52945b14a6a9e7bac03878500b767ac1ff16e7dab22ea62a419ffc565037a462530004353 + "@vue/compiler-core": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" + checksum: f4c44d078443a783a67db80357599bc0a1610ca052135b63fc9ee0e66a204bb4d8f46f737a5a82c3633a57701d9ad380c18d910f3e065804e63b6ae1ace61599 languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/compiler-sfc@npm:3.3.4" +"@vue/compiler-sfc@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/compiler-sfc@npm:3.3.8" dependencies: - "@babel/parser": "npm:^7.20.15" - "@vue/compiler-core": "npm:3.3.4" - "@vue/compiler-dom": "npm:3.3.4" - "@vue/compiler-ssr": "npm:3.3.4" - "@vue/reactivity-transform": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.0" + "@vue/compiler-core": "npm:3.3.8" + "@vue/compiler-dom": "npm:3.3.8" + "@vue/compiler-ssr": "npm:3.3.8" + "@vue/reactivity-transform": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" estree-walker: "npm:^2.0.2" - magic-string: "npm:^0.30.0" - postcss: "npm:^8.1.10" + magic-string: "npm:^0.30.5" + postcss: "npm:^8.4.31" source-map-js: "npm:^1.0.2" - checksum: c749b542d8d3b893e245142db5e6f55592a81aa602bf781a86643c525fad876d1924504eb3808d8b704cf05a510985ca336917942bc81cd7ae8197e82167ab97 + checksum: 26a83cf3c9a19865602fd7d477e6c0529191ef3b2c3d15b7aaa63b9a702587f97a45833fcc06569ed4fb978273fc6263957af7b36f689e08d01a5c0fb10939cd languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/compiler-ssr@npm:3.3.4" +"@vue/compiler-ssr@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/compiler-ssr@npm:3.3.8" dependencies: - "@vue/compiler-dom": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: e971e3f4472a6d041c1657bdcee2d95c42569ab27d2af524b7937b86a6908723bce9673e2dc75663b95272932412a96297322c0f31ddcacaaba460e1a076509f + "@vue/compiler-dom": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" + checksum: 68fea1f4648b6ce0f759f846e4e967644fd1f668821b2da0951d26d8780169cbc146e7840b17d212cf571a30bd65014cf7b82afc3b3b9a3450cb4c86d778fbaf languageName: node linkType: hard -"@vue/language-core@npm:1.8.19, @vue/language-core@npm:^1.8.8": - version: 1.8.19 - resolution: "@vue/language-core@npm:1.8.19" +"@vue/language-core@npm:1.8.22, @vue/language-core@npm:^1.8.8": + version: 1.8.22 + resolution: "@vue/language-core@npm:1.8.22" dependencies: - "@volar/language-core": "npm:~1.10.4" - "@volar/source-map": "npm:~1.10.4" + "@volar/language-core": "npm:~1.10.5" + "@volar/source-map": "npm:~1.10.5" "@vue/compiler-dom": "npm:^3.3.0" - "@vue/reactivity": "npm:^3.3.0" "@vue/shared": "npm:^3.3.0" + computeds: "npm:^0.0.1" minimatch: "npm:^9.0.3" muggle-string: "npm:^0.3.1" vue-template-compiler: "npm:^2.7.14" @@ -14414,79 +15024,69 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: f6bcbc92804a6e7bcf183a3a838ed2d640225e4ad8ca7a7d9a08546c195ef04f84bda20e6855cd2b8305632691cd6ff7061ecb8f1f9e0497b5841a4a6803a5c5 + checksum: e121fd1b7e55bedb11c7114e3d430f6511ee1bc0343eec0c6c3e6964a4a1014e49550c92a9fa23d5044827cba6f6cfaf689841828f833ac405381f6b29aff64a languageName: node linkType: hard -"@vue/reactivity-transform@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/reactivity-transform@npm:3.3.4" +"@vue/reactivity-transform@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/reactivity-transform@npm:3.3.8" dependencies: - "@babel/parser": "npm:^7.20.15" - "@vue/compiler-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@babel/parser": "npm:^7.23.0" + "@vue/compiler-core": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" estree-walker: "npm:^2.0.2" - magic-string: "npm:^0.30.0" - checksum: b6801f44efc33c04084736893838b5fc1e5be747efda75e46de34af8bbf921c72f20b13b2bdbc59051bbeee51bf5727aa3bd7eeebb97f40c6f450b2ac562cb4d + magic-string: "npm:^0.30.5" + checksum: c623e911e8c7cfc91bcb2b5849a29a0af0b279c2f3e38c57773f2e86b917b69586826f064514167d587ca16984ba7f51dcc5c76f450e887f0871c38ab9b471d4 languageName: node linkType: hard -"@vue/reactivity@npm:3.3.4, @vue/reactivity@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/reactivity@npm:3.3.4" +"@vue/reactivity@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/reactivity@npm:3.3.8" dependencies: - "@vue/shared": "npm:3.3.4" - checksum: 39c80d83e6e046c086f1f5db53c9e9e806ddf6e90bb2d0ea33f60da85c4747cae26d34959ae1f5b2a4b9e2822fc74701c996aa43ab1c727d2d4887e0ed0c8023 + "@vue/shared": "npm:3.3.8" + checksum: 929dbd92ddd9e114536ea755dfa09cb0bb4ed7792bcd34685265b691c1725ca020ac8d4948c38f5ce9402e11a383a2c5e9fa31116d544cbf4e432285eddc4cf7 languageName: node linkType: hard -"@vue/runtime-core@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/runtime-core@npm:3.3.4" +"@vue/runtime-core@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/runtime-core@npm:3.3.8" dependencies: - "@vue/reactivity": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: a057d811c2e5c38ab7a332f9769a9457772933c87a1627903b00cb156d253e43271c6f0f731d7b19c747c85bcc21b885f2b3e36e9e2d862cc298c47fcf8bd3b9 + "@vue/reactivity": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" + checksum: 7675b0c24cb79a2472cfa5b9f36879650e2e8bf204b4eb2e1557a6f89cfff3e3a24e2630fa88d5c5e9a069f67ae4c865ca2ad9ca8a3128520f16c2e8b037031b languageName: node linkType: hard -"@vue/runtime-dom@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/runtime-dom@npm:3.3.4" +"@vue/runtime-dom@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/runtime-dom@npm:3.3.8" dependencies: - "@vue/runtime-core": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - csstype: "npm:^3.1.1" - checksum: 5f063ccdd6b73602d9dfe345d2c8454794d5329d1365ae8b44d196bb33cfab627433f2e0552b663ef0bc4113a1d6f8205464e15d40ccc9b0bd2ff59d85dced45 + "@vue/runtime-core": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" + csstype: "npm:^3.1.2" + checksum: c0036b38204f05cdee38b22242c556782229d1ace9588ef3148754136820434acad46bc0f5a053e6daeea39d691aac6a74566fe828d8e61303bb23881f686287 languageName: node linkType: hard -"@vue/server-renderer@npm:3.3.4": - version: 3.3.4 - resolution: "@vue/server-renderer@npm:3.3.4" +"@vue/server-renderer@npm:3.3.8": + version: 3.3.8 + resolution: "@vue/server-renderer@npm:3.3.8" dependencies: - "@vue/compiler-ssr": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" + "@vue/compiler-ssr": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" peerDependencies: - vue: 3.3.4 - checksum: 9029c15d8d9cc69e6cb10b6e38f75d20b72e286e288962abc6f0f7f96c264571839e32d52afd4e6b4613ac97287084f945203ef6fc8787a04708353793166743 + vue: 3.3.8 + checksum: c81da56efc3fb248e6f44aebf80a4372f452933a551654a9e94a0b361295a34f49146f15cf1bf3a3369f0529b217534f7131971ae5f1584d1ba6ba8990f257e4 languageName: node linkType: hard -"@vue/shared@npm:3.3.4, @vue/shared@npm:^3.3.0": - version: 3.3.4 - resolution: "@vue/shared@npm:3.3.4" - checksum: ce01d9cb02ca01fd396e36ad0d75c2ff19e1adb8cf4e3454199511e3192655ae3bd8e8b1b581b529738ae4530f8aadaf09719d5ffe337279f3b47f6031c3f650 - languageName: node - linkType: hard - -"@vue/typescript@npm:1.8.19": - version: 1.8.19 - resolution: "@vue/typescript@npm:1.8.19" - dependencies: - "@volar/typescript": "npm:~1.10.4" - "@vue/language-core": "npm:1.8.19" - checksum: b4188f3d4f720f2f7510c97aed1dbaf75c7b3c34e354ba5b09cd2b57c188c5a6c0580b424a6cd51346b66fa83a6c4b4fedd6dc9ee390a16f7aabc67734aa3977 +"@vue/shared@npm:3.3.8, @vue/shared@npm:^3.3.0": + version: 3.3.8 + resolution: "@vue/shared@npm:3.3.8" + checksum: 6511b05ccee9f25ad71f4c4a0984090a6aad0717a1bcc95be5df041e38fb907e9a83a029705fb9e7132f755dab9bb795294358fe3f58fdb3506a7a3ebec42445 languageName: node linkType: hard @@ -14730,12 +15330,12 @@ __metadata: linkType: hard "@whatwg-node/fetch@npm:^0.9.0": - version: 0.9.13 - resolution: "@whatwg-node/fetch@npm:0.9.13" + version: 0.9.14 + resolution: "@whatwg-node/fetch@npm:0.9.14" dependencies: - "@whatwg-node/node-fetch": "npm:^0.4.17" + "@whatwg-node/node-fetch": "npm:^0.5.0" urlpattern-polyfill: "npm:^9.0.0" - checksum: 523c231f7fbcdd4a3eb7880c68555aee0ab66823d7a5c40138d5384857d5452cabdb60ad5aa9ea329e8d525b5c924f0a368a7e965454e18e707474d9f7dac9cf + checksum: 74cdaf82abc2eaa15790fe1a15c8d1208bed090956888c8f35ba622b977e75027edef6b85705b0e7680497f478bd90bf0b784b486de95c84a2806e19d65a1f0c languageName: node linkType: hard @@ -14752,20 +15352,20 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/node-fetch@npm:^0.4.17": - version: 0.4.19 - resolution: "@whatwg-node/node-fetch@npm:0.4.19" +"@whatwg-node/node-fetch@npm:^0.5.0": + version: 0.5.0 + resolution: "@whatwg-node/node-fetch@npm:0.5.0" dependencies: "@whatwg-node/events": "npm:^0.1.0" busboy: "npm:^1.6.0" fast-querystring: "npm:^1.1.1" fast-url-parser: "npm:^1.1.3" tslib: "npm:^2.3.1" - checksum: 343a8777df3bde6d275ea19a6feaa66f39bcc7619fa9ec1442fa98b2bcc759eff44af74db2746bf210100f25b2a43625ac38ae7a478a512d868fa6b26da4fae6 + checksum: b779288b07296e0be60e90e338de46b9d0c892d2e38b99bd04d062bbd4acb429607afc92b9bfdbf10841cef6f4b531e63415197583677de69a07e7b2e39350b9 languageName: node linkType: hard -"@xmldom/xmldom@npm:^0.8.3, @xmldom/xmldom@npm:^0.8.8": +"@xmldom/xmldom@npm:^0.8.8": version: 0.8.10 resolution: "@xmldom/xmldom@npm:0.8.10" checksum: 62400bc5e0e75b90650e33a5ceeb8d94829dd11f9b260962b71a784cd014ddccec3e603fe788af9c1e839fa4648d8c521ebd80d8b752878d3a40edabc9ce7ccf @@ -14852,13 +15452,6 @@ __metadata: languageName: node linkType: hard -"@zxing/text-encoding@npm:0.9.0": - version: 0.9.0 - resolution: "@zxing/text-encoding@npm:0.9.0" - checksum: 268e4ef64b8eaa32b990240bdfd1f7b3e2b501a6ed866a565f7c9747f04ac884fbe0537fe12bb05d9241b98fb111270c0fd0023ef0a02d23a6619b4589e98f6b - languageName: node - linkType: hard - "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -14885,6 +15478,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -14930,9 +15530,9 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: e69f7234f2adfeb16db3671429a7c80894105bd7534cb2032acf01bb26e6a847952d11a062d071420b43f8d82e33d2e57f26fe87d9cce0853e8143d8910ff1de + version: 8.3.0 + resolution: "acorn-walk@npm:8.3.0" + checksum: 7673f342db939adc16ac3596c374a56be33e6ef84e01dfb3a0b50cc87cf9b8e46d84c337dcd7d5644f75bf219ad5a36bf33795e9f1af15298e6bceacf46c5f1f languageName: node linkType: hard @@ -14945,12 +15545,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" +"acorn@npm:^8.10.0, acorn@npm:^8.11.2, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" bin: acorn: bin/acorn - checksum: 522310c20fdc3c271caed3caf0f06c51d61cb42267279566edd1d58e83dbc12eebdafaab666a0f0be1b7ad04af9c6bc2a6f478690a9e6391c3c8b165ada917dd + checksum: ff559b891382ad4cd34cc3c493511d0a7075a51f5f9f02a03440e92be3705679367238338566c5fbd3521ecadd565d29301bc8e16cb48379206bffbff3d72500 languageName: node linkType: hard @@ -15015,13 +15615,6 @@ __metadata: languageName: node linkType: hard -"ahocorasick@npm:1.0.2": - version: 1.0.2 - resolution: "ahocorasick@npm:1.0.2" - checksum: b2da9f3a7e6faae9975ffdb15a0d7a6c6590f8cf902fe8dc08ba972b59b61a25276923d7776fbd1844685a15600c24353dee3ee5a1cb27244fd64f1522b2c04a - languageName: node - linkType: hard - "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -15101,13 +15694,6 @@ __metadata: languageName: node linkType: hard -"ansi-color@npm:^0.2.1": - version: 0.2.1 - resolution: "ansi-color@npm:0.2.1" - checksum: 5e08767ae19f6e5b5717b800e3cba259600b913f04678076718abe5dccad25f66639aa3c6872a08365b18675b18c1f6d781638137d03da3f9da6a5394869c71c - languageName: node - linkType: hard - "ansi-colors@npm:^4.1.1": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -15389,11 +15975,11 @@ __metadata: linkType: hard "array-includes@npm:@nolyfill/array-includes@latest": - version: 1.0.21 - resolution: "@nolyfill/array-includes@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/array-includes@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 4664b7000a9042418fcda19ce32c105b511a0cb2e64096e36ee3346d05b3aa40fead35d50fb6b317d6a8ec33987e44c724dda907723a92739a2c4160eeee92d6 + "@nolyfill/shared": "npm:1.0.24" + checksum: d3258c0274387e44ead3495691442ac2fe3bc772a71ea53c1b4c564b6f1454cb4a22999718b5278c3e6ca251d6073c9ab3004755062211f4212cc1009a5c5e3e languageName: node linkType: hard @@ -15405,29 +15991,29 @@ __metadata: linkType: hard "array.prototype.flat@npm:@nolyfill/array.prototype.flat@latest": - version: 1.0.21 - resolution: "@nolyfill/array.prototype.flat@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/array.prototype.flat@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: b8cce8682e261171a0c1f39dc8b923c4787485fcab7bbeb7c892e11651568139aaf0b66b36ecbe18abee7ebdfed143f4d14e001bd564125c2865c5c3372c7d93 + "@nolyfill/shared": "npm:1.0.24" + checksum: 626b65be158d74727e3df79e8f2e0c45b0424f35ce721a4ae21675234ecb6bb802e9e51afdc5c43a19a1f7657b043a0f43c91ed3d4f9187d820698f6f3d2522a languageName: node linkType: hard "array.prototype.flatmap@npm:@nolyfill/array.prototype.flatmap@latest": - version: 1.0.21 - resolution: "@nolyfill/array.prototype.flatmap@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/array.prototype.flatmap@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 5ec463143f58f17b4cda8e3d05ef72e31696960c37cc754a868a34423ab895d2e51e15674149bf59e32becabc28e756b69d24ce3a477b5cb4be82b7ae36594dc + "@nolyfill/shared": "npm:1.0.24" + checksum: 42d8d8611049387d90ba0c118d80b3708c35a626d5c459c28d5275d685854e807ff0d85f855c9194f0d1b7775d0bc93e74145b372d7a6748857427b3a23f8d6b languageName: node linkType: hard "array.prototype.tosorted@npm:@nolyfill/array.prototype.tosorted@latest": - version: 1.0.21 - resolution: "@nolyfill/array.prototype.tosorted@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/array.prototype.tosorted@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 2f4a10fa5b326ff3af9490d28bb43c81b4144ba1c66668fab80b6615b4e36b8b3bbe4349b0524a1c0ef32f0c1e8d26519f985c98006ab3371e65cc09f3005f81 + "@nolyfill/shared": "npm:1.0.24" + checksum: bcf444867bb06e980d303a432a9426b6a53cb52a82462a103ba7acee1cd751684e1082929b060a9d4b9413d6896760c479c0db55f09a785cfca2347118d48004 languageName: node linkType: hard @@ -15554,15 +16140,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:^0.14.2": - version: 0.14.2 - resolution: "ast-types@npm:0.14.2" - dependencies: - tslib: "npm:^2.0.1" - checksum: 7c74b3090c90aa600b49a7a8cecc99e329f190600bcaa75ad087472a1a5a7ef23795a17ea00a74c2a8e822b336cd4f874e2e1b815a9877b4dba5e401566b0433 - languageName: node - linkType: hard - "ast-types@npm:^0.16.1": version: 0.16.1 resolution: "ast-types@npm:0.16.1" @@ -15617,9 +16194,9 @@ __metadata: linkType: hard "async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: bebb5dc2258c45b83fa1d3be179ae0eb468e1646a62d443c8d60a45e84041b28fccebe1e2d1f234bfc3dcad44e73dcdbf4ba63d98327c9f6556e3dbd47c2ae8b + version: 3.2.5 + resolution: "async@npm:3.2.5" + checksum: 323c3615c3f0ab1ac25a6f953296bc0ac3213d5e0f1c0debdb12964e55963af288d570293c11e44f7967af58c06d2a88d0ea588c86ec0fbf62fa98037f604a0f languageName: node linkType: hard @@ -15729,24 +16306,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" - dependencies: - follow-redirects: "npm:^1.14.9" - form-data: "npm:^4.0.0" - checksum: 2efaf18dd0805f7bc772882bc86f004abd92d51007b54c5081f74db0d08ce3593e2c010261896d25a14318eeaa2e966fd825e34f810e8a3339dc64b9d177cf70 - languageName: node - linkType: hard - -"axios@npm:^1.0.0": - version: 1.5.1 - resolution: "axios@npm:1.5.1" +"axios@npm:^1.5.1, axios@npm:^1.6.1": + version: 1.6.2 + resolution: "axios@npm:1.6.2" dependencies: follow-redirects: "npm:^1.15.0" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 67633db5867c789a6edb6e5229884501bef89584a6718220c243fd5a64de4ea7dcdfdf4f8368a672d582db78aaa9f8d7b619d39403b669f451e1242bbd4c7ee2 + checksum: 612bc93f8f738a518e7c5f9de9cc782bcd36aac6bae279160ef6a10260378e21c1786520eab3336898e3d66e0839ebdf739f327fb6d0431baa4d3235703a7652 languageName: node linkType: hard @@ -15759,20 +16326,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-jest@npm:28.1.3" +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" dependencies: - "@jest/transform": "npm:^28.1.3" + "@jest/transform": "npm:^29.7.0" "@types/babel__core": "npm:^7.1.14" babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^28.1.3" + babel-preset-jest: "npm:^29.6.3" chalk: "npm:^4.0.0" graceful-fs: "npm:^4.2.9" slash: "npm:^3.0.0" peerDependencies: "@babel/core": ^7.8.0 - checksum: 6dcbf194a037fb3df18d2aee56a3919a98a9b34292d1eb4aad823ebfa8b67f5a55f897213c1aafd52183928e99770319b8a094681ccb2910dc9993e6a7c1fd61 + checksum: 8a0953bd813b3a8926008f7351611055548869e9a53dd36d6e7e96679001f71e65fd7dbfe253265c3ba6a4e630dc7c845cf3e78b17d758ef1880313ce8fba258 languageName: node linkType: hard @@ -15802,15 +16369,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-plugin-jest-hoist@npm:28.1.3" +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" dependencies: "@babel/template": "npm:^7.3.3" "@babel/types": "npm:^7.3.3" "@types/babel__core": "npm:^7.1.14" "@types/babel__traverse": "npm:^7.0.6" - checksum: 355e383dae2b50efa0aff73a751f6bc55e7ae19ddfe72c73f4a0ad7667a671175aba17d824833d98b33602da18dd04e5e5d37d03c4f245940d8664c45ad29df5 + checksum: 9bfa86ec4170bd805ab8ca5001ae50d8afcb30554d236ba4a7ffc156c1a92452e220e4acbd98daefc12bf0216fccd092d0a2efed49e7e384ec59e0597a926d65 languageName: node linkType: hard @@ -15850,14 +16417,14 @@ __metadata: linkType: hard "babel-plugin-polyfill-corejs3@npm:^0.8.5": - version: 0.8.5 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" + version: 0.8.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" dependencies: "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - core-js-compat: "npm:^3.32.2" + core-js-compat: "npm:^3.33.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 5c2ac3615bd064f294a0b36bf6a1939995ec510173602e317fb18b1c015d31f46e2dd885faa3376e4da22785a515e5ba37e069f0008e5eea830d2fe3b0e66a27 + checksum: 2d9c926fda31d800dea7843d82a41b8914a8aaa67d7fb293dd2594e82cd6ce4c9fc67c9d469587b7c14ba38f5ab5689bdc9c21c268888598f464fe77a5f4c964 languageName: node linkType: hard @@ -15947,15 +16514,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-preset-jest@npm:28.1.3" +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" dependencies: - babel-plugin-jest-hoist: "npm:^28.1.3" + babel-plugin-jest-hoist: "npm:^29.6.3" babel-preset-current-node-syntax: "npm:^1.0.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb languageName: node linkType: hard @@ -16041,9 +16608,9 @@ __metadata: linkType: hard "big-integer@npm:^1.6.44": - version: 1.6.51 - resolution: "big-integer@npm:1.6.51" - checksum: c7a12640901906d6f6b6bdb42a4eaba9578397b6d9a0dd090cf001ec813ff2bfcd441e364068ea0416db6175d2615f8ed19cff7d1a795115bf7c92d44993f991 + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 languageName: node linkType: hard @@ -16343,25 +16910,13 @@ __metadata: languageName: node linkType: hard -"bufrw@npm:^1.3.0": - version: 1.3.0 - resolution: "bufrw@npm:1.3.0" - dependencies: - ansi-color: "npm:^0.2.1" - error: "npm:^7.0.0" - hexer: "npm:^1.5.0" - xtend: "npm:^4.0.0" - checksum: 3fb8c0e349585615dd64b31e3dd1395296e66ed7e99dccdb20f7d2fcc4914920e051e5e94e608782c8b6d90aff0d9de8871e6c72e29b51053a108032ff31404b - languageName: node - linkType: hard - -"builder-util-runtime@npm:9.2.1, builder-util-runtime@npm:^9.2.1": - version: 9.2.1 - resolution: "builder-util-runtime@npm:9.2.1" +"builder-util-runtime@npm:9.2.3, builder-util-runtime@npm:^9.2.3": + version: 9.2.3 + resolution: "builder-util-runtime@npm:9.2.3" dependencies: debug: "npm:^4.3.4" sax: "npm:^1.2.4" - checksum: 23a4cc0e65d1547d022c9ec9b84958c811b3ef064baff58a103b985f902fd4bce043547126eb834227445fa7da915169069837ffed38631a59cd64385e45fe43 + checksum: 15f9618af1a2224d0ade19fa7dca12f80bc2ceeb4fc89242f2505b44f58d13d3439bb08a5bec865bb0f8e930fa57bd112d9ee9024f22f1654925ffe2bed3925b languageName: node linkType: hard @@ -16413,28 +16968,6 @@ __metadata: languageName: node linkType: hard -"c8@npm:^7.6.0": - version: 7.14.0 - resolution: "c8@npm:7.14.0" - dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@istanbuljs/schema": "npm:^0.1.3" - find-up: "npm:^5.0.0" - foreground-child: "npm:^2.0.0" - istanbul-lib-coverage: "npm:^3.2.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-reports: "npm:^3.1.4" - rimraf: "npm:^3.0.2" - test-exclude: "npm:^6.0.0" - v8-to-istanbul: "npm:^9.0.0" - yargs: "npm:^16.2.0" - yargs-parser: "npm:^20.2.9" - bin: - c8: bin/c8.js - checksum: 1b9ada019c999cb84d1dd2ace52aef84d91608214dfea612d97d66ef5285c7a75877569285955bfab58fea87f1d2edcdfee56ac1e3e93027df741cedf11e1aeb - languageName: node - linkType: hard - "c8@npm:^8.0.1": version: 8.0.1 resolution: "c8@npm:8.0.1" @@ -16464,14 +16997,40 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": "npm:^2.1.0" + "@npmcli/move-file": "npm:^2.0.0" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.1.0" + glob: "npm:^8.0.1" + infer-owner: "npm:^1.0.4" + lru-cache: "npm:^7.7.1" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + mkdirp: "npm:^1.0.4" + p-map: "npm:^4.0.0" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^9.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^2.0.0" + checksum: a14524d90e377ee691d63a81173b33c473f8bc66eb299c64290b58e1d41b28842397f8d6c15a01b4c57ca340afcec019ae112a45c2f67a79f76130d326472e92 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.0 + resolution: "cacache@npm:18.0.0" dependencies: "@npmcli/fs": "npm:^3.1.0" fs-minipass: "npm:^3.0.0" glob: "npm:^10.2.2" - lru-cache: "npm:^7.7.1" + lru-cache: "npm:^10.0.1" minipass: "npm:^7.0.3" minipass-collect: "npm:^1.0.2" minipass-flush: "npm:^1.0.5" @@ -16480,7 +17039,7 @@ __metadata: ssri: "npm:^10.0.0" tar: "npm:^6.1.11" unique-filename: "npm:^3.0.0" - checksum: 6e26c788bc6a18ff42f4d4f97db30d5c60a5dfac8e7c10a03b0307a92cf1b647570547cf3cd96463976c051eb9c7258629863f156e224c82018862c1a8ad0e70 + checksum: b71fefe97b9799a863dc48ac79da2bd57a724ff0922fddd3aef4f3b70395ba00d1ef9547a0594d3d6d3cd57aeaeaf4d938c54f89695053eb2198cf8758b47511 languageName: node linkType: hard @@ -16518,13 +17077,14 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.0.2" - checksum: ca787179c1cbe09e1697b56ad499fd05dc0ae6febe5081d728176ade699ea6b1589240cb1ff1fe11fcf9f61538c1af60ad37e8eb2ceb4ef21cd6085dfd3ccedd + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.1" + set-function-length: "npm:^1.1.1" + checksum: 246d44db6ef9bbd418828dbd5337f80b46be4398d522eded015f31554cbb2ea33025b0203b75c7ab05a1a255b56ef218880cca1743e4121e306729f9e414da39 languageName: node linkType: hard @@ -16606,9 +17166,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001549 - resolution: "caniuse-lite@npm:1.0.30001549" - checksum: 515ea123e5249075566a602e2c6a3239e16283d3cd4b78daf4fa86569c450ea6eec8a1c2d2cc33e3d554fa37b3a203306dc8423fee635ec04a86b2a9164dbbf2 + version: 1.0.30001564 + resolution: "caniuse-lite@npm:1.0.30001564" + checksum: eb63d0b5be8a4609ac89c02e4518c6a3adb2884fffd6b43151b43f06a5f367bde3e2c90a5df2213d094ef1af2d43f5b8756601955d077116f2a2897534b9ce33 languageName: node linkType: hard @@ -16891,18 +17451,18 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^7.4.0": - version: 7.4.0 - resolution: "chromatic@npm:7.4.0" +"chromatic@npm:^9.1.0": + version: 9.1.0 + resolution: "chromatic@npm:9.1.0" bin: chroma: dist/bin.js chromatic: dist/bin.js chromatic-cli: dist/bin.js - checksum: 6a3965c734d9513b17577078233d04db069204d44affc5db8b6cb21591f7bae0b26cf12cd6dd744ce6a04fef0336ef4fdd346a62ea3322babf585fe19bdea13b + checksum: e015aebb77ee266fc3a3da7d366cfb6132b27f540236dd23bcd5ed5985a9727f5e6398eb1880127e791d37febba04f80654519073d7e31b69fc59c256d1d6401 languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2": +"chrome-trace-event@npm:^1.0.2, chrome-trace-event@npm:^1.0.3": version: 1.0.3 resolution: "chrome-trace-event@npm:1.0.3" checksum: b5fbdae5bf00c96fa3213de919f2b2617a942bfcb891cdf735fbad2a6f4f3c25d42e3f2b1703328619d352c718b46b9e18999fd3af7ef86c26c91db6fae1f0da @@ -17340,7 +17900,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.16.0, commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.8.1": +"commander@npm:^2.16.0, commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: 90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b @@ -17442,9 +18002,9 @@ __metadata: linkType: hard "component-emitter@npm:^1.3.0": - version: 1.3.0 - resolution: "component-emitter@npm:1.3.0" - checksum: dfc1ec2e7aa2486346c068f8d764e3eefe2e1ca0b24f57506cd93b2ae3d67829a7ebd7cc16e2bf51368fac2f45f78fcff231718e40b1975647e4a86be65e1d05 + version: 1.3.1 + resolution: "component-emitter@npm:1.3.1" + checksum: 94550aa462c7bd5a61c1bc480e28554aa306066930152d1b1844a0dd3845d4e5db7e261ddec62ae184913b3e59b55a2ad84093b9d3596a8f17c341514d6c483d languageName: node linkType: hard @@ -17472,6 +18032,13 @@ __metadata: languageName: node linkType: hard +"computeds@npm:^0.0.1": + version: 0.0.1 + resolution: "computeds@npm:0.0.1" + checksum: 738625ccec6e483124d0ac79ec5474ab5c9df103ea05afc1fd840eed7d9004e3d6009b7bc806df564d66ad915c1ee1fb017bd91b2b32606a252ea9870b6a4026 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -17507,9 +18074,9 @@ __metadata: languageName: node linkType: hard -"concurrently@npm:^8.2.1": - version: 8.2.1 - resolution: "concurrently@npm:8.2.1" +"concurrently@npm:^8.2.2": + version: 8.2.2 + resolution: "concurrently@npm:8.2.2" dependencies: chalk: "npm:^4.1.2" date-fns: "npm:^2.30.0" @@ -17523,7 +18090,7 @@ __metadata: bin: conc: dist/bin/concurrently.js concurrently: dist/bin/concurrently.js - checksum: 8a7cb8caeb9430f939ae6ba3ccdce6080e7f3084dcbffb6383059002937bbe771d71f8f4f854258e6138f52918637a3d66a6b21fd19d0ea69c426011f878e701 + checksum: dcb1aa69d9c611a7bda9d4fc0fe1e388f971d1744acec7e0d52dffa2ef55743f1266ec9292f414c5789b9f61734b3fce772bd005d4de9564a949fb121b97bae1 languageName: node linkType: hard @@ -17582,39 +18149,39 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-angular@npm:^6.0.0": - version: 6.0.0 - resolution: "conventional-changelog-angular@npm:6.0.0" +"conventional-changelog-angular@npm:^7.0.0": + version: 7.0.0 + resolution: "conventional-changelog-angular@npm:7.0.0" dependencies: compare-func: "npm:^2.0.0" - checksum: ddc59ead53a45b817d83208200967f5340866782b8362d5e2e34105fdfa3d3a31585ebbdec7750bdb9de53da869f847e8ca96634a9801f51e27ecf4e7ffe2bad + checksum: e7966d2fee5475e76263f30f8b714b2b592b5bf556df225b7091e5090831fc9a20b99598a7d2997e19c2ef8118c0a3150b1eba290786367b0f55a5ccfa804ec9 languageName: node linkType: hard -"conventional-changelog-conventionalcommits@npm:^6.1.0": - version: 6.1.0 - resolution: "conventional-changelog-conventionalcommits@npm:6.1.0" +"conventional-changelog-conventionalcommits@npm:^7.0.2": + version: 7.0.2 + resolution: "conventional-changelog-conventionalcommits@npm:7.0.2" dependencies: compare-func: "npm:^2.0.0" - checksum: 7e5caef7d65b381a0b302534058acff83adc7a907094c85379ef138c35f2aa043cf8e7a3bef30f42078dcc4bff0e8bc763b179c007dd732d92856fae0607a4bc + checksum: 3cc6586ac57cc54c0595b28ae22e8b674c970034bad35e467f71aba395278a6ef43351cfbf782a5fc33eb13ed4ad843a145b89ad1444f5fa571e3bf9c1d5519b languageName: node linkType: hard -"conventional-commits-parser@npm:^4.0.0": - version: 4.0.0 - resolution: "conventional-commits-parser@npm:4.0.0" +"conventional-commits-parser@npm:^5.0.0": + version: 5.0.0 + resolution: "conventional-commits-parser@npm:5.0.0" dependencies: JSONStream: "npm:^1.3.5" - is-text-path: "npm:^1.0.1" - meow: "npm:^8.1.2" - split2: "npm:^3.2.2" + is-text-path: "npm:^2.0.0" + meow: "npm:^12.0.1" + split2: "npm:^4.0.0" bin: - conventional-commits-parser: cli.js - checksum: d3b7d947b486d3bb40f961808947ee46487429e050be840030211a80aa2eec170e427207c830f2720d8ab898649a652bbbe1825993b8bf0596517e3603f5a1bd + conventional-commits-parser: cli.mjs + checksum: 3b56a9313127f18c56b7fc0fdb0c49d2184ec18e0574e64580a0d5a3c3e0f3eecfb8bc3131dce967bfe9fd27debd5f42b7fc1f09e8e541e688e1dd2b57f49278 languageName: node linkType: hard -"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": +"convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 @@ -17666,7 +18233,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.4.2, cookie@npm:~0.4.1": +"cookie@npm:~0.4.1": version: 0.4.2 resolution: "cookie@npm:0.4.2" checksum: 2e1de9fdedca54881eab3c0477aeb067f281f3155d9cfee9d28dfb252210d09e85e9d175c0a60689661feb9e35e588515352f2456bc1f8e8db4267e05fd70137 @@ -17696,19 +18263,19 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": - version: 3.33.0 - resolution: "core-js-compat@npm:3.33.0" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": + version: 3.33.3 + resolution: "core-js-compat@npm:3.33.3" dependencies: browserslist: "npm:^4.22.1" - checksum: b1a5f7aab1c6ac0efd86c1412a5b27fb372c4e52c4b8f2c80b05216385125c4de30e4c36e4bcc6bfeec917a56e7736c87fab6a301ff8faaa1ae4acf81643fc9a + checksum: 90d5580bac23946c31aec1b75f1af4ebeafe97528398623780b3728cb6b28444be9aeb3563c857643cc84b3579007c45281fcb69fba9d9a7a011bea370e5e940 languageName: node linkType: hard "core-js-pure@npm:^3.23.3": - version: 3.33.0 - resolution: "core-js-pure@npm:3.33.0" - checksum: 4916014881a4e19475a503c91788ea0414d11687ea5c0de6666d5de756819db444ef88b29e12c7ad35d7320fc952251183ec60cf3f206e7955cccdfe4c260054 + version: 3.33.3 + resolution: "core-js-pure@npm:3.33.3" + checksum: 543a1e5fa9c6c17a732e56891c84e645b043fe91825bbcb09c93a557ccf152b0723c5cde2bb791b01528a3b1869aa4d50e0058b0391b64ee31dd1cbd37d45bf3 languageName: node linkType: hard @@ -17729,27 +18296,33 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.4.0 - resolution: "cosmiconfig-typescript-loader@npm:4.4.0" +"cosmiconfig-typescript-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "cosmiconfig-typescript-loader@npm:5.0.0" + dependencies: + jiti: "npm:^1.19.1" peerDependencies: "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" + cosmiconfig: ">=8.2" typescript: ">=4" - checksum: 7450491304cf498aa8bf9bffab5aaa189c1abc3e763e4ca7afca32d7c62cdba9abbc032e754ec2a6980580127c39d7227e9e5ea453c3456f150ab09196ae2661 + checksum: ccbb367fe92e623207cb33a85c1fe2e2b592e2af845b38c39c0781e0b05c1a72642eec9bea1ed589d0ac95b47c5d1f232f43cbbe0f68b6218f7d887d9813f850 languageName: node linkType: hard -"cosmiconfig@npm:8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" +"cosmiconfig@npm:8.3.6, cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0, cosmiconfig@npm:^8.3.6": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: "npm:^3.2.1" + import-fresh: "npm:^3.3.0" js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" + parse-json: "npm:^5.2.0" path-type: "npm:^4.0.0" - checksum: e0b188f9a672ee7135851bf9d9fc8f0ba00f9769c95fda5af0ebc274804f6aeb713b753e04e706f595e1fbd0fa67c5073840666019068c0296a06057560ab39d + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 91d082baca0f33b1c085bf010f9ded4af43cbedacba8821da0fb5667184d0a848addc52c31fadd080007f904a555319c238cf5f4c03e6d58ece2e4876b2e73d6 languageName: node linkType: hard @@ -17779,20 +18352,20 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.0.0, cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": - version: 8.3.6 - resolution: "cosmiconfig@npm:8.3.6" +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" dependencies: - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - path-type: "npm:^4.0.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 91d082baca0f33b1c085bf010f9ded4af43cbedacba8821da0fb5667184d0a848addc52c31fadd080007f904a555319c238cf5f4c03e6d58ece2e4876b2e73d6 + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 847b4764451672b4174be4d5c6d7d63442ec3aa5f3de52af924e4d996d87d7801c18e125504f25232fc75840f6625b3ac85860fac6ce799b5efae7bdcaf4a2b7 languageName: node linkType: hard @@ -17803,6 +18376,16 @@ __metadata: languageName: node linkType: hard +"cron@npm:3.1.3": + version: 3.1.3 + resolution: "cron@npm:3.1.3" + dependencies: + "@types/luxon": "npm:~3.3.0" + luxon: "npm:~3.4.0" + checksum: 1cf7c9176c380239af093943ba72bee631bac561e4e02bae137c7508cb07e2fff93e18ef7ed2003f469762794e01d98616af95e1e5df900724171db30fa9299b + languageName: node + linkType: hard + "cross-env@npm:^7.0.3": version: 7.0.3 resolution: "cross-env@npm:7.0.3" @@ -17833,6 +18416,15 @@ __metadata: languageName: node linkType: hard +"cross-inspect@npm:1.0.0": + version: 1.0.0 + resolution: "cross-inspect@npm:1.0.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 975c81799549627027254eb70f1c349cefb14435d580bea6f351f510c839dcb1a9288983407bac2ad317e6eff29cf1e99299606da21f404562bfa64cec502239 + languageName: node + linkType: hard + "cross-spawn-windows-exe@npm:^1.1.0, cross-spawn-windows-exe@npm:^1.2.0": version: 1.2.0 resolution: "cross-spawn-windows-exe@npm:1.2.0" @@ -18070,7 +18662,7 @@ __metadata: languageName: node linkType: hard -"csso@npm:^5.0.5": +"csso@npm:5.0.5": version: 5.0.5 resolution: "csso@npm:5.0.5" dependencies: @@ -18086,7 +18678,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.10, csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.1, csstype@npm:^3.1.2": +"csstype@npm:^3.0.10, csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.2": version: 3.1.2 resolution: "csstype@npm:3.1.2" checksum: 1f39c541e9acd9562996d88bc9fb62d1cb234786ef11ed275567d4b2bd82e1ceacde25debc8de3d3b4871ae02c2933fa02614004c97190711caebad6347debc2 @@ -18251,10 +18843,15 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: fc00a8bc3dfb7c413a778dc40ee8151b6c6ff35159d641f36ecd839c1df5c6e0ec5f4992e658c82624a1a62aaecaffc23b9c965ceb0bbf4d698bfc16469ac27d languageName: node linkType: hard @@ -18268,11 +18865,11 @@ __metadata: linkType: hard "deep-equal@npm:@nolyfill/deep-equal@latest": - version: 1.0.21 - resolution: "@nolyfill/deep-equal@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/deep-equal@npm:1.0.24" dependencies: dequal: "npm:2.0.3" - checksum: 93b63c11036886018b74f15834ecae27ea0839e2bc603087702c421a35baa9b6dd4e00730aefeba3434f9ced1fde6c8173ad9d9927e031c7e0beda1137963c27 + checksum: 016e303c6495d237de5a1584437591eba5bdd9622aeb0a2156150d6fe97a92053a7327f92a3223282ece3f9bb25e5fbba93d4e3610c15649e1f1422ea768b1be languageName: node linkType: hard @@ -18360,6 +18957,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 5573c8df96b5857408cad64d9b91b69152e305ce4b06218e5f49b59c6cafdbb90a8bd8a0bb83c7bc67a8d479c04aa697063c9bc28d849b7282f9327586d6bc7b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -18375,18 +18983,18 @@ __metadata: linkType: hard "define-properties@npm:@nolyfill/define-properties@latest": - version: 1.0.21 - resolution: "@nolyfill/define-properties@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/define-properties@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 0f6ab93cb4e37e969cbd52bcd7cb2e29393d158efef1b5f4f6f2f71926a718ea7cacd3d6c525971380525ff50b59d80dd9638aba8e983ad7425ca217393d59c9 + "@nolyfill/shared": "npm:1.0.24" + checksum: 96976b5512257eba3118e83ee9e614aa9abff89424baaf2337162f9fa4974d926b55bf01b7a751eea1c989cab0d355df7d305b4da915a4516b82fa81f0754397 languageName: node linkType: hard "defu@npm:^6.1.2": - version: 6.1.2 - resolution: "defu@npm:6.1.2" - checksum: 5704aa6ea0b503004ee25b2ce909af8e6dc7c472d2d41e293f5a879534a0a7827a37e6692e0ca0c6e8d3ef6b00651d50089be681c814832cbed98f0f206ef25b + version: 6.1.3 + resolution: "defu@npm:6.1.3" + checksum: ae0cc81dc6e573422c012bc668625e506525bde9767ff19f80e5c1d155696a95631fced376583d661fb64c3cc6314e578225bba00467178a72a3829d374a346f languageName: node linkType: hard @@ -18470,6 +19078,15 @@ __metadata: languageName: node linkType: hard +"derive-valtio@npm:0.1.0": + version: 0.1.0 + resolution: "derive-valtio@npm:0.1.0" + peerDependencies: + valtio: "*" + checksum: 3fec351a46cbe2aa37099059e4fc8f518bc4c2c9e9f29cc3e55811fb9ce61f3fc49302196c620705fc5584e5a8e1be629a4269f9903899450099a487ceea8e3b + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -18872,16 +19489,6 @@ __metadata: languageName: node linkType: hard -"dom-helpers@npm:^5.0.1": - version: 5.2.1 - resolution: "dom-helpers@npm:5.2.1" - dependencies: - "@babel/runtime": "npm:^7.8.7" - csstype: "npm:^3.0.2" - checksum: bed2341adf8864bf932b3289c24f35fdd99930af77df46688abf2d753ff291df49a15850c874d686d9be6ec4e1c6835673906e64dbd8b2839d227f117a11fd41 - languageName: node - linkType: hard - "dom-serializer@npm:0": version: 0.2.2 resolution: "dom-serializer@npm:0.2.2" @@ -19039,9 +19646,9 @@ __metadata: linkType: hard "dset@npm:^3.1.2": - version: 3.1.2 - resolution: "dset@npm:3.1.2" - checksum: 8af5554965b7e48c3c7e6b62f7a3d6c054efe643f56f0e19b11bbc2c677641af25cf89cee53ae8905b94dca4805620e9b4c966d3c6d51269157a71fedce5559a + version: 3.1.3 + resolution: "dset@npm:3.1.3" + checksum: f3f7096718eeabe1608886364ea02254d5221a4d59d4fb4d2fd2fdf53cccf293d486793a44c894d3a07a916a283d1214e831e423839096d461a38571fc092126 languageName: node linkType: hard @@ -19162,6 +19769,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "electron-log@npm:^5.0.0": version: 5.0.0 resolution: "electron-log@npm:5.0.0" @@ -19195,6 +19803,12 @@ __metadata: bin: electron-packager: bin/electron-packager.js checksum: 9e8cac6893d44b797413f2c64c08d452fba94795b2ac5bb24f1cfc238e2eae98f711384fee6b1dd1f8b72d255398968e8efd458d8278afb10335372460c7603e +======= +"electron-log@npm:^5.0.1": + version: 5.0.1 + resolution: "electron-log@npm:5.0.1" + checksum: deebe96d9ba634e89083804c7faac46de7b6f03f502bc539efb0c609dc35f71fdcad15f1ce179b78f1855113f1178e8401ae1314411283491b54b4f1ae93f8b5 +>>>>>>> canary languageName: node linkType: hard @@ -19208,17 +19822,17 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.535": - version: 1.4.556 - resolution: "electron-to-chromium@npm:1.4.556" - checksum: b5edf73fa95d5a9d2dceb66c77e5893656d2af938065416dc7d3d5dbb91d6e661a314d069d10cdc4f78adbb8c74eea1a0d6d9012c36415d4418046c6f407cbef + version: 1.4.590 + resolution: "electron-to-chromium@npm:1.4.590" + checksum: 04f54be67d5465432363e6a7cf0813dbd95a23d115f55679662677508d9e068ce241b4a8e1224a53fccc4037094928d38946529c5118c1184090e2609c65cd94 languageName: node linkType: hard "electron-updater@npm:^6.1.5": - version: 6.1.5 - resolution: "electron-updater@npm:6.1.5" + version: 6.1.7 + resolution: "electron-updater@npm:6.1.7" dependencies: - builder-util-runtime: "npm:9.2.1" + builder-util-runtime: "npm:9.2.3" fs-extra: "npm:^10.1.0" js-yaml: "npm:^4.1.0" lazy-val: "npm:^1.0.5" @@ -19226,7 +19840,7 @@ __metadata: lodash.isequal: "npm:^4.5.0" semver: "npm:^7.3.8" tiny-typed-emitter: "npm:^2.1.0" - checksum: a3f347a2ead880b42d1b9a31f540110d0fbf7915d6e27f8c79b50d7768f3360e8d387ea2ac73db18a89d385bf770a33ebd6ebc0aea61a0286961b73060c3cbf1 + checksum: c6a5b566d70de550cd959a3af0bed98da868b997d7ef741ede488027a8c876af2e1bf981becfeac767c4dbf7af856ed4e53053e7fcd246dc2af5fc71fd5ef7cc languageName: node linkType: hard @@ -19241,15 +19855,15 @@ __metadata: linkType: hard "electron-winstaller@npm:^5.0.0": - version: 5.1.0 - resolution: "electron-winstaller@npm:5.1.0" + version: 5.2.1 + resolution: "electron-winstaller@npm:5.2.1" dependencies: "@electron/asar": "npm:^3.2.1" debug: "npm:^4.1.1" fs-extra: "npm:^7.0.1" lodash.template: "npm:^4.2.2" temp: "npm:^0.9.0" - checksum: e68307557818411119eb8f5b168baf63ade8ba0a4a520d3b3f1140dbcb133b6de28be1f4b0828043d8dd2791c985aa26639f0404cd06d91623d97b18e1678b2e + checksum: f8eecfb0ce8122a4c83342d59231ce76bd932c8ed9f19876df2c674086cdc881e9fb04aa33fbd5be374daa9de8e430536682f8383954080d8a5bd6b973f91111 languageName: node linkType: hard @@ -19259,22 +19873,22 @@ __metadata: languageName: node linkType: soft -"electron@npm:^27.0.0": - version: 27.0.0 - resolution: "electron@npm:27.0.0" +"electron@npm:^27.1.0": + version: 27.1.0 + resolution: "electron@npm:27.1.0" dependencies: "@electron/get": "npm:^2.0.0" "@types/node": "npm:^18.11.18" extract-zip: "npm:^2.0.1" bin: electron: cli.js - checksum: 486057738b20ec65a7ac9b30d615f94311a6b8ea900f94d1c6668c4e48bb6c9371a9131ee4349a3247031c292f97b8aa85448ec8e95b6998200a28bafe4aa6c2 + checksum: 8eed880bbda6efd55041cc855b93f632897139557761a913dd56c68a9e24bcb1c222a0b335f70e3df97e9692997f659d62600276bbf3714b374d841fed75bab4 languageName: node linkType: hard "element-plus@npm:^2.4.0": - version: 2.4.0 - resolution: "element-plus@npm:2.4.0" + version: 2.4.2 + resolution: "element-plus@npm:2.4.2" dependencies: "@ctrl/tinycolor": "npm:^3.4.1" "@element-plus/icons-vue": "npm:^2.0.6" @@ -19293,14 +19907,7 @@ __metadata: normalize-wheel-es: "npm:^1.2.0" peerDependencies: vue: ^3.2.0 - checksum: 2604e13f2517a051b8fec0b79effd14ae84a945b5767ed52c0b3e7a48be28d340ce48dabe974aac0dff0d809ec5d387b10585e163b900522f00144efe5d27257 - languageName: node - linkType: hard - -"emittery@npm:^0.10.2": - version: 0.10.2 - resolution: "emittery@npm:0.10.2" - checksum: fa86fc2b1f4c792d7d479a4de1a6a1f74b0b597770bae770336f0be6501e64be0995aa07d284ae502b269f5cec960cd0c44c91dd090d06d8deecee6d9787e396 + checksum: 7d2a0bafca99ec5f7e5e1fc914df6164e45505c9a19bc51df393a352c0fa806ece5c67fe2565572274a8d7fbaf61afbcec7f7462b3ae7555ce161a0eec3bd121 languageName: node linkType: hard @@ -19318,10 +19925,10 @@ __metadata: languageName: node linkType: hard -"emoji-regex@npm:^10.2.1": - version: 10.2.1 - resolution: "emoji-regex@npm:10.2.1" - checksum: fb2143d669ed7a3b180a56bfb5fc0638af25aeef421df4bb9c3a835dccfc4b737bcb45dfc8cea33c3f2b9dcd92a3fdb79820c7a840491a899e2d68aa3245c4b5 +"emoji-regex@npm:^10.3.0": + version: 10.3.0 + resolution: "emoji-regex@npm:10.3.0" + checksum: b9b084ebe904f13bb4b66ee4c29fb41a7a4a1165adcc33c1ce8056c0194b882cc91ebdc782f1a779b5d7ea7375c5064643a7734893d7c657b44c5c6b9d7bf1e7 languageName: node linkType: hard @@ -19379,15 +19986,15 @@ __metadata: linkType: hard "engine.io-client@npm:~6.5.2": - version: 6.5.2 - resolution: "engine.io-client@npm:6.5.2" + version: 6.5.3 + resolution: "engine.io-client@npm:6.5.3" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.11.0" xmlhttprequest-ssl: "npm:~2.0.0" - checksum: 1a5405c1afdd6332a62f68e4d069e1ee7bad34bcb7cc5555ff2774968724813548a0f48edad6f31a7be77f48af0b2d1b2bda588fc95acf433e0d9ba85766acc5 + checksum: 0d7c3e6de23f37706c163bc8a0e90e70e613c7768be0705bda3675124d5e24d849810fddda005f8dcc721da35aee713976a03a0465d71f0856adfc1af7a80e5d languageName: node linkType: hard @@ -19399,8 +20006,8 @@ __metadata: linkType: hard "engine.io@npm:~6.5.2": - version: 6.5.3 - resolution: "engine.io@npm:6.5.3" + version: 6.5.4 + resolution: "engine.io@npm:6.5.4" dependencies: "@types/cookie": "npm:^0.4.1" "@types/cors": "npm:^2.8.12" @@ -19412,7 +20019,7 @@ __metadata: debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.11.0" - checksum: 50e022f94d6417be00d0ab4b70b57fe6b0f597a73c7fdf7e2b7570e0ce65d3e94caadebca759155fdf66a6812159b068afb88fd56655d5fa71d43933c9985c81 + checksum: f1a74fc9431593ca1e50d1faa5db1041feecf2a7da5c75cfca88c5a760d3c8a898141ff7e7a2a2a2859a784c25d9c87be422f094b553e0dcf98433f8e798d18f languageName: node linkType: hard @@ -19475,11 +20082,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.10.0 - resolution: "envinfo@npm:7.10.0" + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" bin: envinfo: dist/cli.js - checksum: d4db29c5a405081759c57c0e74ffa6adab09b7477ca105587252643394f13ab128ad4c8f755b15334b5f1901cef091acc76c71b695ce0f27853ebf147c882075 + checksum: 8cba09db181329b243fe02b3384ec275ebf93d5d3663c31e2064697aa96576c7de9b7e1c878a250f8eaec0db8026bace747709dcdc8d8a4ecd9a653cdbc08926 languageName: node linkType: hard @@ -19508,25 +20115,6 @@ __metadata: languageName: node linkType: hard -"error@npm:7.0.2": - version: 7.0.2 - resolution: "error@npm:7.0.2" - dependencies: - string-template: "npm:~0.2.1" - xtend: "npm:~4.0.0" - checksum: 407ff5faa73f5da3424a81d0160a1d3c6b5144e87cb1266334e7a4c2c7a69ae653e1b544032d7dbd8b210006858eea909ea0f46694b0484cd7555ba3086be0a8 - languageName: node - linkType: hard - -"error@npm:^7.0.0": - version: 7.2.1 - resolution: "error@npm:7.2.1" - dependencies: - string-template: "npm:~0.2.1" - checksum: 9c790d20a386947acfeabb0d1c39173efe8e5a38cb732b5f06c11a25c23ce8ac4dafbb7aa240565e034580a49aba0703e743d0274c6228500ddf947a1b998568 - languageName: node - linkType: hard - "es-iterator-helpers@npm:@nolyfill/es-iterator-helpers@latest": version: 1.0.21 resolution: "@nolyfill/es-iterator-helpers@npm:1.0.21" @@ -19544,9 +20132,9 @@ __metadata: linkType: hard "es-module-lexer@npm:^1.2.1": - version: 1.3.1 - resolution: "es-module-lexer@npm:1.3.1" - checksum: c6aa137c5f5865fe1d12b4edbe027ff618d3836684cda9e52ae4dec48bfc2599b25db4f1265a12228d4663e21fd0126addfb79f761d513f1a6708c37989137e3 + version: 1.4.1 + resolution: "es-module-lexer@npm:1.4.1" + checksum: cf453613468c417af6e189b03d9521804033fdd5a229a36fedec28d37ea929fccf6822d42abff1126eb01ba1d2aa2845a48d5d1772c0724f8204464d9d3855f6 languageName: node linkType: hard @@ -19564,7 +20152,7 @@ __metadata: languageName: node linkType: hard -"esbuild-register@npm:^3.4.0": +"esbuild-register@npm:^3.5.0": version: 3.5.0 resolution: "esbuild-register@npm:3.5.0" dependencies: @@ -19806,32 +20394,32 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.19.4": - version: 0.19.5 - resolution: "esbuild@npm:0.19.5" +"esbuild@npm:^0.19.7": + version: 0.19.7 + resolution: "esbuild@npm:0.19.7" dependencies: - "@esbuild/android-arm": "npm:0.19.5" - "@esbuild/android-arm64": "npm:0.19.5" - "@esbuild/android-x64": "npm:0.19.5" - "@esbuild/darwin-arm64": "npm:0.19.5" - "@esbuild/darwin-x64": "npm:0.19.5" - "@esbuild/freebsd-arm64": "npm:0.19.5" - "@esbuild/freebsd-x64": "npm:0.19.5" - "@esbuild/linux-arm": "npm:0.19.5" - "@esbuild/linux-arm64": "npm:0.19.5" - "@esbuild/linux-ia32": "npm:0.19.5" - "@esbuild/linux-loong64": "npm:0.19.5" - "@esbuild/linux-mips64el": "npm:0.19.5" - "@esbuild/linux-ppc64": "npm:0.19.5" - "@esbuild/linux-riscv64": "npm:0.19.5" - "@esbuild/linux-s390x": "npm:0.19.5" - "@esbuild/linux-x64": "npm:0.19.5" - "@esbuild/netbsd-x64": "npm:0.19.5" - "@esbuild/openbsd-x64": "npm:0.19.5" - "@esbuild/sunos-x64": "npm:0.19.5" - "@esbuild/win32-arm64": "npm:0.19.5" - "@esbuild/win32-ia32": "npm:0.19.5" - "@esbuild/win32-x64": "npm:0.19.5" + "@esbuild/android-arm": "npm:0.19.7" + "@esbuild/android-arm64": "npm:0.19.7" + "@esbuild/android-x64": "npm:0.19.7" + "@esbuild/darwin-arm64": "npm:0.19.7" + "@esbuild/darwin-x64": "npm:0.19.7" + "@esbuild/freebsd-arm64": "npm:0.19.7" + "@esbuild/freebsd-x64": "npm:0.19.7" + "@esbuild/linux-arm": "npm:0.19.7" + "@esbuild/linux-arm64": "npm:0.19.7" + "@esbuild/linux-ia32": "npm:0.19.7" + "@esbuild/linux-loong64": "npm:0.19.7" + "@esbuild/linux-mips64el": "npm:0.19.7" + "@esbuild/linux-ppc64": "npm:0.19.7" + "@esbuild/linux-riscv64": "npm:0.19.7" + "@esbuild/linux-s390x": "npm:0.19.7" + "@esbuild/linux-x64": "npm:0.19.7" + "@esbuild/netbsd-x64": "npm:0.19.7" + "@esbuild/openbsd-x64": "npm:0.19.7" + "@esbuild/sunos-x64": "npm:0.19.7" + "@esbuild/win32-arm64": "npm:0.19.7" + "@esbuild/win32-ia32": "npm:0.19.7" + "@esbuild/win32-x64": "npm:0.19.7" dependenciesMeta: "@esbuild/android-arm": optional: true @@ -19879,7 +20467,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: f8ffe0cbab8a80ec63b6962b7d722da9e3dbe79a57d3cd998e107e35792068facd6f63e58ae19e919891456ed6cb73114a9777f0e7353ec8613b4fc75571d56d + checksum: 326b9d98a77c5f2fb9a535b292bdc67c88bdfb4a19d29a221d65fd69f4800faea1f34947e8e6bc25ca3bd5db01f61c6968fec91f8c335e21e29b50330d90bd89 languageName: node linkType: hard @@ -19954,7 +20542,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.7": +"eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -19977,13 +20565,13 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-i@npm:^2.28.1": - version: 2.28.1 - resolution: "eslint-plugin-i@npm:2.28.1" +"eslint-plugin-i@npm:^2.29.0": + version: 2.29.0 + resolution: "eslint-plugin-i@npm:2.29.0" dependencies: debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.7" + eslint-import-resolver-node: "npm:^0.3.9" eslint-module-utils: "npm:^2.8.0" get-tsconfig: "npm:^4.6.2" is-glob: "npm:^4.0.3" @@ -19992,7 +20580,7 @@ __metadata: semver: "npm:^7.5.3" peerDependencies: eslint: ^7.2.0 || ^8 - checksum: f85ace292cdf6c68570860f3139497d33e418435213918583ec9baec6a8971fe455035b2aa47a678f5136f1b53e7f7d79dabf1708e53cb3f2c556dbb498fcdce + checksum: fb0e694b1e57962c97aa573223cec79fff72351d0f98d8ea28a6d31716a9f7224ae995f68b8d51ede5987add61582760fc137d7a7ec2bb7ce7d1f834c675adb8 languageName: node linkType: hard @@ -20059,20 +20647,20 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-sonarjs@npm:^0.21.0": - version: 0.21.0 - resolution: "eslint-plugin-sonarjs@npm:0.21.0" +"eslint-plugin-sonarjs@npm:^0.23.0": + version: 0.23.0 + resolution: "eslint-plugin-sonarjs@npm:0.23.0" peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 79cede5ac4de9312498d9e3f6aab390de482540466d99ba5dd7c353ede48f89d2c8ff1574cc4993341a87e2f972b8af1f068b3f1fb539814614dc78b3a057dba + checksum: 1cfe063a979ab139b4fd75fcb8c9a478c5a43c3bb3126faffe19192c28ae199fab6570da01b6ed6430cdf52e2d79a93079105af2c568db5d029d312beea41a60 languageName: node linkType: hard -"eslint-plugin-unicorn@npm:^48.0.1": - version: 48.0.1 - resolution: "eslint-plugin-unicorn@npm:48.0.1" +"eslint-plugin-unicorn@npm:^49.0.0": + version: 49.0.0 + resolution: "eslint-plugin-unicorn@npm:49.0.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.5" + "@babel/helper-validator-identifier": "npm:^7.22.20" "@eslint-community/eslint-utils": "npm:^4.4.0" ci-info: "npm:^3.8.0" clean-regexp: "npm:^1.0.0" @@ -20080,7 +20668,6 @@ __metadata: indent-string: "npm:^4.0.0" is-builtin-module: "npm:^3.2.1" jsesc: "npm:^3.0.2" - lodash: "npm:^4.17.21" pluralize: "npm:^8.0.0" read-pkg-up: "npm:^7.0.1" regexp-tree: "npm:^0.1.27" @@ -20088,8 +20675,8 @@ __metadata: semver: "npm:^7.5.4" strip-indent: "npm:^3.0.0" peerDependencies: - eslint: ">=8.44.0" - checksum: c7ee2d2c031f74bc84ebd44a59462eaee93387fef4df29e9ec9489b2d7d92564962a35626aacc1c4a136c2f92f605c7749f38654ad51fd7a8c4bcc2aa7439b74 + eslint: ">=8.52.0" + checksum: 7f73f41356cdf720675998c558ab13872d76302dde3a49661df0b5219fd328627e3d7e418aaa3e94cf8764d1ef8b606f7ea01f019eccc0bf0522def8e6769caa languageName: node linkType: hard @@ -20108,9 +20695,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-vue@npm:^9.17.0": - version: 9.17.0 - resolution: "eslint-plugin-vue@npm:9.17.0" +"eslint-plugin-vue@npm:^9.18.1": + version: 9.18.1 + resolution: "eslint-plugin-vue@npm:9.18.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" natural-compare: "npm:^1.4.0" @@ -20121,7 +20708,7 @@ __metadata: xml-name-validator: "npm:^4.0.0" peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - checksum: e72abc29bb8766874262d187340243e247b9f71fea213e250455fe4e13087802aaf29bdf52fa70b835c0604afd2bf215fdb70b6f60c9eab083e89f22f8a40206 + checksum: de064eac9ff28315e1f086bd035f2797cf921ec58dd16193b7b6b4aa2898f5d5b7c06e9effe455b3e06744f840e118f05d99943e62052ffd9beaa83959ff7aee languageName: node linkType: hard @@ -20166,17 +20753,18 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.51.0": - version: 8.51.0 - resolution: "eslint@npm:8.51.0" +"eslint@npm:^8.54.0": + version: 8.54.0 + resolution: "eslint@npm:8.54.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.2" - "@eslint/js": "npm:8.51.0" - "@humanwhocodes/config-array": "npm:^0.11.11" + "@eslint/eslintrc": "npm:^2.1.3" + "@eslint/js": "npm:8.54.0" + "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" @@ -20209,7 +20797,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 1f3720dd2a8e25198815c33720dd66ceee88d7527b3b6f2da57b57d0476440af29da2a1d9f28515660afb3345e4f84438562772d6b5fc19b6fab7c77c478ebca + checksum: 379827964fd7885a4d48611a5237cf5c534eff0ad3d0c1a1d6a14d52ac6758f4efdccd924c9bb3a9aa4dc80a3446d48dc49f61733cd5bd5f74419d0240970e7b languageName: node linkType: hard @@ -20266,17 +20854,6 @@ __metadata: languageName: node linkType: hard -"estree-to-babel@npm:^3.1.0": - version: 3.2.1 - resolution: "estree-to-babel@npm:3.2.1" - dependencies: - "@babel/traverse": "npm:^7.1.6" - "@babel/types": "npm:^7.2.0" - c8: "npm:^7.6.0" - checksum: c3e51bf32606084faa6037bbaa6a69bbe73d21589c187aa70c8703c81c0ab56d2b32ae13a5d8346eb4fd575092415d62222677355acf8259d65f79c7cae5cebf - languageName: node - linkType: hard - "estree-walker@npm:^0.6.1": version: 0.6.1 resolution: "estree-walker@npm:0.6.1" @@ -20284,7 +20861,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": +"estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" checksum: b02109c5d46bc2ed47de4990eef770f7457b1159a229f0999a09224d2b85ffeed2d7679cffcff90aeb4448e94b0168feb5265b209cdec29aad50a3d6e93d21e2 @@ -20350,7 +20927,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -20462,16 +21039,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^28.1.3": - version: 28.1.3 - resolution: "expect@npm:28.1.3" +"expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" dependencies: - "@jest/expect-utils": "npm:^28.1.3" - jest-get-type: "npm:^28.0.2" - jest-matcher-utils: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - checksum: 87033c88f7a578063ae7de98000fbd423bdb751756b1c6a1c69cd2b093bdb8b11a5b7a66eb89984068850d14978c7daffc2cc8ed56eb912424c24885a7573061 + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a languageName: node linkType: hard @@ -20584,10 +21161,10 @@ __metadata: languageName: node linkType: hard -"fake-indexeddb@npm:5.0.0, fake-indexeddb@npm:^5.0.0": - version: 5.0.0 - resolution: "fake-indexeddb@npm:5.0.0" - checksum: 460c96b5a98d960dae6210bc8744b6488d5f70b460f7ea4bbaee45487e27546e02498e2c7a90c66707a2b697d62df84db6d956cc948ee16a91c6be4d2e776e10 +"fake-indexeddb@npm:5.0.1, fake-indexeddb@npm:^5.0.0": + version: 5.0.1 + resolution: "fake-indexeddb@npm:5.0.1" + checksum: 1d4a19ed04e1ddfcbf3d52ebd985af3dbe090812df720862c1043e1cf0f90019d2919d6b59be39e03ea3a9a4c5cc0762c37b55b3d57dda6b5a6036f4f4d73400 languageName: node linkType: hard @@ -20625,16 +21202,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.1, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" +"fast-glob@npm:3.3.2, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" micromatch: "npm:^4.0.4" - checksum: 51bcd15472879dfe51d4b01c5b70bbc7652724d39cdd082ba11276dbd7d84db0f6b33757e1938af8b2768a4bf485d9be0c89153beae24ee8331d6dcc7550379f + checksum: 222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df languageName: node linkType: hard @@ -20853,14 +21430,14 @@ __metadata: languageName: node linkType: hard -"file-type@npm:^18.5.0": - version: 18.5.0 - resolution: "file-type@npm:18.5.0" +"file-type@npm:^18.7.0": + version: 18.7.0 + resolution: "file-type@npm:18.7.0" dependencies: readable-web-to-node-stream: "npm:^3.0.2" strtok3: "npm:^7.0.0" token-types: "npm:^5.0.1" - checksum: 2face4fc3ea059ea0a9b507be2bb4181471ba98927ad6a84ccf7cf0767ba54f9e9c90a6d2444afb3e36fd37f4cae1b05972fdf1a70ca67fb1d8c89d9a18c5766 + checksum: 95b70313d697484bb9613dd822a29554e9754b49f4d62f17e399649c981a12556776b4ee83b0a62b752fc9048ac79f6cf79ad13b2a750d89afa170902c7b0029 languageName: node linkType: hard @@ -21055,13 +21632,13 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: flatted: "npm:^3.2.9" keyv: "npm:^4.5.3" rimraf: "npm:^3.0.2" - checksum: 04b57c7cb4bd54f1e80a335f037bff467cc7b2479ecc015ff7e78fd41aa12777757d55836e99c7e5faca2271eb204a96bf109b4d98c36c20c3b98cf1372b5592 + checksum: 02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 languageName: node linkType: hard @@ -21106,9 +21683,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.218.1 - resolution: "flow-parser@npm:0.218.1" - checksum: c78f9c7cdd41c62372738388323ad3b654e6a76dcbce210f1fd807839b68519c3c282ba72b49860192fd0026dac01d42961874f48543774b1a7437c75c648834 + version: 0.222.0 + resolution: "flow-parser@npm:0.222.0" + checksum: b9535c9f732c4d698d586ef3ba45de65ca085e3cb6b6cb8503fccb77a3720ba528d28feaf9bf58c538e9884480f39241223ec71cadf60d202094431e3a3e8aee languageName: node linkType: hard @@ -21121,7 +21698,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.0": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.0": version: 1.15.3 resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: @@ -21214,9 +21791,9 @@ __metadata: languageName: node linkType: hard -"foxact@npm:^0.2.20": - version: 0.2.20 - resolution: "foxact@npm:0.2.20" +"foxact@npm:^0.2.20, foxact@npm:^0.2.26": + version: 0.2.26 + resolution: "foxact@npm:0.2.26" dependencies: client-only: "npm:^0.0.1" server-only: "npm:^0.0.1" @@ -21225,7 +21802,7 @@ __metadata: peerDependenciesMeta: react: optional: true - checksum: 3afe07f74c7102155a7b39e19ba0cfbb6efdf43837eb5c6dc8828d50a0a4d801300b92be712eaf71264ba06ebe1be3a1c5ad0a45629276828ff57d5226084bad + checksum: a1fae3f98c64aab49e71bb5153fb25237bdfecc453b0ee4c4666f3a45556f584d30418c7c5b4ec5b029ab8ecd42a661718f81139f2ef984100ebe096e8043852 languageName: node linkType: hard @@ -21327,7 +21904,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -21583,6 +22160,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.0.0": + version: 1.2.0 + resolution: "get-east-asian-width@npm:1.2.0" + checksum: c9b280e7c7c67fb89fa17e867c4a9d1c9f1321aba2a9ee27bff37fb6ca9552bccda328c70a80c1f83a0e39ba1b7e3427e60f47823402d19e7a41b83417ec047a + languageName: node + linkType: hard + "get-folder-size@npm:^2.0.1": version: 2.0.1 resolution: "get-folder-size@npm:2.0.1" @@ -21611,15 +22195,15 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" +"get-intrinsic@npm:^1.2.1": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" + function-bind: "npm:^1.1.2" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" - checksum: aee631852063f8ad0d4a374970694b5c17c2fb5c92bd1929476d7eb8798ce7aebafbf9a34022c05fd1adaa2ce846d5877a627ce1986f81fc65adf3b81824bd54 + hasown: "npm:^2.0.0" + checksum: aa96db4f809734d26d49b59bc8669d73a0ae792da561514e987735573a1dfaede516cd102f217a078ea2b42d4c4fb1f83d487932cb15d49826b726cc9cd4470b languageName: node linkType: hard @@ -21631,9 +22215,9 @@ __metadata: linkType: hard "get-npm-tarball-url@npm:^2.0.3": - version: 2.0.3 - resolution: "get-npm-tarball-url@npm:2.0.3" - checksum: 8ad48a6f1126697665e12ebf053e0d1c3b15b3c4f29ea6c458387ac68d044ea1c08f0f2eb5c0fe35447fdd2da4f2fb5c9882feb5a2ea195c773f94e762c9b886 + version: 2.1.0 + resolution: "get-npm-tarball-url@npm:2.1.0" + checksum: 02b96993ad5a04cbd0ef0577ac3cc9e2e78a7c60db6bb5e6c8fe78950fc1fc3d093314987629a2fda3083228d91a93670bde321767ca2cf89ce7f463c9e44071 languageName: node linkType: hard @@ -21858,6 +22442,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.1": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: 9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e + languageName: node + linkType: hard + "global-agent@npm:^3.0.0": version: 3.0.0 resolution: "global-agent@npm:3.0.0" @@ -21944,11 +22541,11 @@ __metadata: linkType: hard "globalthis@npm:@nolyfill/globalthis@latest": - version: 1.0.21 - resolution: "@nolyfill/globalthis@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/globalthis@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 0bd4e84c406a0c54f9ea8c269ba22b9dc14e30a7ca529ac33fd41b7a09584d78b2ffe3f570e549a6b31b06357069a2625837298556b20f1ba3285abfb1224a32 + "@nolyfill/shared": "npm:1.0.24" + checksum: 3756ba83d0b6c788fa81e110bb31b926aae882bea034c99b4178ea32152eb467c6e2c295d39b23d14394db1a9c4ec8e38287cd4708b2ff5edcf08aad93727cd7 languageName: node linkType: hard @@ -22066,6 +22663,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:@nolyfill/gopd@latest": + version: 1.0.24 + resolution: "@nolyfill/gopd@npm:1.0.24" + checksum: ed865149eea5bc81c86fb366a8c5914d15d16cfb19f457809bf7b34042c0439626229840ca0c0d5164ce0d017a2b44bfe0a7da9a9ae06f9f6b58c73e52be62ba + languageName: node + linkType: hard + "got@npm:^11.7.0, got@npm:^11.8.5": version: 11.8.6 resolution: "got@npm:11.8.6" @@ -22180,21 +22784,12 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:5.14.0": - version: 5.14.0 - resolution: "graphql-ws@npm:5.14.0" +"graphql-ws@npm:5.14.2, graphql-ws@npm:^5.14.0": + version: 5.14.2 + resolution: "graphql-ws@npm:5.14.2" peerDependencies: graphql: ">=0.11 <=16" - checksum: 0e985798f67c13c95eae3442dc3b6b32b472484011cdc3b610e50bbed71f62e4adbc8acf81139c91317ca27ef303b9a301efc4ee2234d71ed8c6cdebeae1f810 - languageName: node - linkType: hard - -"graphql-ws@npm:^5.14.0": - version: 5.14.1 - resolution: "graphql-ws@npm:5.14.1" - peerDependencies: - graphql: ">=0.11 <=16" - checksum: d3b0917df3ae20aa65b5193527f7005cdce35d7c59856adc3aad2ff128952b9f6f207c0cc4f92bb5d7b5210d458243a93fb3e58339253ed830a5b17619d21ea8 + checksum: d335f1f54cf1346632ea480ecacb59ccce3f6413f4eb03a02d021cd08a17314547cba50e80cbd6dd5f9e4b3803cd8edc61a181f04b1014ec8a523ac8750cc663 languageName: node linkType: hard @@ -22257,9 +22852,9 @@ __metadata: languageName: node linkType: hard -"happy-dom@npm:^12.9.1": - version: 12.9.1 - resolution: "happy-dom@npm:12.9.1" +"happy-dom@npm:^12.10.3": + version: 12.10.3 + resolution: "happy-dom@npm:12.10.3" dependencies: css.escape: "npm:^1.5.1" entities: "npm:^4.5.0" @@ -22267,7 +22862,7 @@ __metadata: webidl-conversions: "npm:^7.0.0" whatwg-encoding: "npm:^2.0.0" whatwg-mimetype: "npm:^3.0.0" - checksum: 332b348751957e35f61fb27e3e30bd1cfdc07be55caf5150c17a994a221dc8362ec21624f74ef7888e73eb76884ef79ea8b12723deaf00907de942d4b88aa163 + checksum: de82ddd1c981f24a95011c62c2d03e12c4c48f86c0234fa7a1a309d8fa1481885956c783fb3cc56371fa49193d2323822a583196156b10db179e7ac754ef7864 languageName: node linkType: hard @@ -22292,10 +22887,17 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:@nolyfill/has-property-descriptors@latest": + version: 1.0.24 + resolution: "@nolyfill/has-property-descriptors@npm:1.0.24" + checksum: ab6a7cdcacee3b36291161a7ae6e4cba920c5c6e85330c120822426d680ada76821d9ea161004fcc2101d325c21f8ea2c7fa729e4bfc70ac01ab652dcea910a0 + languageName: node + linkType: hard + "has-proto@npm:@nolyfill/has-proto@latest": - version: 1.0.21 - resolution: "@nolyfill/has-proto@npm:1.0.21" - checksum: 1c93ba5dd4e54608ebed5c2efba48de19b6603d225d2ff1e55744c2aa0708fd158e53aa3cf6dcfc565d3fc781dd8de7d79fd139e40135646d0da1a13890c17b6 + version: 1.0.24 + resolution: "@nolyfill/has-proto@npm:1.0.24" + checksum: 07235e99620e7daf6b86ba7b42d09ec14c02770597ec24ac51050662d2a704d5d4dfb4b08f080a42baeb7d474f12b47776f28c264ad63f559fd6e31f364d4f72 languageName: node linkType: hard @@ -22313,15 +22915,6 @@ __metadata: languageName: node linkType: hard -"has@npm:@nolyfill/has@latest": - version: 1.0.21 - resolution: "@nolyfill/has@npm:1.0.21" - dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: cca7163ddc11390e3f65ad679dd88aecd121936f0cf881917932b41117d355abdf160b83580462d690305d9824159f433eb3516d4642dfca5f4ba808380251b2 - languageName: node - linkType: hard - "hasha@npm:^5.0.0": version: 5.2.2 resolution: "hasha@npm:5.2.2" @@ -22332,6 +22925,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: "npm:^1.1.2" + checksum: c330f8d93f9d23fe632c719d4db3d698ef7d7c367d51548b836069e06a90fa9151e868c8e67353cfe98d67865bf7354855db28fa36eb1b18fa5d4a3f4e7f1c90 + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -22371,24 +22973,10 @@ __metadata: languageName: node linkType: hard -"headers-polyfill@npm:3.2.5": - version: 3.2.5 - resolution: "headers-polyfill@npm:3.2.5" - checksum: 3aa62d23091576c05722e8043879a3a6beb9fdd85719780248d628ef8df232eb8261522ae2edb8dd6d0a991d7c744f7382c22e279bc81690f8da39502bc62c4c - languageName: node - linkType: hard - -"hexer@npm:^1.5.0": - version: 1.5.0 - resolution: "hexer@npm:1.5.0" - dependencies: - ansi-color: "npm:^0.2.1" - minimist: "npm:^1.1.0" - process: "npm:^0.10.0" - xtend: "npm:^4.0.0" - bin: - hexer: ./cli.js - checksum: 0c91e98ba53c469932f0abeb6ef9ebe40241c6f4024fccc8724357adfff682f0ed19d3b60e1240b7ac4368169241feaa527b4cbbaec226d5b75f690775604735 +"headers-polyfill@npm:^4.0.1": + version: 4.0.2 + resolution: "headers-polyfill@npm:4.0.2" + checksum: 70b53abf48a1d50760150624d6c7ca974a0d286ba102e411538f6dad6687ce51ce7cc60197e326df96f844548d6ff77d900e28c3cdbc0ba1fe09a05eae47156a languageName: node linkType: hard @@ -22595,7 +23183,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f @@ -22735,7 +23323,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.2": +"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "https-proxy-agent@npm:7.0.2" dependencies: @@ -22794,11 +23382,11 @@ __metadata: linkType: hard "i18next@npm:^23.5.1": - version: 23.5.1 - resolution: "i18next@npm:23.5.1" + version: 23.7.6 + resolution: "i18next@npm:23.7.6" dependencies: - "@babel/runtime": "npm:^7.22.5" - checksum: 38e62d582b0f67eb2eee4f079c9cd512246496f2fb970f50a0be26c7c5e6ac5e772de9763ac1943919ecd816b2c0375f4b2071c67b1485a6a980c4d37348408f + "@babel/runtime": "npm:^7.23.2" + checksum: ae16654e08e10c38d4d17c6a28ae7cb4ac894f03bccfa7ae1637b6c6705937009d5f625f9cd0c3b664bec1acaa7116e5dda7a5e9fbbf41bf97260b49da2875e7 languageName: node linkType: hard @@ -22865,9 +23453,9 @@ __metadata: linkType: hard "ignore@npm:^5.0.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 4f7caf5d2005da21a382d4bd1d2aa741a3bed51de185c8562dd7f899a81a620ac4fd0619b06f7029a38ae79e4e4c134399db3bd0192c703c3ef54bb82df3086c + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: 51594355cea4c6ad6b28b3b85eb81afa7b988a1871feefd7062baf136c95aa06760ee934fa9590e43d967bd377ce84a4cf6135fbeb6063e063f1182a0e9a3bcd languageName: node linkType: hard @@ -22896,7 +23484,7 @@ __metadata: languageName: node linkType: hard -"immutable@npm:^4.2.2": +"immutable@npm:^4.3.4": version: 4.3.4 resolution: "immutable@npm:4.3.4" checksum: ea187acc1eec9dcfaa0823bae59e1ae0ea82e7a40d2ace9fb84d467875d5506ced684a79b68e70451f1e1761a387a958ba724171f93aa10330998b026fcb5d29 @@ -22993,6 +23581,13 @@ __metadata: languageName: node linkType: hard +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -23024,30 +23619,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.5": - version: 8.2.5 - resolution: "inquirer@npm:8.2.5" - dependencies: - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.1.1" - cli-cursor: "npm:^3.1.0" - cli-width: "npm:^3.0.0" - external-editor: "npm:^3.0.3" - figures: "npm:^3.0.0" - lodash: "npm:^4.17.21" - mute-stream: "npm:0.0.8" - ora: "npm:^5.4.1" - run-async: "npm:^2.4.0" - rxjs: "npm:^7.5.5" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - through: "npm:^2.3.6" - wrap-ansi: "npm:^7.0.0" - checksum: 50a240dfeaca37a14e6a6d11d7d6f7da947be3a9fe1e34ac41db6a49fc27022e7b3875ebe8ccd739497359808694488f3509792cc986f9ac48c43135f4e14172 - languageName: node - linkType: hard - -"inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": +"inquirer@npm:8.2.6, inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -23180,9 +23752,9 @@ __metadata: linkType: hard "is-arguments@npm:@nolyfill/is-arguments@latest": - version: 1.0.21 - resolution: "@nolyfill/is-arguments@npm:1.0.21" - checksum: d18dbeaf463ade91c6663f8ea21e4685f64018f4c763e055d1fcbee3c4d5bafda70e8e620e0bc4e674e09769c2a6c51812f4fd16ded899306bc4e4a93476648e + version: 1.0.24 + resolution: "@nolyfill/is-arguments@npm:1.0.24" + checksum: ca0d8cac595219fe1a9be71c233ab9575be5ee10373939ba5c0b31aaed4689783e03531652b82d61ffc2fd06f2cc2e3d0c47ea095ad0165d3445065a363d7248 languageName: node linkType: hard @@ -23226,11 +23798,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.13.0 - resolution: "is-core-module@npm:2.13.0" + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: "npm:^1.0.3" - checksum: 55ccb5ccd208a1e088027065ee6438a99367e4c31c366b52fbaeac8fa23111cd17852111836d904da604801b3286d38d3d1ffa6cd7400231af8587f021099dc6 + hasown: "npm:^2.0.0" + checksum: d53bd0cc24b0a0351fb4b206ee3908f71b9bbf1c47e9c9e14e5f06d292af1663704d2abd7e67700d6487b2b7864e0d0f6f10a1edf1892864bdffcb197d1845a2 languageName: node linkType: hard @@ -23302,9 +23874,9 @@ __metadata: linkType: hard "is-generator-function@npm:@nolyfill/is-generator-function@latest": - version: 1.0.21 - resolution: "@nolyfill/is-generator-function@npm:1.0.21" - checksum: 123b6f61381de1ac7d2a469b781d8feacfc2488d6f8a935cc3dd15f8b990f0e0301af400507c59c5dcf1f803eaa3e9ec55210f09312e365796b11f7351225823 + version: 1.0.24 + resolution: "@nolyfill/is-generator-function@npm:1.0.24" + checksum: e803f96bcccf4a85f7f1526b3a0c5f8365a80aaff9fe88a2fae0328daf302d5ed9485bf47a137328c80e49c41425b7e9328a64ab102e0734f61aca65a4d4a123 languageName: node linkType: hard @@ -23548,12 +24120,12 @@ __metadata: languageName: node linkType: hard -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" +"is-text-path@npm:^2.0.0": + version: 2.0.0 + resolution: "is-text-path@npm:2.0.0" dependencies: - text-extensions: "npm:^1.0.0" - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 + text-extensions: "npm:^2.0.0" + checksum: e26ade26a6aa6b26c3f00c913871c3c1ceb5a2a5ca4380aac3f0e092b151ad8e2ce4cee1060fb7a13a5684fa55ce62c9df04fa7723b180c82a34ae4c0fa34adb languageName: node linkType: hard @@ -23582,10 +24154,10 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:*, is-unicode-supported@npm:^1.2.0": - version: 1.3.0 - resolution: "is-unicode-supported@npm:1.3.0" - checksum: 20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc +"is-unicode-supported@npm:*": + version: 2.0.0 + resolution: "is-unicode-supported@npm:2.0.0" + checksum: 000b80639dedaf59a385f1c0a57f97a4d1435e0723716f24cc19ad94253a7a0a9f838bdc9ac49b10a29ac93b01f52ae9b2ed358a8876caf1eb74d73b4ede92b2 languageName: node linkType: hard @@ -23596,6 +24168,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc + languageName: node + linkType: hard + "is-upper-case@npm:^2.0.2": version: 2.0.2 resolution: "is-upper-case@npm:2.0.2" @@ -23649,6 +24228,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 + languageName: node + linkType: hard + "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -23701,9 +24287,9 @@ __metadata: linkType: hard "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: 31621b84ad29339242b63d454243f558a7958ee0b5177749bacf1f74be7d95d3fd93853738ef7eebcddfaf3eab014716e51392a8dbd5aa1bdc1b15c2ebc53c24 + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 languageName: node linkType: hard @@ -23790,7 +24376,7 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.4, istanbul-reports@npm:^3.1.5, istanbul-reports@npm:^3.1.6": +"istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.5, istanbul-reports@npm:^3.1.6": version: 3.1.6 resolution: "istanbul-reports@npm:3.1.6" dependencies: @@ -23827,19 +24413,6 @@ __metadata: languageName: node linkType: hard -"jaeger-client@npm:^3.15.0": - version: 3.19.0 - resolution: "jaeger-client@npm:3.19.0" - dependencies: - node-int64: "npm:^0.4.0" - opentracing: "npm:^0.14.4" - thriftrw: "npm:^3.5.0" - uuid: "npm:^8.3.2" - xorshift: "npm:^1.1.1" - checksum: 411d5657ec2d3f4ba9175260f0586c125edbd76c283ceabe0baa78efe2a04698f029be8d79ad199105f10c0428c7cd9f8cfed5f5c8393eeb2cb3ceb974c43279 - languageName: node - linkType: hard - "jake@npm:^10.8.5": version: 10.8.7 resolution: "jake@npm:10.8.7" @@ -23868,58 +24441,59 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-changed-files@npm:28.1.3" +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" dependencies: execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" p-limit: "npm:^3.1.0" - checksum: 206be715fed00c70d69f46f6274129816b2959dd9fe5d77b7c929d572eef8f55092baea48f51cf45848edd17e23b00aa720201b5e7781904e6ede06ba666e668 + checksum: 3d93742e56b1a73a145d55b66e96711fbf87ef89b96c2fab7cfdfba8ec06612591a982111ca2b712bb853dbc16831ec8b43585a2a96b83862d6767de59cbf83d languageName: node linkType: hard -"jest-circus@npm:^28.0.0, jest-circus@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-circus@npm:28.1.3" +"jest-circus@npm:^29.6.4, jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" dependencies: - "@jest/environment": "npm:^28.1.3" - "@jest/expect": "npm:^28.1.3" - "@jest/test-result": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" "@types/node": "npm:*" chalk: "npm:^4.0.0" co: "npm:^4.6.0" - dedent: "npm:^0.7.0" + dedent: "npm:^1.0.0" is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^28.1.3" - jest-matcher-utils: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-runtime: "npm:^28.1.3" - jest-snapshot: "npm:^28.1.3" - jest-util: "npm:^28.1.3" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" p-limit: "npm:^3.1.0" - pretty-format: "npm:^28.1.3" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" slash: "npm:^3.0.0" stack-utils: "npm:^2.0.3" - checksum: 3ac1f369cadbdd1982c123c04bc69f140b9790a8d0a729084f53aa13154bbdf318ba162dc70daecc37ef1d620afa339408d6b99a0314306238c547dc6a25b4a3 + checksum: 716a8e3f40572fd0213bcfc1da90274bf30d856e5133af58089a6ce45089b63f4d679bd44e6be9d320e8390483ebc3ae9921981993986d21639d9019b523123d languageName: node linkType: hard -"jest-cli@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-cli@npm:28.1.3" +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" dependencies: - "@jest/core": "npm:^28.1.3" - "@jest/test-result": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" import-local: "npm:^3.0.2" - jest-config: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - jest-validate: "npm:^28.1.3" - prompts: "npm:^2.0.1" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" yargs: "npm:^17.3.1" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -23928,34 +24502,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 935a0c517e7b972e60543fdb921302fc63d78e629ab077195c91336279c0815978ca2e03c65ec6dbff3226a5c4ee64b13c7ef5a86387330c9da54454cd4bbbfb + checksum: 6cc62b34d002c034203065a31e5e9a19e7c76d9e8ef447a6f70f759c0714cb212c6245f75e270ba458620f9c7b26063cd8cf6cd1f7e3afd659a7cc08add17307 languageName: node linkType: hard -"jest-config@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-config@npm:28.1.3" +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" dependencies: "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - babel-jest: "npm:^28.1.3" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" chalk: "npm:^4.0.0" ci-info: "npm:^3.2.0" deepmerge: "npm:^4.2.2" glob: "npm:^7.1.3" graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^28.1.3" - jest-environment-node: "npm:^28.1.3" - jest-get-type: "npm:^28.0.2" - jest-regex-util: "npm:^28.0.2" - jest-resolve: "npm:^28.1.3" - jest-runner: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - jest-validate: "npm:^28.1.3" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" micromatch: "npm:^4.0.4" parse-json: "npm:^5.2.0" - pretty-format: "npm:^28.1.3" + pretty-format: "npm:^29.7.0" slash: "npm:^3.0.0" strip-json-comments: "npm:^3.1.1" peerDependencies: @@ -23966,7 +24540,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 457d8709e24e0e4d8a8a8e074a65092e896d80f30d80c0448f8ce6a24bd0b30060a1a593a20aa7fb8c3c2228d519f0a979ccdff3a176efb60afc7187785d59cf + checksum: 6bdf570e9592e7d7dd5124fc0e21f5fe92bd15033513632431b211797e3ab57eaa312f83cc6481b3094b72324e369e876f163579d60016677c117ec4853cf02b languageName: node linkType: hard @@ -23982,7 +24556,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.4.1": +"jest-diff@npm:^29.4.1, jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" dependencies: @@ -23994,39 +24568,39 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:^28.1.1": - version: 28.1.1 - resolution: "jest-docblock@npm:28.1.1" +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" dependencies: detect-newline: "npm:^3.0.0" - checksum: 4062cb9ba54c88c88f5452fcd054937f35755240014ea277ff8dbfde30efcbdb77a4844a09279e55ec98f2fe9a1978a9b8583315e93fdf03602a619ae070356b + checksum: 8d48818055bc96c9e4ec2e217a5a375623c0d0bfae8d22c26e011074940c202aa2534a3362294c81d981046885c05d304376afba9f2874143025981148f3e96d languageName: node linkType: hard -"jest-each@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-each@npm:28.1.3" +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" dependencies: - "@jest/types": "npm:^28.1.3" + "@jest/types": "npm:^29.6.3" chalk: "npm:^4.0.0" - jest-get-type: "npm:^28.0.2" - jest-util: "npm:^28.1.3" - pretty-format: "npm:^28.1.3" - checksum: 4877cdda70048923ad6aabf25779e3e2c6bc580253d95739b8af291fbc506b95b043031b498f26807093abe9e6e93ecd7b50e3ce5b7ab175fc21637a197a248b + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: bd1a077654bdaa013b590deb5f7e7ade68f2e3289180a8c8f53bc8a49f3b40740c0ec2d3a3c1aee906f682775be2bebbac37491d80b634d15276b0aa0f2e3fda languageName: node linkType: hard -"jest-environment-node@npm:^28.0.0, jest-environment-node@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-environment-node@npm:28.1.3" +"jest-environment-node@npm:^29.6.4, jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" dependencies: - "@jest/environment": "npm:^28.1.3" - "@jest/fake-timers": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" "@types/node": "npm:*" - jest-mock: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - checksum: ab9ec5c57309a0ca40ebc58ba84b4980445f24d351cc3292c8c8715062c7ea14442d9d8e7701eccb9cb810f425bbdb7eba631fd76fb1835b92150b6bdda7cb18 + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 9cf7045adf2307cc93aed2f8488942e39388bff47ec1df149a997c6f714bfc66b2056768973770d3f8b1bf47396c19aa564877eb10ec978b952c6018ed1bd637 languageName: node linkType: hard @@ -24044,29 +24618,6 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-haste-map@npm:28.1.3" - dependencies: - "@jest/types": "npm:^28.1.3" - "@types/graceful-fs": "npm:^4.1.3" - "@types/node": "npm:*" - anymatch: "npm:^3.0.3" - fb-watchman: "npm:^2.0.0" - fsevents: "npm:^2.3.2" - graceful-fs: "npm:^4.2.9" - jest-regex-util: "npm:^28.0.2" - jest-util: "npm:^28.1.3" - jest-worker: "npm:^28.1.3" - micromatch: "npm:^4.0.4" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: c78e0e81e3f138f379440fb2ddfdc3753da377b74477df02ef404d5de1508d6545d28cf02516713dbde093a8c112098be6f50080a7a8fab6b888992720322a57 - languageName: node - linkType: hard - "jest-haste-map@npm:^29.7.0": version: 29.7.0 resolution: "jest-haste-map@npm:29.7.0" @@ -24090,29 +24641,29 @@ __metadata: languageName: node linkType: hard -"jest-junit@npm:^14.0.0": - version: 14.0.1 - resolution: "jest-junit@npm:14.0.1" +"jest-junit@npm:^16.0.0": + version: 16.0.0 + resolution: "jest-junit@npm:16.0.0" dependencies: mkdirp: "npm:^1.0.4" strip-ansi: "npm:^6.0.1" uuid: "npm:^8.3.2" xml: "npm:^1.0.1" - checksum: a3a960c233d3be178327be1d34a52b97f90177d0aee0be5c92d060a97aefc0e0b18ef26cbdb96a8305ecd7b5b9e033a9ee1eab4223af2a6cc316bffb51387598 + checksum: 2c33ee8bfd0c83b9aa1f8ba5905084890d5f519d294ccc2829d778ac860d5adffffec75d930f44f1d498aa8370c783e0aa6a632d947fb7e81205f0e7b926669d languageName: node linkType: hard -"jest-leak-detector@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-leak-detector@npm:28.1.3" +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" dependencies: - jest-get-type: "npm:^28.0.2" - pretty-format: "npm:^28.1.3" - checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 languageName: node linkType: hard -"jest-matcher-utils@npm:^28.0.0, jest-matcher-utils@npm:^28.1.3": +"jest-matcher-utils@npm:^28.0.0": version: 28.1.3 resolution: "jest-matcher-utils@npm:28.1.3" dependencies: @@ -24124,20 +24675,15 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^28.1.3" - "@types/stack-utils": "npm:^2.0.0" chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^28.1.3" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 91137a507e9eb79ef6156a3d17c882a181fa662da28cc1a86245ff53ba13726653c8d5fed2660e922aae020a9caca4d22c3689bfe61a215c8a17a43e01b7eb5c + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 languageName: node linkType: hard @@ -24168,16 +24714,6 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-mock@npm:28.1.3" - dependencies: - "@jest/types": "npm:^28.1.3" - "@types/node": "npm:*" - checksum: 43cbec0ceddea795b8b2bc09f8632eecc97b88ef018a9c9737b887ed6cbdbda000a436e9165dce2bccfbb949be8b0daca6faa530dc390d43a0e5e3099f3ae216 - languageName: node - linkType: hard - "jest-mock@npm:^29.7.0": version: 29.7.0 resolution: "jest-mock@npm:29.7.0" @@ -24189,9 +24725,9 @@ __metadata: languageName: node linkType: hard -"jest-playwright-preset@npm:^2.0.0": - version: 2.0.0 - resolution: "jest-playwright-preset@npm:2.0.0" +"jest-playwright-preset@npm:^3.0.1": + version: 3.0.1 + resolution: "jest-playwright-preset@npm:3.0.1" dependencies: expect-playwright: "npm:^0.8.0" jest-process-manager: "npm:^0.3.1" @@ -24200,11 +24736,11 @@ __metadata: rimraf: "npm:^3.0.2" uuid: "npm:^8.3.2" peerDependencies: - jest: ^28.0.0 - jest-circus: ^28.0.0 - jest-environment-node: ^28.0.0 - jest-runner: ^28.0.0 - checksum: fe9bad513fe7338f3138b4a81f4aa6e327b16d577d25c622eb01bedc0b8275219eabca333d4d30a5cecf4cace35ea2336623464f7aee3d3e2801861ad88bcdab + jest: ^29.3.1 + jest-circus: ^29.3.1 + jest-environment-node: ^29.3.1 + jest-runner: ^29.3.1 + checksum: 66282d2eed8e49f6b66dbf2559a83a5b1e0b8e2b150444503f5aa87ee13744e9cdbf533d56d73a02acc1d407b57babf6c3bf31c490fa169607b01f926371c8de languageName: node linkType: hard @@ -24238,13 +24774,6 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-regex-util@npm:28.0.2" - checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add - languageName: node - linkType: hard - "jest-regex-util@npm:^29.0.0, jest-regex-util@npm:^29.6.3": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -24252,89 +24781,89 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve-dependencies@npm:28.1.3" +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" dependencies: - jest-regex-util: "npm:^28.0.2" - jest-snapshot: "npm:^28.1.3" - checksum: 5c3128ea5f702a22141116b6a3d83c594c192d3e17b7235a1d47ecd64bcd9aa4924100668804e6b54faf5a1437a366f37165a2ea7170a2ce35899323b4ed7aac + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 1e206f94a660d81e977bcfb1baae6450cb4a81c92e06fad376cc5ea16b8e8c6ea78c383f39e95591a9eb7f925b6a1021086c38941aa7c1b8a6a813c2f6e93675 languageName: node linkType: hard -"jest-resolve@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve@npm:28.1.3" +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" dependencies: chalk: "npm:^4.0.0" graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^28.1.3" + jest-haste-map: "npm:^29.7.0" jest-pnp-resolver: "npm:^1.2.2" - jest-util: "npm:^28.1.3" - jest-validate: "npm:^28.1.3" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" resolve: "npm:^1.20.0" - resolve.exports: "npm:^1.1.0" + resolve.exports: "npm:^2.0.0" slash: "npm:^3.0.0" - checksum: 742b2301a43172206bf88d405df73d19510cfd4eacb0fb16d620157de408e9f7399567a57c86c61b30aaa303c15d88a77b38a69ad0230d288e44db4d44d5f724 + checksum: faa466fd9bc69ea6c37a545a7c6e808e073c66f46ab7d3d8a6ef084f8708f201b85d5fe1799789578b8b47fa1de47b9ee47b414d1863bc117a49e032ba77b7c7 languageName: node linkType: hard -"jest-runner@npm:^28.0.0, jest-runner@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runner@npm:28.1.3" +"jest-runner@npm:^29.6.4, jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" dependencies: - "@jest/console": "npm:^28.1.3" - "@jest/environment": "npm:^28.1.3" - "@jest/test-result": "npm:^28.1.3" - "@jest/transform": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" "@types/node": "npm:*" chalk: "npm:^4.0.0" - emittery: "npm:^0.10.2" + emittery: "npm:^0.13.1" graceful-fs: "npm:^4.2.9" - jest-docblock: "npm:^28.1.1" - jest-environment-node: "npm:^28.1.3" - jest-haste-map: "npm:^28.1.3" - jest-leak-detector: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-resolve: "npm:^28.1.3" - jest-runtime: "npm:^28.1.3" - jest-util: "npm:^28.1.3" - jest-watcher: "npm:^28.1.3" - jest-worker: "npm:^28.1.3" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" p-limit: "npm:^3.1.0" source-map-support: "npm:0.5.13" - checksum: 0fb6ed4f628650da9ff502b89bfdf98ea7f3015ad0369429c223ddae793573d9c5f350e95756e8bb827e2e6e3de03e5cb94569075c5788e574697b63c09d80ae + checksum: 9d8748a494bd90f5c82acea99be9e99f21358263ce6feae44d3f1b0cd90991b5df5d18d607e73c07be95861ee86d1cbab2a3fc6ca4b21805f07ac29d47c1da1e languageName: node linkType: hard -"jest-runtime@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runtime@npm:28.1.3" +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" dependencies: - "@jest/environment": "npm:^28.1.3" - "@jest/fake-timers": "npm:^28.1.3" - "@jest/globals": "npm:^28.1.3" - "@jest/source-map": "npm:^28.1.2" - "@jest/test-result": "npm:^28.1.3" - "@jest/transform": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" chalk: "npm:^4.0.0" cjs-module-lexer: "npm:^1.0.0" collect-v8-coverage: "npm:^1.0.0" - execa: "npm:^5.0.0" glob: "npm:^7.1.3" graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-mock: "npm:^28.1.3" - jest-regex-util: "npm:^28.0.2" - jest-resolve: "npm:^28.1.3" - jest-snapshot: "npm:^28.1.3" - jest-util: "npm:^28.1.3" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" slash: "npm:^3.0.0" strip-bom: "npm:^4.0.0" - checksum: d3d91b3f1082bbe3f87dc11ad7abce12f323797d98b3fa5ef7fb5efbd6d30e42041e3732cb8be5d41f0c8d8312d14461381d829ed1fe4e3712cfc82ea4a586fc + checksum: 59eb58eb7e150e0834a2d0c0d94f2a0b963ae7182cfa6c63f2b49b9c6ef794e5193ef1634e01db41420c36a94cefc512cdd67a055cd3e6fa2f41eaf0f82f5a20 languageName: node linkType: hard @@ -24347,48 +24876,31 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-snapshot@npm:28.1.3" +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" dependencies: "@babel/core": "npm:^7.11.6" "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" "@babel/plugin-syntax-typescript": "npm:^7.7.2" - "@babel/traverse": "npm:^7.7.2" "@babel/types": "npm:^7.3.3" - "@jest/expect-utils": "npm:^28.1.3" - "@jest/transform": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - "@types/babel__traverse": "npm:^7.0.6" - "@types/prettier": "npm:^2.1.5" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" babel-preset-current-node-syntax: "npm:^1.0.0" chalk: "npm:^4.0.0" - expect: "npm:^28.1.3" + expect: "npm:^29.7.0" graceful-fs: "npm:^4.2.9" - jest-diff: "npm:^28.1.3" - jest-get-type: "npm:^28.0.2" - jest-haste-map: "npm:^28.1.3" - jest-matcher-utils: "npm:^28.1.3" - jest-message-util: "npm:^28.1.3" - jest-util: "npm:^28.1.3" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" natural-compare: "npm:^1.4.0" - pretty-format: "npm:^28.1.3" - semver: "npm:^7.3.5" - checksum: 4e1f4e2aa5ccc776f1fdaab75f96342534f737df0d43458e0614af362f7e80097909f69e5d8f2d0aed2caae07fa122b1cf7b8da0c97c44c3b2d06da472d7ad79 - languageName: node - linkType: hard - -"jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" - dependencies: - "@jest/types": "npm:^28.1.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 92895523d30ddde8f22bebbc20ed6e1be35b0a21c8e9df8a1fc289bf354f6a3f96e5d271340f2ed212a5aa0b55fd7717ff3167da8c5f247d623e2a93a3bf7b32 + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: cb19a3948256de5f922d52f251821f99657339969bf86843bd26cf3332eae94883e8260e3d2fba46129a27c3971c1aa522490e460e16c7fad516e82d10bbf9f8 languageName: node linkType: hard @@ -24406,17 +24918,17 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-validate@npm:28.1.3" +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" dependencies: - "@jest/types": "npm:^28.1.3" + "@jest/types": "npm:^29.6.3" camelcase: "npm:^6.2.0" chalk: "npm:^4.0.0" - jest-get-type: "npm:^28.0.2" + jest-get-type: "npm:^29.6.3" leven: "npm:^3.1.0" - pretty-format: "npm:^28.1.3" - checksum: c49c8c64b4afbfb5c7434cfd30f8adbe7c6f57ce3ad6be55cfd65403f9ae664822badc1f27844ae800b23c84653bea834e928ad79e18ea0afdc4aa2d0a121156 + pretty-format: "npm:^29.7.0" + checksum: 8ee1163666d8eaa16d90a989edba2b4a3c8ab0ffaa95ad91b08ca42b015bfb70e164b247a5b17f9de32d096987cada63ed8491ab82761bfb9a28bc34b27ae161 languageName: node linkType: hard @@ -24437,23 +24949,7 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-watcher@npm:28.1.3" - dependencies: - "@jest/test-result": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - emittery: "npm:^0.10.2" - jest-util: "npm:^28.1.3" - string-length: "npm:^4.0.1" - checksum: e6d2c099d461408a992d144c230112fb282b2d8f54c49227bdb0c3efcfa5ecab70a019fc57d8ad6360000459087bb942c4f72670b52fc5b97ac0d9834f87d24e - languageName: node - linkType: hard - -"jest-watcher@npm:^29.0.0": +"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.7.0": version: 29.7.0 resolution: "jest-watcher@npm:29.7.0" dependencies: @@ -24480,17 +24976,6 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-worker@npm:28.1.3" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 0b5992308276ac8440a789e5317ff8feaa496cd9a0512c9cd73dbb9b6d2ff81b717cef1aa20113633c7280c9e29319af00a4d53d6bb35adbd1e3c01f0c290152 - languageName: node - linkType: hard - "jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" @@ -24503,14 +24988,14 @@ __metadata: languageName: node linkType: hard -"jest@npm:^28.0.0": - version: 28.1.3 - resolution: "jest@npm:28.1.3" +"jest@npm:^29.6.4": + version: 29.7.0 + resolution: "jest@npm:29.7.0" dependencies: - "@jest/core": "npm:^28.1.3" - "@jest/types": "npm:^28.1.3" + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" import-local: "npm:^3.0.2" - jest-cli: "npm:^28.1.3" + jest-cli: "npm:^29.7.0" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -24518,16 +25003,16 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: fb7c93e8a9d4c760a59e2b7638886f9f05465a14a88e263dca448f205464434967897a89784a37f7623999dfc33206d3d61d0acdc83eed99c4474d84a4ed3cf8 + checksum: 97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a languageName: node linkType: hard -"jiti@npm:^1.17.1, jiti@npm:^1.18.2": - version: 1.20.0 - resolution: "jiti@npm:1.20.0" +"jiti@npm:^1.17.1, jiti@npm:^1.18.2, jiti@npm:^1.19.1": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" bin: jiti: bin/jiti.js - checksum: c4e59419dcf5599e599602c6c6bd0b3e19748c0bce886887cc91542ea085ef11f69a25dbda2b0ac7af8085afda34eef89ac6e9311949a01839c52a9af4352ec2 + checksum: 005a0239e50381b5c9919f59dbab86128367bd64872f3376dbbde54b6523f41bd134bf22909e2a509e38fd87e1c22125ca255b9b6b53e7df0fedd23f737334cc languageName: node linkType: hard @@ -24538,7 +25023,7 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.3.0, joi@npm:^17.7.0": +"joi@npm:^17.11.0, joi@npm:^17.3.0": version: 17.11.0 resolution: "joi@npm:17.11.0" dependencies: @@ -24551,13 +25036,20 @@ __metadata: languageName: node linkType: hard -"jose@npm:^4.11.1, jose@npm:^4.11.4, jose@npm:^4.15.1": +"jose@npm:^4.11.4, jose@npm:^4.15.1": version: 4.15.4 resolution: "jose@npm:4.15.4" checksum: 20fa941597150dffc7af3f41d994500cc3e71cd650b755243dbd80d91cf26c1053f95b78af588f05cfc4371e492a67c5c7a48f689b8605145a8fe28b484d725b languageName: node linkType: hard +"jose@npm:^5.0.0, jose@npm:^5.1.0": + version: 5.1.1 + resolution: "jose@npm:5.1.1" + checksum: b925c5dbb49c46561b748178f70b7aa7439444b87fe9c00e1e209d5dcf838a2e250b6282c47a3b7c1967e76ec73484d40f97f1139c37d1edf1a7e6ff26d6e547 + languageName: node + linkType: hard + "jotai-devtools@npm:^0.7.0": version: 0.7.0 resolution: "jotai-devtools@npm:0.7.0" @@ -24578,28 +25070,28 @@ __metadata: languageName: node linkType: hard -"jotai-effect@npm:^0.2.2": - version: 0.2.2 - resolution: "jotai-effect@npm:0.2.2" +"jotai-effect@npm:^0.2.3": + version: 0.2.3 + resolution: "jotai-effect@npm:0.2.3" peerDependencies: jotai: ">=2.4.3" - checksum: f74f90836b3afb203d65e4621ce9fc267b838685007cf30db2802e15088f40e9bbb4f232121a7010194562286187fe7bc488935d75a948fd256c5bb58e5c858f + checksum: 3c99923fa6684231920ff34c15d42e4fc06e6dabe9596d6ac480eb35153ef3119c7682077370654b289aafb39b6e9a42b72f410cfda92f40c856af1b4598c4ba languageName: node linkType: hard -"jotai-scope@npm:^0.4.0": - version: 0.4.0 - resolution: "jotai-scope@npm:0.4.0" +"jotai-scope@npm:^0.4.1": + version: 0.4.1 + resolution: "jotai-scope@npm:0.4.1" peerDependencies: jotai: ">=2.5.0" react: ">=17.0.0" - checksum: 398b76507570a674af3e5cbb6f45ede8e8e02014c5d416825952d21f274da6191bbb41d18d0b9bac4dd375e9b5b8c848886a13f930a9810e3de823bfe7a22137 + checksum: a5d7f984a92edc7890c588a0d5218281eb1db1e55f4fcdd917c62c8f4fed1e26e34ded26c1c8e6e548c2a5ca1930e6e4ebb3634f89db35d52907d12caf48ae46 languageName: node linkType: hard -"jotai@npm:^2.4.3": - version: 2.4.3 - resolution: "jotai@npm:2.4.3" +"jotai@npm:^2.5.1": + version: 2.5.1 + resolution: "jotai@npm:2.5.1" peerDependencies: "@types/react": ">=17.0.0" react: ">=17.0.0" @@ -24608,7 +25100,7 @@ __metadata: optional: true react: optional: true - checksum: 804a4387cc24754490a0ec40311a7aa96c79d161414db659155f7056fa5ef3526f9ab1a521e16f72dce943ca60d8772156d7719a2d478f79ff70a324dfff2e40 + checksum: acd85e669eeb3bb86feef26d53050611488143f8d2311e8b714a65708b8a7c383d0677285240daf2cb1762fee9dc008edd09048a0ba161e99ff1c096efd81cfd languageName: node linkType: hard @@ -24634,11 +25126,11 @@ __metadata: linkType: hard "js-tiktoken@npm:^1.0.7": - version: 1.0.7 - resolution: "js-tiktoken@npm:1.0.7" + version: 1.0.8 + resolution: "js-tiktoken@npm:1.0.8" dependencies: base64-js: "npm:^1.5.1" - checksum: 591d561bc8d2f344153a163a9040cfad03929a813c03e0c34ba8d3ca61bfe891019ad985746f6ca552e33cb679a7aad542a610adea303b8bfd111ab282016af6 + checksum: c669848e4abd22ecbba38a968f307de1b93e053a6901c56da5f2eff6c7f9c1f2b33b7e874ca10da2e09870da0f680e00c6fae30b4576fc817fc010817c4848f5 languageName: node linkType: hard @@ -24782,11 +25274,14 @@ __metadata: linkType: hard "json-stable-stringify@npm:^1.0.1": - version: 1.0.2 - resolution: "json-stable-stringify@npm:1.0.2" + version: 1.1.0 + resolution: "json-stable-stringify@npm:1.1.0" dependencies: + call-bind: "npm:^1.0.5" + isarray: "npm:^2.0.5" jsonify: "npm:^0.0.1" - checksum: 96c8d697520072231c4916b7c0084ea857418cad0d06dc910f89a40df3824386a8eee5ed83ceea25b6052d67223fe821f9b1e51be311383104c5b2305b1dc87e + object-keys: "npm:^1.1.1" + checksum: 2889eca4f39574905bde288791d3fcc79fc9952f445a5fefb82af175a7992ec48c64161421c1e142f553a14a5f541de2e173cb22ce61d7fffc36d4bb44720541 languageName: node linkType: hard @@ -24982,9 +25477,9 @@ __metadata: linkType: hard "ky@npm:^1.0.1": - version: 1.0.1 - resolution: "ky@npm:1.0.1" - checksum: 0db9aa34ab4a6aeb441378cb85fecb9e49163e9e4652acf32ffc2feed602069f8d0f55353f7352f86d977caa9eb016f01724cafe83b737583d0a1ce8225e79f2 + version: 1.1.3 + resolution: "ky@npm:1.1.3" + checksum: 0545fd228d7e21aa51adc1b317559da317cdd3131d5af86480dcd323231d5e5831987dbb1d1a61317a9a7d615a9d822faff827fd22956f14cd345bf764da95fe languageName: node linkType: hard @@ -25298,8 +25793,8 @@ __metadata: linkType: hard "langsmith@npm:~0.0.31": - version: 0.0.43 - resolution: "langsmith@npm:0.0.43" + version: 0.0.48 + resolution: "langsmith@npm:0.0.48" dependencies: "@types/uuid": "npm:^9.0.1" commander: "npm:^10.0.1" @@ -25308,7 +25803,7 @@ __metadata: uuid: "npm:^9.0.0" bin: langsmith: dist/cli/main.cjs - checksum: 4d2a943646dcae58a19da5a11beccb475389ad45788f5b435a73438c95cdd880cfab98e22695fc39f412873090b8e405f7f795e3a4745e7ccda44282084b6d96 + checksum: e7c03e71c6e262e1a50826d65bd88703beee523f759beb4a55e6d6dea6e5ec9f64e941f6fc27a2ad6dcb7360bd5cfa82872598ee750ea1bca75195705fb2fa51 languageName: node linkType: hard @@ -25357,15 +25852,15 @@ __metadata: languageName: node linkType: hard -"lib0@npm:^0.2.74, lib0@npm:^0.2.85, lib0@npm:^0.2.87": - version: 0.2.87 - resolution: "lib0@npm:0.2.87" +"lib0@npm:^0.2.74, lib0@npm:^0.2.85, lib0@npm:^0.2.86, lib0@npm:^0.2.87": + version: 0.2.88 + resolution: "lib0@npm:0.2.88" dependencies: isomorphic.js: "npm:^0.2.4" bin: 0gentesthtml: bin/gentesthtml.js 0serve: bin/0serve.js - checksum: 078a55d1a6eb85a6fe836cf8c1268fa4761e475679db7f31c4993acd8a3a15e16c20e4481da9239402ff8a02a3718be9572767b3d6759e23a3518bcc0cc6b520 + checksum: 9539dcc3046305201747051a9d7f4af988fe539bf576b80fab47345f1f717e3867839c191b6fdeb6dde70c550340467b51ef69986a9e84e65f72ede67de0f9d5 languageName: node linkType: hard @@ -25378,13 +25873,20 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.5, lilconfig@npm:^2.1.0": +"lilconfig@npm:2.1.0, lilconfig@npm:^2.1.0": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" checksum: b1314a2e55319013d5e7d7d08be39015829d2764a1eaee130129545d40388499d81b1c31b0f9b3417d4db12775a88008b72ec33dd06e0184cf7503b32ca7cc0b languageName: node linkType: hard +"lilconfig@npm:^3.0.0": + version: 3.0.0 + resolution: "lilconfig@npm:3.0.0" + checksum: 55f60f4f9f7b41358cc33875e3696919412683a35aec30c6c60c4f6ecb16fb6d11f7ac856b8458b9b82b21d5f4629649fbfca1de034e8d5b0cc7a70836266db6 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -25393,9 +25895,9 @@ __metadata: linkType: hard "lines-and-columns@npm:~2.0.3": - version: 2.0.3 - resolution: "lines-and-columns@npm:2.0.3" - checksum: b5bb0d6ee2f82ae834ceddc9251af2060c30db476673e9c817c34c00bed58e0c5d90a6866b64afe7bdcb2c5eb1b418a5b1ee631d2592dc8ff381540901fa4da6 + version: 2.0.4 + resolution: "lines-and-columns@npm:2.0.4" + checksum: 81ac2f943f5428a46bd4ea2561c74ba674a107d8e6cc70cd317d16892a36ff3ba0dc6e599aca8b6f8668d26c85288394c6edf7a40e985ca843acab3701b80d4c languageName: node linkType: hard @@ -25411,29 +25913,29 @@ __metadata: languageName: node linkType: hard -"lint-staged@npm:^15.0.0": - version: 15.0.1 - resolution: "lint-staged@npm:15.0.1" +"lint-staged@npm:^15.1.0": + version: 15.1.0 + resolution: "lint-staged@npm:15.1.0" dependencies: chalk: "npm:5.3.0" commander: "npm:11.1.0" debug: "npm:4.3.4" execa: "npm:8.0.1" lilconfig: "npm:2.1.0" - listr2: "npm:7.0.1" + listr2: "npm:7.0.2" micromatch: "npm:4.0.5" pidtree: "npm:0.6.0" string-argv: "npm:0.3.2" - yaml: "npm:2.3.2" + yaml: "npm:2.3.4" bin: lint-staged: bin/lint-staged.js - checksum: feeede7055d3d863a9f7a552589f2ea789c8596d7faa3750b03fe6061ea4893e718e3fd60a11494a11183649c569e50216c4b2fa798aad1a5afdf9177e3c6f64 + checksum: 77aacab303ebab8ef6781833d35d82405b73f0e3e8f8c585cdd95b0e1f42a638a12e853d7ef6227a85d77ed2ba233f92b0499124696a6872569c508e04d25ce3 languageName: node linkType: hard -"listr2@npm:7.0.1": - version: 7.0.1 - resolution: "listr2@npm:7.0.1" +"listr2@npm:7.0.2": + version: 7.0.2 + resolution: "listr2@npm:7.0.2" dependencies: cli-truncate: "npm:^3.1.0" colorette: "npm:^2.0.20" @@ -25441,7 +25943,7 @@ __metadata: log-update: "npm:^5.0.1" rfdc: "npm:^1.3.0" wrap-ansi: "npm:^8.1.0" - checksum: e94e6e20ebf991f9eae990c97a013a80bc2e22cb0baea708f4100e25ce239163813df46e6c2a01633253c3ec745400563e15812fb38f5f9a70d48ae15b20d54f + checksum: 42cda5764906f9d298e3b0b0a684e71a3737533b2aef66f361265a3b938c4bc8f49bcea91536a8daa956833658d14108469b00c565c8e93ce4079795f6a06e07 languageName: node linkType: hard @@ -25488,33 +25990,33 @@ __metadata: linkType: hard "lit-element@npm:^4.0.0": - version: 4.0.1 - resolution: "lit-element@npm:4.0.1" + version: 4.0.2 + resolution: "lit-element@npm:4.0.2" dependencies: "@lit-labs/ssr-dom-shim": "npm:^1.1.2" "@lit/reactive-element": "npm:^2.0.0" - lit-html: "npm:^3.0.0" - checksum: bc44ff7531c40edbf8482cd696bb62cbe931d3c098ab820b76cb77099889d363e6a8fa607adb4c8efa48d4deefad92580d0d85be4a95bc15a85946a66b5273e1 + lit-html: "npm:^3.1.0" + checksum: 185e8b916516c87d337d0491e572af412a3f7c60f751b5432d2f671ab1615f515683c49f2a28aeae81264072a8d6f80cfdcf39ca9521b2a6dd96d2f83e929bf6 languageName: node linkType: hard -"lit-html@npm:^3.0.0": - version: 3.0.2 - resolution: "lit-html@npm:3.0.2" +"lit-html@npm:^3.1.0": + version: 3.1.0 + resolution: "lit-html@npm:3.1.0" dependencies: "@types/trusted-types": "npm:^2.0.2" - checksum: f68e13e4fce25268712ec45d78ccc515be4c6f85f4820b32229f10f839c2c8b2a68a8e905793d0621237840d1078b97c0a5f157f75d81073aa6447f986d0f292 + checksum: 2831f48e82bc75a27e329a844faf0b0324f006c004e2bbc2c5cc8632429ec79a5401aae31866fba9befae7861bf40c7513a7a39227ceafe2dc7a069f617ef875 languageName: node linkType: hard "lit@npm:^3.0.2": - version: 3.0.2 - resolution: "lit@npm:3.0.2" + version: 3.1.0 + resolution: "lit@npm:3.1.0" dependencies: "@lit/reactive-element": "npm:^2.0.0" lit-element: "npm:^4.0.0" - lit-html: "npm:^3.0.0" - checksum: 54a173cb9eb2287ed91d093cece8af3c699303dc5a050a6c67810e0c332a193df59f4b6c5aaa8a51f53987597838ecbc10c49e7fdbcb9754dedd92a22482e9c6 + lit-html: "npm:^3.1.0" + checksum: cf46959d909a5dce2ac4bff3d9f8aa942be223c30ce1d4e86e66eda55d53f2886e4ae6092f9ab825c1a26d56d1a57c360981040cb579d53a73869d07ec04bad9 languageName: node linkType: hard @@ -25856,13 +26358,6 @@ __metadata: languageName: node linkType: hard -"long@npm:^2.4.0": - version: 2.4.0 - resolution: "long@npm:2.4.0" - checksum: 64184debca70b0ddcc1742c4254e58926468d1a04329428115afee8ef4491b22a68127bb4349106141dd2d697d5c785bce648712f00340721ace2e78908412d5 - languageName: node - linkType: hard - "long@npm:^4.0.0": version: 4.0.0 resolution: "long@npm:4.0.0" @@ -25959,9 +26454,9 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 5bb91a97a342a41fd049c3494b44d9e21a7d4843f9284d0a0b26f00bb0e436f1f627d0641c78f88be16b86b4231546c5ee4f284733fb530c7960f0bcd7579026 + version: 10.0.3 + resolution: "lru-cache@npm:10.0.3" + checksum: 2fd14d8f828760eb4f1e696d20383bf52bb58a02aebfd08cb8035a66876c6fc1ec244ffdcf93d5a201fdad6d9f8c59de62c4fc5ff5604d67a4f833441f5b5945 languageName: node linkType: hard @@ -25990,10 +26485,10 @@ __metadata: languageName: node linkType: hard -"lru_map@npm:^0.3.3": - version: 0.3.3 - resolution: "lru_map@npm:0.3.3" - checksum: 50f6597924a7763ab0b31192e5e9965f08ca64a0044254138e74a65aecab95047d540f73739cff489866f4310e0202c11c10fdf18b10b236472160baaa68bbb1 +"luxon@npm:~3.4.0": + version: 3.4.4 + resolution: "luxon@npm:3.4.4" + checksum: c14164bc338987349075a08e63ea3ff902866735f7f5553a355b27be22667919765ff96fde4d3413d0e9a0edc4ff9e2e74ebcb8f86eae0ce8b14b27330d87d6e languageName: node linkType: hard @@ -26068,7 +26563,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.1": +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.1, magic-string@npm:^0.30.5": version: 0.30.5 resolution: "magic-string@npm:0.30.5" dependencies: @@ -26112,26 +26607,46 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" dependencies: agentkeepalive: "npm:^4.2.1" - cacache: "npm:^17.0.0" - http-cache-semantics: "npm:^4.1.1" + cacache: "npm:^16.1.0" + http-cache-semantics: "npm:^4.1.0" http-proxy-agent: "npm:^5.0.0" https-proxy-agent: "npm:^5.0.0" is-lambda: "npm:^1.0.1" lru-cache: "npm:^7.7.1" - minipass: "npm:^5.0.0" - minipass-fetch: "npm:^3.0.0" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^2.0.3" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" negotiator: "npm:^0.6.3" promise-retry: "npm:^2.0.1" socks-proxy-agent: "npm:^7.0.0" + ssri: "npm:^9.0.0" + checksum: fef5acb865a46f25ad0b5ad7d979799125db5dbb24ea811ffa850fbb804bc8e495df2237a8ec3a4fc6250e73c2f95549cca6d6d36a73b1faa61224504eb1188f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" ssri: "npm:^10.0.0" - checksum: b4b442cfaaec81db159f752a5f2e3ee3d7aa682782868fa399200824ec6298502e01bdc456e443dc219bcd5546c8e4471644d54109c8599841dc961d17a805fa + checksum: ded5a91a02b76381b06a4ec4d5c1d23ebbde15d402b3c3e4533b371dac7e2f7ca071ae71ae6dae72aa261182557b7b1b3fd3a705b39252dc17f74fa509d3e76f languageName: node linkType: hard @@ -26198,31 +26713,31 @@ __metadata: linkType: hard "marked-gfm-heading-id@npm:^3.1.0": - version: 3.1.0 - resolution: "marked-gfm-heading-id@npm:3.1.0" + version: 3.1.1 + resolution: "marked-gfm-heading-id@npm:3.1.1" dependencies: github-slugger: "npm:^2.0.0" peerDependencies: - marked: ">=4 <10" - checksum: e6e8fb710e5f2a78f207d652ad34aed3170b438258a7595e5bfb8d0dc36554b0a48e370511cbc1ce3c4d4a7b697eaf85bf2016f4f68afbd830868e7f5598199e + marked: ">=4 <11" + checksum: 75dbe8223808a79fa10b27eb50e6045a5a761122885b5b173937d5067b3e6c698af8b3d154300a5b209de28b0235069cc7ecf9e7f28b0aaad2570efa2fd66dca languageName: node linkType: hard "marked-mangle@npm:^1.1.4": - version: 1.1.4 - resolution: "marked-mangle@npm:1.1.4" + version: 1.1.5 + resolution: "marked-mangle@npm:1.1.5" peerDependencies: - marked: ">=4 <10" - checksum: b6f939bf927e808e9a1a03498427c46bc1f1faccbf261511898e4424e40b83cd9d33e6c3a639aa2b9a35f886fc00e64d3912a8028aa74886e1096d66134bc5d6 + marked: ">=4 <11" + checksum: 5d917b97dd1933331cb980fa80a3c4edc0b0418886ce4ea0523d93feea46f1bc0a30ac6efe33cf84129b7366f1b9485754f2933552b32806e676b207e6ba6405 languageName: node linkType: hard -"marked@npm:*, marked@npm:^9.1.2": - version: 9.1.2 - resolution: "marked@npm:9.1.2" +"marked@npm:*": + version: 10.0.0 + resolution: "marked@npm:10.0.0" bin: marked: bin/marked.js - checksum: aaa7140852b5ce4c3d0adba42a11037db6d5dca7dd18ec3900a6625f1f7dd7a6e0817639d47a8bbee331aee13d37ce0bc3c934b5593e340bb0c953548de79b1e + checksum: f7442f6bd6a678e48eb3ca2f4b15e6d80ce63fa8363d319733ad7d968cfea410eacd01e764dc76c59d7ff77d409007bf5628d215ec84ef4ffa65f44ae08f0255 languageName: node linkType: hard @@ -26235,6 +26750,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^9.1.2": + version: 9.1.6 + resolution: "marked@npm:9.1.6" + bin: + marked: bin/marked.js + checksum: 29d073500c70b6b53cd35a8d19f5e43df6e2819ddeca8848a31901b87b82ca0ea46a8a831920c656c69c33ad5dce4b75654c4c4ced34a67f4e4e4a31c7620cfe + languageName: node + linkType: hard + "matcher@npm:^3.0.0": version: 3.0.0 resolution: "matcher@npm:3.0.0" @@ -26509,7 +27033,14 @@ __metadata: languageName: node linkType: hard -"meow@npm:^8.0.0, meow@npm:^8.1.2": +"meow@npm:^12.0.1": + version: 12.1.1 + resolution: "meow@npm:12.1.1" + checksum: 8594c319f4671a562c1fef584422902f1bbbad09ea49cdf9bb26dc92f730fa33398dd28a8cf34fcf14167f1d1148d05a867e50911fc4286751a4fb662fdd2dc2 + languageName: node + linkType: hard + +"meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" dependencies: @@ -26790,11 +27321,11 @@ __metadata: linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 705715a2dd6f10d85c69371b4176a0b2fec5811a14f7d26f66f358ac5adebb12975f79597b1a1a184a6dcf6799319f7cf8eb91398e47c1faa2cab2c84f155b78 + checksum: 9512507722efd2033a9f08715eeef787fbfe27e23edf55db21423d46d82ab46f76c89b4f960be3f5e50a2d388d89658afc0647989cf256d051e9ea01277a1adb languageName: node linkType: hard @@ -27001,7 +27532,7 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0": +"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -27019,9 +27550,9 @@ __metadata: languageName: node linkType: hard -"miniflare@npm:3.20231025.0": - version: 3.20231025.0 - resolution: "miniflare@npm:3.20231025.0" +"miniflare@npm:3.20231030.1": + version: 3.20231030.1 + resolution: "miniflare@npm:3.20231030.1" dependencies: acorn: "npm:^8.8.0" acorn-walk: "npm:^8.2.0" @@ -27031,11 +27562,13 @@ __metadata: source-map-support: "npm:0.5.21" stoppable: "npm:^1.1.0" undici: "npm:^5.22.1" - workerd: "npm:1.20231025.0" + workerd: "npm:1.20231030.0" ws: "npm:^8.11.0" youch: "npm:^3.2.2" zod: "npm:^3.20.6" - checksum: 187d2088ea710dfd7e63e179e4be03553d4585e7b03a4e16d41e2779ace28ce6b221723bdf3660a032aa6acc18e31d42aa2c2bcb456d596933d6604a0603aaf2 + bin: + miniflare: bootstrap.js + checksum: 0d86d4234e856658394b4206c55d1a80b2a8cd78e5644a6c325db8c636964c9ec6e3b4f36c54789dc9566cb07be7c36faac7e0330de11ee85ef7885787a7b7d5 languageName: node linkType: hard @@ -27111,7 +27644,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7, minimist@npm:~1.2.5": +"minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8, minimist@npm:~1.2.5": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -27127,6 +27660,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^3.1.6" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 8cfc589563ae2a11eebbf79121ef9a526fd078fca949ed3f1e4a51472ca4a4aad89fcea1738982ce9d7d833116ecc9c6ae9ebbd844832a94e3f4a3d4d1b9d3b9 + languageName: node + linkType: hard + "minipass-fetch@npm:^3.0.0": version: 3.0.4 resolution: "minipass-fetch@npm:3.0.4" @@ -27169,7 +27717,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0": +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -27192,7 +27740,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": version: 7.0.4 resolution: "minipass@npm:7.0.4" checksum: e864bd02ceb5e0707696d58f7ce3a0b89233f0d686ef0d447a66db705c0846a8dc6f34865cd85256c1472ff623665f616b90b8ff58058b2ad996c5de747d2d18 @@ -27294,6 +27842,13 @@ __metadata: languageName: node linkType: hard +"modern-ahocorasick@npm:^1.0.0": + version: 1.0.1 + resolution: "modern-ahocorasick@npm:1.0.1" + checksum: ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e + languageName: node + linkType: hard + "module-definition@npm:^3.3.1": version: 3.4.0 resolution: "module-definition@npm:3.4.0" @@ -27375,37 +27930,39 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.3.2": - version: 1.3.2 - resolution: "msw@npm:1.3.2" +"msw@npm:^2.0.8": + version: 2.0.8 + resolution: "msw@npm:2.0.8" dependencies: - "@mswjs/cookies": "npm:^0.2.2" - "@mswjs/interceptors": "npm:^0.17.10" - "@open-draft/until": "npm:^1.0.3" + "@bundled-es-modules/cookie": "npm:^2.0.0" + "@bundled-es-modules/js-levenshtein": "npm:^2.0.1" + "@bundled-es-modules/statuses": "npm:^1.0.1" + "@mswjs/cookies": "npm:^1.1.0" + "@mswjs/interceptors": "npm:^0.25.11" + "@open-draft/until": "npm:^2.1.0" "@types/cookie": "npm:^0.4.1" "@types/js-levenshtein": "npm:^1.1.1" - chalk: "npm:^4.1.1" + "@types/statuses": "npm:^2.0.1" + chalk: "npm:^4.1.2" chokidar: "npm:^3.4.2" - cookie: "npm:^0.4.2" graphql: "npm:^16.8.1" - headers-polyfill: "npm:3.2.5" + headers-polyfill: "npm:^4.0.1" inquirer: "npm:^8.2.0" is-node-process: "npm:^1.2.0" js-levenshtein: "npm:^1.1.6" - node-fetch: "npm:^2.6.7" outvariant: "npm:^1.4.0" path-to-regexp: "npm:^6.2.0" - strict-event-emitter: "npm:^0.4.3" + strict-event-emitter: "npm:^0.5.0" type-fest: "npm:^2.19.0" yargs: "npm:^17.3.1" peerDependencies: - typescript: ">= 4.4.x <= 5.2.x" + typescript: ">= 4.7.x <= 5.2.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: 9864406faf9ee3381ebfdad1f06eda1468c0f34041238aba2f8eb44690f4a2d5949c68e414105a14c869aff7bd03ef61606f4acccd33735ba34d5cf290cfb189 + checksum: fdcc44c57f7739d746a5333bf1fb0c7aa68ec8fc49596cdf8f83f2fd31463fb0206caa6b0395cc76fe84c2f594df68c1a72a323aa1b72196af3ff6ca40830cae languageName: node linkType: hard @@ -27491,11 +28048,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.3, nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 67235c39d1bc05851383dadde5cf77ae1c90c2a1d189e845c7f20f646f0488d875ad5f5226bbba072a88cebbb085a3f784a6673117daf785bdf614a852550362 + checksum: ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 languageName: node linkType: hard @@ -27522,27 +28079,27 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.5.0, neo-async@npm:^2.6.1, neo-async@npm:^2.6.2": +"neo-async@npm:^2.5.0, neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" checksum: 1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 languageName: node linkType: hard -"nest-commander@npm:^3.12.0": - version: 3.12.0 - resolution: "nest-commander@npm:3.12.0" +"nest-commander@npm:^3.12.2": + version: 3.12.2 + resolution: "nest-commander@npm:3.12.2" dependencies: "@fig/complete-commander": "npm:^2.0.1" "@golevelup/nestjs-discovery": "npm:4.0.0" commander: "npm:11.0.0" - cosmiconfig: "npm:8.2.0" - inquirer: "npm:8.2.5" + cosmiconfig: "npm:8.3.6" + inquirer: "npm:8.2.6" peerDependencies: "@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 "@nestjs/core": ^8.0.0 || ^9.0.0 || ^10.0.0 "@types/inquirer": ^8.1.3 - checksum: 29554f1cef113e0b0fa05a958c81b63613a046c682a2da7f7856b3f03f1e0b4792d76637fa1e47cdac4db98862dba34bbae46b964db71ad72f5bb9fff72ef530 + checksum: d2633e3c678c509b9d591ce265923dc5d5076e71426e3ab521ebde3a1ad6b867fe12e46ebd032800521b3a8efa6754641cc448901248e2af97c781faeb37d256 languageName: node linkType: hard @@ -27559,9 +28116,9 @@ __metadata: languageName: node linkType: hard -"next-auth@npm:4.23.2": - version: 4.23.2 - resolution: "next-auth@npm:4.23.2" +"next-auth@npm:4.24.5": + version: 4.24.5 + resolution: "next-auth@npm:4.24.5" dependencies: "@babel/runtime": "npm:^7.20.13" "@panva/hkdf": "npm:^1.0.2" @@ -27573,20 +28130,20 @@ __metadata: preact-render-to-string: "npm:^5.1.19" uuid: "npm:^8.3.2" peerDependencies: - next: ^12.2.5 || ^13 + next: ^12.2.5 || ^13 || ^14 nodemailer: ^6.6.5 react: ^17.0.2 || ^18 react-dom: ^17.0.2 || ^18 peerDependenciesMeta: nodemailer: optional: true - checksum: b67fde4a1c6210859196fa15808b2e5c1456dcdecabdd540957a410c2472517714ef43955758012eb146769b96ee9798991cf30d3e52c3ac5297975e9159704b + checksum: c9256deaa7a77741be2c8829c290c43c63fd8fa86ace3196910d3fa4389c101d6a610f3c5f4b55000e766a51dd89eafc9b5cd876e373884db3bf90122fdfa6a1 languageName: node linkType: hard -"next-auth@patch:next-auth@npm%3A4.23.2#./.yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch::locator=%40affine%2Fmonorepo%40workspace%3A.": - version: 4.23.2 - resolution: "next-auth@patch:next-auth@npm%3A4.23.2#./.yarn/patches/next-auth-npm-4.23.2-5f0e551bc7.patch::version=4.23.2&hash=0801fa&locator=%40affine%2Fmonorepo%40workspace%3A." +"next-auth@patch:next-auth@npm%3A4.24.5#~/.yarn/patches/next-auth-npm-4.24.5-8428e11927.patch": + version: 4.24.5 + resolution: "next-auth@patch:next-auth@npm%3A4.24.5#~/.yarn/patches/next-auth-npm-4.24.5-8428e11927.patch::version=4.24.5&hash=9af7e1" dependencies: "@babel/runtime": "npm:^7.20.13" "@panva/hkdf": "npm:^1.0.2" @@ -27598,14 +28155,14 @@ __metadata: preact-render-to-string: "npm:^5.1.19" uuid: "npm:^8.3.2" peerDependencies: - next: ^12.2.5 || ^13 + next: ^12.2.5 || ^13 || ^14 nodemailer: ^6.6.5 react: ^17.0.2 || ^18 react-dom: ^17.0.2 || ^18 peerDependenciesMeta: nodemailer: optional: true - checksum: 339a4daf3571012ef98af33e9c1fc0d45b7bd239e68957efa127a6f28c6a17c87fd1a1e6044e4ad6cb03a1b2861857d92bbf47e3ca05559242748d69cdedf950 + checksum: 15f251a6e31c79459bce7a2d638c6069c34b5e92effdae8d7b2c366bbe2d1e1916da6ed5bc7995c1926dd35442552deb33959ee4bd45bbab0347455c13448d4b languageName: node linkType: hard @@ -27627,16 +28184,16 @@ __metadata: languageName: node linkType: hard -"nise@npm:^5.1.4": - version: 5.1.4 - resolution: "nise@npm:5.1.4" +"nise@npm:^5.1.5": + version: 5.1.5 + resolution: "nise@npm:5.1.5" dependencies: "@sinonjs/commons": "npm:^2.0.0" "@sinonjs/fake-timers": "npm:^10.0.2" "@sinonjs/text-encoding": "npm:^0.7.1" just-extend: "npm:^4.0.2" path-to-regexp: "npm:^1.7.0" - checksum: d49fbe9093ca6c54e3a8e997fe003ace695874c065e5b59d62a7dc096cc4249afe8d9bd0c55e1b81fc0a92d302f197f9e0fb5e18ae812371a7affc53dc2025c3 + checksum: c6afe82b919a2c1985916d5bb3a738a7b2cfb017a6ab9479ec1ede62343051b40da88a1321517bb5d912c13e08b8d9ce9cdef9583edeb44d640af7273c35ebf2 languageName: node linkType: hard @@ -27666,15 +28223,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^3.2.1": - version: 3.2.1 - resolution: "node-addon-api@npm:3.2.1" - dependencies: - node-gyp: "npm:latest" - checksum: 681b52dfa3e15b0a8e5cf283cc0d8cd5fd2a57c559ae670fcfd20544cbb32f75de7648674110defcd17ab2c76ebef630aa7d2d2f930bc7a8cc439b20fe233518 - languageName: node - linkType: hard - "node-api-version@npm:^0.1.4": version: 0.1.4 resolution: "node-api-version@npm:0.1.4" @@ -27684,7 +28232,7 @@ __metadata: languageName: node linkType: hard -"node-dir@npm:^0.1.10, node-dir@npm:^0.1.17": +"node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" dependencies: @@ -27701,9 +28249,9 @@ __metadata: linkType: hard "node-fetch-native@npm:^1.4.0": - version: 1.4.0 - resolution: "node-fetch-native@npm:1.4.0" - checksum: cc6d60db42432a352c12da8b39eebd7a0f90c2617f372cb46c570689480ac121325adf1ded30fdf50abed324c97e1a1612cf8ce639af4de9e4d2541e71f0eb0d + version: 1.4.1 + resolution: "node-fetch-native@npm:1.4.1" + checksum: f66a6d495d50ee3739369fe6b614236087059af0b6fd7fa263c4204d9717e9dc53493b409e6921af0beaf4587a4cc2b74eae4605f30f0b4ea7f270c1d53e04f6 languageName: node linkType: hard @@ -27753,26 +28301,15 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.3.0": - version: 4.6.1 - resolution: "node-gyp-build@npm:4.6.1" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: 79b948377492ae8e1aa1c18071661e6020c11f8847d5ce822abd67ec02bee5b21715b1b4861041d2b40d16633824476735bc9a60e81c82c49e715d55ee29b206 - languageName: node - linkType: hard - -"node-gyp@npm:^9.0.0, node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" +"node-gyp@npm:^9.0.0": + version: 9.4.1 + resolution: "node-gyp@npm:9.4.1" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" glob: "npm:^7.1.4" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^11.0.3" + make-fetch-happen: "npm:^10.0.3" nopt: "npm:^6.0.0" npmlog: "npm:^6.0.0" rimraf: "npm:^3.0.2" @@ -27781,7 +28318,27 @@ __metadata: which: "npm:^2.0.2" bin: node-gyp: bin/node-gyp.js - checksum: 458317127c63877365f227b18ef2362b013b7f8440b35ae722935e61b31e6b84ec0e3625ab07f90679e2f41a1d5a7df6c4049fdf8e7b3c81fcf22775147b47ac + checksum: 329b109b138e48cb0416a6bca56e171b0e479d6360a548b80f06eced4bef3cf37652a3d20d171c20023fb18d996bd7446a49d4297ddb59fc48100178a92f432d + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 578cf0c821f258ce4b6ebce4461eca4c991a4df2dee163c0624f2fe09c7d6d37240be4942285a0048d307230248ee0b18382d6623b9a0136ce9533486deddfa8 languageName: node linkType: hard @@ -27833,10 +28390,10 @@ __metadata: languageName: node linkType: hard -"nodemailer@npm:^6.9.6": - version: 6.9.6 - resolution: "nodemailer@npm:6.9.6" - checksum: fa0041c242ae5eb484a4aa74cae626aded143a3af363f2dd1c9309defc485fda71ecd008efe560fa12c1b44fe4e53ec3f2538903cecc05b4f0eeca850ac86d4c +"nodemailer@npm:^6.9.7": + version: 6.9.7 + resolution: "nodemailer@npm:6.9.7" + checksum: 32b6e6c3f5e0ab6c5fa796934fee397e8b520f6d782fc41d8bd5aaf72a2e757564b8e7e7f7aa02fcf0ba73a83d364bdb923c2dbb76a32ac87a5c628d1bde03df languageName: node linkType: hard @@ -27878,6 +28435,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 1e7489f17cbda452c8acaf596a8defb4ae477d2a9953b76eb96f4ec3f62c6b421cd5174eaa742f88279871fde9586d8a1d38fb3f53fa0c405585453be31dff4c + languageName: node + linkType: hard + "nopt@npm:~1.0.10": version: 1.0.10 resolution: "nopt@npm:1.0.10" @@ -28044,26 +28612,25 @@ __metadata: languageName: node linkType: hard -"nx@npm:16.10.0, nx@npm:^16.10.0": - version: 16.10.0 - resolution: "nx@npm:16.10.0" +"nx@npm:17.1.3, nx@npm:^17.1.3": + version: 17.1.3 + resolution: "nx@npm:17.1.3" dependencies: - "@nrwl/tao": "npm:16.10.0" - "@nx/nx-darwin-arm64": "npm:16.10.0" - "@nx/nx-darwin-x64": "npm:16.10.0" - "@nx/nx-freebsd-x64": "npm:16.10.0" - "@nx/nx-linux-arm-gnueabihf": "npm:16.10.0" - "@nx/nx-linux-arm64-gnu": "npm:16.10.0" - "@nx/nx-linux-arm64-musl": "npm:16.10.0" - "@nx/nx-linux-x64-gnu": "npm:16.10.0" - "@nx/nx-linux-x64-musl": "npm:16.10.0" - "@nx/nx-win32-arm64-msvc": "npm:16.10.0" - "@nx/nx-win32-x64-msvc": "npm:16.10.0" - "@parcel/watcher": "npm:2.0.4" + "@nrwl/tao": "npm:17.1.3" + "@nx/nx-darwin-arm64": "npm:17.1.3" + "@nx/nx-darwin-x64": "npm:17.1.3" + "@nx/nx-freebsd-x64": "npm:17.1.3" + "@nx/nx-linux-arm-gnueabihf": "npm:17.1.3" + "@nx/nx-linux-arm64-gnu": "npm:17.1.3" + "@nx/nx-linux-arm64-musl": "npm:17.1.3" + "@nx/nx-linux-x64-gnu": "npm:17.1.3" + "@nx/nx-linux-x64-musl": "npm:17.1.3" + "@nx/nx-win32-arm64-msvc": "npm:17.1.3" + "@nx/nx-win32-x64-msvc": "npm:17.1.3" "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:3.0.0-rc.46" "@zkochan/js-yaml": "npm:0.0.6" - axios: "npm:^1.0.0" + axios: "npm:^1.5.1" chalk: "npm:^4.1.0" cli-cursor: "npm:3.1.0" cli-spinners: "npm:2.6.1" @@ -28125,7 +28692,8 @@ __metadata: optional: true bin: nx: bin/nx.js - checksum: 748a28491ac607e6d3ab1878dc17b0a78a74be1a272a2775336a8110660d6c39e3e993793391b5810d2e482156421a247cce47b9c3035e4f156129a4b595dd2e + nx-cloud: bin/nx-cloud.js + checksum: 08ce65184756d8fc1ead70458952d8d3122cc50ef661d376f84f4570e399e249c657a90e555b0d664b2eb5ca2d9fb7c75ef31d27a8cf59af731d2747720ea4f1 languageName: node linkType: hard @@ -28166,10 +28734,10 @@ __metadata: languageName: node linkType: hard -"oauth4webapi@npm:^2.0.6": - version: 2.3.0 - resolution: "oauth4webapi@npm:2.3.0" - checksum: f0ec83060a2ceb6297c898a9c6c3f4c4a4af0539813ec6eb17f053b3f7b6260bd9052df35444afdfe7aa2c3791bcb6dc63e642e621c35ab1c9a8ada83e611032 +"oauth4webapi@npm:^2.3.0": + version: 2.4.0 + resolution: "oauth4webapi@npm:2.4.0" + checksum: 8886e1757db177c9d71175b1285c682c97e75cec4cfbd363a0d7ede05f52072d2065e11c31f829ff42f0dae4f4e07ce8b9f6964111793b82b88dcc69b50a8b15 languageName: node linkType: hard @@ -28202,20 +28770,20 @@ __metadata: linkType: hard "object-is@npm:@nolyfill/object-is@latest": - version: 1.0.21 - resolution: "@nolyfill/object-is@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object-is@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 056e7d9991f90db35d6e81590773dfe6ebd650a862a85a3a7b463d3d610f163a1b76e2779924c850d2aecdec696b575b61acf3731d95496ddfcd7bec77001b06 + "@nolyfill/shared": "npm:1.0.24" + checksum: 0a3f815468e3f7af9d726ab8c181bcea99edff457f508ff5b09de3102f76af4ea31ae1bb4458d8f358bad0226cb11775c7873a894aae745008cd7f4c85f01d2c languageName: node linkType: hard "object-keys@npm:@nolyfill/object-keys@latest": - version: 1.0.21 - resolution: "@nolyfill/object-keys@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object-keys@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 1691746c97cd58af5e9b5b498ad05ab1f69b817de965dac21e58c7e46413b96de6d9cf66c4c02f23887b6e5190ec115addb23aca1abeb7d5687da2f78018ba17 + "@nolyfill/shared": "npm:1.0.24" + checksum: 8fa022a0a36361b5144febb4c70b8306f2d8ab08c4b2435c93525366cb9a5720bf895b9ace782e9137f04abe8ff5e2fb49b87b2784240f0b7cf101a71d049311 languageName: node linkType: hard @@ -28227,47 +28795,47 @@ __metadata: linkType: hard "object.assign@npm:@nolyfill/object.assign@latest": - version: 1.0.21 - resolution: "@nolyfill/object.assign@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object.assign@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 3e0111844270fcfb8fab10f8570c8acd6aaea27089066c2f39dd2fef0c8312c537489b305593c9dc03c4cfeb47a0b2a8b51bdc880f7781112977c04972bb72b0 + "@nolyfill/shared": "npm:1.0.24" + checksum: 75eba97342183b8e24da6f5f4eaeadac91c4237c6d55744282e06707872e7227fed8a039f1dbaa20d1a9fee6812cb739a7d5b4d0f8d41533c7b6d2871221d187 languageName: node linkType: hard "object.entries@npm:@nolyfill/object.entries@latest": - version: 1.0.21 - resolution: "@nolyfill/object.entries@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object.entries@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: c3cc0dac0c7b778ea1ce57d42ad316c8cd1e54a0850b82e248410cc15cc5da6a0d0f9612895e0325a8f1ff317f02933a1892833f4f5d0be9a5e80baaea475e20 + "@nolyfill/shared": "npm:1.0.24" + checksum: d17528841f057c5ee2570488ca0537a2c49bb45c9e81c964c9db65193b097ae905f6fd6c23eca8b19b747bfb5ecd213184eed63b50fd02ef95e2957335d82516 languageName: node linkType: hard "object.fromentries@npm:@nolyfill/object.fromentries@latest": - version: 1.0.21 - resolution: "@nolyfill/object.fromentries@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object.fromentries@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 5039a93c966f21d01645792652d1be2dd005e70aef2d1a8a4ca1956c3703cf795b619c6b93b7849447e11db738f1974a6628cb8e32e5f140d1b2072742c7f5eb + "@nolyfill/shared": "npm:1.0.24" + checksum: fd0296bb7208e83ebade1ef752126f07936428e6608402d431e0ebc5eb6df51facfc64742da8b08c7c6242815e258fcdc0cd9d2226bcebc9c735fe3c5d2ec876 languageName: node linkType: hard "object.hasown@npm:@nolyfill/object.hasown@latest": - version: 1.0.21 - resolution: "@nolyfill/object.hasown@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object.hasown@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 2fcfdf0052fd982425813f07054026be6865eb5a4ef84a1cc1c5b5db4ee7b1177af1970d467d95f34175fc14f3c3f0b8209b78d6a604eab2921456bb9e1af1de + "@nolyfill/shared": "npm:1.0.24" + checksum: 5abf9b19ab90c020928ea84557db02a3c353fa33d6683fd795ad920aeedbb888a84fa01747a6dc0afd09bdf7bfba0de5dd6104ae7465ea0e3780bc062ce3fe0c languageName: node linkType: hard "object.values@npm:@nolyfill/object.values@latest": - version: 1.0.21 - resolution: "@nolyfill/object.values@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/object.values@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 6e364d955ec08126455973bf0a089d429ca4fd1c27a58289e974fdc08270ad1f45d9944492cf7ccdff62ac98c585a9e737f6588a16c134830143d966e513f579 + "@nolyfill/shared": "npm:1.0.24" + checksum: 7a76754bd885c7ba77cf056cd96ec10ed36a13d2731e137a85c229ed5ca7b47ffe1d9b7ad2476cdf829e9d6be0d0fb18801bc88498dc354931e02dbc2c4d15c3 languageName: node linkType: hard @@ -28388,13 +28956,6 @@ __metadata: languageName: node linkType: hard -"opentracing@npm:^0.14.4": - version: 0.14.7 - resolution: "opentracing@npm:0.14.7" - checksum: 0159a5a2a40bef0722cd6e0607808355e0e22909fe54f3441fbce3c78183fed0a12f834ca43eff0c93abddb8b1ab89548162b05cd9b340678dfa3b5cb9eb04b8 - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -28848,6 +29409,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 7e7368a5207e7c6b9051ef045711d0dc3c2b6203e96057e408e6e74d09f383061010d2be95cb8593fe6258a767c3e9fc6b2bfc7ce8d48ae8c3d9f6994cca9ad8 + languageName: node + linkType: hard + "path-case@npm:^3.0.4": version: 3.0.4 resolution: "path-case@npm:3.0.4" @@ -29077,7 +29645,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc @@ -29162,27 +29730,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.39.0, playwright-core@npm:>=1.2.0": - version: 1.39.0 - resolution: "playwright-core@npm:1.39.0" +"playwright-core@npm:1.40.0, playwright-core@npm:>=1.2.0": + version: 1.40.0 + resolution: "playwright-core@npm:1.40.0" bin: playwright-core: cli.js - checksum: e4e01ddea024c7564bbfacdba5f545b004a4017b466af08ae90e5184da4f5bc61e74c96e37cc5e30b7d4f97341c0883cfb2038c8cfbfab65316d714f65b82d83 + checksum: 2ce5245988b0e89ed3359476a83ad724484da349eae42e6c9dd4162a2180b1d37fe1750df45473a5a04a1590cb093d9f0df81e607b7f5c2c161f881436ee1a00 languageName: node linkType: hard -"playwright@npm:1.39.0, playwright@npm:^1.14.0, playwright@npm:^1.39.0": - version: 1.39.0 - resolution: "playwright@npm:1.39.0" +"playwright@npm:1.40.0, playwright@npm:^1.14.0, playwright@npm:^1.39.0": + version: 1.40.0 + resolution: "playwright@npm:1.40.0" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.39.0" + playwright-core: "npm:1.40.0" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 6f6b2f4381fccfbc560c4cd25e164f5093fec4e2046990587282e18618151d723b299b56c16741ce08e44a759c22e38c3e705b716d31238320e08e6ffcfa7319 + checksum: 56352a177e712598f30bbe6da69027a065cb9ee50df512e186dfc9e479a68bd60bab2fee9278e943ab75d4109ad062b88556f3e7efdabfd1f91f728ccceee631 languageName: node linkType: hard @@ -29296,12 +29864,12 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^3.1.0": - version: 3.1.4 - resolution: "postcss-load-config@npm:3.1.4" +"postcss-load-config@npm:^4.0.1": + version: 4.0.2 + resolution: "postcss-load-config@npm:4.0.2" dependencies: - lilconfig: "npm:^2.0.5" - yaml: "npm:^1.10.2" + lilconfig: "npm:^3.0.0" + yaml: "npm:^2.3.4" peerDependencies: postcss: ">=8.0.9" ts-node: ">=9.0.0" @@ -29310,7 +29878,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 75fa409d77b96e6f53e99f680c550f25ca8922c1150d3d368ded1f6bd8e0d4d67a615fe1f1c5d409aefb6e66fb4b5e48e86856d581329913de84578def078b19 + checksum: e2c2ed9b7998a5b123e1ce0c124daf6504b1454c67dcc1c8fdbcc5ffb2597b7de245e3ac34f63afc928d3fd3260b1e36492ebbdb01a9ff63f16b3c8b7b925d1b languageName: node linkType: hard @@ -29643,7 +30211,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.1.10, postcss@npm:^8.1.7, postcss@npm:^8.3.6, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.27": +"postcss@npm:^8.1.7, postcss@npm:^8.3.6, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.27, postcss@npm:^8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" dependencies: @@ -29684,9 +30252,9 @@ __metadata: linkType: hard "preact@npm:^10.6.3": - version: 10.18.1 - resolution: "preact@npm:10.18.1" - checksum: 587c4634b310efc306ef9315f849b8e4ff538435087a1dca626e1394b98570af1ecdc254b7f0bb3060fc7ab87456c5f891f9b8a167d5c34dbbcfcf60b6e993f4 + version: 10.19.2 + resolution: "preact@npm:10.19.2" + checksum: 1519050e79f0dec61aa85daa5dcba4a5294e89fb09ab53d5e1a215ef8526dd5ccdbe82a02842cc4875fa3ea076eee9697a7421c32ffcc6159007d27b13a60a8f languageName: node linkType: hard @@ -29751,12 +30319,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:*, prettier@npm:^3.0.3": - version: 3.0.3 - resolution: "prettier@npm:3.0.3" +"prettier@npm:*, prettier@npm:^3.0.3, prettier@npm:^3.1.0": + version: 3.1.0 + resolution: "prettier@npm:3.1.0" bin: prettier: bin/prettier.cjs - checksum: ccf1ead9794b017be6b42d0873f459070beef2069eb393c8b4c0d11aa3430acefc54f6d5f44a5b7ce9af05ad8daf694b912f0aa2808d1c22dfa86e61e9d563f8 + checksum: e95e8f93c6b9aea2ac1e86bebe329bee90c8c50d9a23d1f593eba8d7f39b33b3641eb28785001505b6723c47895a5322ad12a2fb855b289cb7bae450ffc34425 languageName: node linkType: hard @@ -29868,14 +30436,14 @@ __metadata: languageName: node linkType: hard -"prisma@npm:^5.4.2": - version: 5.4.2 - resolution: "prisma@npm:5.4.2" +"prisma@npm:^5.6.0": + version: 5.6.0 + resolution: "prisma@npm:5.6.0" dependencies: - "@prisma/engines": "npm:5.4.2" + "@prisma/engines": "npm:5.6.0" bin: prisma: build/index.js - checksum: 43733677419f264a9dba299b052649828949f97fcbde1a247772fdcf5daaf4da10d4fd7ba46d0c8f25c9712c48ff77b96e24f4c0cc48fd67b8f6515d6779616d + checksum: e6484ffd697f0591fe9e7fd0f55c366eeee5c909b8e061071308834e3f1145922f953277e03a43bec187bc7bcbeab61a722b8a9c5300e91380ca2ad3b0e6a842 languageName: node linkType: hard @@ -29916,13 +30484,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.10.0": - version: 0.10.1 - resolution: "process@npm:0.10.1" - checksum: bdaaa28a8edf96d5daa0f5c1faf4adfedce512ebca829a82e846d991492780c34eb934decf4fa5b311c698881d07a8d4592b4d7ea53ec03d51580a2f364d3e30 - languageName: node - linkType: hard - "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -29947,6 +30508,13 @@ __metadata: languageName: node linkType: hard +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 1560d413ea20c5a74f3631d39ba8cbd1972b9228072a755d01e1f5ca5110382d9af76a1582d889445adc6e75bb5ac4886b56dc4b6eae51b30145d7bb1ac7505b + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -29976,7 +30544,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -30093,9 +30661,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: d4e7fbb96f570c57d64b09a35a1182c879ac32833de7c6926a2c10619632c1377865af3dab5479f59d51da18bcd5035a20a5ef6ceb74020082a3e78025d9a9ca + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 languageName: node linkType: hard @@ -30117,7 +30685,14 @@ __metadata: languageName: node linkType: hard -"pvtsutils@npm:^1.3.2": +"pure-rand@npm:^6.0.0": + version: 6.0.4 + resolution: "pure-rand@npm:6.0.4" + checksum: 34fed0abe99d3db7ddc459c12e1eda6bff05db6a17f2017a1ae12202271ccf276fb223b442653518c719671c1b339bbf97f27ba9276dba0997c89e45c4e6a3bf + languageName: node + linkType: hard + +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": version: 1.3.5 resolution: "pvtsutils@npm:1.3.5" dependencies: @@ -30288,12 +30863,12 @@ __metadata: languageName: node linkType: hard -"rcedit@npm:^3.0.1": - version: 3.1.0 - resolution: "rcedit@npm:3.1.0" +"rcedit@npm:^4.0.0": + version: 4.0.1 + resolution: "rcedit@npm:4.0.1" dependencies: cross-spawn-windows-exe: "npm:^1.1.0" - checksum: 463b6650a9f6d6ea112a1ed8de898d7e62a78b2190feb35ee03a70320fda131ca523ab7f7efba4fc6f5bbecabe5414b4c745c13ad0f04e203b2c7abec3be1f1f + checksum: 103ba5f141fd07837dc6588c4adf70b8d8b725fba8e1bc6561996a5510a3283c13572aaa6638dd65f4540bbb1666d02b195521733326e1d9f14dc334c3e6d34a languageName: node linkType: hard @@ -30323,8 +30898,8 @@ __metadata: linkType: hard "react-datepicker@npm:^4.20.0": - version: 4.20.0 - resolution: "react-datepicker@npm:4.20.0" + version: 4.23.0 + resolution: "react-datepicker@npm:4.23.0" dependencies: "@popperjs/core": "npm:^2.11.8" classnames: "npm:^2.2.6" @@ -30335,7 +30910,7 @@ __metadata: peerDependencies: react: ^16.9.0 || ^17 || ^18 react-dom: ^16.9.0 || ^17 || ^18 - checksum: ea357305a70d4232f02a52fc04ffcc159af24116c795ff98050195ba139d2e23a9b08ef4a47416bf3ac657c8355158a46fb25150f4f8e0302bbe818cf43e8609 + checksum: 5334fcd024e9fb7bad740f3cb9ea7e1fcbde1145ef2ecdbe9abfe493d425d1063f3cab3bd3068443fdfa1823f24bab97133cd322c8a7727addbf0cadc9060b64 languageName: node linkType: hard @@ -30373,23 +30948,21 @@ __metadata: languageName: node linkType: hard -"react-docgen@npm:6.0.0-alpha.3": - version: 6.0.0-alpha.3 - resolution: "react-docgen@npm:6.0.0-alpha.3" +"react-docgen@npm:^6.0.2": + version: 6.0.4 + resolution: "react-docgen@npm:6.0.4" dependencies: - "@babel/core": "npm:^7.7.5" - "@babel/generator": "npm:^7.12.11" - ast-types: "npm:^0.14.2" - commander: "npm:^2.19.0" + "@babel/core": "npm:^7.18.9" + "@babel/traverse": "npm:^7.18.9" + "@babel/types": "npm:^7.18.9" + "@types/babel__core": "npm:^7.18.0" + "@types/babel__traverse": "npm:^7.18.0" + "@types/doctrine": "npm:^0.0.6" + "@types/resolve": "npm:^1.20.2" doctrine: "npm:^3.0.0" - estree-to-babel: "npm:^3.1.0" - neo-async: "npm:^2.6.1" - node-dir: "npm:^0.1.10" - resolve: "npm:^1.17.0" - strip-indent: "npm:^3.0.0" - bin: - react-docgen: bin/react-docgen.js - checksum: 8ada07260ba7ecdf3b2b45071c7b89454681acb9fce03a49dfbcb4527306eaa0036ecce4c7dbf4c08b873542ba53538a900593eb47a9c4e5edb5b8c42c914caf + resolve: "npm:^1.22.1" + strip-indent: "npm:^4.0.0" + checksum: 1709162ba3a84ef527dc8d852dbc50716364a29c7e6f9b083067c0b94305dfc62df35704625c701bae5c36146765109174f340362d554d397ea9bcb8ff0e50aa languageName: node linkType: hard @@ -30438,8 +31011,8 @@ __metadata: linkType: hard "react-i18next@npm:^13.3.0": - version: 13.3.0 - resolution: "react-i18next@npm:13.3.0" + version: 13.5.0 + resolution: "react-i18next@npm:13.5.0" dependencies: "@babel/runtime": "npm:^7.22.5" html-parse-stringify: "npm:^3.0.1" @@ -30451,7 +31024,7 @@ __metadata: optional: true react-native: optional: true - checksum: 2ef46245ba1ba9fca8c43dbe1bcab4ac63ca68e67de7159cb5f93cd7fd10407599bcdf1999f6567091987be7b9aaba77cdb515a70d5ee2b935b985f4c40d6d9d + checksum: 903b486d112cd0aa40bdc3afaefd0c32b91c0a1e3e3561367c8d91ddc0fbad9945f1d630c3ddcd4764795fc00e0887252e2d337256a825caf3a86de038f6b2db languageName: node linkType: hard @@ -30612,37 +31185,37 @@ __metadata: languageName: node linkType: hard -"react-resizable-panels@npm:^0.0.55": - version: 0.0.55 - resolution: "react-resizable-panels@npm:0.0.55" +"react-resizable-panels@npm:^0.0.61": + version: 0.0.61 + resolution: "react-resizable-panels@npm:0.0.61" peerDependencies: react: ^16.14.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 - checksum: 9b83287d2c962ff87cddae85b5233aaf61c0ff3ac30e29fcc51ac1a0ae5ea45fe78092ecf79b2e4a9dd898ca95c43dd698295b72e737d9275daac85c1ae59339 + checksum: 6a2eca04892f24f3b270c782a03e8302799391b1436f73ff7fb6ff5cb0eabd8695772b809f34a2ead34f3d1361fe6cfcdf5229856acc6a268448e15413c09a5d languageName: node linkType: hard -"react-router-dom@npm:^6.16.0": - version: 6.17.0 - resolution: "react-router-dom@npm:6.17.0" +"react-router-dom@npm:^6.16.0, react-router-dom@npm:^6.19.0": + version: 6.19.0 + resolution: "react-router-dom@npm:6.19.0" dependencies: - "@remix-run/router": "npm:1.10.0" - react-router: "npm:6.17.0" + "@remix-run/router": "npm:1.12.0" + react-router: "npm:6.19.0" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: fc881346af12cdfc4f709c6ca91090d5ed62362154a398a0e8c2b19daabee1fbc8a3ddd0ab727e743ea4268b87f3b2ebc3251c730e2c190ee3ab286059f523e5 + checksum: 38312efc11d3ef688062301479a8257a1495a81cd8dd7039c1f81aba6774963df7d21aaee2ba1a3c152857b70f4fb9966a3ccff47aca12212e854dcd6fc4deab languageName: node linkType: hard -"react-router@npm:6.17.0": - version: 6.17.0 - resolution: "react-router@npm:6.17.0" +"react-router@npm:6.19.0": + version: 6.19.0 + resolution: "react-router@npm:6.19.0" dependencies: - "@remix-run/router": "npm:1.10.0" + "@remix-run/router": "npm:1.12.0" peerDependencies: react: ">=16.8" - checksum: 5c589c67b53cc1a210bd08285392e951a2c3d51a2502806f68d9ce604307944239b0a3b766d8390b484d707ace3068af858e999a1c242662b917ddcd4ab3c453 + checksum: 5454f4a4d65401430ded8f1033cebe4ccca771c3c827e8329c77dcfd73618ca9a32488fb58722bf6a07afef7d8e7ef22a710aae0f3337e5c20962bf6473d81a3 languageName: node linkType: hard @@ -30691,21 +31264,6 @@ __metadata: languageName: node linkType: hard -"react-transition-group@npm:^4.4.5": - version: 4.4.5 - resolution: "react-transition-group@npm:4.4.5" - dependencies: - "@babel/runtime": "npm:^7.5.5" - dom-helpers: "npm:^5.0.1" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.6.2" - peerDependencies: - react: ">=16.6.0" - react-dom: ">=16.6.0" - checksum: ca32d3fd2168c976c5d90a317f25d5f5cd723608b415fb3b9006f9d793c8965c619562d0884503a3e44e4b06efbca4fdd1520f30e58ca3e00a0890e637d55419 - languageName: node - linkType: hard - "react-virtuoso@npm:^4.6.2": version: 4.6.2 resolution: "react-virtuoso@npm:4.6.2" @@ -31285,21 +31843,14 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^1.1.0": - version: 1.1.1 - resolution: "resolve.exports@npm:1.1.1" - checksum: de58c30aca30883f0e29910e4ad1b7b9986ec5f69434ef2e957ddbe52d3250e138ddd2688e8cd67909b4ee9bf3437424c718a5962d59edd610f035b861ef8441 - languageName: node - linkType: hard - -"resolve.exports@npm:^2.0.2": +"resolve.exports@npm:^2.0.0, resolve.exports@npm:^2.0.2": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" checksum: f1cc0b6680f9a7e0345d783e0547f2a5110d8336b3c2a4227231dd007271ffd331fd722df934f017af90bae0373920ca0d4005da6f76cb3176c8ae426370f893 languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.1, resolve@npm:^1.22.3, resolve@npm:^1.22.4, resolve@npm:~1.22.1": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.1, resolve@npm:^1.22.3, resolve@npm:^1.22.4, resolve@npm:~1.22.1": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -31335,7 +31886,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.21.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.21.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.3#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -31496,17 +32047,17 @@ __metadata: linkType: hard "rollup-plugin-swc3@npm:^0.10.2": - version: 0.10.2 - resolution: "rollup-plugin-swc3@npm:0.10.2" + version: 0.10.4 + resolution: "rollup-plugin-swc3@npm:0.10.4" dependencies: "@fastify/deepmerge": "npm:^1.3.0" - "@rollup/pluginutils": "npm:^4.2.1" + "@rollup/pluginutils": "npm:^5.0.5" get-tsconfig: "npm:^4.7.2" - rollup-swc-preserve-directives: "npm:^0.3.2" + rollup-swc-preserve-directives: "npm:^0.6.0" peerDependencies: "@swc/core": ">=1.2.165" rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: cd310f54bece7619b827679428e96aee0200e63bbcf3b10aa7b7be1cf757cfeb549df88128e303cbef3cb1d9a0d6cef1632c1feb8928c1fe487220d79e3587e3 + checksum: 9add7f3869a7f16458df7b6ac362afd14f1e9258f681a3e2b94eb59c559152b035e4bf5ec0abb82f4d738e9270e1f10a708c9a7dce3010bac0afb58ef30cbd7a languageName: node linkType: hard @@ -31519,15 +32070,15 @@ __metadata: languageName: node linkType: hard -"rollup-swc-preserve-directives@npm:^0.3.2": - version: 0.3.2 - resolution: "rollup-swc-preserve-directives@npm:0.3.2" +"rollup-swc-preserve-directives@npm:^0.6.0": + version: 0.6.0 + resolution: "rollup-swc-preserve-directives@npm:0.6.0" dependencies: "@napi-rs/magic-string": "npm:^0.3.4" peerDependencies: - "@swc/core": ">=1.2.165" - rollup: ^2.0.0 || ^3.0.0 - checksum: 8a26658847cc7d3a928822040ea07030dd66bb38763781c0a8f96c23844738f91d3e08995db85ca6dc6b62035552fa5ddddb3da9d015221dde970f64f67a4ffa + "@swc/core": ">=1.3.79" + rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 + checksum: 72d514d9307f4640b50b95b466252c920fca1ed52b123a98cdf28a8576a2b6a8098dccb0d03ced9670d1a407438350beea7071acd10341ac24d2dfe69e3549aa languageName: node linkType: hard @@ -31674,11 +32225,12 @@ __metadata: linkType: hard "selfsigned@npm:^2.0.1, selfsigned@npm:^2.1.1": - version: 2.1.1 - resolution: "selfsigned@npm:2.1.1" + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" dependencies: + "@types/node-forge": "npm:^1.3.0" node-forge: "npm:^1" - checksum: 6005206e0d005448274aceceaded5195b944f67a42b72d212a6169d2e5f4bdc87c15a3fe45732c544db8c7175702091aaf95403ad6632585294a6ec8cca63638 + checksum: 52536623f1cfdeb2f8b9198377f2ce7931c677ea69421238d1dc1ea2983bbe258e56c19e7d1af87035cad7270f19b7e996eaab1212e724d887722502f68e17f2 languageName: node linkType: hard @@ -31866,10 +32418,15 @@ __metadata: languageName: node linkType: hard -"set-cookie-parser@npm:^2.4.6": - version: 2.6.0 - resolution: "set-cookie-parser@npm:2.6.0" - checksum: 8d451ebadb760989f93b634942c79de3c925ca7a986d133d08a80c40b5ae713ce12e354f0d5245c49f288c52daa7bd6554d5dc52f8a4eecaaf5e192881cf2b1f +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: "npm:^1.1.1" + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 745ed1d7dc69a6185e0820082fe73838ab3dfd01e75cce83a41e4c1d68bbf34bc5fb38f32ded542ae0b557536b5d2781594499b5dcd19e7db138e06292a76c7b languageName: node linkType: hard @@ -31974,9 +32531,9 @@ __metadata: linkType: hard "side-channel@npm:@nolyfill/side-channel@latest": - version: 1.0.21 - resolution: "@nolyfill/side-channel@npm:1.0.21" - checksum: 9b801519f2b3abde17ec1cef507e19dd4da371c79fc9d1bc0c070ed87379c5df0a85dd808d4b1a5e301531f6ff5fc229542f4643961cd7964cda62977ec88ccc + version: 1.0.24 + resolution: "@nolyfill/side-channel@npm:1.0.24" + checksum: 6f45be3df4101cc4cebb60a2ee36cd7554d447d6aa0a4996296451a47387b31de4cb1ac9ea377706997be09a2cfbb3647c8588216ed232e6bbd30b20da3c0bb7 languageName: node linkType: hard @@ -32009,13 +32566,13 @@ __metadata: linkType: hard "simple-git@npm:^3.15.0": - version: 3.20.0 - resolution: "simple-git@npm:3.20.0" + version: 3.21.0 + resolution: "simple-git@npm:3.21.0" dependencies: "@kwsites/file-exists": "npm:^1.1.1" "@kwsites/promise-deferred": "npm:^1.1.1" debug: "npm:^4.3.4" - checksum: fabfdbabfec8c7a7484d22d0218fb4ff9c8acdecaadc34c4655cd10f2aacd40bd656284abdf1613831b692d7fe1be58314b23e9f1adfe380f2b910622cc2468e + checksum: 6b644151a41facdafdb6ef97f52125cfcfa61e1aa4bed1f25249d4ae71f9ddaffd371919f9dd0cc3fdb16db248d98b389f80ae4f2a416d924f23e6cee3b2f813 languageName: node linkType: hard @@ -32037,17 +32594,17 @@ __metadata: languageName: node linkType: hard -"sinon@npm:^16.1.0": - version: 16.1.0 - resolution: "sinon@npm:16.1.0" +"sinon@npm:^17.0.1": + version: 17.0.1 + resolution: "sinon@npm:17.0.1" dependencies: "@sinonjs/commons": "npm:^3.0.0" - "@sinonjs/fake-timers": "npm:^10.3.0" + "@sinonjs/fake-timers": "npm:^11.2.2" "@sinonjs/samsam": "npm:^8.0.0" diff: "npm:^5.1.0" - nise: "npm:^5.1.4" + nise: "npm:^5.1.5" supports-color: "npm:^7.2.0" - checksum: 1dc7dbfd4adbcdc82108447b671430396361e0853b2ad48e343b6e64a7d6fe3433e7e79b35577fb920dccea335e97cb82b61db0151821dbaf7bb4b8be470bb10 + checksum: b34f1a97da0be3556ac686c6b649a566c2666eb7f50e75e754928c1c72c96d78f56e56a999227be794c3d9cdaed0bc78d11f38ab303d3079c5bcbcffc0f9c6d5 languageName: node linkType: hard @@ -32207,7 +32764,18 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: ea727734bd5b2567597aa0eda14149b3b9674bb44df5937bbb9815280c1586994de734d965e61f1dd45661183d7b41f115fb9e432d631287c9063864cfcc2ecc + languageName: node + linkType: hard + +"socks@npm:^2.6.2, socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: @@ -32410,7 +32978,7 @@ __metadata: languageName: node linkType: hard -"split2@npm:^3.0.0, split2@npm:^3.2.2": +"split2@npm:^3.0.0": version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: @@ -32419,6 +32987,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 09bbefc11bcf03f044584c9764cd31a252d8e52cea29130950b26161287c11f519807c5e54bd9e5804c713b79c02cefe6a98f4688630993386be353e03f534ab + languageName: node + linkType: hard + "sponge-case@npm:^1.0.1": version: 1.0.1 resolution: "sponge-case@npm:1.0.1" @@ -32451,6 +33026,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: 7638a61e91432510718e9265d48d0438a17d53065e5184f1336f234ef6aa3479663942e41e97df56cda06bb24d9d0b5ef342c10685add3cac7267a82d7fa6718 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -32491,7 +33075,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": +"statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb @@ -32506,9 +33090,9 @@ __metadata: linkType: hard "std-env@npm:^3.3.3": - version: 3.4.3 - resolution: "std-env@npm:3.4.3" - checksum: 3087e9b2f6f9f40f1562b765c2d0768ad12f04a4d039fa5848e9e951263266b533590464e5d90e412680ec37e4febabf0c8fb3d15c4c7b8c5eb21ebcb09bf393 + version: 3.5.0 + resolution: "std-env@npm:3.5.0" + checksum: 6071a727e1f1e67d6598648a085473671672ad6b2e0fc7220bb731c4c7584979047565c81b4c482a59cc25b7f14d5e6d06d5682250d06a9fefd1a571daaa711c languageName: node linkType: hard @@ -32526,9 +33110,9 @@ __metadata: languageName: node linkType: hard -"storybook-addon-react-router-v6@npm:^2.0.7": - version: 2.0.7 - resolution: "storybook-addon-react-router-v6@npm:2.0.7" +"storybook-addon-react-router-v6@npm:^2.0.10": + version: 2.0.10 + resolution: "storybook-addon-react-router-v6@npm:2.0.10" dependencies: compare-versions: "npm:^6.0.0" react-inspector: "npm:6.0.2" @@ -32548,7 +33132,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 597ed0534589d599a7e50bbab95dcf342e620bc57c4cdf95f31daf1f18b2b681012faff69bc502f60672bbf2406bc4e77270c2fcee3222e7de86ec925c743846 + checksum: a45cfb25ccf9119281bbc74ceb02d5a04927dad61dd18311376b4ff0152fdcf500d537a9ad5013e066b7fa85d1a007e70f2a834c1180486fe80dceb33290334b languageName: node linkType: hard @@ -32576,15 +33160,15 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^7.4.6": - version: 7.4.6 - resolution: "storybook@npm:7.4.6" +"storybook@npm:^7.5.3": + version: 7.5.3 + resolution: "storybook@npm:7.5.3" dependencies: - "@storybook/cli": "npm:7.4.6" + "@storybook/cli": "npm:7.5.3" bin: sb: ./index.js storybook: ./index.js - checksum: 248e5fa2e094e7a0d365f940cc75c036215ad710abb2e4ea33321ac5a2820e1ae991bed5f6c210ba885818e2d1b8f98cace61232e259ee56d969df1e9e8a266b + checksum: d5263aa78fd8f295d2770911b78cc13c00bf5ac3b67c017b9c7d388de915efd41c2091dc808122649c22c0904afb8e593ed5521d7086aea8cd12596d6df95a4b languageName: node linkType: hard @@ -32618,19 +33202,10 @@ __metadata: languageName: node linkType: hard -"strict-event-emitter@npm:^0.2.4": - version: 0.2.8 - resolution: "strict-event-emitter@npm:0.2.8" - dependencies: - events: "npm:^3.3.0" - checksum: 6ac06fe72a6ee6ae64d20f1dd42838ea67342f1b5f32b03b3050d73ee6ecee44b4d5c4ed2965a7154b47991e215f373d4e789e2b2be2769cd80e356126c2ca53 - languageName: node - linkType: hard - -"strict-event-emitter@npm:^0.4.3": - version: 0.4.6 - resolution: "strict-event-emitter@npm:0.4.6" - checksum: abdbf59b6c45b599cc2f227fa473765d1510d155ebd22533e8ecb06110dfacb2ff07aece7fd528dde2b4f9e379d60f2687eee8af3fa2877c3ed88ee5b7ed2707 +"strict-event-emitter@npm:^0.5.0, strict-event-emitter@npm:^0.5.1": + version: 0.5.1 + resolution: "strict-event-emitter@npm:0.5.1" + checksum: 25c84d88be85940d3547db665b871bfecea4ea0bedfeb22aae8db48126820cfb2b0bc2fba695392592a09b1aa36b686d6eede499e1ecd151593c03fe5a50d512 languageName: node linkType: hard @@ -32675,13 +33250,6 @@ __metadata: languageName: node linkType: hard -"string-template@npm:~0.2.1": - version: 0.2.1 - resolution: "string-template@npm:0.2.1" - checksum: 042cdcf4d4832378f12fbf45b42f479990f330cc409e6dc184838801efbc8352ccf9428fe169f8f8cfff2b864879d4ba1ef8b5f41d63d1d71844c48005a1683f - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -32704,23 +33272,23 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^6.1.0": - version: 6.1.0 - resolution: "string-width@npm:6.1.0" +"string-width@npm:^7.0.0": + version: 7.0.0 + resolution: "string-width@npm:7.0.0" dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^10.2.1" - strip-ansi: "npm:^7.0.1" - checksum: 8aefb456a230c8d7fe254049b1b2d62603da1a3b6c7fc9f3332f6779583cc1c72653f9b6e4cd0c1c92befee1565d4a0a7542d09ba4ceb6d96af02fbd8425bb03 + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: bc0de5700a2690895169fce447ec4ed44bc62de80312c2093d5606bfd48319bb88e48a99e97f269dff2bc9577448b91c26b3804c16e7d9b389699795e4655c3b languageName: node linkType: hard "string.prototype.matchall@npm:@nolyfill/string.prototype.matchall@latest": - version: 1.0.21 - resolution: "@nolyfill/string.prototype.matchall@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/string.prototype.matchall@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 2b71257a84dbf6198c6650d442b4e74aaf933521f6447efee973a504e5975a42fac98576c74c43ad140ebd12fb9d03be3d0ceb630ba2aa7775415a2f3224f122 + "@nolyfill/shared": "npm:1.0.24" + checksum: f9afcfd62ade653f0350b9d0a18c895534115c1163b5527e650d68402d49ac2fb24d24a49be371901bb77640942c46e123780c5da73c04c5bfcb9d2292ddc986 languageName: node linkType: hard @@ -32769,7 +33337,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" dependencies: @@ -32822,6 +33390,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-indent@npm:4.0.0" + dependencies: + min-indent: "npm:^1.0.1" + checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.0.1, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -32854,13 +33431,13 @@ __metadata: languageName: node linkType: hard -"stripe@npm:^14.1.0": - version: 14.1.0 - resolution: "stripe@npm:14.1.0" +"stripe@npm:^14.5.0": + version: 14.5.0 + resolution: "stripe@npm:14.5.0" dependencies: "@types/node": "npm:>=8.1.0" qs: "npm:^6.11.0" - checksum: 1363bc6fed873a9d96312a7d33fb422b9e0ca32064cf027eee12cf5cd132a936d3e248013b59d7011ca5a40acaae9adfcbae175345f7c76ee778800ca1077756 + checksum: a2b9615ef7b1f53a2214ce21d533fe66df3575e89f22b74fba885111c66ac17064951f68065b336fb16ce1d93f7bf2c334604c1c6419917073cf6778a251f516 languageName: node linkType: hard @@ -33024,7 +33601,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": +"supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: @@ -33042,16 +33619,6 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^2.0.0": - version: 2.3.0 - resolution: "supports-hyperlinks@npm:2.3.0" - dependencies: - has-flag: "npm:^4.0.0" - supports-color: "npm:^7.0.0" - checksum: 3e7df6e9eaa177d7bfbbe065c91325e9b482f48de0f7c9133603e3ffa8af31cbceac104a0941cd0266a57f8e691de6eb58b79fec237852dc84ed7ad152b116b0 - languageName: node - linkType: hard - "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -33067,18 +33634,19 @@ __metadata: linkType: hard "svgo@npm:^3.0.2": - version: 3.0.2 - resolution: "svgo@npm:3.0.2" + version: 3.0.4 + resolution: "svgo@npm:3.0.4" dependencies: "@trysound/sax": "npm:0.2.0" commander: "npm:^7.2.0" css-select: "npm:^5.1.0" css-tree: "npm:^2.2.1" - csso: "npm:^5.0.5" + css-what: "npm:^6.1.0" + csso: "npm:5.0.5" picocolors: "npm:^1.0.0" bin: - svgo: bin/svgo - checksum: e2c72b166881ef697c1de85628d87e8d41d5e175b3063eab0025760aafe79356507b409fcfa74afffec44a334e59ebe71154909851a72ccb4eb3a5e5217f2e84 + svgo: ./bin/svgo + checksum: 077858c571b3ad988b0cf72c132fb766b293a6edeab62c5da648050473622c9ffdcf7870d3dd87cd7a74e2a71a43d382221dff79f6094f0bd63c382361dcab8f languageName: node linkType: hard @@ -33288,16 +33856,6 @@ __metadata: languageName: node linkType: hard -"terminal-link@npm:^2.0.0": - version: 2.1.1 - resolution: "terminal-link@npm:2.1.1" - dependencies: - ansi-escapes: "npm:^4.2.1" - supports-hyperlinks: "npm:^2.0.0" - checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f - languageName: node - linkType: hard - "terser-webpack-plugin@npm:^5.3.7": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" @@ -33321,8 +33879,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.16.8": - version: 5.22.0 - resolution: "terser@npm:5.22.0" + version: 5.24.0 + resolution: "terser@npm:5.24.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -33330,7 +33888,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: e5407f9a143e7f9306f1b585b16dbb03df19b93318b55a26b542e12b74cc792dcf6961d9a2cab6778b20d7b591f498c200376d282a300cf9999ca40bccbc047c + checksum: bd7ba6bfef58f8c179592894923c8c933d980e17287d3f2a9927550be853d1601beebb724cf015929599b32945641c44f9c3db8dd242c7933af3830bcb853510 languageName: node linkType: hard @@ -33345,10 +33903,10 @@ __metadata: languageName: node linkType: hard -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 +"text-extensions@npm:^2.0.0": + version: 2.4.0 + resolution: "text-extensions@npm:2.4.0" + checksum: 9bdbc9959e004ccc86a6ec076d6c5bb6765978263e9d0d5febb640d7675c09919ea912f3fe9d50b68c3c7c43cc865610a7cb24954343abb31f74c205fbae4e45 languageName: node linkType: hard @@ -33382,19 +33940,6 @@ __metadata: languageName: node linkType: hard -"thriftrw@npm:^3.5.0": - version: 3.12.0 - resolution: "thriftrw@npm:3.12.0" - dependencies: - bufrw: "npm:^1.3.0" - error: "npm:7.0.2" - long: "npm:^2.4.0" - bin: - thrift2json: ./thrift2json.js - checksum: f22f865f1d580a20f27452628482d3da82eb10cd37d5bbb40fe8f5e111114a4620058ca6589d90363bbcf225b5f4018718e4b59d53209e9fe20b3924228359ae - languageName: node - linkType: hard - "through2@npm:^2.0.3": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -33577,9 +34122,9 @@ __metadata: linkType: hard "tocbot@npm:^4.20.1": - version: 4.21.2 - resolution: "tocbot@npm:4.21.2" - checksum: eec4703be87d010c47bc9d596c9cc111e74e33856d40a5a9847e696dfadf8d0bfea7ce63fac514f2bb2f208662d3f0a28d9dd02ec2e459d7ee1d6e175bc06c51 + version: 4.22.0 + resolution: "tocbot@npm:4.22.0" + checksum: 41ff72948464c3d1ce6f63845c9ba1ddad11f94f25f3c22cfbbac6339ab912efc874144046fd85501c1f2e7194da3750151d7846e07b68e7663fbaed703a2163 languageName: node linkType: hard @@ -33709,7 +34254,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:10.9.1, ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": +"ts-node@npm:10.9.1, ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -33784,7 +34329,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.6.2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1 || ^1.9.3, tslib@npm:^2.5.0, tslib@npm:^2.6.0, tslib@npm:^2.6.1": +"tslib@npm:2.6.2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -33955,13 +34500,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.6.4 || ^5.0.0, typescript@npm:^5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" +"typescript@npm:^5.2.2, typescript@npm:^5.3.2": + version: 5.3.2 + resolution: "typescript@npm:5.3.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d65e50eb849bd21ff8677e5b9447f9c6e74777e346afd67754934264dcbf4bd59e7d2473f6062d9a015d66bd573311166357e3eb07fea0b52859cf9bb2b58555 + checksum: 415e5fb6611f5713e460bad48039f00bcfdbde53a2f911727862d5aa9c5d5edd250059a419df382d8f031709e15a169c41eb62b6a401da5eec7ac0f4e359d6ac languageName: node linkType: hard @@ -33995,13 +34540,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.6.4 || ^5.0.0#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" +"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin": + version: 5.3.2 + resolution: "typescript@patch:typescript@npm%3A5.3.2#optional!builtin::version=5.3.2&hash=29ae49" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: f79cc2ba802c94c2b78dbb00d767a10adb67368ae764709737dc277273ec148aa4558033a03ce901406b35fddf4eac46dabc94a1e1d12d2587e2b9cfe5707b4a + checksum: 43c3346528a1b410b9ee7f218d709ce8d1336eb8e47b0f8bb43954f98ed43fd11e35de398c9a5f4a085b6889c89782362789b00db7aac862bd09d083058a01a2 languageName: node linkType: hard @@ -34016,16 +34561,16 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.36 - resolution: "ua-parser-js@npm:1.0.36" - checksum: 04d7909ceb6a75a0e148ab888e6aa57635909c1c76dd94fb94492d82e31b4964b441d4b4da8f0d18947505e0d652c26779290dc774149d1b4b487577ae50b258 + version: 1.0.37 + resolution: "ua-parser-js@npm:1.0.37" + checksum: 56508f2428ebac64382c4d41da14189e5013e3e2a5f5918aff4bee3ba77df1f4eaad6f81f90c24999f1cf12cc1596764684497fec07e0ff5182ce9a323a8c05b languageName: node linkType: hard "ufo@npm:^1.3.0": - version: 1.3.1 - resolution: "ufo@npm:1.3.1" - checksum: cc10314a5065c50995167a2c4bbe04c3929f6a750f09e5a805cc647e2a16ea5556360b3c22a4cb03fe32cb18877d37c5f833a44930633916a916fac41be25d14 + version: 1.3.2 + resolution: "ufo@npm:1.3.2" + checksum: 7133290d495e2b3f9416de69982019e81cff40d28cfd3a07accff1122ee52f23d9165e495a140a1b34b183244e88fc4001cb649591385ecbad1d3d0d2264fa6e languageName: node linkType: hard @@ -34068,19 +34613,19 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.25.1": - version: 5.25.3 - resolution: "undici-types@npm:5.25.3" - checksum: 9a57f2dd6fecb2d0f7d9b86aa6f417609a0ffc73247a95aa25c078cf36cbbfe6c164b63b8dace7ad01126e6510f284c185b69c78356bb1d6b279f195acffcaf4 +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd languageName: node linkType: hard -"undici@npm:^5.22.1, undici@npm:^5.26.3": - version: 5.26.3 - resolution: "undici@npm:5.26.3" +"undici@npm:^5.22.1, undici@npm:^5.27.2": + version: 5.27.2 + resolution: "undici@npm:5.27.2" dependencies: "@fastify/busboy": "npm:^2.0.0" - checksum: 7280135e89c6f96f17f02fa99b8dcf5c64511d36de31b5cea0e1a858c8a16f07ea22aba524d5b8f574e9341a543d295aebb20cb715545829f2e959329149a638 + checksum: 2bf96b102fb84568fb235bdf6e1e352e5d2bf99566b243cd1b13b41578bf9dd5c7c3d3d82192b20a3fec61fe7a528f9d80cd5b4555ce65405c06c69b023013de languageName: node linkType: hard @@ -34137,6 +34682,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: "npm:^3.0.0" + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -34146,6 +34700,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 26fc5bc209a875956dd5e84ca39b89bc3be777b112504667c35c861f9547df95afc80439358d836b878b6d91f6ee21fe5ba1a966e9ec2e9f071ddf3fd67d45ee + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -34239,9 +34802,9 @@ __metadata: linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 languageName: node linkType: hard @@ -34281,14 +34844,14 @@ __metadata: linkType: hard "unplugin@npm:^1.3.1": - version: 1.5.0 - resolution: "unplugin@npm:1.5.0" + version: 1.5.1 + resolution: "unplugin@npm:1.5.1" dependencies: - acorn: "npm:^8.10.0" + acorn: "npm:^8.11.2" chokidar: "npm:^3.5.3" webpack-sources: "npm:^3.2.3" - webpack-virtual-modules: "npm:^0.5.0" - checksum: 4a867f2630b932c34983a4b7c741624789752677ea1a6e3e73ca68a716e7214d50d7855fb4d0e02b4a58f81aaee2def021d54365929be03a57c4b25911ae89c1 + webpack-virtual-modules: "npm:^0.6.0" + checksum: 470575a98514a394b667305878390ed244cf0bea80cc65c4700806dc12e48d3ae03e38c72ce1a4db23540307e98b68a8213c5fda319cecc5e844ad1975d2d9b0 languageName: node linkType: hard @@ -34485,7 +35048,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.3, util@npm:^0.12.4, util@npm:^0.12.5": +"util@npm:^0.12.4, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -34521,12 +35084,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" +"uuid@npm:9.0.1, uuid@npm:^9.0.0, uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 23857699a616d1b48224bc2b8440eae6e57d25463c3a0200e514ba8279dfa3bde7e92ea056122237839cfa32045e57d8f8f4a30e581d720fd72935572853ae2e + checksum: 9d0b6adb72b736e36f2b1b53da0d559125ba3e39d913b6072f6f033e0c87835b414f0836b45bcfaf2bdf698f92297fea1c3cc19b0b258bc182c9c43cc0fab9f2 languageName: node linkType: hard @@ -34539,15 +35102,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0, uuid@npm:^9.0.1": - version: 9.0.1 - resolution: "uuid@npm:9.0.1" - bin: - uuid: dist/bin/uuid - checksum: 9d0b6adb72b736e36f2b1b53da0d559125ba3e39d913b6072f6f033e0c87835b414f0836b45bcfaf2bdf698f92297fea1c3cc19b0b258bc182c9c43cc0fab9f2 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -34563,13 +35117,13 @@ __metadata: linkType: hard "v8-to-istanbul@npm:^9.0.0, v8-to-istanbul@npm:^9.0.1": - version: 9.1.3 - resolution: "v8-to-istanbul@npm:9.1.3" + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.12" "@types/istanbul-lib-coverage": "npm:^2.0.1" convert-source-map: "npm:^2.0.0" - checksum: d6ce9f6d97c53a401098fe42018f32be81c99830bcf44ee2717332e20a7df3e364a3f322c10dab4ea94488e81dde462295149cdfb44f48e8ef2829e3afd09752 + checksum: 18dd8cebfb6790f27f4e41e7cff77c7ab1c8904085f354dd7875e2eb65f4261c4cf40939132502875779d92304bfea46b8336346ecb40b6f33c3a3979e6f5729 languageName: node linkType: hard @@ -34600,9 +35154,10 @@ __metadata: linkType: hard "valtio@npm:^1.11.2": - version: 1.11.2 - resolution: "valtio@npm:1.11.2" + version: 1.12.0 + resolution: "valtio@npm:1.12.0" dependencies: + derive-valtio: "npm:0.1.0" proxy-compare: "npm:2.5.1" use-sync-external-store: "npm:1.2.0" peerDependencies: @@ -34613,7 +35168,7 @@ __metadata: optional: true react: optional: true - checksum: a259f5af204b801668e019855813a8f702c9558961395bb5847f583119428b997efb9b0e6feb5d6e48a76a9b541173a10fdfdb1527a7bd14477a0e0c5beba914 + checksum: ffe4e1f6dc30c2cc18e8fe136bcce13abae68f50f10461f3f49d139afff4606e22f5c975fe6a10d51bf2065096936be7f7711c14700ca0c3a38aad56b7a18055 languageName: node linkType: hard @@ -34721,17 +35276,17 @@ __metadata: languageName: node linkType: hard -"vite-plugin-static-copy@npm:^0.17.0": - version: 0.17.0 - resolution: "vite-plugin-static-copy@npm:0.17.0" +"vite-plugin-static-copy@npm:^0.17.1": + version: 0.17.1 + resolution: "vite-plugin-static-copy@npm:0.17.1" dependencies: chokidar: "npm:^3.5.3" fast-glob: "npm:^3.2.11" fs-extra: "npm:^11.1.0" picocolors: "npm:^1.0.0" peerDependencies: - vite: ^3.0.0 || ^4.0.0 - checksum: 96a1ada9c82fc2c65a30ab8e23b61336d72dcbd3dc1426b6d5d5ac7245e23cb3bfacfd3e641c174fd28c38381d7f3eeb854294fd04648bb0b3c293127a37eea2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: 53762f6504ea65148d92603b0e01ea7c67008d6c1adab2cc5575c0d76d8f456e5b4a88c9379376ed6415bea1348042b2648a1a91f6a3a92ab87f49ec80471855 languageName: node linkType: hard @@ -34752,8 +35307,8 @@ __metadata: linkType: hard "vite@npm:^4.4.11": - version: 4.4.11 - resolution: "vite@npm:4.4.11" + version: 4.5.0 + resolution: "vite@npm:4.5.0" dependencies: esbuild: "npm:^0.18.10" fsevents: "npm:~2.3.2" @@ -34787,7 +35342,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 325e2955fe939bc5706aab2aa46498d98adace1df4d11f42cf4539754b886798b6bf7c247c94d23fb6cf3a569e56bad4a11561bf25e8e6dcc8c0e2f73ecc5e5b + checksum: b262ea4880ba7de8a77b0a665c771561ae3cb7f0d6c5b90e65298039755192550bf90cb96a2910d564506e2d499aa20e9becd330b835c34d414249083ac6e40c languageName: node linkType: hard @@ -34936,40 +35491,45 @@ __metadata: linkType: hard "vue-template-compiler@npm:^2.7.14": - version: 2.7.14 - resolution: "vue-template-compiler@npm:2.7.14" + version: 2.7.15 + resolution: "vue-template-compiler@npm:2.7.15" dependencies: de-indent: "npm:^1.0.2" he: "npm:^1.2.0" - checksum: b55cbc2d5dd07d6cbf2ac87cce93fb76f3db4dcea6f7910dab98fd5e2068d97f4bcb3ee7ceedbabd9fd96ce3547116fa3ca6ff1cc6e3df17d18e6b356009067e + checksum: 450634ed5baf652b1d25f74d13b4ee061d4da83292731406bfbd8a212e286f59def3c762eac05b9fa8769df9ee42a1960ec7c2431ea30999cfc75eb314cc16b9 languageName: node linkType: hard "vue-tsc@npm:^1.8.8": - version: 1.8.19 - resolution: "vue-tsc@npm:1.8.19" + version: 1.8.22 + resolution: "vue-tsc@npm:1.8.22" dependencies: - "@vue/language-core": "npm:1.8.19" - "@vue/typescript": "npm:1.8.19" + "@volar/typescript": "npm:~1.10.5" + "@vue/language-core": "npm:1.8.22" semver: "npm:^7.5.4" peerDependencies: typescript: "*" bin: vue-tsc: bin/vue-tsc.js - checksum: 04d948667c4a850ee33c3b4bcd471d387433b9fff9befdb579286b159e4afe04f5b9db17cf27291d59dbb61ed4c4dccc7921dcc729f192b49f6108658a3ae3b9 + checksum: 8e3ca396b9d8bce82c868569ff60433d6c02dedf7d694d37a67a35b54835aa02850d7e79fe876d37925de9adadd0bc6ae6ba4bc39ebcf9add705338615504e70 languageName: node linkType: hard "vue@npm:^3.3.4": - version: 3.3.4 - resolution: "vue@npm:3.3.4" + version: 3.3.8 + resolution: "vue@npm:3.3.8" dependencies: - "@vue/compiler-dom": "npm:3.3.4" - "@vue/compiler-sfc": "npm:3.3.4" - "@vue/runtime-dom": "npm:3.3.4" - "@vue/server-renderer": "npm:3.3.4" - "@vue/shared": "npm:3.3.4" - checksum: ff95b3a4f9cb996ae217158e08d310ca847408634bf9b051a770d4d484a1ebca83885b4367949cb508774b952125a2812f5adec20eb2492f23e6f1edd50b7943 + "@vue/compiler-dom": "npm:3.3.8" + "@vue/compiler-sfc": "npm:3.3.8" + "@vue/runtime-dom": "npm:3.3.8" + "@vue/server-renderer": "npm:3.3.8" + "@vue/shared": "npm:3.3.8" + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 6d06edc99b35a6dee678086fc52abd76896feee62924806433ac1b3e3c4cbdaf42c4a6b314a992ecb2e87980c178d7790453ebe2420570536e52ad574e605b0b languageName: node linkType: hard @@ -34995,18 +35555,18 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:^7.0.1": - version: 7.0.1 - resolution: "wait-on@npm:7.0.1" +"wait-on@npm:^7.2.0": + version: 7.2.0 + resolution: "wait-on@npm:7.2.0" dependencies: - axios: "npm:^0.27.2" - joi: "npm:^17.7.0" + axios: "npm:^1.6.1" + joi: "npm:^17.11.0" lodash: "npm:^4.17.21" - minimist: "npm:^1.2.7" - rxjs: "npm:^7.8.0" + minimist: "npm:^1.2.8" + rxjs: "npm:^7.8.1" bin: wait-on: bin/wait-on - checksum: 9f76c0eb89785745fd0c20332d447e5f3505a84997aca4ab19e1a961c2ccd39cf60cb805ff4223184593a133cd84d6170f9eb1cdc105d0d31eb55a0703d6d432 + checksum: 00299e3b651c70d7082d02b93d9d4784cbe851914f1674d795d578d4826876193fdc7bee7e9491264b7c2d242ac9fe6e1fd09e1143409f730f13a7ee2da67fff languageName: node linkType: hard @@ -35076,19 +35636,6 @@ __metadata: languageName: node linkType: hard -"web-encoding@npm:^1.1.5": - version: 1.1.5 - resolution: "web-encoding@npm:1.1.5" - dependencies: - "@zxing/text-encoding": "npm:0.9.0" - util: "npm:^0.12.3" - dependenciesMeta: - "@zxing/text-encoding": - optional: true - checksum: 243518cfa8388ac05eeb4041bd330d38c599476ff9a93239b386d1ba2af130089a2fcefb0cf65b385f989105ff460ae69dca7e42236f4d98dc776b04e558cdb5 - languageName: node - linkType: hard - "web-streams-polyfill@npm:4.0.0-beta.3": version: 4.0.0-beta.3 resolution: "web-streams-polyfill@npm:4.0.0-beta.3" @@ -35256,6 +35803,13 @@ __metadata: languageName: node linkType: hard +"webpack-virtual-modules@npm:^0.6.0": + version: 0.6.1 + resolution: "webpack-virtual-modules@npm:0.6.1" + checksum: 12a43ecdb910185c9d7e4ec19cc3b13bff228dae362e8a487c0bd292b393555e017ad16f771d5ce5b692d91d65b71a7bcd64763958d39066a5351ea325395539 + languageName: node + linkType: hard + "webpack@npm:^5.89.0": version: 5.89.0 resolution: "webpack@npm:5.89.0" @@ -35359,11 +35913,11 @@ __metadata: linkType: hard "which-typed-array@npm:@nolyfill/which-typed-array@latest": - version: 1.0.21 - resolution: "@nolyfill/which-typed-array@npm:1.0.21" + version: 1.0.24 + resolution: "@nolyfill/which-typed-array@npm:1.0.24" dependencies: - "@nolyfill/shared": "npm:1.0.21" - checksum: 2bcbf7fc0789457a9b718feb5391ced6103528414e4dfe7cceaa06d0deb0ffe7a9f0fabdcd96b2cd1b75d12a7663b48dc478bb6055f3ce1e0c65235d5eb36999 + "@nolyfill/shared": "npm:1.0.24" + checksum: 135ba38d092385859213a1a38c90a019d6b9f8e274da0fe0d30f0a2a873f868cd6e95523238fb95e4007af12edd33a64e15d6dd1ffa42a2a3addce36f97f3f91 languageName: node linkType: hard @@ -35451,15 +36005,15 @@ __metadata: languageName: node linkType: hard -"workerd@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "workerd@npm:1.20231025.0" +"workerd@npm:1.20231030.0": + version: 1.20231030.0 + resolution: "workerd@npm:1.20231030.0" dependencies: - "@cloudflare/workerd-darwin-64": "npm:1.20231025.0" - "@cloudflare/workerd-darwin-arm64": "npm:1.20231025.0" - "@cloudflare/workerd-linux-64": "npm:1.20231025.0" - "@cloudflare/workerd-linux-arm64": "npm:1.20231025.0" - "@cloudflare/workerd-windows-64": "npm:1.20231025.0" + "@cloudflare/workerd-darwin-64": "npm:1.20231030.0" + "@cloudflare/workerd-darwin-arm64": "npm:1.20231030.0" + "@cloudflare/workerd-linux-64": "npm:1.20231030.0" + "@cloudflare/workerd-linux-arm64": "npm:1.20231030.0" + "@cloudflare/workerd-windows-64": "npm:1.20231030.0" dependenciesMeta: "@cloudflare/workerd-darwin-64": optional: true @@ -35473,13 +36027,13 @@ __metadata: optional: true bin: workerd: bin/workerd - checksum: 1ad3b1399d17da8a0cbe0b76165c34ac0c396641e8a5e886b2a44c8881eef7dc2a771cf28994b2334fd048414cb8a06cb2c74108c774b0ef37c44cadfc2dbbf7 + checksum: 7fbb12c1e9a1c6394dbe03005777e337bbf486a5e529065d9a2f2260978b239225a7d8a374cbe9e38cb4a91ec8fd6ebbbde95c2ae67773d78480fdbfdd4122ca languageName: node linkType: hard "wrangler@npm:^3.15.0": - version: 3.15.0 - resolution: "wrangler@npm:3.15.0" + version: 3.17.0 + resolution: "wrangler@npm:3.17.0" dependencies: "@cloudflare/kv-asset-handler": "npm:^0.2.0" "@esbuild-plugins/node-globals-polyfill": "npm:^0.2.3" @@ -35488,7 +36042,7 @@ __metadata: chokidar: "npm:^3.5.3" esbuild: "npm:0.17.19" fsevents: "npm:~2.3.2" - miniflare: "npm:3.20231025.0" + miniflare: "npm:3.20231030.1" nanoid: "npm:^3.3.3" path-to-regexp: "npm:^6.2.0" resolve.exports: "npm:^2.0.2" @@ -35502,7 +36056,7 @@ __metadata: bin: wrangler: bin/wrangler.js wrangler2: bin/wrangler.js - checksum: d386070a0cf3c3d2f05d52de089af776bf38b937e106f03a449a0ef812f933f87896f1c819eeaaaff898453dbe7bc5bab97cd6accbdb0b135556d6e50fd08970 + checksum: 62139687f1b7887158336a6c3caa37aac05305665252c5dd87e01fda7cfac92f8530986f0859dc4215411827f1961d8673d15bc6d6d182aa4258fdd070fbc0eb languageName: node linkType: hard @@ -35569,7 +36123,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.1, write-file-atomic@npm:^4.0.2": +"write-file-atomic@npm:^4.0.2": version: 4.0.2 resolution: "write-file-atomic@npm:4.0.2" dependencies: @@ -35589,21 +36143,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 1769532b6fdab9ff659f0b17810e7501831d34ecca23fd179ee64091dd93a51f42c59f6c7bb4c7a384b6c229aca8076fb312aa35626257c18081511ef62a161d - languageName: node - linkType: hard - "ws@npm:8.14.2, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.2.3": version: 8.14.2 resolution: "ws@npm:8.14.2" @@ -35686,13 +36225,6 @@ __metadata: languageName: node linkType: hard -"xorshift@npm:^1.1.1": - version: 1.2.0 - resolution: "xorshift@npm:1.2.0" - checksum: 8d7f6bf1d343cbd9d1a6f20aca290b084ee589f39e31b051c6c918d1fead800b9614364baddc51869468316328d9d3654cb88a2b4949c46c9fb0c606a52636bf - languageName: node - linkType: hard - "xss@npm:^1.0.8": version: 1.0.14 resolution: "xss@npm:1.0.14" @@ -35705,7 +36237,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:~4.0.0, xtend@npm:~4.0.1": +"xtend@npm:^4.0.0, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a @@ -35729,13 +36261,13 @@ __metadata: linkType: hard "y-indexeddb@npm:^9.0.11": - version: 9.0.11 - resolution: "y-indexeddb@npm:9.0.11" + version: 9.0.12 + resolution: "y-indexeddb@npm:9.0.12" dependencies: lib0: "npm:^0.2.74" peerDependencies: yjs: ^13.0.0 - checksum: 70bd2645046a7647ce2ce0f487a65ff33ffdbed5c879e8cff499c9053a0a1b1b681f978b7382e2751b8721757909fcbde23d7d3c4b21c3491baee61361a2e696 + checksum: 6468ebdcb2936a5fe10e4fb57cbe2d90260c44b63c6ecf6a26cc3652d21bd3be58bb76dfb56dbe56dd71b320042bfd3663274217b89300f2f0db92611fc9e7c6 languageName: node linkType: hard @@ -35754,11 +36286,15 @@ __metadata: version: 0.0.0-use.local resolution: "y-provider@workspace:packages/common/y-provider" dependencies: +<<<<<<< HEAD "@blocksuite/store": "npm:0.0.0-20231116023037-31273bb7-nightly" +======= + "@blocksuite/store": "npm:0.0.0-20231122113751-6bf81eb3-nightly" +>>>>>>> canary vite: "npm:^4.4.11" vite-plugin-dts: "npm:3.6.0" vitest: "npm:0.34.6" - yjs: "npm:^13.6.8" + yjs: "npm:^13.6.10" peerDependencies: yjs: ^13 languageName: unknown @@ -35799,27 +36335,20 @@ __metadata: languageName: node linkType: hard -"yaml@npm:2.3.2": - version: 2.3.2 - resolution: "yaml@npm:2.3.2" - checksum: dba78b314c4b713a7dfa4412c88c1168ffe41fe26cdd4363cb3389194765895415b800f5a2d1a5bdfb0b2e31f1ad689f8e8f9cf78153f24142b68172e72afc95 +"yaml@npm:2.3.4, yaml@npm:^2.2.1, yaml@npm:^2.3.1, yaml@npm:^2.3.4": + version: 2.3.4 + resolution: "yaml@npm:2.3.4" + checksum: f8207ce43065a22268a2806ea6a0fa3974c6fde92b4b2fa0082357e487bc333e85dc518910007e7ac001b532c7c84bd3eccb6c7757e94182b564028b0008f44b languageName: node linkType: hard -"yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": +"yaml@npm:^1.10.0, yaml@npm:^1.7.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: e088b37b4d4885b70b50c9fa1b7e54bd2e27f5c87205f9deaffd1fb293ab263d9c964feadb9817a7b129a5bf30a06582cb08750f810568ecc14f3cdbabb79cb3 languageName: node linkType: hard -"yaml@npm:^2.2.1, yaml@npm:^2.3.1": - version: 2.3.3 - resolution: "yaml@npm:2.3.3" - checksum: 3b1a974b9d3672c671d47099a41c0de77b7ff978d0849aa55a095587486e82cd072321d19f2b4c791a367f766310b5a82dff098839b0f4ddcbbbe477f82dfb07 - languageName: node - linkType: hard - "yargs-parser@npm:21.1.1, yargs-parser@npm:>=21.1.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -35837,7 +36366,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc @@ -35863,7 +36392,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.0.2, yargs@npm:^16.2.0": +"yargs@npm:^16.0.2": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -35916,12 +36445,12 @@ __metadata: languageName: node linkType: hard -"yjs@npm:^13.6.8": - version: 13.6.8 - resolution: "yjs@npm:13.6.8" +"yjs@npm:^13.6.10": + version: 13.6.10 + resolution: "yjs@npm:13.6.10" dependencies: - lib0: "npm:^0.2.74" - checksum: cad2eccba3f37be480f9459e98e75e4f9fe4ffab88aea25601c8ea6f56fd185fc7fdae36a210598534d6030000d12b5d0c11e79f30af685a17c7a17728bc3299 + lib0: "npm:^0.2.86" + checksum: fe766c48ed450689d1b0ae6d96dbbbda9b1cf284bb4b67f774a3a075eeb5481b5990f804129edaf3ec9d6f462a9cd528f4cbd689e9dc996b1b55c51c4188549c languageName: node linkType: hard @@ -35947,13 +36476,13 @@ __metadata: linkType: hard "youch@npm:^3.2.2": - version: 3.3.2 - resolution: "youch@npm:3.3.2" + version: 3.3.3 + resolution: "youch@npm:3.3.3" dependencies: cookie: "npm:^0.5.0" mustache: "npm:^4.2.0" stacktracey: "npm:^2.1.8" - checksum: 36cc2204b898f3051e2d4f4a41ade6220d51e85f905b5884965458e242df998832313902c65080791fe7a2091718b99f7b290ead3b44b6a68a116ebc143ed372 + checksum: d13fb6f1e756823397ba02dd0c6f8a1b060a21327238872b46677ea1e1570b6b90fe216560a2ff9f34ba2eead6c442403b70df44354c6224bbfe31cc9a182c38 languageName: node linkType: hard @@ -35975,11 +36504,11 @@ __metadata: linkType: hard "zod-to-json-schema@npm:^3.20.4": - version: 3.21.4 - resolution: "zod-to-json-schema@npm:3.21.4" + version: 3.22.0 + resolution: "zod-to-json-schema@npm:3.22.0" peerDependencies: - zod: ^3.21.4 - checksum: 8247fa3679c48b3cd748912baee7870c78951a66b12d4663daa7707bcd600de3050ee5ebae4c5596fbc109a4af7efd2507dad4f8959dfcd22fe72ea09c6d599b + zod: ^3.22.4 + checksum: d82c9457fd83cb6e6bf22b5bb7dfc1a5f289f1cf600c97788c34898bec3b749a53ef05cd6be828cf84fc6933139233d0f86b7d6cf5d8a0c9568c8fb2869a18ca languageName: node linkType: hard