diff --git a/.envrc b/.envrc index f38ba33a28..bec7634cfd 100644 --- a/.envrc +++ b/.envrc @@ -19,25 +19,27 @@ fi use nix --max-jobs auto watch_file shell.nix build/nix/**/*.nix -export APP_FOLDER_NAME="Mintter.dev" - # Redefining the ports in development # to allow running release builds and dev builds at the same time. # These values are passed to mintterd via flags when Electron spawns the mintterd process. -export VITE_BACKEND_HTTP_PORT="56001" -export VITE_BACKEND_GRPC_PORT="56002" -export VITE_BACKEND_P2P_PORT="56003" +export VITE_DESKTOP_P2P_PORT="56000" +export VITE_DESKTOP_HTTP_PORT="56001" +export VITE_DESKTOP_GRPC_PORT="56002" +export VITE_DESKTOP_APPDATA="Mintter.dev" +export VITE_DESKTOP_HOSTNAME="http://localhost" -export GRPC_HOST="http://localhost:57001" -export NEXT_PUBLIC_LN_HOST="https://ln.mintter.com" -export MINTTER_IS_GATEWAY="1" -export NEXT_TELEMETRY_DISABLED="1" -export VITE_MINTTER_GATEWAY_URL="https://mintter.com" -export VITE_APP_VERSION="0.0.100" +export GRPC_HOST="http://localhost:55002" +export NEXT_PUBLIC_LN_HOST="https://ln.testnet.mintter.com" +export NEXT_TELEMETRY_DISABLED="1" + +export VITE_VERSION="0.0.100" # Needed for the Go extension in VS Code to find the right toolchain. export GOROOT="$(go env GOROOT)" export VITE_HM_SENTRY_DESKTOP_DSN="https://8d3089ffb71045dc911bc66efbd3463a@o4504088793841664.ingest.sentry.io/4505527460429824" +export HM_SENTRY_DESKTOP_DSN="https://8d3089ffb71045dc911bc66efbd3463a@o4504088793841664.ingest.sentry.io/4505527460429824" + +# NODE_ENV=test VITE_DESKTOP_P2P_PORT=5800 VITE_DESKTOP_HTTP_PORT=58001 VITE_DESKTOP_GRPC_PORT=58002 VITE_DESKTOP_APPDATA=appData.test.local \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 53a001eb0b..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -frontend/packages/ui/dist -node_modules \ No newline at end of file diff --git a/.github/workflows/desktop-release.yml b/.github/workflows/desktop-release.yml index 1887e06c25..5d081bab94 100644 --- a/.github/workflows/desktop-release.yml +++ b/.github/workflows/desktop-release.yml @@ -103,7 +103,7 @@ jobs: run: | node scripts/set-desktop-version.mjs env: - APP_VERSION: "${{ needs.get-version.outputs.version }}" + VITE_VERSION: "${{ needs.get-version.outputs.version }}" - name: Build, package & make (Unix) if: matrix.config.os != 'windows-latest-l' @@ -114,11 +114,17 @@ jobs: APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} DAEMON_NAME: ${{ matrix.config.daemon_name }} - VITE_APP_VERSION: "${{ needs.get-version.outputs.version }}" - # VITE_APP_VERSION: "0.0.100" + VITE_VERSION: "${{ needs.get-version.outputs.version }}" + # VITE_VERSION: "0.0.100" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} timeout-minutes: 10 + VITE_DESKTOP_P2P_PORT: "55000" + VITE_DESKTOP_HTTP_PORT: "55001" + VITE_DESKTOP_GRPC_PORT: "55002" + VITE_DESKTOP_DESKTOP_APPDATA: "Mintter" + VITE_DESKTOP_HOSTNAME: "http://localhost" + VITE_HM_SENTRY_DESKTOP_DSN: "${{ secrets.HM_SENTRY_SITE_DSN }}" + SENTRY_AUTH_TOKEN: "${{ secrets.SENTRY_AUTH_TOKEN }}" - name: Build, package and make (Win32) if: matrix.config.os == 'windows-latest-l' @@ -127,8 +133,9 @@ jobs: yarn desktop:make --arch=${{ matrix.config.arch }} env: DAEMON_NAME: "${{ matrix.config.daemon_name }}.exe" - VITE_APP_VERSION: "${{ needs.get-version.outputs.version }}" + VITE_VERSION: "${{ needs.get-version.outputs.version }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + VITE_HM_SENTRY_DESKTOP_DSN: "${{ secrets.HM_SENTRY_SITE_DSN }}" SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - name: Upload Artifacts diff --git a/.github/workflows/test-desktop.yml b/.github/workflows/test-desktop.yml new file mode 100644 index 0000000000..084d6b3066 --- /dev/null +++ b/.github/workflows/test-desktop.yml @@ -0,0 +1,149 @@ +name: Desktop Test + +permissions: + contents: write + +on: + push: + branches: + - main + - e2e + - release/* + paths: + - frontend/* + - ".github/workflows/test-desktop.yml" + + pull_request: + branches: + - main + - e2e + - release/* + paths: + - frontend/* + - ".github/workflows/test-desktop.yml" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + AWS_REGION: us-east-1 + +jobs: + build-binaries: + name: Test on ${{ matrix.config.os }} @ ${{ matrix.config.arch }} + runs-on: ${{ matrix.config.os }} + strategy: + matrix: + config: + - os: macos-latest-xl + arch: x64 + goarch: amd64 + daemon_name: x86_64-apple-darwin + # - os: macos-latest-xl + # arch: arm64 + # goarch: arm64 + # daemon_name: aarch64-apple-darwin + # - os: ubuntu-20.04 + # arch: x64 + # goarch: amd64 + # daemon_name: x86_64-unknown-linux-gnu + # - os: windows-latest-l + # arch: x64 + # goarch: amd64 + # daemon_name: x86_64-pc-windows-msvc + steps: + - name: Checkout + uses: actions/checkout@v1 + + - uses: ./.github/actions/ci-setup + with: + matrix-os: ${{ matrix.config.os }} + # matrix-target: ${{ matrix.config.daemon_name }} + # matrix-arch: ${{ matrix.config.arch }} + + - name: Build Backend (Unix) + if: matrix.config.os != 'windows-latest-l' + run: | + mkdir -p plz-out/bin/backend + go build -o plz-out/bin/backend/mintterd-${{ matrix.config.daemon_name }} ./backend/cmd/mintterd + env: + GOARCH: ${{ matrix.config.goarch }} + CGO_ENABLED: 1 + + - name: Build Backend (Windows) + if: matrix.config.os == 'windows-latest-l' + run: | + mkdir -p plz-out/bin/backend + go build -o plz-out/bin/backend/mintterd-${{ matrix.config.daemon_name }}.exe ./backend/cmd/mintterd + env: + GOOS: "windows" + GOARCH: ${{ matrix.config.goarch }} + CGO_ENABLED: 1 + + - name: Set temporal version in package.json + run: | + node scripts/set-desktop-version.mjs + env: + VITE_VERSION: "100.0.0" + + - name: Build, package & make (Unix) + if: matrix.config.os != 'windows-latest-l' + run: | + yarn desktop:package --arch=${{ matrix.config.arch }} + env: + NODE_ENV: test + DAEMON_NAME: ${{ matrix.config.daemon_name }} + VITE_VERSION: "100.0.0" + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + timeout-minutes: 10 + VITE_DESKTOP_P2P_PORT: "58000" + VITE_DESKTOP_HTTP_PORT: "58001" + VITE_DESKTOP_GRPC_PORT: "58002" + VITE_DESKTOP_DESKTOP_APPDATA: "Mintter.test" + VITE_DESKTOP_HOSTNAME: "http://localhost" + + - name: Build, package and make (Win32) + if: matrix.config.os == 'windows-latest-l' + run: | + $env:DEBUG='electron-osx-sign*,electron-notarize*' + yarn desktop:package --arch=${{ matrix.config.arch }} + env: + NODE_ENV: test + DAEMON_NAME: ${{ matrix.config.daemon_name }} + VITE_VERSION: "100.0.0" + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + timeout-minutes: 10 + VITE_DESKTOP_P2P_PORT: "58000" + VITE_DESKTOP_HTTP_PORT: "58001" + VITE_DESKTOP_GRPC_PORT: "58002" + VITE_DESKTOP_DESKTOP_APPDATA: "Mintter.test" + VITE_DESKTOP_HOSTNAME: "http://localhost" + + - name: Validate code + run: | + yarn validate + + - name: Install Playwright Browsers + run: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npx playwright install + + - name: Run Tests + run: yarn workspace @mintter/desktop e2e + env: + CI: "1" + + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: playwright-report-${{ matrix.config.daemon_name }} + path: frontend/apps/desktop/playwright-report/**/* +# - name: Setup Pages +# uses: actions/configure-pages@v2 +# - name: Upload artifact +# uses: actions/upload-pages-artifact@v1 +# with: +# # Upload entire repository +# path: playwright-report/ +# - name: Deploy to GitHub Pages +# id: deployment +# uses: actions/deploy-pages@v1 diff --git a/.github/workflows/testing-builds.yml b/.github/workflows/testing-builds.yml deleted file mode 100644 index 939e524c9b..0000000000 --- a/.github/workflows/testing-builds.yml +++ /dev/null @@ -1,145 +0,0 @@ -name: Desktop app release - -on: - push: - branches: - - testing-builds - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - AWS_REGION: us-east-1 - -jobs: - get-version: - runs-on: ubuntu-latest - outputs: - version: ${{ steps.vars.outputs.version }} - steps: - - uses: actions/checkout@v3 - - - name: Get Tag - id: vars - run: | - echo "version=0.0.100" >> "$GITHUB_OUTPUT" - - build-binaries: - name: Build ${{ matrix.config.os }} @ ${{ matrix.config.arch }} - runs-on: ${{ matrix.config.os }} - # if: startsWith(github.ref, 'refs/tags/') - needs: [get-version] - strategy: - matrix: - config: - - os: macos-latest - arch: x64 - goarch: amd64 - daemon_name: x86_64-apple-darwin - - os: macos-latest - arch: arm64 - goarch: arm64 - daemon_name: aarch64-apple-darwin - - os: ubuntu-latest - arch: x64 - goarch: amd64 - daemon_name: x86_64-unknown-linux-gnu - - os: windows-latest - arch: x64 - goarch: amd64 - daemon_name: x86_64-pc-windows-msvc - steps: - - name: Checkout - uses: actions/checkout@v1 - - - uses: ./.github/actions/ci-setup - with: - matrix-os: ${{ matrix.config.os }} - # matrix-target: ${{ matrix.config.daemon_name }} - # matrix-arch: ${{ matrix.config.arch }} - - - name: Build Backend (Unix) - if: matrix.config.os != 'windows-latest' - run: | - mkdir -p plz-out/bin/backend - go build -o plz-out/bin/backend/mintterd-${{ matrix.config.daemon_name }} ./backend/cmd/mintterd - env: - GOARCH: ${{ matrix.config.goarch }} - CGO_ENABLED: 1 - - - name: Build Backend (Windows) - if: matrix.config.os == 'windows-latest' - run: | - mkdir -p plz-out/bin/backend - go build -o plz-out/bin/backend/mintterd-${{ matrix.config.daemon_name }}.exe ./backend/cmd/mintterd - env: - GOOS: "windows" - GOARCH: ${{ matrix.config.goarch }} - CGO_ENABLED: 1 - - - name: Set MacOS signing certs - if: matrix.config.os == 'macos-latest' - env: - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE_BASE64 }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }} - run: | - echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12 - security create-keychain -p $APPLE_KEYCHAIN_PASSWORD build.keychain - security default-keychain -s build.keychain - security unlock-keychain -p $APPLE_KEYCHAIN_PASSWORD build.keychain - security import certificate.p12 -k build.keychain -P $APPLE_CERTIFICATE_PASSWORD -T /usr/bin/codesign - security set-key-partition-list -S apple-tool:,apple: -s -k $APPLE_KEYCHAIN_PASSWORD build.keychain - rm -fr *.p12 - security set-keychain-settings -lut 1200 # prevent the keychain to get locked before codesign is done - - - name: Set temporal version in package.json - run: | - node scripts/set-desktop-version.mjs - env: - APP_VERSION: "${{ needs.get-version.outputs.version }}" - - - name: Build, package & make (Unix) - if: matrix.config.os != 'windows-latest' - run: | - DEBUG='electron-osx-sign*,electron-notarize*' yarn desktop:make --arch=${{ matrix.config.arch }} - env: - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - DAEMON_NAME: ${{ matrix.config.daemon_name }} - APP_VERSION: "${{ needs.get-version.outputs.version }}" - # APP_VERSION: "0.0.100" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - timeout-minutes: 10 - - - name: Build, package and make (Win32) - if: matrix.config.os == 'windows-latest' - run: | - $env:DEBUG='electron-osx-sign*,electron-notarize*' - yarn desktop:make --arch=${{ matrix.config.arch }} - env: - DAEMON_NAME: "${{ matrix.config.daemon_name }}.exe" - APP_VERSION: "${{ needs.get-version.outputs.version }}" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - - - name: Upload Artifacts - uses: actions/upload-artifact@v3 - with: - name: artifacts-${{ matrix.config.daemon_name }} - path: frontend/apps/desktop/out/make/**/* - publish-to-github: - needs: [get-version, build-binaries] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Download amd64 artifacts - uses: actions/download-artifact@v3 - with: - path: artifacts diff --git a/.github/workflows/validate-desktop.yml b/.github/workflows/validate-desktop.yml deleted file mode 100644 index b9e8351ab1..0000000000 --- a/.github/workflows/validate-desktop.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Validate + Test Desktop code - -on: - push: - branches: - - main - paths: - - ".github/workflows/validate-desktop.yml" - - "frontend/apps/desktop/**" - - "frotend/packages/**" - - "package.json" - - "frontend/apps/desktop/package.json" - pull_request: - paths: - - ".github/workflows/validate-desktop.yml" - - "frontend/apps/desktop/**" - - "frotend/packages/**" - - "package.json" - - "frontend/apps/desktop/package.json" - branches-ignore: - - "renovate/**" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - validate-test-desktop: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: ./.github/actions/ci-setup - with: - matrix-os: "ubuntu-latest" - - - name: Validate code - run: | - yarn validate - - - name: Build Backend (Unix) - run: | - mkdir -p plz-out/bin/backend - go build -o plz-out/bin/backend/mintterd-x86_64-unknown-linux-gnu ./backend/cmd/mintterd - env: - GOARCH: amd64 - CGO_ENABLED: 1 - - - name: Package desktop app - run: | - yarn desktop:package - - - name: Run desktop app tests - run: yarn desktop:test diff --git a/.github/workflows/validate-site.yml b/.github/workflows/validate-site.yml deleted file mode 100644 index 83eb9df6e1..0000000000 --- a/.github/workflows/validate-site.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Validate + Test Site code - -on: - push: - branches: - - main - - electron-ci - paths: - - ".github/workflows/validate-site.yml" - - "frontend/apps/site/**" - - "frotend/packages/shared/**" - - "frotend/packages/ui/**" - - "package.json" - - "frontend/apps/site/package.json" - pull_request: - paths: - - ".github/workflows/validate-site.yml" - - "frontend/apps/site/**" - - "frotend/packages/**" - - "package.json" - - "frontend/apps/site/package.json" - branches-ignore: - - "renovate/**" - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - validate-test-site: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Install Node.js 20 - uses: actions/setup-node@v3 - with: - node-version: 20 - cache: "yarn" - - - name: Install Frontend Dependencies - env: - YARN_ENABLE_IMMUTABLE_INSTALLS: false - run: | - yarn - - - name: Validate Code - run: | - yarn validate - - - name: Run Site tests - run: yarn site:test diff --git a/README.md b/README.md index 4568492c64..fe518381cc 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ installed. [./dev](./dev) is the main dev CLI. Run `./dev` to list commands, including: - `./dev run-desktop` +- `./dev run-desktop-mainnet` - `./dev build-desktop` - `./dev run-site` - `./dev build-site` @@ -48,6 +49,16 @@ To run the dev build with the production network, use the following command: MINTTER_P2P_TESTNET_NAME="" ./dev run-desktop ``` +## Frontend Testing + +```bash +yarn test # test all the packages +yarn desktop:test # test desktop app (e2e only now) +yarn site:test # test only site code (WIP) +``` + +## Web Build + ## Group sites Group sites need two programs to run. The daemon which includes the P2P node (go app) diff --git a/dev b/dev index fbc5b691af..17d017cc13 100755 --- a/dev +++ b/dev @@ -87,6 +87,23 @@ def main(): return run("yarn desktop", args=args) + @cmd( + cmds, + "run-desktop-mainnet", + "Run frontend desktop app for development in Mainnet.", + ) + def run_desktop_mainnet(args): + run("./scripts/cleanup-desktop.sh") + run("yarn install") + run("yarn workspace @mintter/ui generate") + run("plz build //backend:mintterd //:yarn") + + testnet_var = "MINTTER_P2P_TESTNET_NAME" + if testnet_var not in os.environ: + os.environ[testnet_var] = "dev" + + return run("MINTTER_P2P_TESTNET_NAME='' yarn desktop", args=args) + @cmd(cmds, "build-desktop", "Builds the desktop app for the current platform.") def build_desktop(args): run("./scripts/cleanup-frontend.sh") @@ -95,6 +112,17 @@ def main(): run("plz build //backend:mintterd //:yarn") run("yarn desktop:make") + @cmd(cmds, "test-desktop", "Run frontend desktop tests.") + def test_desktop(args): + run("yarn workspace @mintter/ui generate") + run("plz build //backend:mintterd //:yarn") + + testnet_var = "MINTTER_P2P_TESTNET_NAME" + if testnet_var not in os.environ: + os.environ[testnet_var] = "dev" + + return run("yarn desktop:test", args=args) + @cmd(cmds, "run-site", "Run sites app for development.") def run_site(args): run("./scripts/cleanup-site.sh") @@ -122,10 +150,6 @@ def main(): def frontend_validate(args): run("yarn validate") - @cmd(cmds, "frontend-test", "Tests frontend code") - def frontend_test(args): - run("APP_FOLDER_NAME=Mintter.test && yarn test") - @cmd(cmds, "run-backend", "Build and run mintterd binary for the current platform.") def run_backend(args): return run("plz run //backend:mintterd", args=args) diff --git a/docs/docs/frontend-testing-e2e.md b/docs/docs/frontend-testing-e2e.md new file mode 100644 index 0000000000..b74b4f3a6e --- /dev/null +++ b/docs/docs/frontend-testing-e2e.md @@ -0,0 +1,24 @@ +# Frontend E2E Testing + +This app uses Playwright for E2E testing. + +## Running E2E tests + +```bash +cd +yarn desktop:package +yarn desktop:e2e +``` + +## Create new E2E tests + +1. create a new file inside `frontend/apps/desktop/tests`. the filename should end in `e2e.ts`. This is important because E2E tests are set as a separate project based on the filename. We recomment you copy `e2e.template.ts` to start. +2. write your tests. +3. make sure it passes and commit! + +## Setup Explanation + +- Playwright is testing a Built app. this means that in order to run the E2E tests the app MUST be built. +- the path in which the backend DB is stored changes depending on the environment in which the test will run: + - when tests are run in CI, the path is set to a temp directory (using `mkdtempSync(join(tmpdir(), 'hm-'))` ([source](https://nodejs.org/api/fs.html#fsmkdtempsyncprefix-options))) + - when tests are run Locally, the path is set to the production path. we can change this in the future. \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index d63c2063a4..0000000000 --- a/eslint.config.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = [ - // { - // files: ['frontend/**/*.ts'], - // ignores: [ - // 'frontend/**/*.js', - // 'frontend/**/*.d.ts', - // 'frontend/packages/ui/dist/**/*.{js,ts}', - // 'frontend/packages/*/types/*', - // 'frontend/packages/shared/src/client/.generated/*', - // 'node_modules/*', - // '**/*.config.{js,ts}', - // '!**/eslint.config.js', - // ], - // rules: { - // semi: 'error', - // 'prefer-const': 'error', - // }, - // linterOptions: { - // reportUnusedDisableDirectives: true, - // }, - // }, - { - files: ['frontend/apps/desktop/**/*.ts'], - rules: { - semi: 'error', - 'prefer-const': 'error', - }, - }, - { - files: ['frontend/apps/site/**/*.ts'], - rules: { - semi: 'error', - 'prefer-const': 'error', - }, - }, -] diff --git a/frontend/apps/desktop/.eslintrc.js b/frontend/apps/desktop/.eslintrc.js deleted file mode 100644 index b56159ea9c..0000000000 --- a/frontend/apps/desktop/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: ['custom'], -} diff --git a/frontend/apps/desktop/.gitignore b/frontend/apps/desktop/.gitignore index 7ca595b6c7..28f9965559 100644 --- a/frontend/apps/desktop/.gitignore +++ b/frontend/apps/desktop/.gitignore @@ -71,4 +71,9 @@ out/ sentry.properties # Sentry Auth Token -.sentryclirc \ No newline at end of file +.sentryclirc + +# Playwright test +screenshots/ +playwright-report/ +test-results/ \ No newline at end of file diff --git a/frontend/apps/desktop/e2e/example.spec.ts b/frontend/apps/desktop/e2e/example.spec.ts deleted file mode 100644 index f8591e0c22..0000000000 --- a/frontend/apps/desktop/e2e/example.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - ElectronApplication, - Page, - _electron as electron, - expect, - test, -} from '@playwright/test' -import {findLatestBuild, parseElectronApp} from 'electron-playwright-helpers' - -let electronApp: ElectronApplication - -test.beforeAll(async () => { - // find the latest build in the out directory - const latestBuild = findLatestBuild() - // parse the directory and find paths and other info - const appInfo = parseElectronApp(latestBuild) - // set the CI environment variable to true - process.env.CI = 'e2e' - - electronApp = await electron.launch({ - args: [appInfo.main], - executablePath: appInfo.executable, - }) - electronApp.on('window', async (page) => { - const filename = page.url()?.split('/').pop() - console.log(`Window opened: ${filename}`) - - // capture errors - page.on('pageerror', (error) => { - console.error(error) - }) - // capture console messages - page.on('console', (msg) => { - console.log(msg.text()) - }) - }) -}) - -test.afterAll(async () => { - // close app - await electronApp.close() -}) - -let page: Page - -test('renders the first page', async () => { - page = await electronApp.firstWindow() - await page.waitForSelector('[role="heading"]') - const text = await page.$eval('[role="heading"]', (el) => el.textContent) - expect(text).toBe('All Publications') - const title = await page.title() - expect(title).toBe('Mintter Renderer') -}) diff --git a/frontend/apps/desktop/e2e/tsconfig.json b/frontend/apps/desktop/e2e/tsconfig.json deleted file mode 100644 index c7f55be556..0000000000 --- a/frontend/apps/desktop/e2e/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": "." // This must be specified if "paths" is. - } -} diff --git a/frontend/apps/desktop/example.png b/frontend/apps/desktop/example.png new file mode 100644 index 0000000000..d8aa4c9d7c Binary files /dev/null and b/frontend/apps/desktop/example.png differ diff --git a/frontend/apps/desktop/forge.config.ts b/frontend/apps/desktop/forge.config.ts index a26891c6ae..0119a0f788 100644 --- a/frontend/apps/desktop/forge.config.ts +++ b/frontend/apps/desktop/forge.config.ts @@ -5,7 +5,7 @@ import {MakerZIP} from '@electron-forge/maker-zip' import type {ForgeConfig} from '@electron-forge/shared-types' // import {MakerRpm} from '@electron-forge/maker-rpm' import {VitePlugin} from '@electron-forge/plugin-vite' -import path from 'path' +import path from 'node:path' import packageJson from './package.json' // import setLanguages from 'electron-packager-languages' @@ -54,7 +54,7 @@ const commonLinuxConfig: MakerDebConfig = { const config: ForgeConfig = { packagerConfig: { - appVersion: process.env.APP_VERSION, + appVersion: process.env.VITE_VERSION, asar: true, darwinDarkModeSupport: true, icon: iconsPath, diff --git a/frontend/apps/desktop/package.json b/frontend/apps/desktop/package.json index 91036b1fce..827dd37670 100644 --- a/frontend/apps/desktop/package.json +++ b/frontend/apps/desktop/package.json @@ -16,14 +16,17 @@ "main": ".vite/build/main.js", "scripts": { "dev": "electron-forge start", - "devtools": "react-devtools", - "test": "yarn e2e", - "e2e": "xvfb-maybe -- playwright test", - "format": "prettier \"**/*.{ts,tsx,md,mdx,json}\" --check --ignore-path ../../../.prettierignore", - "lint": "echo TODO", + "format": "echo TODO", "make": "electron-forge make", "package": "electron-forge package", - "publish": "electron-forge publish" + "publish": "electron-forge publish", + "devtools": "react-devtools", + "test": "NODE_ENV=test yarn package:test && yarn e2e", + "test:only": "NODE_ENV=test yarn e2e", + "package:test": "NODE_ENV=test VITE_DESKTOP_P2P_PORT=5800 VITE_DESKTOP_HTTP_PORT=58001 VITE_DESKTOP_GRPC_PORT=58002 VITE_DESKTOP_APPDATA=appData.test.local NODE_ENV=test yarn package", + "e2e": "NODE_ENV=test npx playwright test --project=e2e", + "e2e:debug": "NODE_ENV=test PWDEBUG=1 yarn e2e", + "e2e:report": "NODE_ENV=test npx playwright show-report" }, "dependencies": { "@ariakit/react": "0.3.5", @@ -62,14 +65,14 @@ "@electron-forge/plugin-vite": "6.4.1", "@electron-forge/shared-types": "6.4.2", "@mintter/prettier": "*", - "@playwright/test": "1.37.1", + "@playwright/test": "1.40.1", "@tamagui/vite-plugin": "latest", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "@vitejs/plugin-react": "4.0.4", "electron": "26.0.0", "electron-playwright-helpers": "1.6.0", - "eslint-config-custom": "*", + "loglevel": "^1.8.1", "react-devtools": "4.28.0", "react-error-boundary": "4.0.11", "tamagui": "1.79.1", diff --git a/frontend/apps/desktop/playwright.config.ts b/frontend/apps/desktop/playwright.config.ts index 438541a51e..d74879a1b8 100644 --- a/frontend/apps/desktop/playwright.config.ts +++ b/frontend/apps/desktop/playwright.config.ts @@ -1,8 +1,39 @@ -import {PlaywrightTestConfig} from '@playwright/test' +// playwright.config.ts +import type {PlaywrightTestConfig} from '@playwright/test' const config: PlaywrightTestConfig = { - testDir: './test', - maxFailures: 2, + testDir: 'tests', + outputDir: 'test-results', + // Fail the build on CI if you accidentally left test.only in the source code. + forbidOnly: !!process.env.CI, + snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}', + use: { + trace: 'retain-on-failure', + video: 'on', + }, + retries: process.env.CI ? 2 : 0, + workers: 1, + expect: { + timeout: 30 * 1000, + }, + timeout: 30 * 1000, + reporter: process.env.CI ? 'github' : 'html', + // reporter: [ + // ['list'], + // [ + // 'junit', + // { + // outputFile: `test-results/test-results-${new Date() + // .toISOString() + // .replace(/:/g, '_')}.xml`, + // }, + // ], + // ], + projects: [ + { + name: 'e2e', + testMatch: ['**/*e2e.ts'], + }, + ], } - export default config diff --git a/frontend/apps/desktop/src/app-api.ts b/frontend/apps/desktop/src/app-api.ts index 562ce79d7c..90fec6083f 100644 --- a/frontend/apps/desktop/src/app-api.ts +++ b/frontend/apps/desktop/src/app-api.ts @@ -1,12 +1,10 @@ import type {NavRoute} from '@mintter/app/utils/navigation' import {resolveHmIdToAppRoute} from '@mintter/app/utils/navigation' import type {AppWindowEvent} from '@mintter/app/utils/window-events' -import {BACKEND_HTTP_PORT} from '@mintter/shared' import {observable} from '@trpc/server/observable' import { BrowserWindow, NativeImage, - app, dialog, ipcMain, nativeTheme, @@ -19,6 +17,7 @@ import {commentsApi} from './app-comments' import {diagnosisApi} from './app-diagnosis' import {experimentsApi} from './app-experiments' import {grpcClient} from './app-grpc' +import {userDataPath} from './app-paths' import {pinsApi} from './app-pins' import {t} from './app-trpc' import {uploadFile, webImportingApi} from './app-web-importing' @@ -66,8 +65,7 @@ nativeTheme.addListener('updated', () => { }) }) -const userData = app.getPath('userData') -info('App UserData: ', userData) +info('App UserData: ', userDataPath) export function openInitialWindows() { const windowsState = getWindowsState() @@ -221,14 +219,14 @@ export const router = t.router({ }), getDaemonInfo: t.procedure.query(async () => { - const buildInfoUrl = `http://localhost:${BACKEND_HTTP_PORT}/debug/buildinfo` + const buildInfoUrl = `${process.env.VITE_DESKTOP_HOSTNAME}:${process.env.VITE_VITE_DESKTOP_HTTP_PORT}/debug/buildinfo` const daemonVersionReq = await fetch(buildInfoUrl) const daemonVersion = await daemonVersionReq.text() return daemonVersion }), getAppInfo: t.procedure.query(() => { - return {dataDir: userData, loggingDir, grpcHost: process.env.GRPC_HOST} + return {dataDir: userDataPath, loggingDir, grpcHost: process.env.GRPC_HOST} }), }) diff --git a/frontend/apps/desktop/src/app-diagnosis.ts b/frontend/apps/desktop/src/app-diagnosis.ts index ef222d4791..d68a86610e 100644 --- a/frontend/apps/desktop/src/app-diagnosis.ts +++ b/frontend/apps/desktop/src/app-diagnosis.ts @@ -1,16 +1,16 @@ -import {z} from 'zod' -import {t} from './app-trpc' -import {dirname} from 'path' +import {unpackHmId} from '@mintter/shared/src/utils/entity-id-url' import {appendFile, exists, mkdirp, move, rmdir, writeFile} from 'fs-extra' -import {APP_USER_DATA_PATH} from './app-paths' import open from 'open' -import {unpackHmId} from '@mintter/shared/src/utils/entity-id-url' +import {dirname} from 'path' +import {z} from 'zod' +import {userDataPath} from './app-paths' +import {t} from './app-trpc' function draftFilePath(draftId: string) { - return `${APP_USER_DATA_PATH}/DraftLog/Draft_${draftId}.json` + return `${userDataPath}/DraftLog/Draft_${draftId}.json` } function createPubFilePath(docId: string) { - return `${APP_USER_DATA_PATH}/DraftLog/Publication_${getFormattedDateTime()}_${docId}.json` + return `${userDataPath}/DraftLog/Publication_${getFormattedDateTime()}_${docId}.json` } function getFormattedDateTime() { @@ -66,9 +66,9 @@ export const diagnosisApi = t.router({ await open(draftFilePath(id.eid)) }), openDraftLogFolder: t.procedure.mutation(async () => { - await open(`${APP_USER_DATA_PATH}/DraftLog`) + await open(`${userDataPath}/DraftLog`) }), destroyDraftLogFolder: t.procedure.mutation(async () => { - await rmdir(`${APP_USER_DATA_PATH}/DraftLog`, {recursive: true}) + await rmdir(`${userDataPath}/DraftLog`, {recursive: true}) }), }) diff --git a/frontend/apps/desktop/src/app-grpc.ts b/frontend/apps/desktop/src/app-grpc.ts index 6b9cb381ff..e3e920e297 100644 --- a/frontend/apps/desktop/src/app-grpc.ts +++ b/frontend/apps/desktop/src/app-grpc.ts @@ -1,6 +1,6 @@ import type {Interceptor} from '@connectrpc/connect' import {createGrpcWebTransport} from '@connectrpc/connect-node' -import {BACKEND_HTTP_URL, createGRPCClient} from '@mintter/shared' +import {API_HTTP_URL, createGRPCClient} from '@mintter/shared' const loggingInterceptor: Interceptor = (next) => async (req) => { try { @@ -40,7 +40,7 @@ const IS_DEV = process.env.NODE_ENV == 'development' const DEV_INTERCEPTORS = [loggingInterceptor, prodInter] export const transport = createGrpcWebTransport({ - baseUrl: BACKEND_HTTP_URL, + baseUrl: API_HTTP_URL, httpVersion: '1.1', interceptors: IS_DEV ? DEV_INTERCEPTORS : [prodInter], }) diff --git a/frontend/apps/desktop/src/app-paths.ts b/frontend/apps/desktop/src/app-paths.ts index 6957644abb..09604a442a 100644 --- a/frontend/apps/desktop/src/app-paths.ts +++ b/frontend/apps/desktop/src/app-paths.ts @@ -1,20 +1,17 @@ import {app} from 'electron' +import {mkdtempSync} from 'fs' +import os from 'os' import path from 'path' -export const APP_FOLDER_NAME = - process.env.NODE_ENV != 'production' && process.env.APP_FOLDER_NAME - ? process.env.APP_FOLDER_NAME - : 'Mintter' +export const IS_PROD = process.env.NODE_ENV == 'production' +export const IS_TEST = process.env.NODE_ENV == 'test' -export const APP_USER_DATA_PATH = path.join( - app.getPath('appData'), - APP_FOLDER_NAME, -) +export const userDataPath = IS_PROD + ? path.join(app.getPath('appData'), 'Mintter') + : IS_TEST + ? mkdtempSync(path.join(os.tmpdir(), 'hm-')) + : path.join(app.getPath('appData'), process.env.VITE_DESKTOP_APPDATA!) export function initPaths() { - app.setPath('userData', APP_USER_DATA_PATH) -} - -export function setupTests() { - app.setPath('userData', APP_USER_DATA_PATH) + app.setPath('userData', userDataPath) } diff --git a/frontend/apps/desktop/src/app-store.ts b/frontend/apps/desktop/src/app-store.ts index 81617827f2..9ede86923d 100644 --- a/frontend/apps/desktop/src/app-store.ts +++ b/frontend/apps/desktop/src/app-store.ts @@ -1,12 +1,12 @@ import Store from 'electron-store' -import {APP_USER_DATA_PATH} from './app-paths' +import {userDataPath} from './app-paths' export const appStore = new Store({ name: 'AppStore', - cwd: APP_USER_DATA_PATH, + cwd: userDataPath, }) export const commentDraftStore = new Store({ name: 'CommentDraft', - cwd: APP_USER_DATA_PATH, + cwd: userDataPath, }) diff --git a/frontend/apps/desktop/src/app-web-importing.ts b/frontend/apps/desktop/src/app-web-importing.ts index a981439134..74135c0449 100644 --- a/frontend/apps/desktop/src/app-web-importing.ts +++ b/frontend/apps/desktop/src/app-web-importing.ts @@ -1,4 +1,4 @@ -import {BACKEND_FILE_UPLOAD_URL} from '@mintter/shared' +import {API_FILE_UPLOAD_URL} from '@mintter/shared' import * as cheerio from 'cheerio' import http from 'http' import https from 'https' @@ -9,7 +9,7 @@ export async function uploadFile(file: Blob | string) { const formData = new FormData() formData.append('file', file) - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/apps/desktop/src/app-windows.ts b/frontend/apps/desktop/src/app-windows.ts index 6b4892502f..458fd60f7e 100644 --- a/frontend/apps/desktop/src/app-windows.ts +++ b/frontend/apps/desktop/src/app-windows.ts @@ -3,7 +3,7 @@ import type {NavRoute, NavState} from '@mintter/app/utils/navigation' import type {AppWindowEvent} from '@mintter/app/utils/window-events' import {getRouteWindowType} from '@mintter/app/utils/window-types' import {BrowserWindow, app, nativeTheme} from 'electron' -import path from 'path' +import path from 'node:path' import {appStore} from './app-store' import {getDaemonState, subscribeDaemonState} from './daemon' import {childLogger, info, warn} from './logger' @@ -66,9 +66,6 @@ type AppWindow = { sidebarLocked: boolean } -const userData = app.getPath('userData') -info('App UserData: ', userData) - const WINDOW_STATE_STORAGE_KEY = 'WindowState-v003' let windowsState = @@ -324,7 +321,5 @@ export function createAppWindow(input: { ) } - // if (!IS_PROD_DESKTOP) browserWindow.webContents.openDevTools() - return browserWindow } diff --git a/frontend/apps/desktop/src/daemon-path.ts b/frontend/apps/desktop/src/daemon-path.ts new file mode 100644 index 0000000000..a2ebe5a89a --- /dev/null +++ b/frontend/apps/desktop/src/daemon-path.ts @@ -0,0 +1,34 @@ +import path from 'path' + +export function getDaemonBinaryPath() { + if (process.env.NODE_ENV == 'production') { + return path.join(process.resourcesPath, `mintterd-${getPlatformTriple()}`) + } else { + return path.join( + process.cwd(), + '../../..', + `plz-out/bin/backend/mintterd-${getPlatformTriple()}`, + ) + } +} + +function getPlatformTriple() { + if (process.env.DAEMON_NAME) { + return process.env.DAEMON_NAME + } else { + switch (`${process.platform}/${process.arch}`) { + case 'darwin/x64': + return 'x86_64-apple-darwin' + case 'darwin/arm64': + return 'aarch64-apple-darwin' + case 'win32/x64': + return 'x86_64-pc-windows-msvc' + case 'linux/x64': + return 'x86_64-unknown-linux-gnu' + case 'linux/arm64': + return 'aarch64-unknown-linux-gnu' + default: + return 'NO_DAEMON_NAME' + } + } +} diff --git a/frontend/apps/desktop/src/daemon.ts b/frontend/apps/desktop/src/daemon.ts index f9117e2f2a..b5ea44f038 100644 --- a/frontend/apps/desktop/src/daemon.ts +++ b/frontend/apps/desktop/src/daemon.ts @@ -1,74 +1,34 @@ -import { - BACKEND_GRPC_PORT, - BACKEND_HTTP_PORT, - BACKEND_P2P_PORT, -} from '@mintter/shared' +import {GRPC_PORT, HTTP_PORT, P2P_PORT} from '@mintter/shared' import {spawn} from 'child_process' import {app} from 'electron' -import path, {join} from 'path' -import {APP_USER_DATA_PATH} from './app-paths' +import path from 'path' +import {IS_PROD, userDataPath} from './app-paths' +import {getDaemonBinaryPath} from './daemon-path' import {childLogger, info} from './logger' - const logger = childLogger('Go Daemon') -const LLVM_TRIPLES = { - 'darwin/x64': 'x86_64-apple-darwin', - 'darwin/arm64': 'aarch64-apple-darwin', - 'win32/x64': 'x86_64-pc-windows-msvc', - 'linux/x64': 'x86_64-unknown-linux-gnu', - 'linux/arm64': 'aarch64-unknown-linux-gnu', -} +let goDaemonExecutablePath = getDaemonBinaryPath() -const getPlatformTriple = (): string => { - return ( - process.env.DAEMON_NAME || - LLVM_TRIPLES[`${process.platform}/${process.arch}`] - ) -} - -const devProjectRoot = join(process.cwd(), '../../..') -const devDaemonBinaryPath = join( - devProjectRoot, - // TODO: parametrize this for each platform - `plz-out/bin/backend/mintterd-${getPlatformTriple()}`, -) - -const prodDaemonBinaryPath = join( - process.resourcesPath, - `mintterd-${getPlatformTriple()}`, -) - -const userDataDir = - process.env.NODE_ENV == 'development' - ? join(path.resolve('../../..'), 'db.local') - : join(APP_USER_DATA_PATH, 'daemon') - -let goDaemonExecutablePath = - process.env.NODE_ENV == 'development' - ? devDaemonBinaryPath - : prodDaemonBinaryPath - -let lndhubFlags = - process.env.NODE_ENV == 'development' - ? '-lndhub.mainnet=false' - : '-lndhub.mainnet=true' +let lndhubFlags = IS_PROD ? '-lndhub.mainnet=true' : '-lndhub.mainnet=false' const daemonArguments = [ '-http.port', - String(BACKEND_HTTP_PORT), + String(HTTP_PORT), '-grpc.port', - String(BACKEND_GRPC_PORT), + String(GRPC_PORT), '-p2p.port', - String(BACKEND_P2P_PORT), + String(P2P_PORT), '-data-dir', - userDataDir, + `${userDataPath}/daemon`, lndhubFlags, ] +console.log(`== ~ daemonArguments:`, daemonArguments) + type ReadyState = {t: 'ready'} type ErrorState = {t: 'error'; message: string} type StartupState = {t: 'startup'} @@ -100,7 +60,7 @@ export function startMainDaemon() { const daemonProcess = spawn(goDaemonExecutablePath, daemonArguments, { // daemon env - cwd: devProjectRoot, + cwd: path.join(process.cwd(), '../../..'), env: { ...process.env, }, @@ -109,12 +69,13 @@ export function startMainDaemon() { let expectingDaemonClose = false daemonProcess.on('error', (err) => { logger.error('Error:', err) + console.log('ERROR', err) }) daemonProcess.on('close', (code, signal) => { if (!expectingDaemonClose) { updateGoDaemonState({ t: 'error', - message: 'Service Error: ' + lastStderr, + message: 'Service Error: !!!' + lastStderr, }) logger.error('Closed:', code, signal) } @@ -157,9 +118,9 @@ export function startMainDaemon() { }) const mainDaemon = { - httpPort: BACKEND_HTTP_PORT, - grpcPort: BACKEND_GRPC_PORT, - p2pPort: BACKEND_P2P_PORT, + httpPort: process.env.VITE_VITE_DESKTOP_HTTP_PORT, + grpcPort: process.env.VITE_VITE_DESKTOP_GRPC_PORT, + p2pPort: process.env.VITE_VITE_DESKTOP_P2P_PORT, } return mainDaemon } diff --git a/frontend/apps/desktop/src/env.d.ts b/frontend/apps/desktop/src/env.d.ts new file mode 100644 index 0000000000..c0f4990e29 --- /dev/null +++ b/frontend/apps/desktop/src/env.d.ts @@ -0,0 +1,14 @@ +/// + +interface ImportMetaEnv { + readonly VITE_VITE_DESKTOP_HTTP_PORT: string + readonly VITE_VITE_DESKTOP_P2P_PORT: string + readonly VITE_VITE_DESKTOP_GRPC_PORT: string + readonly VITE_VITE_DESKTOP_APPDATA: string + readonly VITE_DESKTOP_HOSTNAME: string + readonly VITE_VERSION: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/frontend/apps/desktop/src/logger.ts b/frontend/apps/desktop/src/logger.ts index 1afe503f52..499d414ea4 100644 --- a/frontend/apps/desktop/src/logger.ts +++ b/frontend/apps/desktop/src/logger.ts @@ -3,7 +3,7 @@ import {existsSync, rmSync} from 'fs' import {join} from 'path' import winston from 'winston' import DailyRotateFile from 'winston-daily-rotate-file' -import {APP_USER_DATA_PATH} from './app-paths' +import {IS_PROD, userDataPath} from './app-paths' export const legacyLogsFilePath = legacyLogger.transports.file.getFile().path @@ -12,7 +12,7 @@ if (existsSync(legacyLogsFilePath)) { rmSync(legacyLogsFilePath) } -export const loggingDir = join(APP_USER_DATA_PATH, 'logs') +export const loggingDir = join(userDataPath, 'logs') const winstonLogger = winston.createLogger({ level: 'info', @@ -40,7 +40,7 @@ const winstonLogger = winston.createLogger({ ], }) -if (process.env.NODE_ENV !== 'production') { +if (!IS_PROD) { winstonLogger.add( new winston.transports.Console({ format: winston.format.simple(), diff --git a/frontend/apps/desktop/src/main.ts b/frontend/apps/desktop/src/main.ts index 4f3dc5458e..483bc013c3 100644 --- a/frontend/apps/desktop/src/main.ts +++ b/frontend/apps/desktop/src/main.ts @@ -18,6 +18,8 @@ import {saveCidAsFile} from './save-cid-as-file' const OS_REGISTER_SCHEME = 'hm' +initPaths() + if (IS_PROD_DESKTOP) { if (squirrelStartup) { app.quit() @@ -34,8 +36,6 @@ if (IS_PROD_DESKTOP) { } } -initPaths() - startMainDaemon() Menu.setApplicationMenu(createAppMenu()) diff --git a/frontend/apps/desktop/src/print.ts b/frontend/apps/desktop/src/print.ts new file mode 100644 index 0000000000..754f9d83d9 --- /dev/null +++ b/frontend/apps/desktop/src/print.ts @@ -0,0 +1,10 @@ +console.log(` +================================== + +vars: +process.env.VITE_HTTP_PORT: ${process.env.VITE_VITE_DESKTOP_HTTP_PORT} +process.env.VITE_P2P_PORT: ${process.env.VITE_VITE_DESKTOP_P2P_PORT} +process.env.VITE_GRPC_PORT: ${process.env.VITE_VITE_DESKTOP_GRPC_PORT} + + +==================================`) diff --git a/frontend/apps/desktop/src/process-env.d.ts b/frontend/apps/desktop/src/process-env.d.ts new file mode 100644 index 0000000000..6aa2408022 --- /dev/null +++ b/frontend/apps/desktop/src/process-env.d.ts @@ -0,0 +1,14 @@ +declare global { + namespace NodeJS { + interface ProcessEnv { + [key: string]: string | undefined + VITE_DESKTOP_HTTP_PORT: string + VITE_DESKTOP_P2P_PORT: string + VITE_DESKTOP_GRPC_PORT: string + VITE_DESKTOP_APPDATA: string + VITE_DESKTOP_HOSTNAME: string + VITE_VERSION: string + // add more environment variables and their types here + } + } +} diff --git a/frontend/apps/desktop/src/root.tsx b/frontend/apps/desktop/src/root.tsx index 09637ad1e0..74a0f1b56e 100644 --- a/frontend/apps/desktop/src/root.tsx +++ b/frontend/apps/desktop/src/root.tsx @@ -10,7 +10,7 @@ import {toast} from '@mintter/app/toast' import {NavigationContainer} from '@mintter/app/utils/navigation-container' import {useListenAppEvent} from '@mintter/app/utils/window-events' import {WindowUtils} from '@mintter/app/window-utils' -import {BACKEND_HTTP_URL, createGRPCClient} from '@mintter/shared' +import {API_HTTP_URL, createGRPCClient} from '@mintter/shared' import type {StateStream} from '@mintter/shared/src/utils/stream' import {Spinner, YStack, useStream} from '@mintter/ui' import '@tamagui/core/reset.css' @@ -94,7 +94,7 @@ const loggingInterceptor: Interceptor = (next) => async (req) => { } const transport = createGrpcWebTransport({ - baseUrl: BACKEND_HTTP_URL, + baseUrl: API_HTTP_URL, interceptors: [loggingInterceptor], }) diff --git a/frontend/apps/desktop/src/save-cid-as-file.tsx b/frontend/apps/desktop/src/save-cid-as-file.tsx index 41f7b84dd1..e50023db41 100644 --- a/frontend/apps/desktop/src/save-cid-as-file.tsx +++ b/frontend/apps/desktop/src/save-cid-as-file.tsx @@ -1,5 +1,5 @@ import {toast} from '@mintter/app/toast' -import {BACKEND_HTTP_URL} from '@mintter/shared' +import {API_HTTP_URL} from '@mintter/shared' import {app, dialog, net} from 'electron' import fs from 'fs' @@ -7,7 +7,7 @@ const {debug, error} = console export async function saveCidAsFile(event, args) { const {cid, name} = args - const request = net.request(`${BACKEND_HTTP_URL}/ipfs/${cid}`) + const request = net.request(`${API_HTTP_URL}/ipfs/${cid}`) debug('Saving cid to ' + app.getPath('downloads')) request.on('response', (response) => { if (response.statusCode === 200) { diff --git a/frontend/apps/desktop/test/fixtures.ts b/frontend/apps/desktop/test/fixtures.ts new file mode 100644 index 0000000000..4361fdf8d4 --- /dev/null +++ b/frontend/apps/desktop/test/fixtures.ts @@ -0,0 +1,38 @@ +import {test as baseTest} from '@playwright/test' +import {HomePage} from './home-page.pom' +import {OnboardingPage} from './onboadring.pom' +import {startApp} from './utils' + +export const test = baseTest.extend<{ + onboardingPage: OnboardingPage + homePage: HomePage +}>({ + /** + * + * This fixture will start the app with no account + */ + onboardingPage: async ({}, use) => { + let data = await startApp() + let onboardingPage = new OnboardingPage(data) + await use(onboardingPage) + + await onboardingPage.appData.appWindow.close() + await onboardingPage.appData.app.close() + }, + /** + * + * This fixture will create a new account and land you on the home screen + */ + homePage: async ({}, use) => { + let alias = 'testAlias' + let bio = 'test bio' + let data = await startApp() + let homePage = new HomePage(data, alias, bio) + await homePage.goto() + + await use(homePage) + + await homePage.appData.appWindow.close() + await homePage.appData.app.close() + }, +}) diff --git a/frontend/apps/desktop/test/home-page.pom.ts b/frontend/apps/desktop/test/home-page.pom.ts new file mode 100644 index 0000000000..389aef4feb --- /dev/null +++ b/frontend/apps/desktop/test/home-page.pom.ts @@ -0,0 +1,35 @@ +import {AppData} from './types' + +export class HomePage { + readonly appData: AppData + alias: string + bio: string + + constructor(data: AppData, alias = 'testAlias', bio = 'test bio') { + this.appData = data + this.alias = alias + this.bio = bio + } + + async goto() { + await this.appData.appWindow.locator('#btn-new-account').click() + + await this.appData.appWindow.locator('#btn-tab-ownwords').click() + await this.appData.appWindow + .locator('#ownwords-input') + .fill( + 'rib canal floor bubble hundred wild bring olive minimum veteran tip snack', + ) + await this.appData.appWindow.locator('#btn-next').click() + + await this.appData.appWindow.locator('#alias').fill(this.alias) + await this.appData.appWindow.locator('#bio').fill(this.bio) + await this.appData.appWindow.locator('#btn-next').click() + + await this.appData.appWindow.locator('#btn-next').click() + await this.appData.appWindow.waitForTimeout(10) + await this.appData.appWindow.locator('#btn-next').click() + await this.appData.appWindow.waitForTimeout(10) + await this.appData.appWindow.locator('#btn-next').click() + } +} diff --git a/frontend/apps/desktop/test/onboadring.pom.ts b/frontend/apps/desktop/test/onboadring.pom.ts new file mode 100644 index 0000000000..e1cea288d4 --- /dev/null +++ b/frontend/apps/desktop/test/onboadring.pom.ts @@ -0,0 +1,11 @@ +import {AppData} from './types' + +export class OnboardingPage { + readonly appData: AppData + + constructor(data: AppData) { + this.appData = data + } + + // No need for a `goto` method here because we assume we land here in the first place when the app has no account +} diff --git a/frontend/apps/desktop/test/onboarding.spec.ts b/frontend/apps/desktop/test/onboarding.spec.ts deleted file mode 100755 index 5ed5e255e7..0000000000 --- a/frontend/apps/desktop/test/onboarding.spec.ts +++ /dev/null @@ -1,166 +0,0 @@ -import {Page, test, expect} from '@playwright/test' -import {alias, bio, electronApp} from './test-setup' -import fs from 'fs' -import path from 'path' -import os from 'os' - -let page: Page - -test.beforeEach(() => { - // remove the app data: - fs.rm( - path.join(os.homedir(), 'Library', 'Application Support', 'Mintter.test'), - {recursive: true}, - (...args) => { - console.log('== DELETE??', args) - }, - ) -}) - -test('Onboarding: New Account', async () => { - page = await electronApp.firstWindow() - - await page.waitForSelector('#welcome-title-section') - - // const text = await page.$eval( - // '[data-testid="step-title"]', - // (el) => el.textContent, - // ) - const welcomeTitles = await page - .locator('#welcome-title-section') - .allTextContents() - - console.log(`== ~ test ~ welcomeTitles:`, welcomeTitles) - expect(welcomeTitles).toEqual(['Welcome toMintter']) - - await page.click('#btn-new-account') - - await page.waitForSelector('#mnemonics-title-section') - - // Mnemonics Step - const mnemonicsTitles = await page - .locator('#mnemonics-title-section') - .allTextContents() - console.log(`== ~ test ~ mnemonicsTitles:`, mnemonicsTitles) - expect(mnemonicsTitles).toEqual(['Your Keys.Your Data.']) - const mnemonics = await page.locator('#mnemonics') - expect(mnemonics).toBeVisible() - - // await page.waitForTimeout(5000) - // // check prev button - expect(await page.locator('#btn-next')).toBeVisible() - expect(await page.locator('#btn-prev')).not.toBeDisabled() - - // // check if the mnemonics are the correct amount of words - let text = (await mnemonics.allTextContents())[0] - let words = text?.split(', ') - - console.log(`== ~ test ~ words:`, words) - expect(words).toHaveLength(12) - - // // toggle own seed textarea - await page.click('#btn-toggle-seed') - const textarea = await page.locator('#mnemonics-input') - expect(textarea).toBeVisible() - await page.click('#btn-toggle-seed') - - // // continue to next step - await page.click('#btn-next') - - await page.waitForSelector('#profile-title-section') - // // check Profile step title - const profileTitles = await page - .locator('#profile-title-section') - .allTextContents() - expect(profileTitles).toEqual(['ProfileInformation']) - - // // check profile alias input - let inputAlias = await page.locator('#alias') - expect(inputAlias).toBeVisible() - await inputAlias.fill(alias) - - // // check profile bio input - let inputBio = await page.locator('#bio') - expect(inputBio).toBeVisible() - await inputBio.fill(bio) - - page.waitForTimeout(100) - // // check prev button - // expect(await page.locator('#btn-next')).toBeVisible() - // expect(await page.locator('#btn-prev')).not.toBeDisabled() - - // continue to next step - await page.click('#btn-next') - - // page.waitForTimeout(1000) - - await page.waitForSelector('#analytics-title-section') - // // check Analytics step title - const analyticsTitles = await page - .locator('#analytics-title-section') - .allTextContents() - expect(analyticsTitles).toEqual(['CrashAnalytics']) - - // // check prev button - // expect(await page.locator('#btn-next')).toBeVisible() - // expect(await page.locator('#btn-prev')).not.toBeDisabled() - - // // continue to next step - await page.click('#btn-next') - // // await page.waitForTimeout(10000) - - // // check finish step - await page.waitForSelector('#complete-title-section') - // check Analytics step title - const finishTitles = await page - .locator('#complete-title-section') - .allTextContents() - expect(finishTitles).toEqual(['You are Ready!']) - - // await page.getByRole('button', {name: 'Open Mintter App'}).click() -}) - -test.skip('Onboarding: Add new Device', async () => { - page = await electronApp.firstWindow() - - await page.waitForSelector('#welcome-title-section') - - // const text = await page.$eval( - // '[data-testid="step-title"]', - // (el) => el.textContent, - // ) - const welcomeTitles = await page - .locator('#welcome-title-section') - .allTextContents() - - console.log(`== ~ test ~ welcomeTitles:`, welcomeTitles) - expect(welcomeTitles).toEqual(['Welcome toMintter']) - - await page.click('#btn-new-device') - - await page.waitForSelector('#new-device-title-section') - - // Mnemonics Step - const newDeviceTitles = await page - .locator('#new-device-title-section') - .allTextContents() - console.log(`== ~ test ~ newDeviceTitles:`, newDeviceTitles) - expect(newDeviceTitles).toEqual(['SetupNew device.']) - const mnemonics = await page.locator('#mnemonic-input') - expect(mnemonics).toBeVisible() - - mnemonics.fill( - 'banana, ridge, galaxy, melt, tobacco, bid, rhythm, spread, tiny, loop, kite, emerge', - ) - - // continue to next step - await page.click('#btn-next') - - // check finish step - await page.waitForSelector('#complete-title-section') - // check Analytics step title - const finishTitles = await page - .locator('#complete-title-section') - .allTextContents() - expect(finishTitles).toEqual(['You are Ready!']) -}) diff --git a/frontend/apps/desktop/test/post-test.js b/frontend/apps/desktop/test/post-test.js deleted file mode 100644 index 5f3d09fe5f..0000000000 --- a/frontend/apps/desktop/test/post-test.js +++ /dev/null @@ -1,35 +0,0 @@ -const path = require('path') -const fs = require('fs') -const os = require('os') -const fsExtra = require('fs-extra') - -let appDataPath = { - darwin: `${os.homedir()}/Library/Application Support`, - linux: `${os.homedir()}/.config`, - win32: '%APPDATA%', -} - -const daemonPath = path.join(appDataPath[process.platform], 'Mintter', 'daemon') - -const daemonTempPath = `${daemonPath}_temp` - -if (!process.env.CI) { - cleanup() -} - -// ======== - -function cleanup() { - console.error('[DESKTOP TEST]: Start cleanup') - console.log('[DESKTOP TEST]: remove daemon test folder generated') - fs.rm(daemonPath, {recursive: true, force: true}, () => {}) - - if (fs.existsSync(daemonTempPath)) { - console.log(`[DESKTOP TEST]: restore previous daemon folder back`) - // Rename the '_temp' folder back to 'daemon' - fsExtra.copySync(daemonTempPath, daemonPath) - fs.rm(daemonTempPath, {recursive: true, force: true}, () => {}) - } - - console.error('[DESKTOP TEST]: Finish cleanup') -} diff --git a/frontend/apps/desktop/test/pre-test.js b/frontend/apps/desktop/test/pre-test.js deleted file mode 100644 index b65adde2a9..0000000000 --- a/frontend/apps/desktop/test/pre-test.js +++ /dev/null @@ -1,43 +0,0 @@ -const path = require('path') -const fs = require('fs') -const os = require('os') - -let appDataPath = { - darwin: `${os.homedir()}/Library/Application Support`, - linux: `${os.homedir()}/.config`, - win32: '%APPDATA%', -} - -const daemonPath = path.join(appDataPath[process.platform], 'Mintter', 'daemon') - -const daemonTempPath = `${daemonPath}_temp` - -if (!process.env.CI) { - checkAndRenameFolder(daemonPath) -} - -// ======== - -function checkAndRenameFolder(path) { - console.error('[DESKTOP TEST]: Start preTest') - console.log(`[DESKTOP TEST]: Checking if ${daemonPath} folder exists`) - fs.rm(daemonTempPath, {recursive: true}, () => {}) - if (fs.existsSync(daemonPath)) { - if (fs.existsSync(daemonTempPath)) { - console.log( - `[DESKTOP TEST]: daemon test path already exists, proceed to remove current daemon...`, - ) - fs.rm(daemonPath, {recursive: true}, () => {}) - } else { - console.log( - `[DESKTOP TEST]: daemon path already exists, proceed to rename...`, - ) - } - fs.renameSync(daemonPath, daemonTempPath) - } else { - console.log( - `[DESKTOP TEST]: daemon folder does not exist. no action required`, - ) - } - console.error('[DESKTOP TEST]: Finish preTest') -} diff --git a/frontend/apps/desktop/test/test-setup.ts b/frontend/apps/desktop/test/test-setup.ts deleted file mode 100755 index 6db9966fb3..0000000000 --- a/frontend/apps/desktop/test/test-setup.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - ElectronApplication, - _electron as electron, - test, -} from '@playwright/test' -import {findLatestBuild, parseElectronApp} from 'electron-playwright-helpers' - -let electronApp: ElectronApplication - -test.beforeAll(async () => { - // find the latest build in the out directory - const latestBuild = findLatestBuild() - - // parse the directory and find paths and other info - const appInfo = parseElectronApp(latestBuild) - - // set the CI environment variable to true - process.env.CI = 'e2e' - - electronApp = await electron.launch({ - args: [appInfo.main], - executablePath: appInfo.executable, - }) - - electronApp.on('window', async (page) => { - const filename = page.url()?.split('/').pop() - - // capture errors - page.on('pageerror', (error) => { - console.error(error) - }) - // capture console messages - page.on('console', (msg) => { - console.log(msg.text()) - }) - }) -}) - -test.afterAll(async () => { - // close app - await electronApp.close() -}) - -export {electronApp} - -export const alias = 'test alias' -export const bio = 'some random test bio' diff --git a/frontend/apps/desktop/test/types.ts b/frontend/apps/desktop/test/types.ts new file mode 100644 index 0000000000..c16e4ab979 --- /dev/null +++ b/frontend/apps/desktop/test/types.ts @@ -0,0 +1,29 @@ +import {startApp} from './utils' + +export enum LocatorStrategy { + id = 'id', + xpath = 'xpath', + role = 'role', + altText = 'altText', + text = 'text', + placeholder = 'placeholder', +} + +export type AppData = Awaited> + +type Architecture = 'x64' | 'x32' | 'arm64' +export interface ElectronAppInfo { + /** Path to the app's executable file */ + executable: string + /** Path to the app's main (JS) file */ + main: string + /** Name of the app */ + name: string + /** Resources directory */ + resourcesDir: string + /** True if the app is using asar */ + asar: boolean + /** OS platform */ + platform: 'darwin' | 'win32' | 'linux' + arch: Architecture +} diff --git a/frontend/apps/desktop/test/utils.ts b/frontend/apps/desktop/test/utils.ts new file mode 100644 index 0000000000..45806894c1 --- /dev/null +++ b/frontend/apps/desktop/test/utils.ts @@ -0,0 +1,301 @@ +// Helpers copied from https://github.com/kubeshop/monokle/blob/main/tests/electronHelpers.ts +import {Page, _electron as electron} from '@playwright/test' +import * as ASAR from 'asar' +import * as fs from 'fs' +import log from 'loglevel' +import os from 'os' +import * as path from 'path' + +/** + * Find the latest build and start monokle app for testing + */ +export async function startApp() { + // find the latest build in the out directory + const latestBuild = findLatestBuild() + // parse the directory and find paths and other info + const appInfo = parseElectronApp(latestBuild) + + // deleteApplicationConfig(appInfo.platform); + const electronApp = await electron.launch({ + args: [appInfo.main], + executablePath: appInfo.executable, + }) + + // // wait for splash-screen to pass + // await electronApp.firstWindow(); + // while (electronApp.windows().length === 2) { + + // await pause(100); + // } + + const windows = electronApp.windows() + + // if (windows.length != 1) { + // console.log(`== ~ startApp ~ windows:`, windows) + // throw new Error('too many windows open') + // } + const appWindow: Page = windows[0] + appWindow.on('console', log.info) + + // await appWindow.screenshot({ + // path: getRecordingPath(appInfo.platform, 'before-modals.png'), + // timeout: 45000, + // }); + + // await closeNotification(appWindow, 20000); + + // for (const modalName of modalsToWait) { + // const modal = await waitForModalToShow(appWindow, modalName, 20000); + // if (modal) { + // await closeModal(modal); + // await pause(500); + // await waitForModalToHide(appWindow, modalName, 20000); + // await pause(500); + // await clickOnMonokleLogo(appWindow); + // } + // await appWindow.screenshot({ + // path: getRecordingPath(appInfo.platform, `modal-gone-${modalName}.png`), + // }); + // } + + // Capture a screenshot. + // await appWindow.screenshot({ + // path: getRecordingPath(appInfo.platform, 'initial-screen.png'), + // }); + return { + getWindow: async () => await electronApp.firstWindow(), + appInfo, + app: electronApp, + appWindow, + } +} + +/** + * Parses the `out` directory to find the latest build. + * Use `npm run package` (or similar) to build your app prior to testing. + * @returns path to the most recently modified build directory + */ +export function findLatestBuild(): string { + // root of your project + const rootDir = path.resolve('./') + // directory where the builds are stored + const outDir = path.join(rootDir, 'out') + // list of files in the out directory + const builds = fs.readdirSync(outDir) + const platforms = [ + 'win32', + 'win', + 'windows', + 'darwin', + 'mac', + 'macos', + 'osx', + 'linux', + 'ubuntu', + ] + + const latestBuild = builds + .map((fileName) => { + // make sure it's a directory with "-" delimited platform in its name + const stats = fs.statSync(path.join(outDir, fileName)) + const isBuild = fileName + .toLocaleLowerCase() + .split('-') + .some((part) => platforms.includes(part)) + if (stats.isDirectory() && isBuild) { + return { + name: fileName, + time: fs.statSync(path.join(outDir, fileName)).mtimeMs, + } + } + }) + // @ts-ignore + .sort((a, b) => b.time - a.time) + .map((file) => { + if (file) { + return file.name + } + })[0] + if (!latestBuild) { + throw new Error('No build found in out directory') + } + return path.join(outDir, latestBuild) +} + +/** + * Given a directory containing an Electron app build, + * return the path to the app's executable and the path to the app's main file. + */ +export function parseElectronApp(buildDir: string): ElectronAppInfo { + log.info(`Parsing Electron app in ${buildDir}`) + let platform: string | undefined + if (buildDir.endsWith('.app')) { + buildDir = path.dirname(buildDir) + platform = 'darwin' + } + if (buildDir.endsWith('.exe')) { + buildDir = path.dirname(buildDir) + platform = 'win32' + } + + const baseName = path.basename(buildDir).toLowerCase() + if (!platform) { + // parse the directory name to figure out the platform + if (baseName.includes('win')) { + platform = 'win32' + } + if ( + baseName.includes('linux') || + baseName.includes('ubuntu') || + baseName.includes('debian') + ) { + platform = 'linux' + } + if ( + baseName.includes('darwin') || + baseName.includes('mac') || + baseName.includes('osx') + ) { + platform = 'darwin' + } + } + + if (!platform) { + throw new Error(`Platform not found in directory name: ${baseName}`) + } + + let arch: ReturnType + if (baseName.includes('x32') || baseName.includes('i386')) { + arch = 'x32' + } + if (baseName.includes('x64')) { + arch = 'x64' + } + if (baseName.includes('arm64')) { + arch = 'arm64' + } + + let executable: string + let main: string + let name: string + let asar: boolean + let resourcesDir: string + + if (platform === 'darwin') { + // MacOS Structure + // / + // .app/ + // Contents/ + // MacOS/ + // (executable) + // Info.plist + // PkgInfo + // Resources/ + // electron.icns + // file.icns + // app.asar (asar bundle) - or - + // app + // package.json + // (your app structure) + + const list = fs.readdirSync(buildDir) + const appBundle = list.find((fileName) => { + return fileName.endsWith('.app') + }) + // @ts-ignore + const appDir = path.join(buildDir, appBundle, 'Contents', 'MacOS') + const appName = fs.readdirSync(appDir)[0] + executable = path.join(appDir, appName) + + // @ts-ignore + resourcesDir = path.join(buildDir, appBundle, 'Contents', 'Resources') + const resourcesList = fs.readdirSync(resourcesDir) + asar = resourcesList.includes('app.asar') + + let packageJson: {main: string; name: string} + if (asar) { + const asarPath = path.join(resourcesDir, 'app.asar') + packageJson = JSON.parse( + ASAR.extractFile(asarPath, 'package.json').toString('utf8'), + ) + main = path.join(asarPath, packageJson.main) + } else { + packageJson = JSON.parse( + fs.readFileSync(path.join(resourcesDir, 'app', 'package.json'), 'utf8'), + ) + main = path.join(resourcesDir, 'app', packageJson.main) + } + name = packageJson.name + } else if (platform === 'win32') { + // Windows Structure + // / + // .exe (executable) + // resources/ + // app.asar (asar bundle) - or - + // app + // package.json + // (your app structure) + + const list = fs.readdirSync(buildDir) + const exe = list.find((fileName) => { + return fileName.endsWith('.exe') + }) + // @ts-ignore + executable = path.join(buildDir, exe) + + resourcesDir = path.join(buildDir, 'resources') + const resourcesList = fs.readdirSync(resourcesDir) + asar = resourcesList.includes('app.asar') + + let packageJson: {main: string; name: string} + + if (asar) { + const asarPath = path.join(resourcesDir, 'app.asar') + packageJson = JSON.parse( + ASAR.extractFile(asarPath, 'package.json').toString('utf8'), + ) + main = path.join(asarPath, packageJson.main) + } else { + packageJson = JSON.parse( + fs.readFileSync(path.join(resourcesDir, 'app', 'package.json'), 'utf8'), + ) + main = path.join(resourcesDir, 'app', packageJson.main) + } + name = packageJson.name + } else { + /** @todo add support for linux */ + throw new Error(`Platform not supported: ${platform}`) + } + return { + executable, + main, + asar, + name, + platform, + resourcesDir, + // @ts-ignore + arch, + } +} + +const MAC_CONFIG_PATH = ['Library', 'Application Support', 'Mintter'] +const WIN_CONFIG_PATH = ['AppData', 'Roaming', 'Mintter'] + +export const deleteApplicationConfig = (platform: string) => { + let tempPath + + if (platform === 'darwin') { + tempPath = MAC_CONFIG_PATH.join(path.sep) + } + if (platform === 'win32') { + tempPath = WIN_CONFIG_PATH.join(path.sep) + } + + try { + if (tempPath) { + fs.unlinkSync(path.join(os.homedir(), tempPath, 'config.json')) + } + } catch (error) { + log.error(error.message) + } +} diff --git a/frontend/apps/desktop/tests/e2e.template.ts b/frontend/apps/desktop/tests/e2e.template.ts new file mode 100755 index 0000000000..89d08b8844 --- /dev/null +++ b/frontend/apps/desktop/tests/e2e.template.ts @@ -0,0 +1,6 @@ +import {test} from '../test/fixtures' + +test.skip('Template test', async ({homePage, onboardingPage}) => { + // let {appWindow} = homePage + // let {appWindow, alias} = onboardingPage +}) diff --git a/frontend/apps/desktop/tests/home-documents.e2e.ts b/frontend/apps/desktop/tests/home-documents.e2e.ts new file mode 100644 index 0000000000..17cfefefef --- /dev/null +++ b/frontend/apps/desktop/tests/home-documents.e2e.ts @@ -0,0 +1,11 @@ +import {expect} from 'playwright/test' +import {test} from '../test/fixtures' + +test('Onboarding With recovery phrase', async ({homePage}) => { + // Increased the timeout here to give the gateway a little bit more time to get connected. + test.setTimeout(60000) + let {appData, alias} = homePage + let {appWindow} = appData + + await expect(await appWindow.getByText(alias)).toBeVisible() +}) diff --git a/frontend/apps/desktop/tests/onboarding-from-scratch.e2e.ts b/frontend/apps/desktop/tests/onboarding-from-scratch.e2e.ts new file mode 100755 index 0000000000..63cb4549e1 --- /dev/null +++ b/frontend/apps/desktop/tests/onboarding-from-scratch.e2e.ts @@ -0,0 +1,66 @@ +import {test} from '../test/fixtures' + +import {expect} from '@playwright/test' + +test('Onboarding from scratch', async ({onboardingPage}) => { + let {appWindow} = onboardingPage.appData + await test.step('Welcome Screen', async () => { + let startBtn = await appWindow.locator('#btn-new-account') + await expect(startBtn).toBeVisible() + await startBtn.click() + }) + + await test.step('Secret Recovery phrase', async () => { + let elPhrase = await appWindow.locator('#recovery-phrase-words') + let phraseTxt = await elPhrase.textContent() + let elNextBtn = await appWindow.locator('#btn-next') + let elCheck1 = await appWindow.locator('#check1') + let elCheck2 = await appWindow.locator('#check2') + await expect(phraseTxt).toBeTruthy() + await expect(phraseTxt?.split(' ').length).toEqual(12) + await expect(elNextBtn).toBeDisabled() + await elCheck1.check() + await elCheck2.check() + expect(elNextBtn).not.toBeDisabled() + await elNextBtn.click() + }) + + await test.step('Profile Data', async () => { + let elAlias = appWindow.locator('#alias') + let elBio = appWindow.locator('#bio') + let elNextBtn = await appWindow.locator('#btn-next') + + await elAlias.fill('testAlias') + await elBio.fill('test bio') + + await elNextBtn.click() + }) + + await test.step('Wallet', async () => { + // TODO: uncomment wallet accept flow when backend is fixed + let elWalletBtn = await appWindow.locator('#btn-accept-wallet') + let elNextBtn = await appWindow.locator('#btn-next') + // we need to give the backend some warm-up time for this to work. + await appWindow.waitForTimeout(10_000) + await elWalletBtn.click() + let elWalletSuccessMssg = await appWindow.getByText( + 'Your wallet is ready to use!', + ) + await expect(elWalletSuccessMssg).toBeVisible() + expect(elNextBtn).toBeInViewport() + await elNextBtn.click() + }) + + await test.step('Analytics', async () => { + let elNextBtn = await appWindow.locator('#btn-next') + expect(elNextBtn).toBeInViewport() + await elNextBtn.click() + }) + + await test.step('Connect to Site', async () => { + let elNextBtn = await appWindow.locator('#btn-next') + let elSkipBtn = await appWindow.locator('#btn-skip') + expect(elNextBtn).toBeInViewport() + await elSkipBtn.click() + }) +}) diff --git a/frontend/apps/desktop/tests/onboarding-new-device.e2e.ts b/frontend/apps/desktop/tests/onboarding-new-device.e2e.ts new file mode 100755 index 0000000000..9290903c13 --- /dev/null +++ b/frontend/apps/desktop/tests/onboarding-new-device.e2e.ts @@ -0,0 +1,35 @@ +import {test} from '../test/fixtures' + +import {expect} from '@playwright/test' + +test('Onboarding by adding a new device to account', async ({ + onboardingPage, +}) => { + let {appWindow} = onboardingPage.appData + + await test.step('Welcome Screen', async () => { + let startBtn = await appWindow.locator('#btn-new-device') + await expect(startBtn).toBeVisible() + await startBtn.click() + }) + + await test.step('Add new Device with Secret Recovery phrase', async () => { + let elOwnWordsInput = await appWindow.getByRole('textbox') + let elNextBtn = await appWindow.getByRole('button', {name: 'NEXT'}) + await elOwnWordsInput.fill('foo') + await elNextBtn.click() + expect(await appWindow.locator('#mnemonics-error-box')).toBeVisible() + await elOwnWordsInput.clear() + await elOwnWordsInput.fill( + 'rib canal floor bubble hundred wild bring olive minimum veteran tip snack', + ) + await elNextBtn.click() + }) + + await test.step('Connect to Site', async () => { + let elNextBtn = await appWindow.locator('#btn-next') + let elSkipBtn = await appWindow.locator('#btn-skip') + expect(elNextBtn).toBeInViewport() + await elSkipBtn.click() + }) +}) diff --git a/frontend/apps/desktop/tests/onboarding-with-secret.e2e.ts b/frontend/apps/desktop/tests/onboarding-with-secret.e2e.ts new file mode 100755 index 0000000000..06f374ceab --- /dev/null +++ b/frontend/apps/desktop/tests/onboarding-with-secret.e2e.ts @@ -0,0 +1,63 @@ +import {test} from '../test/fixtures' + +import {expect} from '@playwright/test' + +test('Onboarding With recovery phrase', async ({onboardingPage}) => { + let {appWindow} = onboardingPage.appData + + await test.step('Welcome Screen', async () => { + let startBtn = await appWindow.locator('#btn-new-account') + await expect(startBtn).toBeVisible() + await startBtn.click() + }) + + await test.step('Secret Recovery phrase', async () => { + let elOwnWordsTabBtn = await appWindow.locator('#btn-tab-ownwords') + let elOwnWordsInput = await appWindow.locator('#ownwords-input') + let elNextBtn = await appWindow.locator('#btn-next') + + await elOwnWordsTabBtn.click() + expect(elOwnWordsInput).toBeVisible() + await elOwnWordsInput.fill('foo') + await elNextBtn.click() + await expect(await appWindow.locator('#mnemonics-error-box')).toBeVisible() + await elOwnWordsInput.clear() + await elOwnWordsInput.fill( + 'rib canal floor bubble hundred wild bring olive minimum veteran tip snack', + ) + await elNextBtn.click() + }) + + await test.step('Profile data', async () => { + let elAlias = appWindow.locator('#alias') + let elBio = appWindow.locator('#bio') + let elNextBtn = await appWindow.locator('#btn-next') + + await elAlias.fill('testAlias') + await elBio.fill('test bio') + + await elNextBtn.click() + }) + + await test.step('Wallet', async () => { + // let elWalletBtn = await appWindow.locator('#btn-accept-wallet') + let elNextBtn = await appWindow.locator('#btn-next') + // elWalletBtn.click() + // expect(elWalletBtn).toBeVisible() + expect(elNextBtn).toBeInViewport() + await elNextBtn.click() + }) + + await test.step('Analytics', async () => { + let elNextBtn = await appWindow.locator('#btn-next') + expect(elNextBtn).toBeInViewport() + await elNextBtn.click() + }) + + await test.step('Connect to Site', async () => { + let elNextBtn = await appWindow.locator('#btn-next') + let elSkipBtn = await appWindow.locator('#btn-skip') + expect(elNextBtn).toBeInViewport() + await elSkipBtn.click() + }) +}) diff --git a/frontend/apps/desktop/vite.main.config.ts b/frontend/apps/desktop/vite.main.config.ts index eda848835e..f2f0eed258 100644 --- a/frontend/apps/desktop/vite.main.config.ts +++ b/frontend/apps/desktop/vite.main.config.ts @@ -1,6 +1,6 @@ import {sentryVitePlugin} from '@sentry/vite-plugin' import {tamaguiPlugin} from '@tamagui/vite-plugin' -import {defineConfig, loadEnv} from 'vite' +import {defineConfig} from 'vite' import tsConfigPaths from 'vite-tsconfig-paths' const _tamaguiPlugin = tamaguiPlugin({ @@ -16,7 +16,6 @@ const _tamaguiPlugin = tamaguiPlugin({ export default defineConfig(({command, mode}) => { // Load env file based on `mode` in the current working directory. // Set the third parameter to '' to load all env regardless of the `VITE_` prefix. - const env = loadEnv(mode, process.cwd(), '') return { build: { sourcemap: true, diff --git a/frontend/apps/site/.eslintrc.js b/frontend/apps/site/.eslintrc.js deleted file mode 100644 index 8814f42ad6..0000000000 --- a/frontend/apps/site/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: ['custom'], - root: true, -} diff --git a/frontend/apps/site/next.config.js b/frontend/apps/site/next.config.js index 4021d9d873..503f183d9e 100644 --- a/frontend/apps/site/next.config.js +++ b/frontend/apps/site/next.config.js @@ -141,7 +141,7 @@ module.exports = withSentryConfig( // https://github.com/getsentry/sentry-webpack-plugin#options // Suppresses source map uploading logs during build - silent: true, + silent: process.env.NODE_ENV == 'production', org: 'mintter', project: 'sites', }, @@ -162,6 +162,6 @@ module.exports = withSentryConfig( hideSourceMaps: true, // Automatically tree-shake Sentry logger statements to reduce bundle size - disableLogger: true, + disableLogger: process.env.NODE_ENV == 'development', }, ) diff --git a/frontend/apps/site/package.json b/frontend/apps/site/package.json index b22b7e6621..17142e868d 100644 --- a/frontend/apps/site/package.json +++ b/frontend/apps/site/package.json @@ -8,7 +8,6 @@ "next:build": "yarn next build", "start": "yarn next start", "serve": "NODE_ENV=production yarn next start --port 8151", - "lint": "next lint", "format": "prettier \"**/*.{ts,tsx,md,mdx,json,js}\" --check --ignore-path ../../../.prettierignore", "test": "echo 'SITE: NO TESTS';", "with-env": "TAMAGUI_TARGET=web" @@ -60,7 +59,6 @@ "@types/react-dom": "18.2.7", "@types/react-native": "0.71.8", "@types/unist": "2.0.6", - "eslint-config-custom": "*", "expo-modules-core": "0.6.5", "expo-screen-orientation": "4.3.0", "next-transpile-modules": "10.0.1", diff --git a/frontend/apps/site/sentry.client.config.ts b/frontend/apps/site/sentry.client.config.ts index 7880dfde18..a09706ef6b 100644 --- a/frontend/apps/site/sentry.client.config.ts +++ b/frontend/apps/site/sentry.client.config.ts @@ -1,12 +1,10 @@ // This file configures the initialization of Sentry on the client. // The config you add here will be used whenever a users loads a page in their browser. // https://docs.sentry.io/platforms/javascript/guides/nextjs/ - import * as Sentry from '@sentry/nextjs' -console.log('=== SENTRY SETUP: NODE_ENV ====', process.env.NODE_ENV) if (process.env.NODE_ENV == 'production') { Sentry.init({ - dsn: process.env.HM_SENTRY_SITE_DSN, + dsn: process.env.HM_SENTRY_DESKTOP_DSN, // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/frontend/apps/site/sentry.edge.config.ts b/frontend/apps/site/sentry.edge.config.ts index 09a9ccf14a..3687432b07 100644 --- a/frontend/apps/site/sentry.edge.config.ts +++ b/frontend/apps/site/sentry.edge.config.ts @@ -4,7 +4,7 @@ // https://docs.sentry.io/platforms/javascript/guides/nextjs/ import * as Sentry from '@sentry/nextjs' -console.log('=== SENTRY SETUP: NODE_ENV ====', process.env.NODE_ENV) + if (process.env.NODE_ENV == 'production') { Sentry.init({ dsn: process.env.HM_SENTRY_SITE_DSN, @@ -13,7 +13,7 @@ if (process.env.NODE_ENV == 'production') { tracesSampleRate: 1, // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: true, + debug: false, }) } else { console.log( diff --git a/frontend/apps/site/sentry.server.config.ts b/frontend/apps/site/sentry.server.config.ts index be4c75aaa5..f056f103fa 100644 --- a/frontend/apps/site/sentry.server.config.ts +++ b/frontend/apps/site/sentry.server.config.ts @@ -3,7 +3,7 @@ // https://docs.sentry.io/platforms/javascript/guides/nextjs/ import * as Sentry from '@sentry/nextjs' -console.log('=== SENTRY SETUP: NODE_ENV ====', process.env.NODE_ENV) + if (process.env.NODE_ENV == 'production') { Sentry.init({ dsn: process.env.HM_SENTRY_SITE_DSN, @@ -12,7 +12,7 @@ if (process.env.NODE_ENV == 'production') { tracesSampleRate: 1, // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: true, + debug: false, }) } else { console.log( diff --git a/frontend/apps/site/src/client.ts b/frontend/apps/site/src/client.ts index 302360fdfc..1fc8e0838f 100644 --- a/frontend/apps/site/src/client.ts +++ b/frontend/apps/site/src/client.ts @@ -8,6 +8,10 @@ import type {Interceptor} from '@connectrpc/connect' import {createGrpcWebTransport} from '@connectrpc/connect-node' import {createGRPCClient} from '@mintter/shared' +const IS_DEV = process.env.NODE_ENV == 'development' +const IS_PROD = process.env.NODE_ENV == 'production' +const IS_CLIENT = !!global.window + const loggingInterceptor: Interceptor = (next) => async (req) => { try { const result = await next(req) @@ -42,23 +46,21 @@ const prodInter: Interceptor = (next) => async (req) => { return result } +// const DEV_INTERCEPTORS = IS_CLIENT ? [loggingInterceptor] : [] +const DEV_INTERCEPTORS = [loggingInterceptor, prodInter] + function getGRPCHost() { if (process.env.GRPC_HOST) { return process.env.GRPC_HOST } - if (process.env.NODE_ENV == 'development') { - return 'http://127.0.0.1:56001' + if (IS_PROD) { + return 'https://hyper.media' } - return 'https://hyper.media' + return 'http://127.0.0.1:56001' } -const IS_DEV = process.env.NODE_ENV == 'development' -const IS_CLIENT = !!global.window -// const DEV_INTERCEPTORS = IS_CLIENT ? [loggingInterceptor] : [] -const DEV_INTERCEPTORS = [loggingInterceptor, prodInter] - let grpcBaseURL = getGRPCHost() console.log('⚙️ Client Config ', { diff --git a/frontend/packages/app/.eslintrc.js b/frontend/packages/app/.eslintrc.js deleted file mode 100644 index de6bdbc522..0000000000 --- a/frontend/packages/app/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: ['custom'], - ignorePatterns: ['.eslintrc.js'], -} diff --git a/frontend/packages/app/components/app-embeds.tsx b/frontend/packages/app/components/app-embeds.tsx index 80f016bba8..9b62d8ed10 100644 --- a/frontend/packages/app/components/app-embeds.tsx +++ b/frontend/packages/app/components/app-embeds.tsx @@ -1,5 +1,5 @@ import { - BACKEND_FILE_URL, + API_FILE_URL, BlockContentUnknown, BlockNodeContent, BlockNodeList, @@ -165,7 +165,7 @@ export function EmbedComment(props: EntityComponentProps) { id={account.data?.id} url={ account.data?.profile?.avatar - ? `${BACKEND_FILE_URL}/${account.data?.profile?.avatar}` + ? `${API_FILE_URL}/${account.data?.profile?.avatar}` : undefined } /> diff --git a/frontend/packages/app/components/app-error.tsx b/frontend/packages/app/components/app-error.tsx index 7643eb6b66..d4f3020722 100644 --- a/frontend/packages/app/components/app-error.tsx +++ b/frontend/packages/app/components/app-error.tsx @@ -1,3 +1,4 @@ +import {GRPC_PORT, HTTP_PORT, P2P_PORT} from '@mintter/shared' import { Button, Heading, @@ -40,6 +41,16 @@ export function AppErrorContent({ message: string resetErrorBoundary?: () => void }) { + console.log(` +================================== + +vars: +VITE_HTTP_PORT: ${HTTP_PORT} +process.env.VITE_P2P_PORT: ${P2P_PORT} +process.env.VITE_GRPC_PORT: ${GRPC_PORT} + + +==================================`) return ( { const formData = new FormData() formData.append('file', file) - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/app/components/clone-group.tsx b/frontend/packages/app/components/clone-group.tsx index 00d7598b08..e866464309 100644 --- a/frontend/packages/app/components/clone-group.tsx +++ b/frontend/packages/app/components/clone-group.tsx @@ -1,6 +1,8 @@ import {zodResolver} from '@hookform/resolvers/zod' +import {Group} from '@mintter/shared' import { Button, + Check as CheckIcon, Checkbox, Form, Input, @@ -8,8 +10,6 @@ import { Spinner, XStack, YStack, - Check as CheckIcon, - UIAvatar, } from '@mintter/ui' import {useEffect} from 'react' import { @@ -22,18 +22,17 @@ import { } from 'react-hook-form' import {toast} from 'react-hot-toast' import * as z from 'zod' +import {useAccount, useMyAccount} from '../models/accounts' import { useCreateGroup, useGroup, useGroupContent, useGroupMembers, } from '../models/groups' -import {useNavigate} from '../utils/useNavigate' -import {DialogTitle} from './dialog' -import {BACKEND_FILE_URL, Group, Role} from '@mintter/shared' -import {useAccount, useMyAccount} from '../models/accounts' import {getAvatarUrl} from '../utils/account-url' +import {useNavigate} from '../utils/useNavigate' import {Avatar} from './avatar' +import {DialogTitle} from './dialog' const cloneGroupSchema = z.object({ title: z.string().min(1, {message: 'Group title is required'}), diff --git a/frontend/packages/app/components/comments.tsx b/frontend/packages/app/components/comments.tsx index f29fe7aa9e..ddd06866aa 100644 --- a/frontend/packages/app/components/comments.tsx +++ b/frontend/packages/app/components/comments.tsx @@ -1,6 +1,6 @@ import {trpc} from '@mintter/desktop/src/trpc' import { - BACKEND_FILE_URL, + API_FILE_URL, BlocksContent, HMComment, StateStream, @@ -257,7 +257,7 @@ export function CommentPresentation({ id={account.data?.id} url={ account.data?.profile?.avatar - ? `${BACKEND_FILE_URL}/${account.data?.profile?.avatar}` + ? `${API_FILE_URL}/${account.data?.profile?.avatar}` : undefined } /> diff --git a/frontend/packages/app/components/commit-draft-button.tsx b/frontend/packages/app/components/commit-draft-button.tsx index 2163784ef5..afbcc9666e 100644 --- a/frontend/packages/app/components/commit-draft-button.tsx +++ b/frontend/packages/app/components/commit-draft-button.tsx @@ -1,6 +1,6 @@ import {useNavRoute} from '@mintter/app/utils/navigation' import {useNavigate} from '@mintter/app/utils/useNavigate' -import {BACKEND_FILE_URL} from '@mintter/shared' +import {API_FILE_URL} from '@mintter/shared' import { AlertCircle, Button, @@ -213,7 +213,7 @@ export default function CommitDraftButton() { size={28} url={ myAccount.data?.profile?.avatar && - `${BACKEND_FILE_URL}/${myAccount.data?.profile?.avatar}` + `${API_FILE_URL}/${myAccount.data?.profile?.avatar}` } label={ myAccount.data?.profile?.alias || myAccount.data?.id diff --git a/frontend/packages/app/components/contacts-prompt.tsx b/frontend/packages/app/components/contacts-prompt.tsx index aa17e0299b..ef077c14ff 100644 --- a/frontend/packages/app/components/contacts-prompt.tsx +++ b/frontend/packages/app/components/contacts-prompt.tsx @@ -52,26 +52,22 @@ function AddConnectionForm({ }, }) - const connectInfo = useMemo( - () => { - if (!deviceId || !peerInfo.data?.addrs?.length) return null - return compressToEncodedURIComponent( - JSON.stringify({ - a: peerInfo.data?.addrs.map((addr) => { - return addr.split('/p2p/').slice(0, -1).join('/p2p/') - }), - n: account.data?.profile?.alias, - d: deviceId, + const connectInfo = useMemo(() => { + if (!deviceId || !peerInfo.data?.addrs?.length) return null + return compressToEncodedURIComponent( + JSON.stringify({ + a: peerInfo.data?.addrs.map((addr) => { + return addr.split('/p2p/').slice(0, -1).join('/p2p/') }), - ) - }, - // @eslint-ignore-next-line - [ - deviceId, - peerInfo.data?.addrs?.length, // explicitly using addrs length because the address list is being polled and frequently changes order, which does not affect connecivity - account.data?.profile?.alias, - ], - ) + n: account.data?.profile?.alias, + d: deviceId, + }), + ) + }, [ + deviceId, + peerInfo.data?.addrs?.length, // explicitly using addrs length because the address list is being polled and frequently changes order, which does not affect connecivity + account.data?.profile?.alias, + ]) return ( <> Add Connection diff --git a/frontend/packages/app/components/footer.tsx b/frontend/packages/app/components/footer.tsx index a8dbe8dbad..ab7ca4c60c 100644 --- a/frontend/packages/app/components/footer.tsx +++ b/frontend/packages/app/components/footer.tsx @@ -1,7 +1,7 @@ import {useConnectionSummary} from '@mintter/app/models/contacts' import {useDaemonReady} from '@mintter/app/node-status-context' import {useNavRoute} from '@mintter/app/utils/navigation' -import {APP_VERSION} from '@mintter/shared' +import {VERSION} from '@mintter/shared' import { Button, ButtonProps, @@ -89,7 +89,7 @@ export default function Footer({children}: {children?: ReactNode}) { }} color="$color8" > - {`Mintter ${APP_VERSION}`} + {`Mintter ${VERSION}`} {/* To do: include release date of this version. when this is clicked, we should help the user upgrade */} diff --git a/frontend/packages/app/components/network-dialog.tsx b/frontend/packages/app/components/network-dialog.tsx index 1724d33243..47787fb00e 100644 --- a/frontend/packages/app/components/network-dialog.tsx +++ b/frontend/packages/app/components/network-dialog.tsx @@ -1,4 +1,4 @@ -import {Account, BACKEND_FILE_URL, PeerInfo} from '@mintter/shared' +import {Account, API_FILE_URL, PeerInfo} from '@mintter/shared' import { ArrowUpRight, Button, @@ -186,7 +186,7 @@ function PeerRow({peer, account}: {peer: PeerInfo; account?: Account}) { label={account.profile?.alias} url={ account.profile?.avatar && - `${BACKEND_FILE_URL}/${account.profile?.avatar}` + `${API_FILE_URL}/${account.profile?.avatar}` } /> ) : null} diff --git a/frontend/packages/app/components/sidebar.tsx b/frontend/packages/app/components/sidebar.tsx index 0983ab04c9..6d431ed6dd 100644 --- a/frontend/packages/app/components/sidebar.tsx +++ b/frontend/packages/app/components/sidebar.tsx @@ -1,4 +1,4 @@ -import {Account, BACKEND_FILE_URL} from '@mintter/shared' +import {Account, API_FILE_URL} from '@mintter/shared' import { Button, ListItem, @@ -8,11 +8,11 @@ import { Spinner, Tooltip, UIAvatar, + useStream, View, XStack, YGroup, YStack, - useStream, } from '@mintter/ui' import { Book, @@ -23,7 +23,7 @@ import { Search, Settings, } from '@tamagui/lucide-icons' -import {ReactNode, memo, useEffect, useState} from 'react' +import {memo, ReactNode, useEffect, useState} from 'react' import {useAppContext} from '../app-context' import appError from '../errors' import {useAccount, useAccounts, useMyAccount} from '../models/accounts' @@ -616,7 +616,7 @@ function PinnedDocument({ diff --git a/frontend/packages/app/components/variants.tsx b/frontend/packages/app/components/variants.tsx index e21d70fad4..fb59fd9b41 100644 --- a/frontend/packages/app/components/variants.tsx +++ b/frontend/packages/app/components/variants.tsx @@ -20,7 +20,7 @@ import { import {pathNameify} from '@mintter/app/utils/path' import {useNavigate} from '@mintter/app/utils/useNavigate' import { - BACKEND_FILE_URL, + API_FILE_URL, Publication, UnpackedHypermediaId, createPublicWebHmUrl, @@ -728,7 +728,7 @@ function AuthorIcon({author}: {author: string}) { size={20} url={ account.data?.profile?.avatar && - `${BACKEND_FILE_URL}/${account.data?.profile?.avatar}` + `${API_FILE_URL}/${account.data?.profile?.avatar}` } label={getAccountName(account.data?.profile) || author} /> @@ -785,7 +785,7 @@ function AuthorVariantItem({ size={28} url={ author.data?.profile?.avatar && - `${BACKEND_FILE_URL}/${author.data?.profile?.avatar}` + `${API_FILE_URL}/${author.data?.profile?.avatar}` } label={author.data?.profile?.alias || authorVersion.author} /> diff --git a/frontend/packages/app/env.d.ts b/frontend/packages/app/env.d.ts index f9b0f9df9e..47fbc29862 100644 --- a/frontend/packages/app/env.d.ts +++ b/frontend/packages/app/env.d.ts @@ -1,9 +1,7 @@ interface ImportMetaEnv { - readonly VITE_MINTTER_GATEWAY_URL: string - readonly VITE_BACKEND_HTTP_PORT: string - readonly VITE_BACKEND_GRPC_PORT: string - readonly VITE_BACKEND_P2P_PORT: string - readonly VITE_BACKEND_HOSTNAME: string + readonly VITE_HTTP_PORT: string + readonly VITE_GRPC_PORT: string + readonly VITE_P2P_PORT: string } interface ImportMeta { diff --git a/frontend/packages/app/models/__tests__/draft.test.ts b/frontend/packages/app/models/__tests__/draft.test.ts deleted file mode 100644 index aa9d6f972c..0000000000 --- a/frontend/packages/app/models/__tests__/draft.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {Block, BlockNode, Document} from '@mintter/shared' -import {describe, expect, test} from 'vitest' -import {createBlocksMap} from '../documents' - -describe('Draft transformations', () => { - describe('backend to blockMap', () => { - test('single block', () => { - let inputBlock = new Block({ - id: '1', - text: 'hello', - annotations: [], - attributes: {}, - }) - let input = new Document({ - children: [ - new BlockNode({ - block: inputBlock, - children: [], - }), - ], - }) - - let output = { - '1': { - parent: '', - left: '', - block: inputBlock, - }, - } - - expect(createBlocksMap(input)).toEqual(output) - }) - }) -}) diff --git a/frontend/packages/app/models/payments.ts b/frontend/packages/app/models/payments.ts index 9da8c80bd4..d78895c71f 100644 --- a/frontend/packages/app/models/payments.ts +++ b/frontend/packages/app/models/payments.ts @@ -1,5 +1,5 @@ import { - BACKEND_GRAPHQL_ENDPOINT, + API_GRAPHQL_ENDPOINT, ExportWalletInput, LightningWallet, Mutation, @@ -36,10 +36,7 @@ function queryWallets(): queryKey: ['payments', 'wallets'], queryFn: async () => { try { - let req: Query = await request( - BACKEND_GRAPHQL_ENDPOINT, - getWalletsQuery, - ) + let req: Query = await request(API_GRAPHQL_ENDPOINT, getWalletsQuery) return req.me.wallets ?? [] } catch (error) { return [] @@ -93,7 +90,7 @@ function queryInvoicesByWallet( queryFn: async () => { try { let req: Query = await request( - BACKEND_GRAPHQL_ENDPOINT, + API_GRAPHQL_ENDPOINT, getInvoicesByWalletQuery, { walletId, @@ -130,7 +127,7 @@ export function mutationExportWallet( mutationFn: async (input: ExportWalletInput) => { try { let req: Mutation = await request( - BACKEND_GRAPHQL_ENDPOINT, + API_GRAPHQL_ENDPOINT, exportWalletMutationQuery, input, ) diff --git a/frontend/packages/app/models/wallet.ts b/frontend/packages/app/models/wallet.ts index 6a9bb1cba9..908e83d1aa 100644 --- a/frontend/packages/app/models/wallet.ts +++ b/frontend/packages/app/models/wallet.ts @@ -1,6 +1,6 @@ import { - BACKEND_GRAPHQL_ENDPOINT, - LIGHTNING_SERVER_URL, + API_GRAPHQL_ENDPOINT, + LIGHTNING_API_URL, Mutation, } from '@mintter/shared' import {UseMutationOptions, useMutation, useQuery} from '@tanstack/react-query' @@ -33,7 +33,7 @@ let insertDefaultWalletMutation = gql` ` export async function checkWalletAccounts(accountIds: string[]) { - let url = `${LIGHTNING_SERVER_URL}/v2/check` + let url = `${LIGHTNING_API_URL}/v2/check` accountIds.forEach((accountId, index) => { url += `${index === 0 ? '?' : '&'}user=${accountId}` }) @@ -66,11 +66,11 @@ export function useWalletOptIn(opts?: UseMutationOptions) { const optIn = useMutation({ mutationFn: async (input) => { const exported: Mutation = await request( - BACKEND_GRAPHQL_ENDPOINT, + API_GRAPHQL_ENDPOINT, exportBuiltInWalletMutation, ) const imported: Mutation = await request( - BACKEND_GRAPHQL_ENDPOINT, + API_GRAPHQL_ENDPOINT, insertDefaultWalletMutation, {credentials: exported.exportWallet.credentials}, ) diff --git a/frontend/packages/app/package.json b/frontend/packages/app/package.json index da9cd35a3d..a1cdfafe7e 100644 --- a/frontend/packages/app/package.json +++ b/frontend/packages/app/package.json @@ -7,10 +7,8 @@ "*.css" ], "scripts": { - "lint": "eslint .", "format": "prettier \"**/*.{ts,tsx,md,mdx,json,js}\" --check --ignore-path ../../../.prettierignore", - "test": "vitest --run", - "test:w": "vitest", + "test": "echo 'APP: NO TESTS';", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -50,7 +48,6 @@ "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "copy-text-to-clipboard": "3.1.0", - "eslint-config-custom": "*", "happy-dom": "7.8.1", "jsdom": "22.1.0", "prettier": "3.0.2", diff --git a/frontend/packages/app/pages/group.tsx b/frontend/packages/app/pages/group.tsx index 69025bd0eb..6acf56345d 100644 --- a/frontend/packages/app/pages/group.tsx +++ b/frontend/packages/app/pages/group.tsx @@ -2,8 +2,8 @@ import * as Ariakit from '@ariakit/react' import {CompositeInput} from '@ariakit/react-core/composite/composite-input' import Footer from '@mintter/app/components/footer' import { + API_FILE_URL, Account, - BACKEND_FILE_URL, Document, Group, Profile, @@ -968,7 +968,7 @@ export const TagInput = forwardRef( {alias @@ -1070,7 +1070,7 @@ export const TagInputItem = forwardRef( id={props.value} url={ props.account?.profile?.avatar - ? `${BACKEND_FILE_URL}/${props.account?.profile?.avatar}` + ? `${API_FILE_URL}/${props.account?.profile?.avatar}` : undefined } /> diff --git a/frontend/packages/app/pages/onboarding.tsx b/frontend/packages/app/pages/onboarding.tsx index 6cadb79daa..099b3df928 100644 --- a/frontend/packages/app/pages/onboarding.tsx +++ b/frontend/packages/app/pages/onboarding.tsx @@ -64,7 +64,6 @@ export function Onboarding({onComplete}: {onComplete: () => void}) { export function OnboardingSteps() { let ctx = useOnboarding() const key = ctx.state.key - let direction = ctx.state.direction return ( <> {key == 'welcome' && } @@ -229,10 +228,10 @@ function Mnemonics(props: OnboardingStepProps) { }} > - + Generate new words - + Use my own words @@ -260,7 +259,7 @@ function Mnemonics(props: OnboardingStepProps) { fontSize={18} fontWeight="700" display="block" - id="mnemonics" + id="recovery-phrase-words" > {mnemonics.data?.join(' ')} @@ -289,6 +288,7 @@ function Mnemonics(props: OnboardingStepProps) { setCheck1(!!v)} > @@ -302,6 +302,7 @@ function Mnemonics(props: OnboardingStepProps) { setCheck2(!!v)} > @@ -333,7 +334,7 @@ function Mnemonics(props: OnboardingStepProps) { autoFocus fontSize={18} flex={1} - id="mnemonics-input" + id="ownwords-input" placeholder={ 'Add your 12 mnemonics words \n(food barrel buzz, ...)' } @@ -353,6 +354,7 @@ function Mnemonics(props: OnboardingStepProps) { borderRadius="$1" paddingHorizontal="$4" paddingVertical={0} + id="mnemonics-error-box" > @@ -476,8 +478,8 @@ function NewDevice(props: OnboardingStepProps) { - Add your account's mnemonics in the input below separated by - commas. + Add your account's Secret Recovery phrase in the input below + separated by commas. @@ -570,7 +573,6 @@ function Profile(props: OnboardingStepProps) { (submitValue.current.alias = val)} placeholder="Readable alias or username. Doesn't have to be unique." /> @@ -654,7 +656,9 @@ function Wallet(props: OnboardingStepProps) { {wallets.data?.length && wallets.data?.length > 0 ? ( - Your wallet is ready to use! + + Your wallet is ready to use! + ) : wallets.data?.length === 0 ? ( @@ -662,6 +666,7 @@ function Wallet(props: OnboardingStepProps) { ) { fullscreen x={0} opacity={1} - animation={ - import.meta.env.VITE_NO_ANIMS - ? undefined - : [ - 'medium', - { - opacity: { - overshootClamping: true, - }, - }, - ] - } + animation={[ + 'medium', + { + opacity: { + overshootClamping: true, + }, + }, + ]} {...props} > diff --git a/frontend/packages/app/pages/settings.tsx b/frontend/packages/app/pages/settings.tsx index ee378e27e5..a5ed1fc77e 100644 --- a/frontend/packages/app/pages/settings.tsx +++ b/frontend/packages/app/pages/settings.tsx @@ -3,8 +3,8 @@ import {useDaemonInfo} from '@mintter/app/models/daemon' import {usePeerInfo} from '@mintter/app/models/networking' import {useInvoicesBywallet, useWallets} from '@mintter/app/models/payments' import {ObjectKeys} from '@mintter/app/utils/object-keys' -import {client, trpc} from '@mintter/desktop/src/trpc' -import {APP_VERSION, LightningWallet, Profile, useHover} from '@mintter/shared' +import {trpc} from '@mintter/desktop/src/trpc' +import {LightningWallet, Profile, VERSION, useHover} from '@mintter/shared' import { ArrowDownRight, Button, @@ -245,26 +245,6 @@ export function DeveloperSettings() { ) } -function TestURLCheck() { - return ( - - ) -} - export function ProfileForm({ profile, accountId, @@ -626,7 +606,7 @@ function AppSettings() { size="$2" icon={Copy} onPress={() => { - copyTextToClipboard(`App Version: ${APP_VERSION} + copyTextToClipboard(`App Version: ${VERSION} Electron Version: ${versions.electron} Chrome Version: ${versions.chrome} Node Version: ${versions.node} @@ -639,7 +619,7 @@ Go Build Info: } /> - + diff --git a/frontend/packages/app/utils/account-url.ts b/frontend/packages/app/utils/account-url.ts index f7fa67d5f2..f67577781f 100644 --- a/frontend/packages/app/utils/account-url.ts +++ b/frontend/packages/app/utils/account-url.ts @@ -1,7 +1,7 @@ -import {BACKEND_FILE_URL} from '@mintter/shared' +import {API_FILE_URL} from '@mintter/shared' export function getAvatarUrl(avatarCID?: string) { if (avatarCID) { - return `${BACKEND_FILE_URL}/${avatarCID}` + return `${API_FILE_URL}/${avatarCID}` } } diff --git a/frontend/packages/editor/.eslintrc.js b/frontend/packages/editor/.eslintrc.js deleted file mode 100644 index 8814f42ad6..0000000000 --- a/frontend/packages/editor/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: ['custom'], - root: true, -} diff --git a/frontend/packages/editor/package.json b/frontend/packages/editor/package.json index 94dea929eb..6f13c30ba6 100644 --- a/frontend/packages/editor/package.json +++ b/frontend/packages/editor/package.json @@ -3,9 +3,8 @@ "version": "0.1.0", "main": "src/index.ts", "scripts": { - "lint": "eslint .", "format": "prettier \"**/*.{ts,tsx,md,mdx,json,js}\" --check --ignore-path ../../../.prettierignore", - "test": "vitest --run", + "test": "echo 'EDITOR: NO TESTS';", "typecheck": "tsc --noEmit" }, "keywords": [], @@ -67,7 +66,6 @@ "@types/prosemirror-dev-tools": "3.0.3", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", - "eslint-config-custom": "*", "happy-dom": "7.8.1", "jsdom": "22.1.0", "prettier": "3.0.2", diff --git a/frontend/packages/editor/src/blocknote/core/BlockNoteEditor.test.ts b/frontend/packages/editor/src/blocknote/core/BlockNoteEditor.test.ts deleted file mode 100644 index cbf705a360..0000000000 --- a/frontend/packages/editor/src/blocknote/core/BlockNoteEditor.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {expect, it} from 'vitest' -import {BlockNoteEditor} from './BlockNoteEditor' -import {getBlockInfoFromPos} from './extensions/Blocks/helpers/getBlockInfoFromPos' - -/** - * @vitest-environment jsdom - */ -it('creates an editor', () => { - const editor = new BlockNoteEditor({}) - const blockInfo = getBlockInfoFromPos(editor._tiptapEditor.state.doc, 2) - expect(blockInfo?.contentNode.type.name).toEqual('paragraph') -}) diff --git a/frontend/packages/editor/src/blocknote/core/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap b/frontend/packages/editor/src/blocknote/core/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap deleted file mode 100644 index d5b3c4497e..0000000000 --- a/frontend/packages/editor/src/blocknote/core/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap +++ /dev/null @@ -1,631 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete multiple blocks 1`] = ` -[ - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 1", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 2", - "type": "text", - }, - ], - "id": "4", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 2", - "type": "text", - }, - ], - "id": "3", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete multiple blocks 2`] = ` -[ - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 1", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 2", - "type": "text", - }, - ], - "id": "4", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 2", - "type": "text", - }, - ], - "id": "3", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete multiple blocks 3`] = ` -[ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete single block 1`] = ` -[ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Paragraph", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete single block 2`] = ` -[ - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Paragraph", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - ], - "content": [ - { - "styles": { - "textColor": "red", - }, - "text": "Heading ", - "type": "text", - }, - { - "styles": { - "backgroundColor": "red", - }, - "text": "3", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "level": "3", - "textAlignment": "right", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Insert, Update, & Delete Blocks > Insert, update, & delete single block 3`] = ` -[ - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Inserting Blocks with Different Placements > Insert after existing block 1`] = ` -[ - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 1", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 2", - "type": "text", - }, - ], - "id": "4", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 2", - "type": "text", - }, - ], - "id": "3", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [], - "content": [], - "id": "5", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Inserting Blocks with Different Placements > Insert before existing block 1`] = ` -[ - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 1", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 2", - "type": "text", - }, - ], - "id": "4", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 2", - "type": "text", - }, - ], - "id": "3", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; - -exports[`Inserting Blocks with Different Placements > Insert nested inside existing block 1`] = ` -[ - { - "children": [ - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 1", - "type": "text", - }, - ], - "id": "2", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 1", - "type": "text", - }, - ], - "id": "1", - "props": { - "backgroundColor": "default", - "level": "1", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - { - "children": [ - { - "children": [], - "content": [ - { - "styles": {}, - "text": "Nested Heading 2", - "type": "text", - }, - ], - "id": "4", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [ - { - "styles": {}, - "text": "Heading 2", - "type": "text", - }, - ], - "id": "3", - "props": { - "backgroundColor": "default", - "level": "2", - "textAlignment": "left", - "textColor": "default", - }, - "type": "heading", - }, - ], - "content": [], - "id": "0", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, - { - "children": [], - "content": [], - "id": "5", - "props": { - "backgroundColor": "default", - "textAlignment": "left", - "textColor": "default", - "type": "p", - }, - "type": "paragraph", - }, -] -`; diff --git a/frontend/packages/editor/src/blocknote/core/api/blockManipulation/blockManipulation._test.ts b/frontend/packages/editor/src/blocknote/core/api/blockManipulation/blockManipulation._test.ts deleted file mode 100644 index 88580ccead..0000000000 --- a/frontend/packages/editor/src/blocknote/core/api/blockManipulation/blockManipulation._test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import {afterEach, beforeEach, describe, expect, it} from 'vitest' -import {Block, BlockNoteEditor, PartialBlock} from '../..' -import {DefaultBlockSchema} from '../../extensions/Blocks/api/defaultBlocks' - -let editor: BlockNoteEditor - -function waitForEditor() { - // wait for create event on editor, - // this is necessary because otherwise UniqueId.create hasn't been called yet, and - // blocks would have "null" as their id - return new Promise((resolve) => { - editor._tiptapEditor.on('create', () => { - resolve() - }) - }) -} - -let singleBlock: PartialBlock - -let multipleBlocks: PartialBlock[] - -let insert: ( - placement: 'before' | 'nested' | 'after', -) => Block[] - -beforeEach(() => { - // TODO: remove any - ;(window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS = {} - - editor = new BlockNoteEditor() - - singleBlock = { - type: 'paragraph', - content: 'Paragraph', - } - - multipleBlocks = [ - { - type: 'heading', - props: { - level: '1', - }, - content: 'Heading 1', - children: [ - { - type: 'heading', - props: { - level: '1', - }, - content: 'Nested Heading 1', - }, - ], - }, - { - type: 'heading', - props: { - level: '2', - }, - content: 'Heading 2', - children: [ - { - type: 'heading', - props: { - level: '2', - }, - content: 'Nested Heading 2', - }, - ], - }, - ] - - insert = (placement) => { - const existingBlock = editor.topLevelBlocks[0] - editor.insertBlocks(multipleBlocks, existingBlock, placement) - - return editor.topLevelBlocks - } -}) - -afterEach(() => { - editor._tiptapEditor.destroy() - editor = undefined as any - - delete (window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS -}) - -describe('Inserting Blocks with Different Placements', () => { - it('Insert before existing block', async () => { - await waitForEditor() - - const output = insert('before') - - expect(output).toMatchSnapshot() - }) - - it('Insert nested inside existing block', async () => { - await waitForEditor() - - const output = insert('nested') - - expect(output).toMatchSnapshot() - }) - - it('Insert after existing block', async () => { - await waitForEditor() - - const output = insert('after') - - expect(output).toMatchSnapshot() - }) -}) - -describe('Insert, Update, & Delete Blocks', () => { - it('Insert, update, & delete single block', async () => { - await waitForEditor() - - const existingBlock = editor.topLevelBlocks[0] - editor.insertBlocks([singleBlock], existingBlock) - - expect(editor.topLevelBlocks).toMatchSnapshot() - - const newBlock = editor.topLevelBlocks[0] - editor.updateBlock(newBlock, { - type: 'heading', - props: { - textAlignment: 'right', - level: '3', - }, - content: [ - { - type: 'text', - text: 'Heading ', - styles: { - textColor: 'red', - }, - }, - { - type: 'text', - text: '3', - styles: { - backgroundColor: 'red', - }, - }, - ], - children: [singleBlock], - }) - - expect(editor.topLevelBlocks).toMatchSnapshot() - - const updatedBlock = editor.topLevelBlocks[0] - editor.removeBlocks([updatedBlock]) - - expect(editor.topLevelBlocks).toMatchSnapshot() - }) - - it('Insert, update, & delete multiple blocks', async () => { - await waitForEditor() - - const existingBlock = editor.topLevelBlocks[0] - editor.insertBlocks(multipleBlocks, existingBlock) - - expect(editor.topLevelBlocks).toMatchSnapshot() - - const newBlock = editor.topLevelBlocks[0] - editor.updateBlock(newBlock, { - type: 'paragraph', - }) - - expect(editor.topLevelBlocks).toMatchSnapshot() - - const updatedBlocks = editor.topLevelBlocks.slice(0, 2) - editor.removeBlocks([updatedBlocks[0].children[0], updatedBlocks[1]]) - - expect(editor.topLevelBlocks).toMatchSnapshot() - }) -}) diff --git a/frontend/packages/editor/src/blocknote/core/api/formatConversions/formatConversions._test.ts b/frontend/packages/editor/src/blocknote/core/api/formatConversions/formatConversions._test.ts deleted file mode 100644 index 017b11950a..0000000000 --- a/frontend/packages/editor/src/blocknote/core/api/formatConversions/formatConversions._test.ts +++ /dev/null @@ -1,753 +0,0 @@ -import {afterEach, beforeEach, describe, expect, it} from 'vitest' -import {Block, BlockNoteEditor} from '../..' -import UniqueID from '../../extensions/UniqueID/UniqueID' - -let editor: BlockNoteEditor - -const getNonNestedBlocks = (): Block[] => [ - { - id: UniqueID.options.generateID(), - type: 'heading', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - level: '1', - }, - content: [ - { - type: 'text', - text: 'Heading', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Paragraph', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [], - }, -] - -const getNestedBlocks = (): Block[] => [ - { - id: UniqueID.options.generateID(), - type: 'heading', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - level: '1', - }, - content: [ - { - type: 'text', - text: 'Heading', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Paragraph', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [], - }, - ], - }, - ], - }, - ], - }, -] - -const getStyledBlocks = (): Block[] => [ - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bold', - styles: { - bold: true, - }, - }, - { - type: 'text', - text: 'Italic', - styles: { - italic: true, - }, - }, - { - type: 'text', - text: 'Underline', - styles: { - underline: true, - }, - }, - { - type: 'text', - text: 'Strikethrough', - styles: { - strike: true, - }, - }, - { - type: 'text', - text: 'TextColor', - styles: { - textColor: 'red', - }, - }, - { - type: 'text', - text: 'BackgroundColor', - styles: { - backgroundColor: 'red', - }, - }, - { - type: 'text', - text: 'Multiple', - styles: { - bold: true, - italic: true, - }, - }, - ], - children: [], - }, -] - -const getComplexBlocks = (): Block[] => [ - { - id: UniqueID.options.generateID(), - type: 'heading', - props: { - backgroundColor: 'red', - textColor: 'yellow', - textAlignment: 'right', - level: '1', - }, - content: [ - { - type: 'text', - text: 'Heading 1', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'heading', - props: { - backgroundColor: 'orange', - textColor: 'orange', - textAlignment: 'center', - level: '2', - }, - content: [ - { - type: 'text', - text: 'Heading 2', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'heading', - props: { - backgroundColor: 'yellow', - textColor: 'red', - textAlignment: 'left', - level: '3', - }, - content: [ - { - type: 'text', - text: 'Heading 3', - styles: {}, - }, - ], - children: [], - }, - ], - }, - ], - }, - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Paragraph', - styles: { - textColor: 'purple', - backgroundColor: 'green', - }, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'P', - styles: {}, - }, - { - type: 'text', - text: 'ara', - styles: { - bold: true, - }, - }, - { - type: 'text', - text: 'grap', - styles: { - italic: true, - }, - }, - { - type: 'text', - text: 'h', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'P', - styles: {}, - }, - { - type: 'text', - text: 'ara', - styles: { - underline: true, - }, - }, - { - type: 'text', - text: 'grap', - styles: { - strike: true, - }, - }, - { - type: 'text', - text: 'h', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'paragraph', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Paragraph', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [], - }, - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [ - { - id: UniqueID.options.generateID(), - type: 'numberedListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Numbered List Item', - styles: {}, - }, - ], - children: [], - }, - ], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, - ], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, - ], - }, - { - id: UniqueID.options.generateID(), - type: 'bulletListItem', - props: { - backgroundColor: 'default', - textColor: 'default', - textAlignment: 'left', - }, - content: [ - { - type: 'text', - text: 'Bullet List Item', - styles: {}, - }, - ], - children: [], - }, -] - -function removeInlineContentClass(html: string) { - return html.replace(/ class="_inlineContent_([a-zA-Z0-9_-])+"/g, '') -} - -beforeEach(() => { - ;(window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS = {} - - editor = new BlockNoteEditor() -}) - -afterEach(() => { - editor._tiptapEditor.destroy() - editor = undefined as any - - delete (window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS -}) - -describe('Non-Nested Block/HTML/Markdown Conversions', () => { - it('Convert non-nested blocks to HTML', async () => { - const output = await editor.blocksToHTML(getNonNestedBlocks()) - - expect(removeInlineContentClass(output)).toMatchSnapshot() - }) - - it('Convert non-nested blocks to Markdown', async () => { - const output = await editor.blocksToMarkdown(getNonNestedBlocks()) - - expect(output).toMatchSnapshot() - }) - - it('Convert non-nested HTML to blocks', async () => { - const html = `

Heading

Paragraph

  • Bullet List Item

  1. Numbered List Item

` - const output = await editor.HTMLToBlocks(html) - - expect(output).toMatchSnapshot() - }) - - it('Convert non-nested Markdown to blocks', async () => { - const markdown = `# Heading - -Paragraph - -* Bullet List Item - -1. Numbered List Item -` - const output = await editor.markdownToBlocks(markdown) - - expect(output).toMatchSnapshot() - }) -}) - -describe('Nested Block/HTML/Markdown Conversions', () => { - it('Convert nested blocks to HTML', async () => { - const output = await editor.blocksToHTML(getNestedBlocks()) - - expect(removeInlineContentClass(output)).toMatchSnapshot() - }) - - it('Convert nested blocks to Markdown', async () => { - const output = await editor.blocksToMarkdown(getNestedBlocks()) - - expect(output).toMatchSnapshot() - }) - // // Failing due to nested block parsing bug. - // it("Convert nested HTML to blocks", async () => { - // const html = `

Heading

Paragraph

  • Bullet List Item

    1. Numbered List Item

`; - // const output = await editor.HTMLToBlocks(html); - // - // expect(output).toMatchSnapshot(); - // }); - // // Failing due to nested block parsing bug. - // it("Convert nested Markdown to blocks", async () => { - // const markdown = `# Heading - // - // Paragraph - // - // * Bullet List Item - // - // 1. Numbered List Item - // `; - // const output = await editor.markdownToBlocks(markdown); - // - // expect(output).toMatchSnapshot(); - // }); -}) - -describe('Styled Block/HTML/Markdown Conversions', () => { - it('Convert styled blocks to HTML', async () => { - const output = await editor.blocksToHTML(getStyledBlocks()) - - expect(removeInlineContentClass(output)).toMatchSnapshot() - }) - - it('Convert styled blocks to Markdown', async () => { - const output = await editor.blocksToMarkdown(getStyledBlocks()) - - expect(output).toMatchSnapshot() - }) - - it('Convert styled HTML to blocks', async () => { - const html = `

BoldItalicUnderlineStrikethroughTextColorBackgroundColorMultiple

` - const output = await editor.HTMLToBlocks(html) - - expect(output).toMatchSnapshot() - }) - - it('Convert styled Markdown to blocks', async () => { - const markdown = `**Bold***Italic*Underline~~Strikethrough~~TextColorBackgroundColor***Multiple***` - const output = await editor.markdownToBlocks(markdown) - - expect(output).toMatchSnapshot() - }) -}) - -describe('Complex Block/HTML/Markdown Conversions', () => { - it('Convert complex blocks to HTML', async () => { - const output = await editor.blocksToHTML(getComplexBlocks()) - - expect(removeInlineContentClass(output)).toMatchSnapshot() - }) - - it('Convert complex blocks to Markdown', async () => { - const output = await editor.blocksToMarkdown(getComplexBlocks()) - - expect(output).toMatchSnapshot() - }) - // // Failing due to nested block parsing bug. - // it("Convert complex HTML to blocks", async () => { - // const html = `

Heading 1

Heading 2

Heading 3

Paragraph

Paragraph

Paragraph

  • Bullet List Item

  • Bullet List Item

    • Bullet List Item

      • Bullet List Item

      Paragraph

      1. Numbered List Item

      2. Numbered List Item

      3. Numbered List Item

        1. Numbered List Item

      • Bullet List Item

    • Bullet List Item

  • Bullet List Item

`; - // const output = await editor.HTMLToBlocks(html); - // - // expect(output).toMatchSnapshot(); - // }); - // // Failing due to nested block parsing bug. - // it("Convert complex Markdown to blocks", async () => { - // const markdown = `# Heading 1 - // - // ## Heading 2 - // - // ### Heading 3 - // - // Paragraph - // - // P**ara***grap*h - // - // P*ara*~~grap~~h - // - // * Bullet List Item - // - // * Bullet List Item - // - // * Bullet List Item - // - // * Bullet List Item - // - // Paragraph - // - // 1. Numbered List Item - // - // 2. Numbered List Item - // - // 3. Numbered List Item - // - // 1. Numbered List Item - // - // * Bullet List Item - // - // * Bullet List Item - // - // * Bullet List Item - // `; - // const output = await editor.markdownToBlocks(markdown); - // - // expect(output).toMatchSnapshot(); - // }); -}) diff --git a/frontend/packages/editor/src/blocknote/core/api/nodeConversions/nodeConversions._test.ts b/frontend/packages/editor/src/blocknote/core/api/nodeConversions/nodeConversions._test.ts deleted file mode 100644 index 37cf9b9e86..0000000000 --- a/frontend/packages/editor/src/blocknote/core/api/nodeConversions/nodeConversions._test.ts +++ /dev/null @@ -1,495 +0,0 @@ -import {Editor} from '@tiptap/core' -import {afterEach, beforeEach, describe, expect, it} from 'vitest' -import {BlockNoteEditor, PartialBlock} from '../..' -import { - DefaultBlockSchema, - defaultBlockSchema, -} from '../../extensions/Blocks/api/defaultBlocks' -import UniqueID from '../../extensions/UniqueID/UniqueID' -import {blockToNode, nodeToBlock} from './nodeConversions' -import {partialBlockToBlockForTesting} from './testUtil' - -let editor: BlockNoteEditor -let tt: Editor - -beforeEach(() => { - ;(window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS = {} - - editor = new BlockNoteEditor() - tt = editor._tiptapEditor -}) - -afterEach(() => { - tt.destroy() - editor = undefined as any - tt = undefined as any - - delete (window as Window & {__TEST_OPTIONS?: any}).__TEST_OPTIONS -}) - -describe('Simple ProseMirror Node Conversions', () => { - it('Convert simple block to node', async () => { - const block: PartialBlock = { - type: 'paragraph', - } - const firstNodeConversion = blockToNode(block, tt.schema) - - expect(firstNodeConversion).toMatchSnapshot() - }) - - it('Convert simple node to block', async () => { - const node = tt.schema.nodes['blockContainer'].create( - {id: UniqueID.options.generateID()}, - tt.schema.nodes['paragraph'].create(), - ) - const firstBlockConversion = nodeToBlock( - node, - defaultBlockSchema, - ) - - expect(firstBlockConversion).toMatchSnapshot() - - const firstNodeConversion = blockToNode(firstBlockConversion, tt.schema) - - expect(firstNodeConversion).toStrictEqual(node) - }) -}) - -describe('Complex ProseMirror Node Conversions', () => { - it('Convert complex block to node', async () => { - const block: PartialBlock = { - type: 'heading', - props: { - backgroundColor: 'blue', - textColor: 'yellow', - textAlignment: 'right', - level: '2', - }, - content: [ - { - type: 'text', - text: 'Heading ', - styles: { - bold: true, - underline: true, - }, - }, - { - type: 'text', - text: '2', - styles: { - italic: true, - strike: true, - }, - }, - ], - children: [ - { - type: 'paragraph', - props: { - backgroundColor: 'red', - }, - content: 'Paragraph', - children: [], - }, - { - type: 'bulletListItem', - }, - ], - } - const firstNodeConversion = blockToNode(block, tt.schema) - - expect(firstNodeConversion).toMatchSnapshot() - }) - - it('Convert complex node to block', async () => { - const node = tt.schema.nodes['blockContainer'].create( - { - id: UniqueID.options.generateID(), - backgroundColor: 'blue', - textColor: 'yellow', - }, - [ - tt.schema.nodes['heading'].create( - {textAlignment: 'right', level: '2'}, - [ - tt.schema.text('Heading ', [ - tt.schema.mark('bold'), - tt.schema.mark('underline'), - ]), - tt.schema.text('2', [ - tt.schema.mark('italic'), - tt.schema.mark('strike'), - ]), - ], - ), - tt.schema.nodes['blockGroup'].create({}, [ - tt.schema.nodes['blockContainer'].create( - {id: UniqueID.options.generateID(), backgroundColor: 'red'}, - [ - tt.schema.nodes['paragraph'].create( - {}, - tt.schema.text('Paragraph'), - ), - ], - ), - tt.schema.nodes['blockContainer'].create( - {id: UniqueID.options.generateID()}, - [tt.schema.nodes['bulletListItem'].create()], - ), - ]), - ], - ) - const firstBlockConversion = nodeToBlock( - node, - defaultBlockSchema, - ) - - expect(firstBlockConversion).toMatchSnapshot() - - const firstNodeConversion = blockToNode(firstBlockConversion, tt.schema) - - expect(firstNodeConversion).toStrictEqual(node) - }) -}) - -describe('links', () => { - it('Convert a block with link', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'link', - href: 'https://www.website.com', - content: 'Website', - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert link block with marks', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'link', - href: 'https://www.website.com', - content: [ - { - type: 'text', - text: 'Web', - styles: { - bold: true, - }, - }, - { - type: 'text', - text: 'site', - styles: {}, - }, - ], - }, - ], - } - const node = blockToNode(block, tt.schema) - // expect(node).toMatchSnapshot(); - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert two adjacent links in a block', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'link', - href: 'https://www.website.com', - content: 'Website', - }, - { - type: 'link', - href: 'https://www.website2.com', - content: 'Website2', - }, - ], - } - - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) -}) - -describe('hard breaks', () => { - it('Convert a block with a hard break', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: 'Text1\nText2', - styles: {}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with multiple hard breaks', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: 'Text1\nText2\nText3', - styles: {}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with a hard break at the start', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: '\nText1', - styles: {}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with a hard break at the end', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: 'Text1\n', - styles: {}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with only a hard break', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: '\n', - styles: {}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with a hard break and different styles', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'text', - text: 'Text1\n', - styles: {}, - }, - { - type: 'text', - text: 'Text2', - styles: {bold: true}, - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with a hard break in a link', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'link', - href: 'https://www.website.com', - content: 'Link1\nLink1', - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) - - it('Convert a block with a hard break between links', async () => { - const block: PartialBlock = { - id: UniqueID.options.generateID(), - type: 'paragraph', - content: [ - { - type: 'link', - href: 'https://www.website.com', - content: 'Link1\n', - }, - { - type: 'link', - href: 'https://www.website2.com', - content: 'Link2', - }, - ], - } - const node = blockToNode(block, tt.schema) - expect(node).toMatchSnapshot() - const outputBlock = nodeToBlock( - node, - defaultBlockSchema, - ) - - // Temporary fix to set props to {}, because at this point - // we don't have an easy way to access default props at runtime, - // so partialBlockToBlockForTesting will not set them. - ;(outputBlock as any).props = {} - const fullOriginalBlock = partialBlockToBlockForTesting(block) - - expect(outputBlock).toStrictEqual(fullOriginalBlock) - }) -}) diff --git a/frontend/packages/editor/src/blocknote/core/extensions/DragMedia/DragExtension.ts b/frontend/packages/editor/src/blocknote/core/extensions/DragMedia/DragExtension.ts index a0db0d47e9..f9b77d7019 100644 --- a/frontend/packages/editor/src/blocknote/core/extensions/DragMedia/DragExtension.ts +++ b/frontend/packages/editor/src/blocknote/core/extensions/DragMedia/DragExtension.ts @@ -1,6 +1,6 @@ import {HMBlockSchema} from '@/schema' import {toast} from '@mintter/app/toast' -import {BACKEND_FILE_UPLOAD_URL} from '@mintter/shared' +import {API_FILE_UPLOAD_URL} from '@mintter/shared' import {Extension} from '@tiptap/core' import {Plugin, PluginKey} from 'prosemirror-state' import {BlockNoteEditor} from '../../BlockNoteEditor' @@ -177,7 +177,7 @@ export async function handleDragMedia(file: File) { formData.append('file', file) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/editor/src/file.tsx b/frontend/packages/editor/src/file.tsx index b846ad3235..5cfd7d7dd2 100644 --- a/frontend/packages/editor/src/file.tsx +++ b/frontend/packages/editor/src/file.tsx @@ -1,7 +1,7 @@ import {useAppContext} from '@mintter/app/app-context' import {toast} from '@mintter/app/toast' import {client} from '@mintter/desktop/src/trpc' -import {BACKEND_FILE_UPLOAD_URL, formatBytes} from '@mintter/shared' +import {API_FILE_UPLOAD_URL, formatBytes} from '@mintter/shared' import { Button, File, @@ -209,7 +209,7 @@ export function FileComponent({ formData.append('file', file) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) @@ -391,7 +391,7 @@ function FileForm({ formData.append('file', files[0]) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) @@ -412,7 +412,7 @@ function FileForm({ formData.append('file', files[i]) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/editor/src/handle-local-media-paste-plugin.ts b/frontend/packages/editor/src/handle-local-media-paste-plugin.ts index d89426ec89..b0462a6c77 100644 --- a/frontend/packages/editor/src/handle-local-media-paste-plugin.ts +++ b/frontend/packages/editor/src/handle-local-media-paste-plugin.ts @@ -1,4 +1,4 @@ -import {BACKEND_FILE_UPLOAD_URL} from '@mintter/shared' +import {API_FILE_UPLOAD_URL} from '@mintter/shared' import {Extension} from '@tiptap/core' import {Plugin, PluginKey} from 'prosemirror-state' @@ -95,7 +95,7 @@ const handleLocalMediaPastePlugin = new Plugin({ async function uploadMedia(file: File) { const formData = new FormData() formData.append('file', file) - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/editor/src/image.tsx b/frontend/packages/editor/src/image.tsx index 100a936fcc..1122829463 100644 --- a/frontend/packages/editor/src/image.tsx +++ b/frontend/packages/editor/src/image.tsx @@ -2,7 +2,7 @@ import {useAppContext} from '@mintter/app/app-context' import {toast} from '@mintter/app/toast' import {client, trpc} from '@mintter/desktop/src/trpc' import { - BACKEND_FILE_UPLOAD_URL, + API_FILE_UPLOAD_URL, getCIDFromIPFSUrl, usePublicationContentContext, } from '@mintter/shared' @@ -207,7 +207,7 @@ function ImageComponent({ formData.append('file', file) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) @@ -434,7 +434,7 @@ function ImageForm({ formData.append('file', files[0]) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) @@ -451,7 +451,7 @@ function ImageForm({ formData.append('file', files[i]) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/editor/src/nostr.tsx b/frontend/packages/editor/src/nostr.tsx index 1f059c00d3..aa341a4238 100644 --- a/frontend/packages/editor/src/nostr.tsx +++ b/frontend/packages/editor/src/nostr.tsx @@ -1,4 +1,4 @@ -import {BACKEND_FILE_UPLOAD_URL, BACKEND_FILE_URL} from '@mintter/shared' +import {API_FILE_UPLOAD_URL, API_FILE_URL} from '@mintter/shared' import { Button, Card, @@ -171,7 +171,7 @@ function NostrComponent({ const header = `${nostrNpud.slice(0, 6)}...${nostrNpud.slice(-6)}` if (block.props.name && block.props.name !== '') { - fetch(`${BACKEND_FILE_URL}/${block.props.url}`, { + fetch(`${API_FILE_URL}/${block.props.url}`, { method: 'GET', }).then((response) => { if (response) { @@ -394,7 +394,7 @@ function NostrForm({ const formData = new FormData() formData.append('file', blob, event.id) - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) diff --git a/frontend/packages/editor/src/video.tsx b/frontend/packages/editor/src/video.tsx index 64af539d79..0600cdacba 100644 --- a/frontend/packages/editor/src/video.tsx +++ b/frontend/packages/editor/src/video.tsx @@ -1,6 +1,6 @@ import {toast} from '@mintter/app/toast' import {client} from '@mintter/desktop/src/trpc' -import {BACKEND_FILE_UPLOAD_URL, BACKEND_FILE_URL} from '@mintter/shared' +import {API_FILE_UPLOAD_URL, API_FILE_URL} from '@mintter/shared' import { Button, Form, @@ -204,7 +204,7 @@ function VideoComponent({ formData.append('file', file) try { - const response = await fetch(BACKEND_FILE_UPLOAD_URL, { + const response = await fetch(API_FILE_UPLOAD_URL, { method: 'POST', body: formData, }) @@ -221,7 +221,7 @@ function VideoComponent({ // editor.setTextCursorPosition(editor.topLevelBlocks.slice(-1)[0], 'end') } - let mediaUrl = `${BACKEND_FILE_URL}/${block.props.url.replace('ipfs://', '')}` + let mediaUrl = `${API_FILE_URL}/${block.props.url.replace('ipfs://', '')}` return ( // we are using this ternary ugly thing with `import.meta.env?` and `process.env` because this variables will be loaded in different runtimes, and not in all runtines both "ways" are available. +export const HTTP_PORT = + (import.meta.env && import.meta.env.VITE_DESKTOP_HTTP_PORT) || + process.env.VITE_DESKTOP_HTTP_PORT -export const MINTTER_GATEWAY_URL = - (import.meta.env && import.meta.env.VITE_MINTTER_GATEWAY_URL) || - process.env.VITE_MINTTER_GATEWAY_URL || - 'https://mintter.com/' -export const BACKEND_HTTP_PORT = - (import.meta.env && import.meta.env.VITE_BACKEND_HTTP_PORT) || - process.env.VITE_BACKEND_HTTP_PORT || - '55001' - -export const BACKEND_GRPC_PORT = - (import.meta.env && import.meta.env.VITE_BACKEND_GRPC_PORT) || - process.env.VITE_BACKEND_GRPC_PORT || - '56001' - -export const BACKEND_P2P_PORT = - (import.meta.env && import.meta.env.VITE_BACKEND_P2P_PORT) || - process.env.VITE_BACKEND_P2P_PORT || - '56002' - -export const BACKEND_HOSTNAME = - (import.meta.env && import.meta.env.VITE_BACKEND_HOSTNAME) || - process.env.VITE_BACKEND_HOSTNAME || - 'http://localhost' - -export const APP_VERSION = - (import.meta.env && import.meta.env.VITE_APP_VERSION) || - process.env.VITE_APP_VERSION || +export const GRPC_PORT = + (import.meta.env && import.meta.env.VITE_DESKTOP_GRPC_PORT) || + process.env.VITE_DESKTOP_GRPC_PORT + +export const P2P_PORT = + (import.meta.env && import.meta.env.VITE_DESKTOP_P2P_PORT) || + process.env.VITE_DESKTOP_P2P_PORT + +export const HOSTNAME = + (import.meta.env && import.meta.env.VITE_DESKTOP_HOSTNAME) || + process.env.VITE_DESKTOP_HOSTNAME + +export const VERSION = + (import.meta.env && import.meta.env.VITE_VERSION) || + process.env.VITE_VERSION || + '0.0.0' + +export const API_HTTP_URL = `${HOSTNAME}:${HTTP_PORT}` +export const API_FILE_UPLOAD_URL = `${HOSTNAME}:${HTTP_PORT}/ipfs/file-upload` +export const API_FILE_URL = `${HOSTNAME}:${HTTP_PORT}/ipfs` +export const API_GRAPHQL_ENDPOINT = `${HOSTNAME}:${HTTP_PORT}/graphql` + +// this is injected by Vite, so it indicates if we are in the production build of the DESKTOP app +export const IS_PROD_DESKTOP = !!import.meta.env?.PROD + +export const LIGHTNING_API_URL = IS_PROD_DESKTOP + ? 'https://ln.mintter.com' + : 'https://ln.testnet.mintter.com' + +export const HM_SENTRY_DESKTOP_DSN = + (import.meta.env && import.meta.env.VITE_HM_SENTRY_DESKTOP_DSN) || + process.env.VITE_HM_SENTRY_DESKTOP_DSN || + 'https://8d3089ffb71045dc911bc66efbd3463a@o4504088793841664.ingest.sentry.io/4505527460429824' + +/** + * /// + +// we are using this ternary ugly thing with `import.meta.env?` and `process.env` because this variables will be loaded in different runtimes, and not in all runtines both "ways" are available. + +export const VERSION = + (import.meta.env && import.meta.env.VITE_VERSION) || + process.env.VITE_VERSION || '0.0.0' -export const BACKEND_HTTP_URL = `${BACKEND_HOSTNAME}:${BACKEND_HTTP_PORT}` -export const BACKEND_GRPC_URL = `${BACKEND_HOSTNAME}:${BACKEND_GRPC_PORT}` -export const BACKEND_P2P_URL = `${BACKEND_HOSTNAME}:${BACKEND_P2P_PORT}` -export const BACKEND_FILE_UPLOAD_URL = `${BACKEND_HOSTNAME}:${BACKEND_HTTP_PORT}/ipfs/file-upload` -export const BACKEND_FILE_URL = `${BACKEND_HOSTNAME}:${BACKEND_HTTP_PORT}/ipfs` -export const BACKEND_GRAPHQL_ENDPOINT = `${BACKEND_HOSTNAME}:${BACKEND_HTTP_PORT}/graphql` +export const API_HTTP_URL = `${import.meta.env.VITE_HOSTNAME}:${ + import.meta.env.VITE_HTTP_PORT +}` + +export const API_FILE_UPLOAD_URL = `${import.meta.env.VITE_HOSTNAME}:${ + import.meta.env.VITE_HTTP_PORT +}/ipfs/file-upload` +export const API_FILE_URL = `${import.meta.env.VITE_HOSTNAME}:${ + import.meta.env.VITE_HTTP_PORT +}/ipfs` +export const API_GRAPHQL_ENDPOINT = `${import.meta.env.VITE_HOSTNAME}:${ + import.meta.env.VITE_HTTP_PORT +}/graphql` // this is injected by Vite, so it indicates if we are in the production build of the DESKTOP app export const IS_PROD_DESKTOP = !!import.meta.env?.PROD -export const LIGHTNING_SERVER_URL = IS_PROD_DESKTOP +export const LIGHTNING_API_URL = IS_PROD_DESKTOP ? 'https://ln.mintter.com' : 'https://ln.testnet.mintter.com' export const HM_SENTRY_DESKTOP_DSN = import.meta.env ?.VITE_MINTTER_SENTRY_DESKTOP + + */ diff --git a/frontend/packages/shared/src/publication-content.tsx b/frontend/packages/shared/src/publication-content.tsx index 80992222ef..8cb1606c83 100644 --- a/frontend/packages/shared/src/publication-content.tsx +++ b/frontend/packages/shared/src/publication-content.tsx @@ -1,6 +1,6 @@ import {PartialMessage, Timestamp} from '@bufbuild/protobuf' import { - BACKEND_HTTP_URL, + API_HTTP_URL, Block, BlockNode, HMBlock, @@ -1213,7 +1213,7 @@ export function BlockContentNostr({block}: {block: HMBlockFile}) { (content === undefined || verified === undefined) ) { const cid = getCIDFromIPFSUrl(block.ref) - fetch(`${BACKEND_HTTP_URL}/ipfs/${cid}`, { + fetch(`${API_HTTP_URL}/ipfs/${cid}`, { method: 'GET', }).then((response) => { if (response) { diff --git a/frontend/packages/ui/.eslintrc.js b/frontend/packages/ui/.eslintrc.js deleted file mode 100644 index 6173d2ccd5..0000000000 --- a/frontend/packages/ui/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ['custom'], -} diff --git a/frontend/packages/ui/package.json b/frontend/packages/ui/package.json index afcb4c2e8f..af8f4f9146 100644 --- a/frontend/packages/ui/package.json +++ b/frontend/packages/ui/package.json @@ -14,13 +14,11 @@ ], "scripts": { "build": "tamagui-build ./src", - "lint": "eslint .", - "lint:fix": "eslint . --fix", "watch": "tamagui-build --watch", "format": "prettier \"**/*.{ts,tsx,md,mdx,json,js}\" --check --ignore-path ../../../.prettierignore", "clean": "tamagui-build clean", "clean:build": "tamagui-build clean:build", - "test": "echo TODO", + "test": "echo NO TESTS", "typecheck": "tsc --noEmit", "generate": "tamagui generate-themes ./src/themes/theme.ts ./src/themes-generated.ts" }, @@ -45,7 +43,6 @@ }, "devDependencies": { "@mintter/prettier": "*", - "@tamagui/build": "latest", - "eslint-config-custom": "*" + "@tamagui/build": "latest" } } diff --git a/package.json b/package.json index fbfc2b6901..26681d0d97 100644 --- a/package.json +++ b/package.json @@ -2,19 +2,20 @@ "name": "mintter", "private": true, "scripts": { - "test": "APP_FOLDER_NAME=Mintter.test && turbo test --continue", - "validate": "yarn lint && yarn format", - "validate:fix": "yarn lint:fix && yarn format:fix", - "site": "TAMAGUI_TARGET=web yarn build && cd frontend/apps/site && yarn dev", - "site:prod": "TAMAGUI_TARGET=web yarn build && yarn workspace @mintter/site build", + "test": "turbo test --continue", + "validate": "yarn format", + "validate:fix": "yarn format:fix", + "site": "yarn build && cd frontend/apps/site && yarn dev", + "site:prod": "yarn build && yarn workspace @mintter/site build", "site:serve": "yarn workspace @mintter/site serve", - "site:test": "yarn test --filter=!@mintter/desktop", + "site:test": "yarn workspace @mintter/site test", "site:extract": "DISABLE_EXTRACTION=false yarn workspace @mintter/site dev", - "desktop": "TAMAGUI_TARGET=web concurrently -n \"DESKTOP:APP,UI\" -c \"blue,green\" -p \"[{name}]\" \"yarn workspace @mintter/desktop dev\" \"yarn watch\"", - "desktop:make": "TAMAGUI_TARGET=web yarn build && yarn workspace @mintter/desktop make", - "desktop:package": "TAMAGUI_TARGET=web yarn build && yarn workspace @mintter/desktop package", - "desktop:publish": "TAMAGUI_TARGET=web yarn build && yarn workspace @mintter/desktop publish", - "desktop:test": "yarn test --filter=!@mintter/site", + "desktop": "concurrently -n \"DESKTOP:APP,UI\" -c \"blue,green\" -p \"[{name}]\" \"yarn workspace @mintter/desktop dev\" \"yarn watch\"", + "desktop:make": "yarn build && yarn workspace @mintter/desktop make", + "desktop:package": "yarn build && yarn workspace @mintter/desktop package", + "desktop:test:package": "yarn build && yarn workspace @mintter/desktop package:test", + "desktop:publish": "yarn build && yarn workspace @mintter/desktop publish", + "desktop:test": "yarn workspace @mintter/desktop test", "desktop:devtools": "yarn workspace @mintter/desktop devtools", "watch": "yarn workspaces foreach -pi run watch", "fix": "manypkg fix", @@ -25,8 +26,6 @@ "check-deps": "check-dependency-version-consistency .", "docs": "yarn workspace @mintter/docs start", "upgrade:tamagui": "yarn up '*tamagui*'@latest '@tamagui/*'@latest", - "lint": "yarn turbo lint", - "lint:fix": "yarn turbo lint:fix", "generate": "yarn turbo gen", "ui:build": "yarn workspace @mintter/ui generate && yarn workspace @mintter/ui build", "gen": "yarn generate", @@ -50,7 +49,6 @@ "check-dependency-version-consistency": "4.1.0", "cross-env": "7.0.3", "electron-squirrel-startup": "1.0.0", - "eslint": "8.47.0", "graphql-codegen": "0.4.0", "node-gyp": "9.3.1", "prettier": "3.0.2", @@ -58,13 +56,15 @@ "sort-package-json": "2.5.1", "superjson": "1.13.3", "tamagui": "1.79.1", - "ts-node": "10.9.1", "turbo": "1.11.2", "typescript": "5.2.2" }, "devDependencies": { + "@playwright/test": "1.40.1", "@storybook/nextjs": "7.0.26", "babel-plugin-react-native-web": "0.19.9", - "concurrently": "8.2.1" + "concurrently": "8.2.1", + "playwright": "^1.40.1", + "ts-node": "10.9.1" } } diff --git a/scripts/set-desktop-version.mjs b/scripts/set-desktop-version.mjs index 22a3416747..9ff2d5ab38 100644 --- a/scripts/set-desktop-version.mjs +++ b/scripts/set-desktop-version.mjs @@ -4,13 +4,13 @@ const packageJsonPath = "./frontend/apps/desktop/package.json"; const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); // Update the version attribute -packageJson.version = process.env.APP_VERSION; +packageJson.version = process.env.VITE_VERSION; try { // Write the updated package.json back to the file fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); console.log( - `[SET-VERSION]: Successfully change the app version to ${process.env.APP_VERSION}` + `[SET-VERSION]: Successfully change the app version to ${process.env.VITE_VERSION}` ); } catch (error) { console.error( diff --git a/turbo.json b/turbo.json index 50ac910c18..d8293183bb 100644 --- a/turbo.json +++ b/turbo.json @@ -6,9 +6,6 @@ "dependsOn": ["^build"], "outputs": [".next/**", "!.next/cache/**", "out/**"] }, - "lint": { - "ignore": ["./frontend/packages/ui/dist/**"] - }, "format": { "outputs": ["node_modules/.cache/.prettiercache"], "outputMode": "new-only" diff --git a/yarn.lock b/yarn.lock index f5ef6ce508..c509bd228f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - "@algolia/autocomplete-core@npm:1.9.3": version: 1.9.3 resolution: "@algolia/autocomplete-core@npm:1.9.3" @@ -55,83 +48,83 @@ __metadata: languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/cache-browser-local-storage@npm:4.22.0" +"@algolia/cache-browser-local-storage@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-browser-local-storage@npm:4.22.1" dependencies: - "@algolia/cache-common": 4.22.0 - checksum: 4fa21d73f0e808832d937d9582ca1f45b0bcc5cd4276ab2ac9330bcdef08918dd34831787973ff1bb493cb16eb606004b41f4f0f904eee26cb1d47b18f99ce2e + "@algolia/cache-common": 4.22.1 + checksum: 82e65c0dbc015d55bf17842757d21c3769fde95c10235d038062ccb41f2f64b3b1efd953df0f1b4892f352d83cdf2b8374a8f1b4e06b4ba42b35c3a449d316e7 languageName: node linkType: hard -"@algolia/cache-common@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/cache-common@npm:4.22.0" - checksum: 9ad444f8799d2dd4e7720d0ea203c4526d1b19687adf31bebe81f0537b2db8b6c9dd6eda997801e7bbc921694a19853a071c5885e69566c30e4398ec0da4efcd +"@algolia/cache-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-common@npm:4.22.1" + checksum: b57b195fdf75ca53417541fd03b48fa2351c18261f21ddc462ca4e76adef4750a35df9db707e9acc9f7a67fb465757d7f254423b4f8b0661056e4d2ec07392c1 languageName: node linkType: hard -"@algolia/cache-in-memory@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/cache-in-memory@npm:4.22.0" +"@algolia/cache-in-memory@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/cache-in-memory@npm:4.22.1" dependencies: - "@algolia/cache-common": 4.22.0 - checksum: 55b09ec4cab57d30387111bdf79fd536a1f3c344fed6305dce7ee63f420135db09632821e3fbc2423c89d84a7cbfee495b509fa4e788de424ea98ac2c62ca392 + "@algolia/cache-common": 4.22.1 + checksum: 83dfe0e3360f5dd03ead8165f6e92e5a414d9e43eee2dd2fb682d418ddcf8c2cb176d040f57ac75018f62ab805518991157bf8572625f1420515f1959f4fdcaa languageName: node linkType: hard -"@algolia/client-account@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/client-account@npm:4.22.0" +"@algolia/client-account@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-account@npm:4.22.1" dependencies: - "@algolia/client-common": 4.22.0 - "@algolia/client-search": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: d6793c855356155332ee25253fa5cc0f6df0a3508ee649f1e330e2a83a6dfca44b13cd13ee42a92aff56c76be4291704e9242b6f4ed79ed9f7ffe75a00008b67 + "@algolia/client-common": 4.22.1 + "@algolia/client-search": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 85f3f7f9fa8e9d5b723e128f3b801583d73e4dc529086d57adfc1ac1718c3e13c0660c0d3f3a43a033d5aa231962ed405912826ae74a5c996929943fc575e7ed languageName: node linkType: hard -"@algolia/client-analytics@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/client-analytics@npm:4.22.0" +"@algolia/client-analytics@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-analytics@npm:4.22.1" dependencies: - "@algolia/client-common": 4.22.0 - "@algolia/client-search": 4.22.0 - "@algolia/requester-common": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: ace1b5a8959f9d0dbed51f9a745bd5942158e407b84dcf248cc0acd4354f18d6eb44430530fc00723d399afc4c223256fa80664521dc5010469c55ef0ef53365 + "@algolia/client-common": 4.22.1 + "@algolia/client-search": 4.22.1 + "@algolia/requester-common": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 8a352ae6bbddeba86fbf12de6bdd4f48d7331c5d8cdf803af803f5957a10d0a09ead58e75e364d25a7becdf68e9d5252377e307c055cbfbd6bc2048557bd75f6 languageName: node linkType: hard -"@algolia/client-common@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/client-common@npm:4.22.0" +"@algolia/client-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-common@npm:4.22.1" dependencies: - "@algolia/requester-common": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: 7207d014d027837f4b12736a66067306e0336dacb061b3d5e78029e0d83bc726de160658a0771e23c0d47ee774c249f62ed565eb0ea594bacc8e1c2ed46ccc5e + "@algolia/requester-common": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 848225464bf62972eee80faed400b6e9666678e724c5ddd3ecedc6fb57db1cd5c47c4a06a4cba90f83db38353ea8dcbf53b51d1423164a0258bce7bbe417e7f8 languageName: node linkType: hard -"@algolia/client-personalization@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/client-personalization@npm:4.22.0" +"@algolia/client-personalization@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-personalization@npm:4.22.1" dependencies: - "@algolia/client-common": 4.22.0 - "@algolia/requester-common": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: da5a948c5db8a8bc0c2531c103b706bae5b4c8392be65082bde0712d8ed188f0019a705ec5f5937e18c5d4a8a946de0a04c0a445bf53416041cbc715e19d4d33 + "@algolia/client-common": 4.22.1 + "@algolia/requester-common": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 64c359c12d2722dfcc821a3bacfed2c49f94159060776fba871b66e4961757732d9696840f415b45bbe5ad1dbd39e2c512a81851a9cfeeec8511975396dad245 languageName: node linkType: hard -"@algolia/client-search@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/client-search@npm:4.22.0" +"@algolia/client-search@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/client-search@npm:4.22.1" dependencies: - "@algolia/client-common": 4.22.0 - "@algolia/requester-common": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: 32ad4878ea8c188dc34cf97793d2ad1caa557cab6522f2ecf0291998c16ba6cbb6bf2532e424017d6938862c6b586588776d3d965e746daab028c3c8725eaca1 + "@algolia/client-common": 4.22.1 + "@algolia/requester-common": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 0477f003c19cf1dbb6190fd491136927bc7174fa9d5a27dead218a51807da9c519be114000bd035265c018682fd8654d110cab07f74004c8c8d069db19800c3d languageName: node linkType: hard @@ -142,55 +135,55 @@ __metadata: languageName: node linkType: hard -"@algolia/logger-common@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/logger-common@npm:4.22.0" - checksum: 9ea190eaa0ddca0a7a0810a0cabcc98a794ef3f5e1fe7ed4eaeb07c81c55f8b5ee4052365af589e4fccbef8115ba101746293f2c09382adda472dc335a43e3b9 +"@algolia/logger-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/logger-common@npm:4.22.1" + checksum: 3ac5430f73e8eabb4e7561b271d38151fb7f128491437c202dac3d54f7c3a83ebc96818532746422ea4abdf9d68a6ccb716dc8b97f69101ff642afaff12057e5 languageName: node linkType: hard -"@algolia/logger-console@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/logger-console@npm:4.22.0" +"@algolia/logger-console@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/logger-console@npm:4.22.1" dependencies: - "@algolia/logger-common": 4.22.0 - checksum: 4eda252ca82e080a0f3a6dc5327f62910ae80c43fa50a7181ce035408f5a92127c4887f1e1f559210769bd3e8d6dfbac050f076ed70bfc1ed39d7ec40b9ee8fd + "@algolia/logger-common": 4.22.1 + checksum: fc6ea0623b257420f4e10ca1a78875dfb4c55841a0db5712150344d742ca457038f209b63c4e25848338c652e5ca5ea052a4143c87c3dc1203eedc5bff0c54f3 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/requester-browser-xhr@npm:4.22.0" +"@algolia/requester-browser-xhr@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-browser-xhr@npm:4.22.1" dependencies: - "@algolia/requester-common": 4.22.0 - checksum: 3abb3881970b1aca5500dd8cb6e91c02b8e55a5f25c075702ce32472328a271fdd63e197b6a0049967f5ec7e23f98e9aca909f01a4d199befd7da8924dd2d42c + "@algolia/requester-common": 4.22.1 + checksum: 825cf73fdc6aa8b159cd35ebb1facbeccb9fe27c4360661b7c9287d830d92409baaa38ad78f6c6f72bcdebc6e9d6ae8a5c8648e998fd34617b7f1eb7a59ea83b languageName: node linkType: hard -"@algolia/requester-common@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/requester-common@npm:4.22.0" - checksum: 59c8d857b9f88e743b34e4f1c259b0c85e2e2d93bdf7ebc2b3e31baee3dc7d64e0ba7bb3ada7c98dc790af6006efaa2984ccde4f7494c52aaeb42ca6590e4820 +"@algolia/requester-common@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-common@npm:4.22.1" + checksum: 7caae4924efccabefd6b1a1d4e7090ed2f6dd4ab53dedf2f2095d5c1ef016c841129331c79791f7ded8072e174204503814f11119ac8bc75f5e10ae2eb42a85b languageName: node linkType: hard -"@algolia/requester-node-http@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/requester-node-http@npm:4.22.0" +"@algolia/requester-node-http@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/requester-node-http@npm:4.22.1" dependencies: - "@algolia/requester-common": 4.22.0 - checksum: a140c7421b8c72e3018e2f0305cdd8fa51ebadd31ff6e2de60857fe4f9a32442bb0312bede95925f3676c02242787c1657af246d794c5dfb819fcf9600f3f2d3 + "@algolia/requester-common": 4.22.1 + checksum: 511348954b7747006875132ed0bc922ec3cfcf0187f41a665fc45426982479dd5cd55fab1de592ac9a71180539ff2e4c7457eea3bdab0e56bce27de2de1ba677 languageName: node linkType: hard -"@algolia/transporter@npm:4.22.0": - version: 4.22.0 - resolution: "@algolia/transporter@npm:4.22.0" +"@algolia/transporter@npm:4.22.1": + version: 4.22.1 + resolution: "@algolia/transporter@npm:4.22.1" dependencies: - "@algolia/cache-common": 4.22.0 - "@algolia/logger-common": 4.22.0 - "@algolia/requester-common": 4.22.0 - checksum: 6173f67e9c14b9d29d26955bd0dc8f1ec9b04eab18e9a87292a3ef3bdd5b16f1b376dbb264309f5f191dc370eae359c17e4f45163514883c73b86207ba4b5ea9 + "@algolia/cache-common": 4.22.1 + "@algolia/logger-common": 4.22.1 + "@algolia/requester-common": 4.22.1 + checksum: 737e787ac77215f30db54ebab3431e06cfee1790ab7cf45222546470546ecb276eedfaa0aedf78b2c95efa9d5550ea7d47c947535f143d7002a22f781d8721ce languageName: node linkType: hard @@ -568,13 +561,13 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/helpers@npm:7.23.7" + version: 7.23.8 + resolution: "@babel/helpers@npm:7.23.8" dependencies: "@babel/template": ^7.22.15 "@babel/traverse": ^7.23.7 "@babel/types": ^7.23.6 - checksum: 4f3bdf35fb54ff79107c6020ba1e36a38213a15b05ca0fa06c553b65f566e185fba6339fb3344be04593ebc244ed0bbb0c6087e73effe0d053a30bcd2db3a013 + checksum: 8b522d527921f8df45a983dc7b8e790c021250addf81ba7900ba016e165442a527348f6f877aa55e1debb3eef9e860a334b4e8d834e6c9b438ed61a63d9a7ad4 languageName: node linkType: hard @@ -1046,22 +1039,21 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.3, @babel/plugin-transform-classes@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/plugin-transform-classes@npm:7.23.5" +"@babel/plugin-transform-classes@npm:^7.23.3, @babel/plugin-transform-classes@npm:^7.23.8": + version: 7.23.8 + resolution: "@babel/plugin-transform-classes@npm:7.23.8" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-compilation-targets": ^7.23.6 "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-function-name": ^7.23.0 - "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-replace-supers": ^7.22.20 "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d0dd3b0828e84a139a51b368f33f315edee5688ef72c68ba25e0175c68ea7357f9c8810b3f61713e368a3063cdcec94f3a2db952e453b0b14ef428a34aa8169 + checksum: 7dee6cebe52131d2d16944f36e1fdb9d4b24f44d0e7e450f93a44435d001f17cc0789a4cb6b15ec67c8e484581b8a730b5c3ec374470f29ff0133086955b8c58 languageName: node linkType: hard @@ -1667,8 +1659,8 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.18.6, @babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.20.2": - version: 7.23.7 - resolution: "@babel/preset-env@npm:7.23.7" + version: 7.23.8 + resolution: "@babel/preset-env@npm:7.23.8" dependencies: "@babel/compat-data": ^7.23.5 "@babel/helper-compilation-targets": ^7.23.6 @@ -1703,7 +1695,7 @@ __metadata: "@babel/plugin-transform-block-scoping": ^7.23.4 "@babel/plugin-transform-class-properties": ^7.23.3 "@babel/plugin-transform-class-static-block": ^7.23.4 - "@babel/plugin-transform-classes": ^7.23.5 + "@babel/plugin-transform-classes": ^7.23.8 "@babel/plugin-transform-computed-properties": ^7.23.3 "@babel/plugin-transform-destructuring": ^7.23.3 "@babel/plugin-transform-dotall-regex": ^7.23.3 @@ -1752,7 +1744,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4b5eb466d9d4beca56c6fdaac92e99d440dc5650fdfd6ebf0d2a07380ebb43b4dc9aedf93bb30d1d1cd56d9e264d3728df348159e18dd138729b249261be11bf + checksum: b850f99fc4aed4ba22c7d9207bd2bbc7a729b49ea6f2c2c36e819fe209e309b96fba336096e555b46f791b39f7cdd5ac41246b556283d435a99106eb825a209f languageName: node linkType: hard @@ -1821,12 +1813,12 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.18.6": - version: 7.23.7 - resolution: "@babel/runtime-corejs3@npm:7.23.7" + version: 7.23.8 + resolution: "@babel/runtime-corejs3@npm:7.23.8" dependencies: core-js-pure: ^3.30.2 regenerator-runtime: ^0.14.0 - checksum: 98792dc4558aba3f57f0a102e1be0a13b5dfa78ecbc1a57a9d7aeb898b2b182961a9e7c83984028e5eb4dbf0e42cdeb92cd33c36d346c3a701d2d9dc0c1fce7a + checksum: e786b79bcb3031bd7433fb4523e43f0acbd386cd7bb5b0a6df6e627c7965706b3d5612211ea3d729ce4459ba1d1b654ccdd8aefe791c6413f70882ee1be903b9 languageName: node linkType: hard @@ -1840,11 +1832,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @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.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4": - version: 7.23.7 - resolution: "@babel/runtime@npm:7.23.7" + version: 7.23.8 + resolution: "@babel/runtime@npm:7.23.8" dependencies: regenerator-runtime: ^0.14.0 - checksum: eba85bd24d250abb5ae19b16cffc15a54d3894d8228ace40fa4c0e2f1938f28b38ad3e3430ebff9a1ef511eeb8c527e36044ac19076d6deafa52cef35d8624b9 + checksum: 0bd5543c26811153822a9f382fd39886f66825ff2a397a19008011376533747cd05c33a91f6248c0b8b0edf0448d7c167ebfba34786088f1b7eb11c65be7dfc3 languageName: node linkType: hard @@ -3056,8 +3048,8 @@ __metadata: linkType: hard "@electron/rebuild@npm:^3.2.10": - version: 3.4.1 - resolution: "@electron/rebuild@npm:3.4.1" + version: 3.5.0 + resolution: "@electron/rebuild@npm:3.5.0" dependencies: "@malept/cross-spawn-promise": ^2.0.0 chalk: ^4.0.0 @@ -3066,7 +3058,7 @@ __metadata: fs-extra: ^10.0.0 got: ^11.7.0 node-abi: ^3.45.0 - node-api-version: ^0.1.4 + node-api-version: ^0.2.0 node-gyp: ^9.0.0 ora: ^5.1.0 read-binary-file-arch: ^1.0.6 @@ -3075,7 +3067,7 @@ __metadata: yargs: ^17.0.1 bin: electron-rebuild: lib/cli.js - checksum: 51b8a23f7638bf2995c61ec4d55549f5679a713dfe7ae94e1dce28186bce7f449c9aa48dc4af0188722d288153e52c6973ee6238e92685e0aeca4ad6064eb9e1 + checksum: 58d6685e1bb5130829f7def4d711b95fa170e0229e63052bda684fa18b5d84f2bc610c7ce1c7ba920b4d317198cff84df767573e401e9a8a47a9e9bb617625a4 languageName: node linkType: hard @@ -3763,48 +3755,6 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 - languageName: node - linkType: hard - -"@eslint/js@npm:^8.47.0": - version: 8.56.0 - resolution: "@eslint/js@npm:8.56.0" - checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539 - languageName: node - linkType: hard - "@expo/config-plugins@npm:~5.0.0": version: 5.0.4 resolution: "@expo/config-plugins@npm:5.0.4" @@ -4088,31 +4038,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" - dependencies: - "@humanwhocodes/object-schema": ^2.0.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4852,7 +4777,6 @@ __metadata: allotment: 1.18.1 cmdk: 0.1.21 copy-text-to-clipboard: 3.1.0 - eslint-config-custom: "*" fast-deep-equal: ^3.1.3 graphql-request: 6.0.0 happy-dom: 7.8.1 @@ -4890,7 +4814,7 @@ __metadata: "@mintter/prettier": "*" "@mintter/shared": "*" "@mintter/ui": "*" - "@playwright/test": 1.37.1 + "@playwright/test": 1.40.1 "@sentry/electron": 4.7.0 "@sentry/vite-plugin": latest "@tamagui/vite-plugin": latest @@ -4908,8 +4832,8 @@ __metadata: electron-squirrel-startup: 1.0.0 electron-store: 8.1.0 electron-trpc: 0.5.2 - eslint-config-custom: "*" fs-extra: 11.1.1 + loglevel: ^1.8.1 match-sorter: 6.3.1 react: 18.2.0 react-devtools: 4.28.0 @@ -4976,7 +4900,6 @@ __metadata: "@types/prosemirror-dev-tools": 3.0.3 "@types/react": 18.2.21 "@types/react-dom": 18.2.7 - eslint-config-custom: "*" happy-dom: 7.8.1 hast-util-from-dom: 4.2.0 jsdom: 22.1.0 @@ -5024,7 +4947,6 @@ __metadata: "@bufbuild/protobuf": 1.4.1 "@connectrpc/connect-web": 1.1.3 "@mintter/prettier": "*" - eslint-config-custom: "*" typescript: 5.1.6 vitest: 0.34.2 languageName: unknown @@ -5059,7 +4981,6 @@ __metadata: browser-headers: 0.4.1 clsx: 1.2.1 date-fns: 2.30.0 - eslint-config-custom: "*" expo-modules-core: 0.6.5 expo-screen-orientation: 4.3.0 is-plain-object: 5.0.0 @@ -5113,20 +5034,19 @@ __metadata: "@tamagui/themes": 1.79.1 "@tamagui/toast": 1.79.1 "@tamagui/web": 1.79.1 - eslint-config-custom: "*" tamagui: 1.79.1 languageName: unknown linkType: soft "@motionone/animation@npm:^10.12.0": - version: 10.16.3 - resolution: "@motionone/animation@npm:10.16.3" + version: 10.17.0 + resolution: "@motionone/animation@npm:10.17.0" dependencies: - "@motionone/easing": ^10.16.3 - "@motionone/types": ^10.16.3 - "@motionone/utils": ^10.16.3 + "@motionone/easing": ^10.17.0 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 tslib: ^2.3.1 - checksum: 797cacea335e6f892af27579eff51450dcf18c5bbc5c0ca44a000929b21857f4afb974ffb411c4935bfbd01ef2ddb3ef542ba3313ae66e1e5392b5d314df6ad3 + checksum: 8cab13cde7ccbe29bcaff1cb43ba39acdc51d9be4726628f4d0ba27898c59456887fd9ec56aceaa3d5b82993efbdfa9a7b9e99d4b96bc458f486208394027093 languageName: node linkType: hard @@ -5144,42 +5064,42 @@ __metadata: languageName: node linkType: hard -"@motionone/easing@npm:^10.16.3": - version: 10.16.3 - resolution: "@motionone/easing@npm:10.16.3" +"@motionone/easing@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/easing@npm:10.17.0" dependencies: - "@motionone/utils": ^10.16.3 + "@motionone/utils": ^10.17.0 tslib: ^2.3.1 - checksum: 03e2460cdd35ee4967a86ce28ffbaaaca589263f659f652801cf6bd667baba9b3d5ce6d134df6b64413b60b34dd21d7c38b0cd8a4c3e1ed789789cdb971905b2 + checksum: 2870d9e94645cf4ed3a27309a858dccee26615291ec46b56e993ef3ac9f059a659b02a2115ed61d27250fc8800acc9640f0319aeb402de7fa0e15dffbebeb548 languageName: node linkType: hard "@motionone/generators@npm:^10.12.0": - version: 10.16.4 - resolution: "@motionone/generators@npm:10.16.4" + version: 10.17.0 + resolution: "@motionone/generators@npm:10.17.0" dependencies: - "@motionone/types": ^10.16.3 - "@motionone/utils": ^10.16.3 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 tslib: ^2.3.1 - checksum: 185091c5cfbe67c38e84bf3920d1b5862e5d7eb624136494a7e4779b2f9d06855ebe3e633d95dcc5a1735d92d59d1ae28a0724c2f9d8bddd60fc9bc3603fab48 + checksum: 6d048a0362692db3f450b97c1679a8d0265bff93106412bdcc33b9c48b9362a3e97f672f29a2932d5e393330750fdd55921c1c9b2bf20690922a37a0164e649f languageName: node linkType: hard -"@motionone/types@npm:^10.12.0, @motionone/types@npm:^10.16.3": - version: 10.16.3 - resolution: "@motionone/types@npm:10.16.3" - checksum: ff38982f5aff2c0abbc3051c843d186d6f954c971e97dd6fced97a4ef50ee04f6e49607541ebb80e14dd143cf63553c388392110e270d04eca23f6b529f7f321 +"@motionone/types@npm:^10.12.0, @motionone/types@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/types@npm:10.17.0" + checksum: 3996c84e1578b17146c14bd581ab682b7b2a06ca7fd5a7dc378a0f3b10539256d7b803a7df748f0c60d6df6b33950269a27ba2bb1839de779196bd024bee4b87 languageName: node linkType: hard -"@motionone/utils@npm:^10.12.0, @motionone/utils@npm:^10.16.3": - version: 10.16.3 - resolution: "@motionone/utils@npm:10.16.3" +"@motionone/utils@npm:^10.12.0, @motionone/utils@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/utils@npm:10.17.0" dependencies: - "@motionone/types": ^10.16.3 + "@motionone/types": ^10.17.0 hey-listen: ^1.0.8 tslib: ^2.3.1 - checksum: d06025911c54c2217c98026cd38d4d681268a2b9b2830ac7342820881ba6be09721dd03626f52547749ead0543d5e2f2a69c9270ffdeaabc0949f7afb3233817 + checksum: 408e278c9051a221e528bb9ca0a773018b9953ecd53bb88715421afc009f4647417b0d9f163c8195467badd934f39ade24f57e007416988e4291242e749ea43d languageName: node linkType: hard @@ -5203,15 +5123,6 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:13.4.19": - version: 13.4.19 - resolution: "@next/eslint-plugin-next@npm:13.4.19" - dependencies: - glob: 7.1.7 - checksum: d60c136e4a8d156b50d4b248eef9918bbf4bd7da293487cdf1f7bc172b07beeae4a2822798942d2f87999af86c53d871ebea592f3d6099ae23a0746d2abf7c73 - languageName: node - linkType: hard - "@next/swc-darwin-arm64@npm:13.5.6": version: 13.5.6 resolution: "@next/swc-darwin-arm64@npm:13.5.6" @@ -5322,7 +5233,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -5404,19 +5315,14 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:1.37.1": - version: 1.37.1 - resolution: "@playwright/test@npm:1.37.1" +"@playwright/test@npm:1.40.1": + version: 1.40.1 + resolution: "@playwright/test@npm:1.40.1" dependencies: - "@types/node": "*" - fsevents: 2.3.2 - playwright-core: 1.37.1 - dependenciesMeta: - fsevents: - optional: true + playwright: 1.40.1 bin: playwright: cli.js - checksum: b7038f29000289103c08b215eff7aabdda70cdc1375fa7dad0e81651be71086a1e2fc0e0e29dc70348037c366cf0cc69f762373fda34ba1a74aa1658741d9195 + checksum: ae094e6cb809365c0707ee2b184e42d2a2542569ada020d2d44ca5866066941262bd9a67af185f86c2fb0133c9b712ea8cb73e2959a289e4261c5fd17077283c languageName: node linkType: hard @@ -6600,13 +6506,6 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.1.3": - version: 1.6.1 - resolution: "@rushstack/eslint-patch@npm:1.6.1" - checksum: d0c0fcc430dae71d9d929e593844aeaec8d326b1d6c27f18059e22dad486d8df43d6f0206b2021a0df789baf514642355bd86eae7a42c457b7b2f48a29bb0f53 - languageName: node - linkType: hard - "@scure/base@npm:1.1.1": version: 1.1.1 resolution: "@scure/base@npm:1.1.1" @@ -6677,14 +6576,14 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/tracing@npm:7.92.0": - version: 7.92.0 - resolution: "@sentry-internal/tracing@npm:7.92.0" +"@sentry-internal/tracing@npm:7.93.0": + version: 7.93.0 + resolution: "@sentry-internal/tracing@npm:7.93.0" dependencies: - "@sentry/core": 7.92.0 - "@sentry/types": 7.92.0 - "@sentry/utils": 7.92.0 - checksum: 2daa6916d6a57bbab33c993a1c6a306525772c4fc16c08a5287327c0fef4c2f7120cca3d353f669d4dceb0e95dc4bb72a2b53fde63979a7793a0527dfe7fecd4 + "@sentry/core": 7.93.0 + "@sentry/types": 7.93.0 + "@sentry/utils": 7.93.0 + checksum: d3e3536c2be747f6e02b844932ae251d52086a7c40bdcb4ddf32de5d9cee7d120f08cf494de887bda4228e9a43f9fccfc3610cba831a79eab147d607981e1388 languageName: node linkType: hard @@ -6731,51 +6630,51 @@ __metadata: languageName: node linkType: hard -"@sentry/cli-darwin@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-darwin@npm:2.24.1" +"@sentry/cli-darwin@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-darwin@npm:2.25.0" conditions: os=darwin languageName: node linkType: hard -"@sentry/cli-linux-arm64@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-linux-arm64@npm:2.24.1" +"@sentry/cli-linux-arm64@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-linux-arm64@npm:2.25.0" conditions: (os=linux | os=freebsd) & cpu=arm64 languageName: node linkType: hard -"@sentry/cli-linux-arm@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-linux-arm@npm:2.24.1" +"@sentry/cli-linux-arm@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-linux-arm@npm:2.25.0" conditions: (os=linux | os=freebsd) & cpu=arm languageName: node linkType: hard -"@sentry/cli-linux-i686@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-linux-i686@npm:2.24.1" +"@sentry/cli-linux-i686@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-linux-i686@npm:2.25.0" conditions: (os=linux | os=freebsd) & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-linux-x64@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-linux-x64@npm:2.24.1" +"@sentry/cli-linux-x64@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-linux-x64@npm:2.25.0" conditions: (os=linux | os=freebsd) & cpu=x64 languageName: node linkType: hard -"@sentry/cli-win32-i686@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-win32-i686@npm:2.24.1" +"@sentry/cli-win32-i686@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-win32-i686@npm:2.25.0" conditions: os=win32 & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-win32-x64@npm:2.24.1": - version: 2.24.1 - resolution: "@sentry/cli-win32-x64@npm:2.24.1" +"@sentry/cli-win32-x64@npm:2.25.0": + version: 2.25.0 + resolution: "@sentry/cli-win32-x64@npm:2.25.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6797,16 +6696,16 @@ __metadata: linkType: hard "@sentry/cli@npm:^2.22.3": - version: 2.24.1 - resolution: "@sentry/cli@npm:2.24.1" - dependencies: - "@sentry/cli-darwin": 2.24.1 - "@sentry/cli-linux-arm": 2.24.1 - "@sentry/cli-linux-arm64": 2.24.1 - "@sentry/cli-linux-i686": 2.24.1 - "@sentry/cli-linux-x64": 2.24.1 - "@sentry/cli-win32-i686": 2.24.1 - "@sentry/cli-win32-x64": 2.24.1 + version: 2.25.0 + resolution: "@sentry/cli@npm:2.25.0" + dependencies: + "@sentry/cli-darwin": 2.25.0 + "@sentry/cli-linux-arm": 2.25.0 + "@sentry/cli-linux-arm64": 2.25.0 + "@sentry/cli-linux-i686": 2.25.0 + "@sentry/cli-linux-x64": 2.25.0 + "@sentry/cli-win32-i686": 2.25.0 + "@sentry/cli-win32-x64": 2.25.0 https-proxy-agent: ^5.0.0 node-fetch: ^2.6.7 progress: ^2.0.3 @@ -6829,7 +6728,7 @@ __metadata: optional: true bin: sentry-cli: bin/sentry-cli - checksum: 5f00ceb93d1feb05ffab9dc81aebae4b1da9ba1b0ba40bfef553a12be573c8dfe930cd1cf5380405da06dc749eb22d4bcae17e8e8270e69245099733bb8e3df6 + checksum: 44a6a7dd34a6553afad65a60f97533a5fe58a6166162bf7dac0651a62080f9dc5ed8046a404ddaba6a65936d377081289191f00154716107409e08344a310235 languageName: node linkType: hard @@ -6865,13 +6764,13 @@ __metadata: languageName: node linkType: hard -"@sentry/core@npm:7.92.0": - version: 7.92.0 - resolution: "@sentry/core@npm:7.92.0" +"@sentry/core@npm:7.93.0": + version: 7.93.0 + resolution: "@sentry/core@npm:7.93.0" dependencies: - "@sentry/types": 7.92.0 - "@sentry/utils": 7.92.0 - checksum: 9db7454c64f672981d95f0cc061297cccd02c208c212c54ef7e1a1d7612e8e87a8bb1bbc51eadda919c01dac9c6f4ae5ad97e4ec7874528e2e4b5cb9d553a21f + "@sentry/types": 7.93.0 + "@sentry/utils": 7.93.0 + checksum: cbf9e944d985605bc38cc0d6b7ebeee10fa6d0f9ff9443d27c18a022e7ddcc1a70974c7ed9aafb2be094398f360c705e3464bf7359c3bdefd03724eac23048f4 languageName: node linkType: hard @@ -6960,15 +6859,15 @@ __metadata: linkType: hard "@sentry/node@npm:^7.60.0": - version: 7.92.0 - resolution: "@sentry/node@npm:7.92.0" + version: 7.93.0 + resolution: "@sentry/node@npm:7.93.0" dependencies: - "@sentry-internal/tracing": 7.92.0 - "@sentry/core": 7.92.0 - "@sentry/types": 7.92.0 - "@sentry/utils": 7.92.0 + "@sentry-internal/tracing": 7.93.0 + "@sentry/core": 7.93.0 + "@sentry/types": 7.93.0 + "@sentry/utils": 7.93.0 https-proxy-agent: ^5.0.0 - checksum: 77efdd0c3c0f868879e5f906975ecec226f5379f9e5426b99e1b5133c006760dc9a3a36a0bd757d8e0c392440fd443567380117b3fa7fbf466ca91293d051f56 + checksum: 15ba62b650f21e6cdaf464a1107079a06851f0de3da8b4fb94e98a74a488e9ce509ea6e3608bce587bb034a9704fbdbaff71e3a3e3dbaffe01c352f29f575a4e languageName: node linkType: hard @@ -7039,10 +6938,10 @@ __metadata: languageName: node linkType: hard -"@sentry/types@npm:7.92.0": - version: 7.92.0 - resolution: "@sentry/types@npm:7.92.0" - checksum: 0dac88acf76aeb905f68b180717ec03451922fea6ddb7a0d1af1d55e658e8e9d0b1d696f1d6eecbbb99f372c8cc622165bd24d5059a1ffb14fe7172cdbb57306 +"@sentry/types@npm:7.93.0": + version: 7.93.0 + resolution: "@sentry/types@npm:7.93.0" + checksum: 43d4bc3215f7bf916404608907d51c0c1bb22b28065a4633e5fc7d244a3f66965857f9ea8464a71040dd752b93035b0fdcd61880f14908f75c6bbdc9d55b882f languageName: node linkType: hard @@ -7075,12 +6974,12 @@ __metadata: languageName: node linkType: hard -"@sentry/utils@npm:7.92.0, @sentry/utils@npm:^7.60.0": - version: 7.92.0 - resolution: "@sentry/utils@npm:7.92.0" +"@sentry/utils@npm:7.93.0, @sentry/utils@npm:^7.60.0": + version: 7.93.0 + resolution: "@sentry/utils@npm:7.93.0" dependencies: - "@sentry/types": 7.92.0 - checksum: 358dd7f31558f0367e38e69f0b24e9b25d02e6ae15b8c5841b8ed4b55eaf6ba311449f283aec9887a6275cc191d3f6083209e8de31e50ab0a4f06e3015c1ccd3 + "@sentry/types": 7.93.0 + checksum: d668bfce46b9ea58778a4c2cbc8df5d16c781187dde10459c61acc57cc1e86028e08fb7dd49506137ce71f5b5280c03e0c3bb94a32b215a713bf422f3d880f7d languageName: node linkType: hard @@ -8210,9 +8109,9 @@ __metadata: languageName: node linkType: hard -"@tamagui/build@npm:1.82.9, @tamagui/build@npm:latest": - version: 1.82.9 - resolution: "@tamagui/build@npm:1.82.9" +"@tamagui/build@npm:1.84.1, @tamagui/build@npm:latest": + version: 1.84.1 + resolution: "@tamagui/build@npm:1.84.1" dependencies: "@types/fs-extra": ^9.0.13 chokidar: ^3.5.2 @@ -8225,7 +8124,7 @@ __metadata: typescript: ^5.2.2 bin: tamagui-build: tamagui-build.js - checksum: cad105fa1e08c798c381f5299418e130e2f88c9713e9b0e77d049c6e0640f2d6cdd85b8cd81ed27fd77923de65eea4eef5595e27f15977292f71bb6b13cd5d7a + checksum: 96a51b3b2e1abeaed3e1ed2e1e02d3402e05826626a0b83b8e45aa7a2aca9b98fc54963f66e59c14bcf6c62bbe913d7fd4a9c5d9bd18860e03b673f366f2b594 languageName: node linkType: hard @@ -8285,10 +8184,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/cli-color@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/cli-color@npm:1.82.9" - checksum: 99affd246f86dd542ca255403759b16fe6e08fcc231ecc80d2d55b73ec05b482310224e4a561da1ed61ec523372c7a7b0cfccaf7aebd5f575ac3065fb683ab10 +"@tamagui/cli-color@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/cli-color@npm:1.84.1" + checksum: b84b67b321712e02402edde508501e4270bc2d9e64079480adfb40ec0db11e990ad18303920131290854452eeaa233e012c65990fe861c3eabeae29f1a6e97db languageName: node linkType: hard @@ -8335,15 +8234,15 @@ __metadata: linkType: hard "@tamagui/cli@npm:latest": - version: 1.82.9 - resolution: "@tamagui/cli@npm:1.82.9" - dependencies: - "@tamagui/build": 1.82.9 - "@tamagui/create-theme": 1.82.9 - "@tamagui/generate-themes": 1.82.9 - "@tamagui/static": 1.82.9 - "@tamagui/types": 1.82.9 - "@tamagui/vite-plugin": 1.82.9 + version: 1.84.1 + resolution: "@tamagui/cli@npm:1.84.1" + dependencies: + "@tamagui/build": 1.84.1 + "@tamagui/create-theme": 1.84.1 + "@tamagui/generate-themes": 1.84.1 + "@tamagui/static": 1.84.1 + "@tamagui/types": 1.84.1 + "@tamagui/vite-plugin": 1.84.1 "@vitejs/plugin-react-swc": ^3.4.0 arg: ^5.0.2 chalk: ^4.1.2 @@ -8372,7 +8271,7 @@ __metadata: bin: tama: dist/index.js tamagui: dist/index.js - checksum: 853db5b23666689732d24530c520abd2d2834720e80a062850e99dfd63a693398bfed006a7ca230ca04232c4b2e9a724c92268bb16eb103a49a18d1e95cb8ad2 + checksum: 349435023ed3d217375d5aabf5d17d8e8cbf0bde86db917e42ecda2c6617da4a4cbf0da522e66f856a3eff701b620012ac7527d80ca33664876e10738a470bbe languageName: node linkType: hard @@ -8425,12 +8324,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/compose-refs@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/compose-refs@npm:1.82.9" +"@tamagui/compose-refs@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/compose-refs@npm:1.84.1" peerDependencies: react: "*" - checksum: 6804f1d97b9973684a2bc3c99a45452dc65d26cbe9d6c705fa8a84314a164f6ad1be71a57bdbc72fada56078a5c47515389bf59a165fad0cd3bf444bbabf281f + checksum: 8ddbe7ada41774ea06325d281ce74b54cb297e3db710a0b9bdc86de16a7fcc19f405026847303ee4269a285459146abc88a5bc016e111908a9e9f726da09066d languageName: node linkType: hard @@ -8444,13 +8343,13 @@ __metadata: languageName: node linkType: hard -"@tamagui/config-default@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/config-default@npm:1.82.9" +"@tamagui/config-default@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/config-default@npm:1.84.1" dependencies: - "@tamagui/core": 1.82.9 - "@tamagui/shorthands": 1.82.9 - checksum: c5cd48807b83e732d53994d18e3ec5219d4d9e6b546f93bd39e1b1e14100574d492bc2ae103ff91042cd93778426308674b5ec136273b111d9efc5542cc4761e + "@tamagui/core": 1.84.1 + "@tamagui/shorthands": 1.84.1 + checksum: c4da1ede0bb2880a7176056989ab07b37c2f570b5de520d223da429b4852ecd1b56085d2d574de289fb845f0a5861fda055179ed44d327c964401ee1ebad3a2b languageName: node linkType: hard @@ -8481,12 +8380,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/constants@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/constants@npm:1.82.9" +"@tamagui/constants@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/constants@npm:1.84.1" peerDependencies: react: "*" - checksum: 3fb8479a5e257c90337f011afb9d4c078106b9c6439c0138f90f82a4b378f0ed165535fc7f94efdc1f287e0a25e574876e21565552bd73867d9052f344db733c + checksum: c9e7c5502f1403b379f22005e0db79b993b8525b98f52c7630bbebbf636375017a658466a0ff7b9522cf49de88802d36399d988be34c30ecb6d957f81d6d4766 languageName: node linkType: hard @@ -8504,17 +8403,17 @@ __metadata: languageName: node linkType: hard -"@tamagui/core@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/core@npm:1.82.9" +"@tamagui/core@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/core@npm:1.84.1" dependencies: - "@tamagui/react-native-use-pressable": 1.82.9 - "@tamagui/react-native-use-responder-events": 1.82.9 - "@tamagui/use-event": 1.82.9 - "@tamagui/web": 1.82.9 + "@tamagui/react-native-use-pressable": 1.84.1 + "@tamagui/react-native-use-responder-events": 1.84.1 + "@tamagui/use-event": 1.84.1 + "@tamagui/web": 1.84.1 peerDependencies: react: "*" - checksum: b4fb2ac5c16ce165e9b6368b10e696419796c18c8fd44b6249f0ab99ef6261f4baf5aa829a168c8f6a206b85b1504a5da6cc0613f3d93bf54076dcf039f95fe6 + checksum: 07504dca11e76144f224fc45e0aadd91b30f3f46c8b8286c9d0b6dcc8097dfceba8bb4b99a9c0cd92508f0fc86135c51d28321a16af97aa811e56be695f23d61 languageName: node linkType: hard @@ -8536,12 +8435,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/create-theme@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/create-theme@npm:1.82.9" +"@tamagui/create-theme@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/create-theme@npm:1.84.1" dependencies: - "@tamagui/web": 1.82.9 - checksum: 5376c316184773affe581155bcf3f795105303e2cd061c9969a20f6c90e125b9e33dd6985123e214cdea442a160cf3a1fd32c9116dc4119accd13c646ab8cc0b + "@tamagui/web": 1.84.1 + checksum: 29df2cf9ca599bcce3263cb57b5908a07d69b899da1c3d8034365e695abe21dad51d6ec152419ef96943d799b913687f976f139d4361fed3ddc80f30f4440421 languageName: node linkType: hard @@ -8600,10 +8499,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/fake-react-native@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/fake-react-native@npm:1.82.9" - checksum: 5a2a38477a89e34d76eec8d2afd9d2337cb882a00108d817516881035fbb469a2d36f7fcbf1b4bbf922f4d10b7d1a28f5afd677d5f86122e6487212d7e48f43e +"@tamagui/fake-react-native@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/fake-react-native@npm:1.84.1" + checksum: 7dba33673c0556ed228f734b1286868af8a1af9d27ee73a92e63a180b3179c9878a4526f9dbcba2120dc443a3ed73839225f1a216fb817c08477b5d4f2b4fdab languageName: node linkType: hard @@ -8702,15 +8601,15 @@ __metadata: languageName: node linkType: hard -"@tamagui/generate-themes@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/generate-themes@npm:1.82.9" +"@tamagui/generate-themes@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/generate-themes@npm:1.84.1" dependencies: - "@tamagui/create-theme": 1.82.9 - "@tamagui/types": 1.82.9 + "@tamagui/create-theme": 1.84.1 + "@tamagui/types": 1.84.1 esbuild-register: ^3.4.2 fs-extra: ^11.1.0 - checksum: 28fc58270121fa2d59ccd5fbc0e82017ead97792f885e58a49c20593575aac6a73a3bab5321069bf0222c7245e620bfc0e49dcdddfe110a6c772cadd42556d40 + checksum: 48a58edff939d384fa0513b1295c33a933da088c649a270ed647c5860e40f8f1d0a7b000990e165f2acaea624eb1aa8ef1ff1420a9d3c7835684705870c8d784 languageName: node linkType: hard @@ -8785,12 +8684,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/helpers-node@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/helpers-node@npm:1.82.9" +"@tamagui/helpers-node@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/helpers-node@npm:1.84.1" dependencies: - "@tamagui/types": 1.82.9 - checksum: 6f459da03298521d44984c100cef25fe7ee647e9fe0e6ca9b9eb142bb5956228540efb5b3fbfac182700562380ea37609a5000a73dbee4c59575b89379110237 + "@tamagui/types": 1.84.1 + checksum: 43b7c918561c9867c647eb76d0512bb6c71f12df00b9d005dc8be747cb36105389c19af6d55a7e42b540453336f98ddcdea6e4c3a2d87bd6da9a728c85bbe3e8 languageName: node linkType: hard @@ -8817,13 +8716,13 @@ __metadata: languageName: node linkType: hard -"@tamagui/helpers@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/helpers@npm:1.82.9" +"@tamagui/helpers@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/helpers@npm:1.84.1" dependencies: - "@tamagui/constants": 1.82.9 - "@tamagui/simple-hash": 1.82.9 - checksum: 55e29260fecbf9a738d72c6c87b0c4ba384af8ede0c26510816c92962463f702068ca9d30f600509881ac3536e8b86bfaff55f40801298e98b4cd018f7a4114b + "@tamagui/constants": 1.84.1 + "@tamagui/simple-hash": 1.84.1 + checksum: 81d01561e2f54eca96a31be07131cd5aa94967c6be2dcf7c9011356f36a1348bff46e9bb625a7477f0836e9debcf2f77d9bf680506977e9734e2c618f96b129c languageName: node linkType: hard @@ -8942,12 +8841,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/normalize-css-color@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/normalize-css-color@npm:1.82.9" +"@tamagui/normalize-css-color@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/normalize-css-color@npm:1.84.1" dependencies: "@react-native/normalize-color": ^2.1.0 - checksum: b4837c15139b1af4332b3278a4b6975cba0510c7cb013531d6c5765d286fa3f2b73e8abab09cea955ddbf307aac52a0a522b1c8a85872b7a0000e75f32a8980b + checksum: 9fc502031ec69a28399e99a8d9c55b5d26f8ab44a9e9cd9f5d39ea511af78724ee0c2d1e9cc6683b251385da70bb04aec4c7aa1c1e2ced6cf05eec4050e20ace languageName: node linkType: hard @@ -9041,10 +8940,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/proxy-worm@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/proxy-worm@npm:1.82.9" - checksum: bf44931a5ae4cf6d5d0cdde2834dd5d50fde466d23705e364a4eb025e18a572c932a06e56d712cbcaa97e4520a042b5ba69c0b5af64827c4577e41fe55e1d9b4 +"@tamagui/proxy-worm@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/proxy-worm@npm:1.84.1" + checksum: 9d1796c623893cac75ae9e4ad3a2d7b1bc3f59c55c3aaf6dd4511f8d1b05675b97b754c69070037e06ab4ef68b7a5ee3e9cb8c874c3e81eaff7d9d857b8259ef languageName: node linkType: hard @@ -9092,10 +8991,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/react-native-svg@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/react-native-svg@npm:1.82.9" - checksum: f247753a112557708a9aa7347f1a925a736afba5d3ad7335e2e218dc4883c09c1b24b65b40e65aa27afb481a1c5482324a6de31c3c8010ff7692a830640edde1 +"@tamagui/react-native-svg@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/react-native-svg@npm:1.84.1" + checksum: 02df3a7b5addde52c546577f7402c25b17ab92a66fbf0f4d0aeaef42a225d0d00f2cdc1c5ee6d3ed58d60fe2e7838ac27aa0f63aef8e996820f8bf45e8ef0e33 languageName: node linkType: hard @@ -9108,12 +9007,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/react-native-use-pressable@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/react-native-use-pressable@npm:1.82.9" +"@tamagui/react-native-use-pressable@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/react-native-use-pressable@npm:1.84.1" peerDependencies: react: "*" - checksum: 4746143ebc8c2a744b1fe8b075c541b1d8825a2721a87379f81b9d0599545b692081ad44ac1a6024162c9fcf24eb3487b534498071b9c632df4f835049d64360 + checksum: 4b17a4657cb6b644b0028ccb92fdaeb196e819dd243bc87235edf315bb14c76a25613a3063ee3d19560122c2c79df3ad50dab14968e496d864e326ee5034348f languageName: node linkType: hard @@ -9126,12 +9025,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/react-native-use-responder-events@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/react-native-use-responder-events@npm:1.82.9" +"@tamagui/react-native-use-responder-events@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/react-native-use-responder-events@npm:1.84.1" peerDependencies: react: "*" - checksum: ec3a132332e1c03ebb0f05ba223f997e49f9737d5bc6a0b5e28651eba3d153b879e62aba83bf2d34f92018cfae179cd0c79947f04c2fd2dc4a86f8495099468e + checksum: 5cf24253dd30f62ac43d4d68b7821913355527038bd7c3ac1fd574125405460da7d652cedc8f93bb0e4750e21df7693e14435fb577ce01abb942ac0a6d6b954a languageName: node linkType: hard @@ -9261,10 +9160,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/shorthands@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/shorthands@npm:1.82.9" - checksum: cc03aed4cbe2fea1d22c89b5500a1220d70b704682184f198b28c46861002cc7197516e38565b7ee9a38dc7ae35daf5bfbf368b33aa9ee94bc0d072f3375f782 +"@tamagui/shorthands@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/shorthands@npm:1.84.1" + checksum: ede148be26a3eacd2b5465c7d4b8b603f21e2f2ec36bb408f542752be52fb1d10a4f5ff1892d78846f8ad8c5894c375af2ca172f903b1b6b1906ed2e188fb462 languageName: node linkType: hard @@ -9275,10 +9174,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/simple-hash@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/simple-hash@npm:1.82.9" - checksum: a5da2b2db41961905bcb1ed4afc485c6cd6eec77e8241d97af589a0675e720c7ed3d3f93dc8f2bcced2edc6ccfa0f7c21d22a29cf4dbd4828db5a7899da1debb +"@tamagui/simple-hash@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/simple-hash@npm:1.84.1" + checksum: 0c9def6f08244da19ef702c5850f145444dbf45f865d861ab27ec80b3858f2c1af5f9762e95347d262ac1c1bee1b33de247cfc24d43ff36ffea70200bcd14735 languageName: node linkType: hard @@ -9351,9 +9250,9 @@ __metadata: languageName: node linkType: hard -"@tamagui/static@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/static@npm:1.82.9" +"@tamagui/static@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/static@npm:1.84.1" dependencies: "@babel/core": ^7.23.3 "@babel/generator": ^7.23.3 @@ -9363,17 +9262,17 @@ __metadata: "@babel/runtime": ^7.23.2 "@babel/traverse": ^7.23.3 "@babel/types": ^7.23.3 - "@tamagui/build": 1.82.9 - "@tamagui/cli-color": 1.82.9 - "@tamagui/config-default": 1.82.9 - "@tamagui/core": 1.82.9 - "@tamagui/fake-react-native": 1.82.9 - "@tamagui/generate-themes": 1.82.9 - "@tamagui/helpers": 1.82.9 - "@tamagui/helpers-node": 1.82.9 - "@tamagui/proxy-worm": 1.82.9 - "@tamagui/shorthands": 1.82.9 - "@tamagui/types": 1.82.9 + "@tamagui/build": 1.84.1 + "@tamagui/cli-color": 1.84.1 + "@tamagui/config-default": 1.84.1 + "@tamagui/core": 1.84.1 + "@tamagui/fake-react-native": 1.84.1 + "@tamagui/generate-themes": 1.84.1 + "@tamagui/helpers": 1.84.1 + "@tamagui/helpers-node": 1.84.1 + "@tamagui/proxy-worm": 1.84.1 + "@tamagui/shorthands": 1.84.1 + "@tamagui/types": 1.84.1 babel-literal-to-ast: ^2.1.0 browserslist: ^4.22.2 esbuild: ^0.19.11 @@ -9385,9 +9284,9 @@ __metadata: lightningcss: ^1.22.1 lodash: ^4.17.21 react-native-web: ^0.19.9 - react-native-web-internals: 1.82.9 - react-native-web-lite: 1.82.9 - checksum: 0aed4b96ef377ab1e2265348588163c1f8bde204a95ffbb6ecbc09fdde4499e1d2babecf266b31f70d563fe99ff850279cd393dead611e8d5b7f470eb2495810 + react-native-web-internals: 1.84.1 + react-native-web-lite: 1.84.1 + checksum: 13952a57e5d31231f42fda537f5b8cab70f0af55f98d7ea6262e99225de7e5a7ce34b781cf4cf1c52a6424a96550bffc416c2dac9399a67a3c5e41026a3d81f6 languageName: node linkType: hard @@ -9483,10 +9382,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/timer@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/timer@npm:1.82.9" - checksum: 48978e51b58ee58a17dcc8328f574bccd852c16e4508b096b3cf203df3fe94bbd4a3717198fbbb7d15727b724b9074b27cfd029f4c4a3ad444a22e68f02db7ff +"@tamagui/timer@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/timer@npm:1.84.1" + checksum: 27a2400de055bcba86b2636656d0dd659578e02887333143c7ccdbd6c0d0cc1fef7fada3f92a8cd2220ccfbae2a1666766752abe1eb64461f7e2df2e811c1d68 languageName: node linkType: hard @@ -9563,10 +9462,10 @@ __metadata: languageName: node linkType: hard -"@tamagui/types@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/types@npm:1.82.9" - checksum: 70929ca2dcb8a9eff00c4a6f678859a811eb85a98a3e5ae9151314c024ef9f69267f4c1c2ffe9066c3441bc06916cf6988abd3eef22112768024fa16dde45963 +"@tamagui/types@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/types@npm:1.84.1" + checksum: 2adc87cf386be5c3bfac3d57ec27e1904f96a6378e9d4a1198c3c423f6703f2337d54071cd40f60c52166a38284a7b782cea2c25933296d513d511197b897377 languageName: node linkType: hard @@ -9617,14 +9516,14 @@ __metadata: languageName: node linkType: hard -"@tamagui/use-did-finish-ssr@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/use-did-finish-ssr@npm:1.82.9" +"@tamagui/use-did-finish-ssr@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/use-did-finish-ssr@npm:1.84.1" dependencies: - "@tamagui/constants": 1.82.9 + "@tamagui/constants": 1.84.1 peerDependencies: react: "*" - checksum: b12474dc89d8401143648a853b9c396e7ee35345571b2b06845d2e63f6e96a99aa2e044f0eaa37c0e7188142314b660b8718e0569debac2535119133cec31d9a + checksum: a18b61a32ae95504872c51af186e20c55eeef810eb51de1bf82395e25f59f06f180d39b15e49a035b35cbac62c6fd37c51dee0632dc4533c0276fb014d3ada16 languageName: node linkType: hard @@ -9655,14 +9554,14 @@ __metadata: languageName: node linkType: hard -"@tamagui/use-event@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/use-event@npm:1.82.9" +"@tamagui/use-event@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/use-event@npm:1.84.1" dependencies: - "@tamagui/constants": 1.82.9 + "@tamagui/constants": 1.84.1 peerDependencies: react: "*" - checksum: 2ad20b7ffe52b69a089de56e0df3ea805e1a0fe60514712b150d5e9f26c8cac1c6825956d4418d33c80e61323501e80d0453dc586e8681db6e227c987c3a121a + checksum: 2a0840253aea47e0e462596cdbf156373bca63a748a5493f46ece1d0758e39e98f1f4b08ce3b2639d5cc4bb3625684773d6b6c1f3e9953186e060e8f431a4123 languageName: node linkType: hard @@ -9675,12 +9574,12 @@ __metadata: languageName: node linkType: hard -"@tamagui/use-force-update@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/use-force-update@npm:1.82.9" +"@tamagui/use-force-update@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/use-force-update@npm:1.84.1" peerDependencies: react: "*" - checksum: 8fcc662f34d4c4e7991a39dafece066efebcdeccc140c6ebdeb0d0ee02130e547f6ead34e17232ca02b38b3b5df687494fa4990f81a0bd1d437613301486285e + checksum: 52f2612147b1a7e40f45c92554515060a43a6c58b290827baf51d3a9be45528fe196587de8bea3aa8163ecffd3cd513788083e463893db0604967101e2b75a73 languageName: node linkType: hard @@ -9764,18 +9663,18 @@ __metadata: languageName: node linkType: hard -"@tamagui/vite-plugin@npm:1.82.9, @tamagui/vite-plugin@npm:latest": - version: 1.82.9 - resolution: "@tamagui/vite-plugin@npm:1.82.9" +"@tamagui/vite-plugin@npm:1.84.1, @tamagui/vite-plugin@npm:latest": + version: 1.84.1 + resolution: "@tamagui/vite-plugin@npm:1.84.1" dependencies: - "@tamagui/fake-react-native": 1.82.9 - "@tamagui/proxy-worm": 1.82.9 - "@tamagui/react-native-svg": 1.82.9 - "@tamagui/static": 1.82.9 + "@tamagui/fake-react-native": 1.84.1 + "@tamagui/proxy-worm": 1.84.1 + "@tamagui/react-native-svg": 1.84.1 + "@tamagui/static": 1.84.1 esm-resolve: ^1.0.8 fs-extra: ^11.1.0 outdent: ^0.8.0 - checksum: a9d29e866cb696c7b78d9060612f7499d0973417d337e08d18b64b59621331e6a41045f481b066fc57e5b2094f58fc7eaeb0c43761a8d166932d10f1e31a117f + checksum: 89299d3bf85235be75fb69244a6357dd11af0fc903664f962428e954e3926deb529aa4a0e3d92ed1deef6a5fe23dfee416b8d162ec844dd258a878ae77703e92 languageName: node linkType: hard @@ -9796,21 +9695,21 @@ __metadata: languageName: node linkType: hard -"@tamagui/web@npm:1.82.9": - version: 1.82.9 - resolution: "@tamagui/web@npm:1.82.9" +"@tamagui/web@npm:1.84.1": + version: 1.84.1 + resolution: "@tamagui/web@npm:1.84.1" dependencies: - "@tamagui/compose-refs": 1.82.9 - "@tamagui/constants": 1.82.9 - "@tamagui/helpers": 1.82.9 - "@tamagui/normalize-css-color": 1.82.9 - "@tamagui/timer": 1.82.9 - "@tamagui/use-did-finish-ssr": 1.82.9 - "@tamagui/use-event": 1.82.9 - "@tamagui/use-force-update": 1.82.9 + "@tamagui/compose-refs": 1.84.1 + "@tamagui/constants": 1.84.1 + "@tamagui/helpers": 1.84.1 + "@tamagui/normalize-css-color": 1.84.1 + "@tamagui/timer": 1.84.1 + "@tamagui/use-did-finish-ssr": 1.84.1 + "@tamagui/use-event": 1.84.1 + "@tamagui/use-force-update": 1.84.1 peerDependencies: react: "*" - checksum: 9184d21568e1978191ad9f593088fdfd993d0b34d3b8380b7218deed1453c6071995fae0876d142bf32ec675d973d1e8fdda5b062843eb4217f5ee194db1d723 + checksum: 67eaa6ebcadfe46a4798e34bff57a41643ae400c76bc02b305575f0404f7dafb4167a2b8a1442dfc1ea32c5103d31d98cc4e7829f036d6fcd70120f437742a51 languageName: node linkType: hard @@ -9895,14 +9794,14 @@ __metadata: linkType: hard "@tiptap/extension-bubble-menu@npm:^2.0.3": - version: 2.1.13 - resolution: "@tiptap/extension-bubble-menu@npm:2.1.13" + version: 2.1.15 + resolution: "@tiptap/extension-bubble-menu@npm:2.1.15" dependencies: tippy.js: ^6.3.7 peerDependencies: "@tiptap/core": ^2.0.0 "@tiptap/pm": ^2.0.0 - checksum: d976e35098883c2f1019f62b96077d317d296d42b1451b2b70c79adf7d8db6c8899f6e33c8796ddf3ad30b6d5b4733c32bc6712eadd11f5b7ddaf3fd08497fbf + checksum: 423bb0ed97e3a65b41a07753bbbbc86a5dc966eae454f82d618a462ba4a6a0ae429a6b9a5a6a6fb217349c007aa2231697e356b0502e9300d991459b07b40ff8 languageName: node linkType: hard @@ -9947,14 +9846,14 @@ __metadata: linkType: hard "@tiptap/extension-floating-menu@npm:^2.0.3": - version: 2.1.13 - resolution: "@tiptap/extension-floating-menu@npm:2.1.13" + version: 2.1.15 + resolution: "@tiptap/extension-floating-menu@npm:2.1.15" dependencies: tippy.js: ^6.3.7 peerDependencies: "@tiptap/core": ^2.0.0 "@tiptap/pm": ^2.0.0 - checksum: f0080a26b3be37a9ca60eff7ed5243091cb8a6944a64f5309d64be8836fd87b84f261f7ec963e66aef3fcf12ab02a24b30a6795eddc2130137ae0ee951d1a2f0 + checksum: 74fadbac764f16861261b7d4f312ff5f06ae7fb457ff0e6e07571deb7c06a535542a1ccd06ae98ddc723a5d6a37aae8be9438228618e6db54a367ff469329488 languageName: node linkType: hard @@ -10321,12 +10220,12 @@ __metadata: linkType: hard "@types/eslint@npm:*": - version: 8.56.1 - resolution: "@types/eslint@npm:8.56.1" + version: 8.56.2 + resolution: "@types/eslint@npm:8.56.2" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 1a4c7334c2f0cfead7b9d25c574c7b3d0b44242958703caa868ed38990a96b5d96477e6fceb7be54fbadd6fb61c97b778b9df58531ced3ec4b022d3e54254dc3 + checksum: 38e054971596f5c0413f66a62dc26b10e0a21ac46ceacb06fbf8cfb838d20820787209b17218b3916e4c23d990ff77cfdb482d655cac0e0d2b837d430fcc5db8 languageName: node linkType: hard @@ -10569,11 +10468,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.10.7 - resolution: "@types/node@npm:20.10.7" + version: 20.11.0 + resolution: "@types/node@npm:20.11.0" dependencies: undici-types: ~5.26.4 - checksum: 86f4f96f5169538f47bbd652ab8e3712cd307701481ff3e9ce0c1ea7d8424a38b5ac4a1d33088cdd9ea1bfe68fd27bbae005a21969aa6d9a36295904da6f09f2 + checksum: 1bd6890db7e0404d11c33d28f46f19f73256f0ba35d19f0ef2a0faba09f366f188915fb9338eebebcc472075c1c4941e17c7002786aa69afa44980737846b200 languageName: node linkType: hard @@ -10613,11 +10512,11 @@ __metadata: linkType: hard "@types/node@npm:^18.11.18": - version: 18.19.5 - resolution: "@types/node@npm:18.19.5" + version: 18.19.6 + resolution: "@types/node@npm:18.19.6" dependencies: undici-types: ~5.26.4 - checksum: 6dab1b67e00ac32799674d22bafa63ea99ddb8218117582660fb89671a1b2343caafb43ed7447320102f299333a475176f5bc11a9b0f1591439d548f93e0c219 + checksum: f0f3739f2d0e5be7b0b41a1fb149f554b1d6cb6c61c68e316c01ec2605559314f5434c170fb8e1a32f6c96a08ac752baa00ffe4451c154e37c77f76b70cf3d5b languageName: node linkType: hard @@ -10935,70 +10834,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0": - version: 6.18.0 - resolution: "@typescript-eslint/parser@npm:6.18.0" - dependencies: - "@typescript-eslint/scope-manager": 6.18.0 - "@typescript-eslint/types": 6.18.0 - "@typescript-eslint/typescript-estree": 6.18.0 - "@typescript-eslint/visitor-keys": 6.18.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 2f9eb1b8f142cb191de6a6f34b913df1c09ea66bb09bd92c201e28fe84b6f3c13cbed3469c94d498e96ea06349b643632bb693dcf27b85908d7221b58c24bcff - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.18.0": - version: 6.18.0 - resolution: "@typescript-eslint/scope-manager@npm:6.18.0" - dependencies: - "@typescript-eslint/types": 6.18.0 - "@typescript-eslint/visitor-keys": 6.18.0 - checksum: 9958dcd95605b9699e1fe823cc38869d542f2cb90cde443938c1352de4161703ed6619e772bc12b8b7df2a44623ebf1e6b2b8d1222e5df22880185d0652040ee - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.18.0": - version: 6.18.0 - resolution: "@typescript-eslint/types@npm:6.18.0" - checksum: 516ad2feb7e7c7b5aac805b287be794e6e42371bc6a5bdd7c9fc230d98bbbcc4877c96377ccce68aede68ec58a64ef9d1e4c5b15cfb55e9a050bafe7b36624c1 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.18.0": - version: 6.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.18.0" - dependencies: - "@typescript-eslint/types": 6.18.0 - "@typescript-eslint/visitor-keys": 6.18.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 64afa0a81af66dfcb1d3027872abc07451691dff956c8b3174da675307050404c720465be5322490859d633e76705fd5e0fd5f040aa4cc1078bd837281e52065 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.18.0": - version: 6.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.18.0" - dependencies: - "@typescript-eslint/types": 6.18.0 - eslint-visitor-keys: ^3.4.1 - checksum: d6b1958867f3287c4e2c4f80633346a676060181e27ef69a1aad68634c62311738a3aad49e61c1d30d8e31800de146424ca8b33483d033132d90bf0c2f31cac8 - languageName: node - linkType: hard - "@typescript/vfs@npm:^1.4.0": version: 1.5.0 resolution: "@typescript/vfs@npm:1.5.0" @@ -11381,7 +11216,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.3.1": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -11546,24 +11381,24 @@ __metadata: linkType: hard "algoliasearch@npm:^4.13.1, algoliasearch@npm:^4.19.1": - version: 4.22.0 - resolution: "algoliasearch@npm:4.22.0" - dependencies: - "@algolia/cache-browser-local-storage": 4.22.0 - "@algolia/cache-common": 4.22.0 - "@algolia/cache-in-memory": 4.22.0 - "@algolia/client-account": 4.22.0 - "@algolia/client-analytics": 4.22.0 - "@algolia/client-common": 4.22.0 - "@algolia/client-personalization": 4.22.0 - "@algolia/client-search": 4.22.0 - "@algolia/logger-common": 4.22.0 - "@algolia/logger-console": 4.22.0 - "@algolia/requester-browser-xhr": 4.22.0 - "@algolia/requester-common": 4.22.0 - "@algolia/requester-node-http": 4.22.0 - "@algolia/transporter": 4.22.0 - checksum: 5b8eb3e3d34a8aac1b4ac87465661c0a75a150e711536bb1473a8c21486a4e0523dcf81302c11558a212991d82bb8c8ec32db6a578f490f3e71cd4945b37702a + version: 4.22.1 + resolution: "algoliasearch@npm:4.22.1" + dependencies: + "@algolia/cache-browser-local-storage": 4.22.1 + "@algolia/cache-common": 4.22.1 + "@algolia/cache-in-memory": 4.22.1 + "@algolia/client-account": 4.22.1 + "@algolia/client-analytics": 4.22.1 + "@algolia/client-common": 4.22.1 + "@algolia/client-personalization": 4.22.1 + "@algolia/client-search": 4.22.1 + "@algolia/logger-common": 4.22.1 + "@algolia/logger-console": 4.22.1 + "@algolia/requester-browser-xhr": 4.22.1 + "@algolia/requester-common": 4.22.1 + "@algolia/requester-node-http": 4.22.1 + "@algolia/transporter": 4.22.1 + checksum: 65226e7ac081fd2dccd2a949b211a67010d933e86572be7cc714b3f5ca07edf099e8a2fd328e8c4a772d971d06ec49779c2b8670196c811faede5b78765cb5bf languageName: node linkType: hard @@ -11807,25 +11642,6 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" - dependencies: - dequal: ^2.0.3 - checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 - languageName: node - linkType: hard - "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -11833,19 +11649,6 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-string: ^1.0.7 - checksum: 06f9e4598fac12a919f7c59a3f04f010ea07f0b7f0585465ed12ef528a60e45f374e79d1bddbb34cdd4338357d00023ddbd0ac18b0be36964f5e726e8965d7fc - languageName: node - linkType: hard - "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -11853,71 +11656,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.2.1 - checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: 5d6b4bf102065fb3f43764bfff6feb3295d372ce89591e6005df3d0ce388527a9f03c909af6f2a973969a4d178ab232ffc9236654149173e0e187ec3a1a6b87b - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.2 - resolution: "array.prototype.tosorted@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.2.1 - checksum: 3607a7d6b117f0ffa6f4012457b7af0d47d38cf05e01d50e09682fd2fb782a66093a5e5fbbdbad77c8c824794a9d892a51844041641f719ad41e3a974f0764de - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" - dependencies: - array-buffer-byte-length: ^1.0.0 - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-array-buffer: ^3.0.2 - is-shared-array-buffer: ^1.0.2 - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 - languageName: node - linkType: hard - "asap@npm:~2.0.3": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -11975,13 +11713,6 @@ __metadata: languageName: node linkType: hard -"ast-types-flow@npm:^0.0.8": - version: 0.0.8 - resolution: "ast-types-flow@npm:0.0.8" - checksum: 0a64706609a179233aac23817837abab614f3548c252a2d3d79ea1e10c74aa28a0846e11f466cf72771b6ed8713abc094dcf8c40c3ec4207da163efa525a94a8 - languageName: node - linkType: hard - "ast-types@npm:^0.14.2": version: 0.14.2 resolution: "ast-types@npm:0.14.2" @@ -12012,15 +11743,6 @@ __metadata: languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: ^1.0.3 - checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -12083,13 +11805,6 @@ __metadata: languageName: node linkType: hard -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: f086bcab42be1761ba2b0b127dec350087f4c3a853bba8dd58f69d898cefaac31a1561da23146f6f3c07954c76171d1f2ce460e555e052d2b02cd79af628fa4a - languageName: node - linkType: hard - "axios@npm:^0.25.0": version: 0.25.0 resolution: "axios@npm:0.25.0" @@ -12099,15 +11814,6 @@ __metadata: languageName: node linkType: hard -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" - dependencies: - dequal: ^2.0.3 - checksum: a94047e702b57c91680e6a952ec4a1aaa2cfd0d80ead76bc8c954202980d8c51968a6ea18b4d8010e8e2cf95676533d8022a8ebba9abc1dfe25686721df26fd2 - languageName: node - linkType: hard - "babel-literal-to-ast@npm:^2.1.0": version: 2.1.0 resolution: "babel-literal-to-ast@npm:2.1.0" @@ -12407,12 +12113,12 @@ __metadata: linkType: hard "bonjour-service@npm:^1.0.11": - version: 1.2.0 - resolution: "bonjour-service@npm:1.2.0" + version: 1.2.1 + resolution: "bonjour-service@npm:1.2.1" dependencies: fast-deep-equal: ^3.1.3 multicast-dns: ^7.2.5 - checksum: 080db14c54efb04e61f34ce7aa65d809cc520bf7a205c28ae9dbd2660efe56fc717d90a329bc7f8ef9b87206a8f22a89b149589db357fe441c2eaa01217c4593 + checksum: b65b3e6e3a07e97f2da5806afb76f3946d5a6426b72e849a0236dc3c9d3612fb8c5359ebade4be7eb63f74a37670c53a53be2ff17f4f709811fda77f600eb25b languageName: node linkType: hard @@ -14178,7 +13884,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -14269,20 +13975,20 @@ __metadata: linkType: hard "css-loader@npm:^6.7.1, css-loader@npm:^6.7.3, css-loader@npm:^6.7.4": - version: 6.8.1 - resolution: "css-loader@npm:6.8.1" + version: 6.9.0 + resolution: "css-loader@npm:6.9.0" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.21 + postcss: ^8.4.31 postcss-modules-extract-imports: ^3.0.0 postcss-modules-local-by-default: ^4.0.3 - postcss-modules-scope: ^3.0.0 + postcss-modules-scope: ^3.1.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 - semver: ^7.3.8 + semver: ^7.5.4 peerDependencies: webpack: ^5.0.0 - checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 + checksum: 71f20ee5eb5a4a9373ab41a5c17df411cb4f6f2de037297a2b0c2150681578f4979f319f4307a61e23c231dd6546e657ae95cba5a0698ad13ca43f91d4d2a0bc languageName: node linkType: hard @@ -14494,13 +14200,6 @@ __metadata: languageName: node linkType: hard -"damerau-levenshtein@npm:^1.0.8": - version: 1.0.8 - resolution: "damerau-levenshtein@npm:1.0.8" - checksum: d240b7757544460ae0586a341a53110ab0a61126570ef2d8c731e3eab3f0cb6e488e2609e6a69b46727635de49be20b071688698744417ff1b6c1d7ccd03e0de - languageName: node - linkType: hard - "dash-get@npm:^1.0.2": version: 1.0.2 resolution: "dash-get@npm:1.0.2" @@ -14565,15 +14264,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - "decamelize@npm:^1.1.1": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -14638,13 +14328,6 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - "deepmerge@npm:4.3.0": version: 4.3.0 resolution: "deepmerge@npm:4.3.0" @@ -14738,7 +14421,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -14793,7 +14476,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0, dequal@npm:^2.0.2": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -14980,15 +14663,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: ^2.0.2 - checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 - languageName: node - linkType: hard - "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -15152,13 +14826,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:16.0.3": - version: 16.0.3 - resolution: "dotenv@npm:16.0.3" - checksum: afcf03f373d7a6d62c7e9afea6328e62851d627a4e73f2e12d0a8deae1cd375892004f3021883f8aec85932cd2834b091f568ced92b4774625b321db83b827f8 - languageName: node - linkType: hard - "dotenv@npm:^16.0.0, dotenv@npm:^16.3.1": version: 16.3.1 resolution: "dotenv@npm:16.3.1" @@ -15298,9 +14965,9 @@ __metadata: linkType: hard "electron-log@npm:beta": - version: 5.1.0-beta.1 - resolution: "electron-log@npm:5.1.0-beta.1" - checksum: 12ad17f3c3df45273f92a09a4f76d744c8d3451a3d89fc9c79d1d926b2f8a9c4a7ac8995412735fc6d3feea63314641cdbd2ab5b78609d56bef6c6ebdcc56f25 + version: 5.1.0-beta.2 + resolution: "electron-log@npm:5.1.0-beta.2" + checksum: 36db9cbd9a8a3fd84d9a996088dd33263e975df3fa4732fb9dcf33aabfd3e9b5782731e7fdac2c486ac24b7468f74171c51f31860bae8ac36606d90fd32f368f languageName: node linkType: hard @@ -15362,9 +15029,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.601": - version: 1.4.623 - resolution: "electron-to-chromium@npm:1.4.623" - checksum: 69b285f1046571bde9cda95089397e1388dc5268c71b361832ade9eae6d9987229fa150856e024f845c68848e235f0fcdaf730f0d03b061239c75c968b521d11 + version: 1.4.628 + resolution: "electron-to-chromium@npm:1.4.628" + checksum: 113b475a3a869123f64ea9b7fc53b59a842c270882c9bc24318b63222fb721886a353fbecafde10d0df8389aff7d020b84e15565b65fe43c6f58c9e03aced1cd languageName: node linkType: hard @@ -15520,7 +15187,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0, enhanced-resolve@npm:^5.12.0, enhanced-resolve@npm:^5.13.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.7.0": +"enhanced-resolve@npm:^5.10.0, enhanced-resolve@npm:^5.13.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.7.0": version: 5.15.0 resolution: "enhanced-resolve@npm:5.15.0" dependencies: @@ -15576,75 +15243,6 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" - dependencies: - array-buffer-byte-length: ^1.0.0 - arraybuffer.prototype.slice: ^1.0.2 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.5 - es-set-tostringtag: ^2.0.1 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.2 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 - is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.12 - is-weakref: ^1.0.2 - object-inspect: ^1.13.1 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.1 - safe-array-concat: ^1.0.1 - safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.8 - string.prototype.trimend: ^1.0.7 - string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.0 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.13 - checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a - languageName: node - linkType: hard - -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" - dependencies: - asynciterator.prototype: ^1.0.0 - call-bind: ^1.0.2 - define-properties: ^1.2.1 - es-abstract: ^1.22.1 - es-set-tostringtag: ^2.0.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - iterator.prototype: ^1.1.2 - safe-array-concat: ^1.0.1 - checksum: 50081ae5c549efe62e5c1d244df0194b40b075f7897fc2116b7e1aa437eb3c41f946d2afda18c33f9b31266ec544765932542765af839f76fa6d7b7855d1e0e1 - languageName: node - linkType: hard - "es-module-lexer@npm:^0.4.1": version: 0.4.1 resolution: "es-module-lexer@npm:0.4.1" @@ -15659,37 +15257,6 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.2 - resolution: "es-set-tostringtag@npm:2.0.2" - dependencies: - get-intrinsic: ^1.2.2 - has-tostringtag: ^1.0.0 - hasown: ^2.0.0 - checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" - dependencies: - hasown: ^2.0.0 - checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - "es6-error@npm:^4.1.1": version: 4.1.1 resolution: "es6-error@npm:4.1.1" @@ -16230,310 +15797,30 @@ __metadata: languageName: node linkType: hard -"eslint-config-custom@*, eslint-config-custom@workspace:frontend/packages/eslint-config-custom": - version: 0.0.0-use.local - resolution: "eslint-config-custom@workspace:frontend/packages/eslint-config-custom" +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" dependencies: - eslint-config-next: 13.4.19 - eslint-config-prettier: 8.10.0 - eslint-config-turbo: 1.10.12 - eslint-plugin-react: 7.33.2 - languageName: unknown - linkType: soft + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard -"eslint-config-next@npm:13.4.19": - version: 13.4.19 - resolution: "eslint-config-next@npm:13.4.19" - dependencies: - "@next/eslint-plugin-next": 13.4.19 - "@rushstack/eslint-patch": ^1.1.3 - "@typescript-eslint/parser": ^5.4.2 || ^6.0.0 - eslint-import-resolver-node: ^0.3.6 - eslint-import-resolver-typescript: ^3.5.2 - eslint-plugin-import: ^2.26.0 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.31.7 - eslint-plugin-react-hooks: ^4.5.0 || 5.0.0-canary-7118f5dd7-20230705 - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: ">=3.3.1" - peerDependenciesMeta: - typescript: - optional: true - checksum: 2b2e527facf98326486b2ce806043f41d1f5a969405d2e546d4726462de3fdd05f720ec97d27952abacb09c34e31f3896da05c0c135e65f587376db9ddd71424 +"esm-resolve@npm:^1.0.8": + version: 1.0.8 + resolution: "esm-resolve@npm:1.0.8" + checksum: aa44828ecf3f417e3dc237658fb3f30ad91b7a3dc0896358c2c15f5ae54f95cc50804c5859aa7afcd7b96c0bbbdb47978f919379386ac4a6c5d2562c4ebd22f2 languageName: node linkType: hard -"eslint-config-prettier@npm:8.10.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" - peerDependencies: - eslint: ">=7.0.0" +"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" bin: - eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 - languageName: node - linkType: hard - -"eslint-config-turbo@npm:1.10.12": - version: 1.10.12 - resolution: "eslint-config-turbo@npm:1.10.12" - dependencies: - eslint-plugin-turbo: 1.10.12 - peerDependencies: - eslint: ">6.6.0" - checksum: 0d34d2f51b1c58e280065a1c5a72079db391615284e55ccc81b56e24c5954bf1f3f9d4a68bea5cf4e3ec384eaaa9e2d6c6e49b2f3ee9bfe6ce9cce9196c98f9c - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" - dependencies: - debug: ^3.2.7 - is-core-module: ^2.13.0 - resolve: ^1.22.4 - checksum: 439b91271236b452d478d0522a44482e8c8540bf9df9bd744062ebb89ab45727a3acd03366a6ba2bdbcde8f9f718bab7fe8db64688aca75acf37e04eafd25e22 - languageName: node - linkType: hard - -"eslint-import-resolver-typescript@npm:^3.5.2": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" - dependencies: - debug: ^4.3.4 - enhanced-resolve: ^5.12.0 - eslint-module-utils: ^2.7.4 - fast-glob: ^3.3.1 - get-tsconfig: ^4.5.0 - is-core-module: ^2.11.0 - is-glob: ^4.0.3 - peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - checksum: 454fa0646533050fb57f13d27daf8c71f51b0bb9156d6a461290ccb8576d892209fcc6702a89553f3f5ea8e5b407395ca2e5de169a952c953685f1f7c46b4496 - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" - dependencies: - debug: ^3.2.7 - peerDependenciesMeta: - eslint: - optional: true - checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.26.0": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" - dependencies: - array-includes: ^3.1.7 - array.prototype.findlastindex: ^1.2.3 - array.prototype.flat: ^1.3.2 - array.prototype.flatmap: ^1.3.2 - debug: ^3.2.7 - doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.9 - eslint-module-utils: ^2.8.0 - hasown: ^2.0.0 - is-core-module: ^2.13.1 - is-glob: ^4.0.3 - minimatch: ^3.1.2 - object.fromentries: ^2.0.7 - object.groupby: ^1.0.1 - object.values: ^1.1.7 - semver: ^6.3.1 - tsconfig-paths: ^3.15.0 - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: e65159aef808136d26d029b71c8c6e4cb5c628e65e5de77f1eb4c13a379315ae55c9c3afa847f43f4ff9df7e54515c77ffc6489c6a6f81f7dd7359267577468c - languageName: node - linkType: hard - -"eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" - dependencies: - "@babel/runtime": ^7.23.2 - aria-query: ^5.3.0 - array-includes: ^3.1.7 - array.prototype.flatmap: ^1.3.2 - ast-types-flow: ^0.0.8 - axe-core: =4.7.0 - axobject-query: ^3.2.1 - damerau-levenshtein: ^1.0.8 - emoji-regex: ^9.2.2 - es-iterator-helpers: ^1.0.15 - hasown: ^2.0.0 - jsx-ast-utils: ^3.3.5 - language-tags: ^1.0.9 - minimatch: ^3.1.2 - object.entries: ^1.1.7 - object.fromentries: ^2.0.7 - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 3dec00e2a3089c4c61ac062e4196a70985fb7eda1fd67fe035363d92578debde92fdb8ed2e472321fc0d71e75f4a1e8888c6a3218c14dd93c8e8d19eb6f51554 - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version: 5.0.0-canary-7118f5dd7-20230705 - resolution: "eslint-plugin-react-hooks@npm:5.0.0-canary-7118f5dd7-20230705" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 20e334e60bf5e56cf9f760598411847525c3ff826e6ae7757c8efdc60b33d47a97ddbe1b94ce95956ea9f7bbef37995b19c716be50bd44e6a1e789cba08b6224 - languageName: node - linkType: hard - -"eslint-plugin-react@npm:7.33.2, eslint-plugin-react@npm:^7.31.7": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" - dependencies: - array-includes: ^3.1.6 - array.prototype.flatmap: ^1.3.1 - array.prototype.tosorted: ^1.1.1 - doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.12 - estraverse: ^5.3.0 - jsx-ast-utils: ^2.4.1 || ^3.0.0 - minimatch: ^3.1.2 - object.entries: ^1.1.6 - object.fromentries: ^2.0.6 - object.hasown: ^1.1.2 - object.values: ^1.1.6 - prop-types: ^15.8.1 - resolve: ^2.0.0-next.4 - semver: ^6.3.1 - string.prototype.matchall: ^4.0.8 - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 - languageName: node - linkType: hard - -"eslint-plugin-turbo@npm:1.10.12": - version: 1.10.12 - resolution: "eslint-plugin-turbo@npm:1.10.12" - dependencies: - dotenv: 16.0.3 - peerDependencies: - eslint: ">6.6.0" - checksum: 8f13089983979b727e5585d6a407cbc973e526eae56f20acff60a10cb03c81149c4e051958dc2fe5e3ec90563bed747289464ba8895d02af6edaed14d9dcc49a - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:8.47.0": - version: 8.47.0 - resolution: "eslint@npm:8.47.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": ^8.47.0 - "@humanwhocodes/config-array": ^0.11.10 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.12.4 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: 1988617f703eadc5c7540468d54dc8e5171cf2bb9483f6172799cd1ff54a9a5e4470f003784e8cef92687eaa14de37172732787040e67817581a20bcb9c15970 - languageName: node - linkType: hard - -"esm-resolve@npm:^1.0.8": - version: 1.0.8 - resolution: "esm-resolve@npm:1.0.8" - checksum: aa44828ecf3f417e3dc237658fb3f30ad91b7a3dc0896358c2c15f5ae54f95cc50804c5859aa7afcd7b96c0bbbdb47978f919379386ac4a6c5d2562c4ebd22f2 - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 languageName: node linkType: hard @@ -16553,7 +15840,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": +"estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b @@ -16853,7 +16140,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, 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: @@ -16880,13 +16167,6 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - "fast-loops@npm:^1.1.3": version: 1.1.3 resolution: "fast-loops@npm:1.1.3" @@ -16993,15 +16273,6 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - "file-loader@npm:^6.2.0": version: 6.2.0 resolution: "file-loader@npm:6.2.0" @@ -17572,32 +16843,13 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 - languageName: node - linkType: hard - "galactus@npm:^1.0.0": version: 1.0.0 resolution: "galactus@npm:1.0.0" @@ -17716,7 +16968,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": version: 1.2.2 resolution: "get-intrinsic@npm:1.2.2" dependencies: @@ -17800,16 +17052,6 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 - languageName: node - linkType: hard - "get-them-args@npm:1.3.2": version: 1.3.2 resolution: "get-them-args@npm:1.3.2" @@ -17866,7 +17108,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.1": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -17907,20 +17149,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.7": - version: 7.1.7 - resolution: "glob@npm:7.1.7" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 - languageName: node - linkType: hard - "glob@npm:9.3.2": version: 9.3.2 resolution: "glob@npm:9.3.2" @@ -18068,16 +17296,7 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c - languageName: node - linkType: hard - -"globalthis@npm:^1.0.1, globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.1": version: 1.0.3 resolution: "globalthis@npm:1.0.3" dependencies: @@ -18202,13 +17421,6 @@ __metadata: languageName: node linkType: hard -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - "graphology@npm:^0.24.1": version: 0.24.1 resolution: "graphology@npm:0.24.1" @@ -18347,13 +17559,6 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -19298,17 +18503,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.5": - version: 1.0.6 - resolution: "internal-slot@npm:1.0.6" - dependencies: - get-intrinsic: ^1.2.2 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549 - languageName: node - linkType: hard - "interpret@npm:^1.0.0": version: 1.4.0 resolution: "interpret@npm:1.4.0" @@ -19394,17 +18588,6 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -19419,24 +18602,6 @@ __metadata: languageName: node linkType: hard -"is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: ^1.0.0 - checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -19446,16 +18611,6 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 - languageName: node - linkType: hard - "is-buffer@npm:^2.0.0": version: 2.0.5 resolution: "is-buffer@npm:2.0.5" @@ -19472,7 +18627,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.3": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -19501,7 +18656,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.13.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -19510,15 +18665,6 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc - languageName: node - linkType: hard - "is-decimal@npm:^1.0.0": version: 1.0.4 resolution: "is-decimal@npm:1.0.4" @@ -19567,15 +18713,6 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^1.0.0": version: 1.0.0 resolution: "is-fullwidth-code-point@npm:1.0.0" @@ -19606,7 +18743,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -19615,7 +18752,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -19685,13 +18822,6 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 - languageName: node - linkType: hard - "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" @@ -19729,13 +18859,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a - languageName: node - linkType: hard - "is-npm@npm:^1.0.0": version: 1.0.0 resolution: "is-npm@npm:1.0.0" @@ -19750,15 +18873,6 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -19796,7 +18910,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 @@ -19877,16 +18991,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 - languageName: node - linkType: hard - "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" @@ -19908,22 +19012,6 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - "is-stream@npm:^1.0.0, is-stream@npm:^1.0.1, is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -19945,25 +19033,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": +"is-typed-array@npm:^1.1.3": version: 1.1.12 resolution: "is-typed-array@npm:1.1.12" dependencies: @@ -20002,32 +19072,6 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.1": - version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 - languageName: node - linkType: hard - "is-what@npm:^4.1.8": version: 4.1.16 resolution: "is-what@npm:4.1.16" @@ -20079,13 +19123,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -20170,19 +19207,6 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" - dependencies: - define-properties: ^1.2.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - reflect.getprototypeof: ^1.0.4 - set-function-name: ^2.0.1 - checksum: d8a507e2ccdc2ce762e8a1d3f4438c5669160ac72b88b648e59a688eec6bc4e64b22338e74000518418d9e693faf2a092d2af21b9ec7dbf7763b037a54701168 - languageName: node - linkType: hard - "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -20458,13 +19482,6 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - "json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -20543,18 +19560,6 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" - dependencies: - array-includes: ^3.1.6 - array.prototype.flat: ^1.3.1 - object.assign: ^4.1.4 - object.values: ^1.1.6 - checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a - languageName: node - linkType: hard - "junk@npm:^3.1.0": version: 3.1.0 resolution: "junk@npm:3.1.0" @@ -20627,22 +19632,6 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a - languageName: node - linkType: hard - -"language-tags@npm:^1.0.9": - version: 1.0.9 - resolution: "language-tags@npm:1.0.9" - dependencies: - language-subtag-registry: ^0.3.20 - checksum: 57c530796dc7179914dee71bc94f3747fd694612480241d0453a063777265dfe3a951037f7acb48f456bf167d6eb419d4c00263745326b3ba1cdcf4657070e78 - languageName: node - linkType: hard - "latest-version@npm:^3.0.0": version: 3.1.0 resolution: "latest-version@npm:3.1.0" @@ -20698,16 +19687,6 @@ __metadata: languageName: node linkType: hard -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - "lib0@npm:^0.2.42, lib0@npm:^0.2.74": version: 0.2.88 resolution: "lib0@npm:0.2.88" @@ -21082,13 +20061,6 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - "lodash.template@npm:^4.2.2": version: 4.5.0 resolution: "lodash.template@npm:4.5.0" @@ -21165,6 +20137,13 @@ __metadata: languageName: node linkType: hard +"loglevel@npm:^1.8.1": + version: 1.8.1 + resolution: "loglevel@npm:1.8.1" + checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d + languageName: node + linkType: hard + "long@npm:5.2.3": version: 5.2.3 resolution: "long@npm:5.2.3" @@ -22252,13 +21231,13 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.6.1": - version: 2.7.6 - resolution: "mini-css-extract-plugin@npm:2.7.6" + version: 2.7.7 + resolution: "mini-css-extract-plugin@npm:2.7.7" dependencies: schema-utils: ^4.0.0 peerDependencies: webpack: ^5.0.0 - checksum: be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83 + checksum: 04af0e7d8c1a4ff31c70ac2d0895837dae3d51cce3bfd90e3c1d90d50eef7de21778361a3064531df046d775d80b3bf056324dddea93831c7def2047c5aa8718 languageName: node linkType: hard @@ -22276,7 +21255,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -22285,15 +21264,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - "minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -22312,6 +21282,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + "minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -22443,6 +21422,7 @@ __metadata: "@connectrpc/protoc-gen-connect-es": 1.1.3 "@manypkg/cli": 0.19.2 "@nderscore/tamagui-typescript-plugin": 0.5.4 + "@playwright/test": 1.40.1 "@storybook/nextjs": 7.0.26 "@tamagui/cli": latest babel-plugin-react-native-web: 0.19.9 @@ -22450,9 +21430,9 @@ __metadata: concurrently: 8.2.1 cross-env: 7.0.3 electron-squirrel-startup: 1.0.0 - eslint: 8.47.0 graphql-codegen: 0.4.0 node-gyp: 9.3.1 + playwright: ^1.40.1 prettier: 3.0.2 react-virtuoso: 4.6.2 sort-package-json: 2.5.1 @@ -22606,13 +21586,6 @@ __metadata: languageName: node linkType: hard -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -22733,12 +21706,12 @@ __metadata: languageName: node linkType: hard -"node-api-version@npm:^0.1.4": - version: 0.1.4 - resolution: "node-api-version@npm:0.1.4" +"node-api-version@npm:^0.2.0": + version: 0.2.0 + resolution: "node-api-version@npm:0.2.0" dependencies: semver: ^7.3.5 - checksum: e652a9502a6b62bda01d6134be30195f9d8b3ba75190a4190c76e7ed4f12a410cdc7ec301f878aff11dafc14bc7d9c4fc81f88c1e174c8fb970b7b33eb978b98 + checksum: 26146d0d4a6a252009e1926e2f3668a7ab1710d6ee59d615b0099ccdc0c6588a48b5f8668349d4eb313be0d904a67b106b7cf2d2a1a31609ff671394baaf6ce0 languageName: node linkType: hard @@ -23077,7 +22050,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.9.0": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f @@ -23113,50 +22086,6 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": - version: 1.1.7 - resolution: "object.entries@npm:1.1.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 - languageName: node - linkType: hard - -"object.groupby@npm:^1.0.1": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 - languageName: node - linkType: hard - -"object.hasown@npm:^1.1.2": - version: 1.1.3 - resolution: "object.hasown@npm:1.1.3" - dependencies: - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 - languageName: node - linkType: hard - "object.omit@npm:^3.0.0": version: 3.0.0 resolution: "object.omit@npm:3.0.0" @@ -23175,17 +22104,6 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 - languageName: node - linkType: hard - "objectorarray@npm:^1.0.5": version: 1.0.5 resolution: "objectorarray@npm:1.0.5" @@ -23298,20 +22216,6 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - "ora@npm:^5.1.0": version: 5.4.1 resolution: "ora@npm:5.4.1" @@ -23916,9 +22820,9 @@ __metadata: linkType: hard "pathe@npm:^1.1.0, pathe@npm:^1.1.1": - version: 1.1.1 - resolution: "pathe@npm:1.1.1" - checksum: 34ab3da2e5aa832ebc6a330ffe3f73d7ba8aec6e899b53b8ec4f4018de08e40742802deb12cf5add9c73b7bf719b62c0778246bd376ca62b0fb23e0dde44b759 + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 languageName: node linkType: hard @@ -24086,12 +22990,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.37.1": - version: 1.37.1 - resolution: "playwright-core@npm:1.37.1" +"playwright-core@npm:1.40.1": + version: 1.40.1 + resolution: "playwright-core@npm:1.40.1" bin: playwright-core: cli.js - checksum: 69f818da2230057584140d5b3af7778a4f4a822b5b18d133abfc5d259128becb943c343a2ddf6b0635277a69f28983e83e2bc3fce23595ececb1e410475b6368 + checksum: 84d92fb9b86e3c225b16b6886bf858eb5059b4e60fa1205ff23336e56a06dcb2eac62650992dede72f406c8e70a7b6a5303e511f9b4bc0b85022ede356a01ee0 + languageName: node + linkType: hard + +"playwright@npm:1.40.1, playwright@npm:^1.40.1": + version: 1.40.1 + resolution: "playwright@npm:1.40.1" + dependencies: + fsevents: 2.3.2 + playwright-core: 1.40.1 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 9e36791c1b4a649c104aa365fdd9d049924eeb518c5967c0e921aa38b9b00994aa6ee54784d6c2af194b3b494b6f69772673081ef53c6c4a4b2065af9955c4ba languageName: node linkType: hard @@ -24350,7 +23269,7 @@ __metadata: languageName: node linkType: hard -"postcss-modules-scope@npm:^3.0.0": +"postcss-modules-scope@npm:^3.1.0": version: 3.1.0 resolution: "postcss-modules-scope@npm:3.1.0" dependencies: @@ -24588,7 +23507,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.14, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.27, postcss@npm:^8.4.32": +"postcss@npm:^8.2.14, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.27, postcss@npm:^8.4.31, postcss@npm:^8.4.32": version: 8.4.33 resolution: "postcss@npm:8.4.33" dependencies: @@ -24599,13 +23518,6 @@ __metadata: languageName: node linkType: hard -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - "prepend-http@npm:^1.0.1": version: 1.0.4 resolution: "prepend-http@npm:1.0.4" @@ -25622,18 +24534,18 @@ __metadata: languageName: node linkType: hard -"react-native-web-internals@npm:1.82.9": - version: 1.82.9 - resolution: "react-native-web-internals@npm:1.82.9" +"react-native-web-internals@npm:1.84.1": + version: 1.84.1 + resolution: "react-native-web-internals@npm:1.84.1" dependencies: - "@tamagui/normalize-css-color": 1.82.9 - "@tamagui/react-native-use-pressable": 1.82.9 - "@tamagui/react-native-use-responder-events": 1.82.9 - "@tamagui/simple-hash": 1.82.9 + "@tamagui/normalize-css-color": 1.84.1 + "@tamagui/react-native-use-pressable": 1.84.1 + "@tamagui/react-native-use-responder-events": 1.84.1 + "@tamagui/simple-hash": 1.84.1 styleq: ^0.1.3 peerDependencies: react: "*" - checksum: 54d8fe1e8ce6d1e04d6ad804a6a60311009a514f300ae56b5e52a90fc47755a69491ef9ca5f41405408765c4c69f8dbc82c9f0164f23c1697caef4fbfeeac528 + checksum: a21583a342ab02e537310a0b11bd1a9a4f8448fbf6bd1b0a00302e79d2945c2b8801197429901fd06308445b66675d654db7fbf784f5db9eb96507e8d4603e7d languageName: node linkType: hard @@ -25652,18 +24564,18 @@ __metadata: languageName: node linkType: hard -"react-native-web-lite@npm:1.82.9": - version: 1.82.9 - resolution: "react-native-web-lite@npm:1.82.9" +"react-native-web-lite@npm:1.84.1": + version: 1.84.1 + resolution: "react-native-web-lite@npm:1.84.1" dependencies: - "@tamagui/normalize-css-color": 1.82.9 + "@tamagui/normalize-css-color": 1.84.1 invariant: ^2.2.4 - react-native-web-internals: 1.82.9 + react-native-web-internals: 1.84.1 styleq: ^0.1.3 peerDependencies: react: "*" react-dom: "*" - checksum: a3734f5b7f0d6b98a45d5b44160e0ffbb91a3443b25a2c84e59de6a885298ab89c808b75a2d012ada5bc333adcf27b3a40a3c4fa69bb66491f925f867c8b01c2 + checksum: 059f6dd035b361ee1c38d37664d9a0879a3fb7c41994ff05c476828eb4855306fbb8a7b735f4dc11d4a7b37cb7b5d618573522c6cfa81a7cd057dcb02ddb584f languageName: node linkType: hard @@ -26073,20 +24985,6 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - which-builtin-type: ^1.1.3 - checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 - languageName: node - linkType: hard - "reforest@npm:^0.13.0": version: 0.13.0 resolution: "reforest@npm:0.13.0" @@ -26152,17 +25050,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - set-function-name: ^2.0.0 - checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 - languageName: node - linkType: hard - "regexpu-core@npm:^5.3.1": version: 5.3.2 resolution: "regexpu-core@npm:5.3.2" @@ -26558,7 +25445,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.3.2": +"resolve@npm:1.22.8, resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.3.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -26571,20 +25458,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": - version: 2.0.0-next.5 - resolution: "resolve@npm:2.0.0-next.5" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: a73ac69a1c4bd34c56b213d91f5b17ce390688fdb4a1a96ed3025cc7e08e7bfb90b3a06fcce461780cb0b589c958afcb0080ab802c71c01a7ecc8c64feafc89f - languageName: node - linkType: hard - -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.3.2#~builtin": +"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.3.2#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -26597,19 +25471,6 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.4#~builtin": - version: 2.0.0-next.5 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=c3c19d" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 064d09c1808d0c51b3d90b5d27e198e6d0c5dad0eb57065fd40803d6a20553e5398b07f76739d69cbabc12547058bec6b32106ea66622375fb0d7e8fca6a846c - languageName: node - linkType: hard - "responselike@npm:^1.0.2": version: 1.0.2 resolution: "responselike@npm:1.0.2" @@ -26865,18 +25726,6 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - isarray: ^2.0.5 - checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 - languageName: node - linkType: hard - "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -26891,17 +25740,6 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 - languageName: node - linkType: hard - "safe-stable-stringify@npm:^2.3.1": version: 2.4.3 resolution: "safe-stable-stringify@npm:2.4.3" @@ -27124,7 +25962,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.1, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -27187,11 +26025,11 @@ __metadata: linkType: hard "serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" dependencies: randombytes: ^2.1.0 - checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 languageName: node linkType: hard @@ -27257,17 +26095,6 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": - version: 2.0.1 - resolution: "set-function-name@npm:2.0.1" - dependencies: - define-data-property: ^1.0.1 - functions-have-names: ^1.2.3 - has-property-descriptors: ^1.0.0 - checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 - languageName: node - linkType: hard - "set-value@npm:^4.1.0": version: 4.1.0 resolution: "set-value@npm:4.1.0" @@ -27947,56 +26774,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.8": - version: 4.0.10 - resolution: "string.prototype.matchall@npm:4.0.10" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - regexp.prototype.flags: ^1.5.0 - set-function-name: ^2.0.0 - side-channel: ^1.0.4 - checksum: 3c78bdeff39360c8e435d7c4c6ea19f454aa7a63eda95fa6fadc3a5b984446a2f9f2c02d5c94171ce22268a573524263fbd0c8edbe3ce2e9890d7cc036cdc3ed - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 - languageName: node - linkType: hard - "string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -28168,11 +26945,11 @@ __metadata: linkType: hard "style-loader@npm:^3.3.1": - version: 3.3.3 - resolution: "style-loader@npm:3.3.3" + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" peerDependencies: webpack: ^5.0.0 - checksum: f59c953f56f6a935bd6a1dfa409f1128fed2b66b48ce4a7a75b85862a7156e5e90ab163878962762f528ec4d510903d828da645e143fbffd26f055dc1c094078 + checksum: caac3f2fe2c3c89e49b7a2a9329e1cfa515ecf5f36b9c4885f9b218019fda207a9029939b2c35821dec177a264a007e7c391ccdd3ff7401881ce6287b9c8f38b languageName: node linkType: hard @@ -28905,15 +27682,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 - languageName: node - linkType: hard - "ts-dedent@npm:^2.0.0": version: 2.2.0 resolution: "ts-dedent@npm:2.2.0" @@ -29004,7 +27772,7 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.15.0, tsconfig-paths@npm:^3.9.0": +"tsconfig-paths@npm:^3.9.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" dependencies: @@ -29119,15 +27887,6 @@ __metadata: languageName: node linkType: hard -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - "type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -29187,53 +27946,6 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - is-typed-array: ^1.1.10 - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 - languageName: node - linkType: hard - -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 - languageName: node - linkType: hard - -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 - languageName: node - linkType: hard - "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -29360,18 +28072,6 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 - languageName: node - linkType: hard - "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -30885,51 +29585,6 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e - languageName: node - linkType: hard - -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" - dependencies: - function.prototype.name: ^1.1.5 - has-tostringtag: ^1.0.0 - is-async-function: ^2.0.0 - is-date-object: ^1.0.5 - is-finalizationregistry: ^1.0.2 - is-generator-function: ^1.0.10 - is-regex: ^1.1.4 - is-weakref: ^1.0.2 - isarray: ^2.0.5 - which-boxed-primitive: ^1.0.2 - which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.1": - version: 1.0.1 - resolution: "which-collection@npm:1.0.1" - dependencies: - is-map: ^2.0.1 - is-set: ^2.0.1 - is-weakmap: ^2.0.1 - is-weakset: ^2.0.1 - checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c - languageName: node - linkType: hard - "which-module@npm:^1.0.0": version: 1.0.0 resolution: "which-module@npm:1.0.0" @@ -30937,7 +29592,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.2": version: 1.1.13 resolution: "which-typed-array@npm:1.1.13" dependencies: