diff --git a/.github/workflows/docker-hub.yml b/.github/workflows/docker-hub.yml index b0a5aed25..f5788caae 100644 --- a/.github/workflows/docker-hub.yml +++ b/.github/workflows/docker-hub.yml @@ -60,11 +60,25 @@ jobs: should_push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }} docker_user: 1001:127 + # build-and-push-yhub: + # uses: ./.github/workflows/docker-publish.yml + # permissions: + # contents: read + # secrets: inherit + # with: + # image_name: lasuite/impress-yhub + # context: . + # file: src/frontend/servers/yhub/Dockerfile + # target: yhub + # should_push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }} + # docker_user: 1001:127 + notify-argocd: needs: - build-and-push-backend - build-and-push-frontend - build-and-push-y-provider + # - build-and-push-yhub runs-on: ubuntu-latest if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') steps: diff --git a/.github/workflows/ghcr.yml b/.github/workflows/ghcr.yml index ac2fb71d0..a3aeed8db 100644 --- a/.github/workflows/ghcr.yml +++ b/.github/workflows/ghcr.yml @@ -158,3 +158,50 @@ jobs: run: | docker system prune -af docker volume prune -f + + # build-and-push-yhub: + # runs-on: ubuntu-latest + # if: github.event.repository.fork == true + # permissions: + # contents: read + # packages: write + # steps: + # - name: Checkout repository + # uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + # - name: Set up QEMU + # uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4 + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4 + # - name: Docker meta + # id: meta + # uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6 + # with: + # images: ${{ env.REGISTRY }}/${{ github.repository }}/yhub + # tags: | + # type=ref,event=branch + # type=ref,event=pr + # type=semver,pattern={{version}} + # type=semver,pattern={{major}}.{{minor}} + # type=sha + # - name: Login to GHCR + # uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4 + # with: + # registry: ${{ env.REGISTRY }} + # username: ${{ github.actor }} + # password: ${{ secrets.GITHUB_TOKEN }} + # - name: Build and push + # uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7 + # with: + # context: . + # file: ./src/frontend/servers/yhub/Dockerfile + # target: yhub + # platforms: linux/amd64,linux/arm64 + # build-args: DOCKER_USER=${{ env.DOCKER_USER }}:-1000 + # push: true + # tags: ${{ steps.meta.outputs.tags }} + # labels: ${{ steps.meta.outputs.labels }} + # - name: Cleanup Docker after build + # if: always() + # run: | + # docker system prune -af + # docker volume prune -f diff --git a/Makefile b/Makefile index d1defd6f2..5b7cfc64e 100644 --- a/Makefile +++ b/Makefile @@ -189,7 +189,7 @@ bootstrap-e2e: \ build: cache ?= build: ## build the project containers @$(MAKE) build-backend cache=$(cache) - @$(MAKE) build-yjs-provider cache=$(cache) + @$(MAKE) build-yhub cache=$(cache) @$(MAKE) build-frontend cache=$(cache) .PHONY: build @@ -203,6 +203,11 @@ build-yjs-provider: ## build the y-provider container @$(COMPOSE) build y-provider-development $(cache) .PHONY: build-yjs-provider +build-yhub: cache ?= +build-yhub: ## build the yhub collaboration server container + @$(COMPOSE) build yhub-development $(cache) +.PHONY: build-yhub + build-frontend: cache ?= build-frontend: ## build the frontend container @$(COMPOSE) build frontend-development $(cache) @@ -212,7 +217,8 @@ build-e2e: cache ?= build-e2e: ## build the e2e container @$(MAKE) build-backend cache=$(cache) @$(COMPOSE_E2E) build frontend $(cache) - @$(COMPOSE_E2E) build y-provider $(cache) + @$(COMPOSE_E2E) build yhub $(cache) + @$(COMPOSE_E2E) build y-provider-converter $(cache) .PHONY: build-e2e nginx-frontend: ## build the nginx-frontend container @@ -231,7 +237,7 @@ run-backend: ## Start only the backend application and all needed services @$(MAKE) create-docker-network @$(COMPOSE) up --force-recreate -d docspec @$(COMPOSE) up --force-recreate -d celery-dev - @$(COMPOSE) up --force-recreate -d y-provider-development + @$(COMPOSE) up --force-recreate -d yhub-development @$(COMPOSE) up --force-recreate -d y-provider-development-converter @$(COMPOSE) up --force-recreate -d nginx .PHONY: run-backend @@ -245,9 +251,10 @@ run: run-e2e: ## start the e2e server run-e2e: @$(MAKE) run-backend - @$(COMPOSE_E2E) stop y-provider-development + @$(COMPOSE_E2E) stop yhub-development + @$(COMPOSE_E2E) stop y-provider-development-converter @$(COMPOSE_E2E) up --force-recreate -d frontend - @$(COMPOSE_E2E) up --force-recreate -d y-provider + @$(COMPOSE_E2E) up --force-recreate -d yhub @$(COMPOSE_E2E) up --force-recreate -d y-provider-converter .PHONY: run-e2e diff --git a/compose-e2e.yml b/compose-e2e.yml index f918b5cc1..dfde3c932 100644 --- a/compose-e2e.yml +++ b/compose-e2e.yml @@ -13,7 +13,29 @@ services: ports: - "3000:3000" - y-provider: + yhub: + user: ${DOCKER_USER:-1000} + build: + context: . + dockerfile: ./src/frontend/servers/yhub/Dockerfile + target: yhub + image: impress:yhub-production + restart: unless-stopped + environment: + - REDIS_URL=redis://redis:6379 + - POSTGRES_URL=postgres://dinum:pass@postgresql:5432/impress + env_file: + - env.d/development/common + - env.d/development/common.local + ports: + - "4444:4444" + depends_on: + redis: + condition: service_healthy + postgresql: + condition: service_healthy + + y-provider-converter: user: ${DOCKER_USER:-1000} build: context: . @@ -24,16 +46,3 @@ services: env_file: - env.d/development/common - env.d/development/common.local - ports: - - "4444:4444" - - y-provider-converter: - user: ${DOCKER_USER:-1000} - image: impress:y-provider-production - restart: unless-stopped - env_file: - - env.d/development/common - - env.d/development/common.local - depends_on: - y-provider: - condition: service_started diff --git a/compose.yml b/compose.yml index 1480304ff..247c212a2 100644 --- a/compose.yml +++ b/compose.yml @@ -17,7 +17,13 @@ services: - ./docker/files/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro redis: - image: redis:5 + # ≥ 6.2 required by the yhub collaboration server (XAUTOCLAIM) + image: redis:7 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 1s + timeout: 2s + retries: 60 mailcatcher: image: sj26/mailcatcher:latest @@ -192,8 +198,6 @@ services: env_file: - env.d/development/common - env.d/development/common.local - ports: - - "4444:4444" volumes: - ./src/frontend/:/home/frontend - /home/frontend/node_modules @@ -210,9 +214,35 @@ services: - ./src/frontend/:/home/frontend - /home/frontend/node_modules - /home/frontend/servers/y-provider/node_modules + # depends_on: + # y-provider-development: + # condition: service_started + + yhub-development: + user: ${DOCKER_USER:-1000} + build: + context: . + dockerfile: ./src/frontend/servers/yhub/Dockerfile + target: yhub-development + image: impress:yhub-development + restart: unless-stopped + environment: + - REDIS_URL=redis://redis:6379 + - POSTGRES_URL=postgres://dinum:pass@postgresql:5432/impress + env_file: + - env.d/development/common + - env.d/development/common.local + ports: + - "4444:4444" + volumes: + - ./src/frontend/:/home/frontend + - /home/frontend/node_modules + - /home/frontend/servers/yhub/node_modules depends_on: - y-provider-development: - condition: service_started + redis: + condition: service_healthy + postgresql: + condition: service_healthy kc_postgresql: image: postgres:14.3 diff --git a/docker/files/production/etc/nginx/conf.d/default.conf.template b/docker/files/production/etc/nginx/conf.d/default.conf.template index 6fff9c52f..a5383c519 100644 --- a/docker/files/production/etc/nginx/conf.d/default.conf.template +++ b/docker/files/production/etc/nginx/conf.d/default.conf.template @@ -55,14 +55,19 @@ server { try_files $uri @proxy_to_docs_backend; } - # Proxy auth for collaboration server - location /collaboration/ws/ { + # Collaboration server (yhub). + # Transition setup: frontend bundles still in browser caches use the old + # Hocuspocus URL form `/collaboration/ws/?room={uuid}` (exact match below, + # routed to y-provider); current bundles use the y-websocket form + # `/collaboration/ws/{uuid}` (regex, routed to yhub). Drop the exact-match + # block and YPROVIDER_HOST WS routing once the fleet has converged. + location = /collaboration/ws/ { # Ensure WebSocket upgrade proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; - # Collaboration server + # Legacy collaboration server (Hocuspocus) proxy_pass http://${YPROVIDER_HOST}:4444; # Set appropriate timeout for WebSocket @@ -75,9 +80,28 @@ server { proxy_set_header Host $host; } + location ~ ^/collaboration/ws/[0-9a-fA-F-]{36}$ { + # Ensure WebSocket upgrade + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + + # Collaboration server (yhub) + proxy_pass http://${YHUB_HOST}:4444; + + # Set appropriate timeout for WebSocket + proxy_read_timeout 86400; + proxy_send_timeout 86400; + + # Preserve original host and additional headers + proxy_set_header X-Forwarded-Proto https; + proxy_set_header Origin $http_origin; + proxy_set_header Host $host; + } + location /collaboration/api/ { - # Collaboration server - proxy_pass http://${YPROVIDER_HOST}:4444; + # Collaboration server (yhub) + proxy_pass http://${YHUB_HOST}:4444; proxy_set_header Host $host; } diff --git a/docs/examples/compose/compose.yaml b/docs/examples/compose/compose.yaml index 6a813299a..fcb249b8b 100644 --- a/docs/examples/compose/compose.yaml +++ b/docs/examples/compose/compose.yaml @@ -41,6 +41,8 @@ services: redis: condition: service_started + # Conversion endpoint only (/api/convert/); realtime collaboration is + # served by the yhub service below. y-provider: image: lasuite/impress-y-provider:latest user: ${DOCKER_USER:-1000} @@ -48,6 +50,24 @@ services: - env.d/common - env.d/yprovider + # Realtime collaboration server (routed by nginx via ${YHUB_HOST}). + # Requires Redis >= 6.2 and a PostgreSQL database for its document cache. + yhub: + image: lasuite/impress-yhub:latest + user: ${DOCKER_USER:-1000} + environment: + - REDIS_URL=redis://redis:6379 + # Must match the credentials in env.d/postgresql + - POSTGRES_URL=postgres://docs:${DB_PASSWORD}@postgresql:5432/docs + env_file: + - env.d/common + - env.d/yprovider + depends_on: + postgresql: + condition: service_healthy + redis: + condition: service_started + frontend: image: lasuite/impress-frontend:latest user: "101" diff --git a/env.d/development/common b/env.d/development/common index e187e2c6c..fbbdf9d67 100644 --- a/env.d/development/common +++ b/env.d/development/common @@ -72,7 +72,7 @@ OIDC_RS_ALLOWED_AUDIENCES="" USER_RECONCILIATION_FORM_URL=http://localhost:3000 # Collaboration -COLLABORATION_API_URL=http://y-provider-development:4444/collaboration/api/ +COLLABORATION_API_URL=http://yhub-development:4444/collaboration/api/ COLLABORATION_BACKEND_BASE_URL=http://app-dev:8000 COLLABORATION_SERVER_ORIGIN=http://localhost:3000 COLLABORATION_SERVER_SECRET=my-secret diff --git a/env.d/development/common.e2e b/env.d/development/common.e2e index 6a2131c78..8f00282b1 100644 --- a/env.d/development/common.e2e +++ b/env.d/development/common.e2e @@ -1,6 +1,6 @@ # For the CI job test-e2e BURST_THROTTLE_RATES="1000/minute" -COLLABORATION_API_URL=http://y-provider:4444/collaboration/api/ +COLLABORATION_API_URL=http://yhub:4444/collaboration/api/ SUSTAINED_THROTTLE_RATES="1000/minute" Y_PROVIDER_API_BASE_URL=http://y-provider-converter:4444/api/ diff --git a/env.d/production.dist/common b/env.d/production.dist/common index bb289de71..680b96f9f 100644 --- a/env.d/production.dist/common +++ b/env.d/production.dist/common @@ -4,6 +4,7 @@ S3_HOST=storage.domain.tld BACKEND_HOST=backend FRONTEND_HOST=frontend YPROVIDER_HOST=y-provider +YHUB_HOST=yhub BUCKET_NAME=docs-media-storage REALM_NAME=docs #COLLABORATION_WS_URL=wss://${DOCS_HOST}/collaboration/ws/ \ No newline at end of file diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-collaboration.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-collaboration.spec.ts index 909609bc1..700b8c7d1 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-collaboration.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-collaboration.spec.ts @@ -7,6 +7,14 @@ import { openSuggestionMenu, writeInEditor } from './utils-editor'; import { connectOtherUserToDoc, updateShareLink } from './utils-share'; import { createRootSubPage } from './utils-sub-pages'; +/** + * The y-websocket provider builds the collaboration WebSocket URL as + * `${serverUrl}/${documentId}` — a path segment, no `?room=` query string. + */ +const COLLABORATION_WS_URL_PATTERN = /\/collaboration\/ws\/[0-9a-f-]{36}$/; +const isCollaborationWsUrl = (url: string) => + COLLABORATION_WS_URL_PATTERN.test(url); + test.beforeEach(async ({ page }) => { await page.goto('/'); }); @@ -20,9 +28,7 @@ test.describe('Doc Collaboration', () => { */ test('checks the connection with collaborative server', async ({ page }) => { let webSocketPromise = page.waitForEvent('websocket', (webSocket) => { - return webSocket - .url() - .includes(`${process.env.COLLABORATION_WS_URL}?room=`); + return isCollaborationWsUrl(webSocket.url()); }); await page @@ -32,9 +38,7 @@ test.describe('Doc Collaboration', () => { .click(); let webSocket = await webSocketPromise; - expect(webSocket.url()).toContain( - `${process.env.COLLABORATION_WS_URL}?room=`, - ); + expect(webSocket.url()).toMatch(COLLABORATION_WS_URL_PATTERN); // Is connected let framesentPromise = webSocket.waitForEvent('framesent'); @@ -60,9 +64,7 @@ test.describe('Doc Collaboration', () => { // Check the ws is connected again webSocket = await page.waitForEvent('websocket', (webSocket) => { - return webSocket - .url() - .includes(`${process.env.COLLABORATION_WS_URL}?room=`); + return isCollaborationWsUrl(webSocket.url()); }); framesentPromise = webSocket.waitForEvent('framesent'); framesent = await framesentPromise; @@ -210,18 +212,14 @@ test.describe('Doc Collaboration', () => { const webSocketPromise = otherPage.waitForEvent( 'websocket', (webSocket) => { - return webSocket - .url() - .includes(`${process.env.COLLABORATION_WS_URL}?room=`); + return isCollaborationWsUrl(webSocket.url()); }, ); await otherPage.goto(urlChildDoc); const webSocket = await webSocketPromise; - expect(webSocket.url()).toContain( - `${process.env.COLLABORATION_WS_URL}?room=`, - ); + expect(webSocket.url()).toMatch(COLLABORATION_WS_URL_PATTERN); await verifyDocName(otherPage, childTitle); @@ -287,9 +285,7 @@ test.describe('Doc Collaboration', () => { await page.goto('/'); let webSocketPromise = page.waitForEvent('websocket', (webSocket) => { - return webSocket - .url() - .includes(`${process.env.COLLABORATION_WS_URL}?room=`); + return isCollaborationWsUrl(webSocket.url()); }); await page @@ -299,9 +295,7 @@ test.describe('Doc Collaboration', () => { .click(); let webSocket = await webSocketPromise; - expect(webSocket.url()).toContain( - `${process.env.COLLABORATION_WS_URL}?room=`, - ); + expect(webSocket.url()).toMatch(COLLABORATION_WS_URL_PATTERN); // Is connected let framesentPromise = webSocket.waitForEvent('framesent'); @@ -330,9 +324,7 @@ test.describe('Doc Collaboration', () => { // Check the ws is connected again webSocketPromise = page.waitForEvent('websocket', (webSocket) => { - return webSocket - .url() - .includes(`${process.env.COLLABORATION_WS_URL}?room=`); + return isCollaborationWsUrl(webSocket.url()); }); // Simulate the tab becoming visible again diff --git a/src/frontend/apps/e2e/tsconfig.tsbuildinfo b/src/frontend/apps/e2e/tsconfig.tsbuildinfo new file mode 100644 index 000000000..14a19181c --- /dev/null +++ b/src/frontend/apps/e2e/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/typescript/lib/lib.es2025.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/typescript/lib/lib.es2025.collection.d.ts","../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/typescript/lib/lib.es2025.intl.d.ts","../../node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../node_modules/typescript/lib/lib.es2025.promise.d.ts","../../node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.date.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/playwright-core/types/protocol.d.ts","../../node_modules/playwright-core/types/structs.d.ts","../../node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/zod/v4/core/registries.d.cts","../../node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/zod/v4/core/util.d.cts","../../node_modules/zod/v4/core/versions.d.cts","../../node_modules/zod/v4/core/schemas.d.cts","../../node_modules/zod/v4/core/checks.d.cts","../../node_modules/zod/v4/core/errors.d.cts","../../node_modules/zod/v4/core/core.d.cts","../../node_modules/zod/v4/core/parse.d.cts","../../node_modules/zod/v4/core/regexes.d.cts","../../node_modules/zod/v4/locales/ar.d.cts","../../node_modules/zod/v4/locales/az.d.cts","../../node_modules/zod/v4/locales/be.d.cts","../../node_modules/zod/v4/locales/bg.d.cts","../../node_modules/zod/v4/locales/ca.d.cts","../../node_modules/zod/v4/locales/cs.d.cts","../../node_modules/zod/v4/locales/da.d.cts","../../node_modules/zod/v4/locales/de.d.cts","../../node_modules/zod/v4/locales/el.d.cts","../../node_modules/zod/v4/locales/en.d.cts","../../node_modules/zod/v4/locales/eo.d.cts","../../node_modules/zod/v4/locales/es.d.cts","../../node_modules/zod/v4/locales/fa.d.cts","../../node_modules/zod/v4/locales/fi.d.cts","../../node_modules/zod/v4/locales/fr.d.cts","../../node_modules/zod/v4/locales/fr-CA.d.cts","../../node_modules/zod/v4/locales/he.d.cts","../../node_modules/zod/v4/locales/hr.d.cts","../../node_modules/zod/v4/locales/hu.d.cts","../../node_modules/zod/v4/locales/hy.d.cts","../../node_modules/zod/v4/locales/id.d.cts","../../node_modules/zod/v4/locales/is.d.cts","../../node_modules/zod/v4/locales/it.d.cts","../../node_modules/zod/v4/locales/ja.d.cts","../../node_modules/zod/v4/locales/ka.d.cts","../../node_modules/zod/v4/locales/kh.d.cts","../../node_modules/zod/v4/locales/km.d.cts","../../node_modules/zod/v4/locales/ko.d.cts","../../node_modules/zod/v4/locales/lt.d.cts","../../node_modules/zod/v4/locales/mk.d.cts","../../node_modules/zod/v4/locales/ms.d.cts","../../node_modules/zod/v4/locales/nl.d.cts","../../node_modules/zod/v4/locales/no.d.cts","../../node_modules/zod/v4/locales/ota.d.cts","../../node_modules/zod/v4/locales/ps.d.cts","../../node_modules/zod/v4/locales/pl.d.cts","../../node_modules/zod/v4/locales/pt.d.cts","../../node_modules/zod/v4/locales/ro.d.cts","../../node_modules/zod/v4/locales/ru.d.cts","../../node_modules/zod/v4/locales/sl.d.cts","../../node_modules/zod/v4/locales/sv.d.cts","../../node_modules/zod/v4/locales/ta.d.cts","../../node_modules/zod/v4/locales/th.d.cts","../../node_modules/zod/v4/locales/tr.d.cts","../../node_modules/zod/v4/locales/ua.d.cts","../../node_modules/zod/v4/locales/uk.d.cts","../../node_modules/zod/v4/locales/ur.d.cts","../../node_modules/zod/v4/locales/uz.d.cts","../../node_modules/zod/v4/locales/vi.d.cts","../../node_modules/zod/v4/locales/zh-CN.d.cts","../../node_modules/zod/v4/locales/zh-TW.d.cts","../../node_modules/zod/v4/locales/yo.d.cts","../../node_modules/zod/v4/locales/index.d.cts","../../node_modules/zod/v4/core/doc.d.cts","../../node_modules/zod/v4/core/api.d.cts","../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../node_modules/zod/v4/core/index.d.cts","../../node_modules/zod/v4/classic/errors.d.cts","../../node_modules/zod/v4/classic/parse.d.cts","../../node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/zod/v4/classic/checks.d.cts","../../node_modules/zod/v4/classic/compat.d.cts","../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../node_modules/zod/v4/classic/iso.d.cts","../../node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/zod/v4/classic/external.d.cts","../../node_modules/zod/index.d.cts","../../node_modules/zod/v3/helpers/typeAliases.d.cts","../../node_modules/zod/v3/helpers/util.d.cts","../../node_modules/zod/v3/ZodError.d.cts","../../node_modules/zod/v3/locales/en.d.cts","../../node_modules/zod/v3/errors.d.cts","../../node_modules/zod/v3/helpers/parseUtil.d.cts","../../node_modules/zod/v3/helpers/enumUtil.d.cts","../../node_modules/zod/v3/helpers/errorUtil.d.cts","../../node_modules/zod/v3/helpers/partialUtil.d.cts","../../node_modules/zod/v3/standard-schema.d.cts","../../node_modules/zod/v3/types.d.cts","../../node_modules/zod/v3/external.d.cts","../../node_modules/zod/v3/index.d.cts","../../node_modules/playwright-core/types/types.d.ts","../../node_modules/playwright-core/index.d.ts","../../node_modules/playwright/types/test.d.ts","../../node_modules/playwright/test.d.ts","../../node_modules/@playwright/test/index.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/querystring/decode.d.ts","../../node_modules/querystring/encode.d.ts","../../node_modules/querystring/index.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/dotenv/lib/main.d.ts","./playwright.config.ts","./__tests__/helpers.ts","./__tests__/app-impress/404.spec.ts","./__tests__/app-impress/utils-signin.ts","./__tests__/app-impress/auth.setup.ts","../../../backend/impress/configuration/theme/default.json","./package.json","./__tests__/app-impress/utils-common.ts","./__tests__/app-impress/utils-editor.ts","./__tests__/app-impress/config.spec.ts","./__tests__/app-impress/doc-ai.spec.ts","./__tests__/app-impress/utils-share.ts","./__tests__/app-impress/utils-sub-pages.ts","./__tests__/app-impress/doc-collaboration.spec.ts","./__tests__/app-impress/doc-comments.spec.ts","./__tests__/app-impress/doc-create.spec.ts","./__tests__/app-impress/doc-editor.spec.ts","../../node_modules/jszip/index.d.ts","../../node_modules/pdfjs-dist/types/src/shared/util.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/tools.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/toolbar.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/comment.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/editor.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/freetext.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/highlight.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/draw.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/drawers/outline.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/drawers/inkdraw.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/ink.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/signature.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/stamp.d.ts","../../node_modules/pdfjs-dist/types/src/display/display_utils.d.ts","../../node_modules/pdfjs-dist/types/web/text_accessibility.d.ts","../../node_modules/pdfjs-dist/types/src/display/optional_content_config.d.ts","../../node_modules/pdfjs-dist/types/src/display/annotation_storage.d.ts","../../node_modules/pdfjs-dist/types/src/display/metadata.d.ts","../../node_modules/pdfjs-dist/types/src/display/pdf_objects.d.ts","../../node_modules/pdfjs-dist/types/src/shared/message_handler.d.ts","../../node_modules/pdfjs-dist/types/src/display/api.d.ts","../../node_modules/pdfjs-dist/types/web/interfaces.d.ts","../../node_modules/pdfjs-dist/types/web/struct_tree_layer_builder.d.ts","../../node_modules/pdfjs-dist/types/web/comment_manager.d.ts","../../node_modules/pdfjs-dist/types/src/display/annotation_layer.d.ts","../../node_modules/pdfjs-dist/types/src/display/draw_layer.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/annotation_editor_layer.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/color_picker.d.ts","../../node_modules/pdfjs-dist/types/src/display/svg_factory.d.ts","../../node_modules/pdfjs-dist/types/src/display/worker_options.d.ts","../../node_modules/pdfjs-dist/types/src/display/api_utils.d.ts","../../node_modules/pdfjs-dist/types/src/display/editor/drawers/signaturedraw.d.ts","../../node_modules/pdfjs-dist/types/src/display/text_layer.d.ts","../../node_modules/pdfjs-dist/types/src/display/touch_manager.d.ts","../../node_modules/pdfjs-dist/types/src/display/xfa_layer.d.ts","../../node_modules/pdfjs-dist/types/src/pdf.d.ts","../../node_modules/pdfjs-dist/legacy/build/pdf.d.mts","../../node_modules/pdf-parse/dist/pdf-parse/esm/ImageResult.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/InfoResult.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/LoadParameters.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/ParseParameters.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/ScreenshotResult.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/TableResult.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/TextResult.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/PDFParse.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/Exception.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/Shape.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/Point.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/Line.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/Rectangle.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/TableData.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/Table.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/LineStore.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/geometry/index.d.ts","../../node_modules/pdf-parse/dist/pdf-parse/esm/index.d.ts","../../node_modules/pixelmatch/index.d.ts","../../node_modules/@types/pngjs/index.d.ts","./__tests__/app-impress/utils-export.ts","./__tests__/app-impress/doc-export.spec.ts","./__tests__/app-impress/doc-grid-move.spec.ts","./__tests__/app-impress/doc-grid.spec.ts","./__tests__/app-impress/doc-header.spec.ts","./__tests__/app-impress/doc-import.spec.ts","./__tests__/app-impress/doc-inherited-share.spec.ts","./__tests__/app-impress/doc-member-create.spec.ts","./__tests__/app-impress/doc-member-list.spec.ts","./__tests__/app-impress/doc-routing.spec.ts","./__tests__/app-impress/doc-search.spec.ts","./__tests__/app-impress/doc-table-content.spec.ts","./__tests__/app-impress/doc-trashbin.spec.ts","./__tests__/app-impress/doc-tree.spec.ts","./__tests__/app-impress/doc-version.spec.ts","./__tests__/app-impress/doc-visibility.spec.ts","./__tests__/app-impress/footer.spec.ts","./__tests__/app-impress/header.spec.ts","./__tests__/app-impress/help.spec.ts","./__tests__/app-impress/home.spec.ts","./__tests__/app-impress/language.spec.ts","./__tests__/app-impress/left-panel.spec.ts","./__tests__/app-impress/login.spec.ts","./__tests__/app-impress/presenter-mode.spec.ts","./type/convert-stream.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@eslint/core/dist/esm/types.d.ts","../../node_modules/@eslint/config-helpers/dist/esm/types.ts","../../node_modules/@eslint/config-helpers/dist/esm/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@eslint/core/dist/cjs/types.d.cts","../../node_modules/@eslint/plugin-kit/dist/cjs/types.cts","../../node_modules/@eslint/plugin-kit/dist/cjs/index.d.cts","../../node_modules/eslint/lib/types/index.d.ts","../../packages/eslint-plugin-docs/index.d.ts","./eslint.config.mjs"],"fileIdsList":[[192,247,264,265],[189,192,247,264,265],[189,192,247,264,265,305],[189,192,247,264,265,269,309,310],[189,192,247,264,265,309,310],[189,192,247,264,265,269,309,310,313,314],[189,192,247,264,265,309,310,313],[189,192,247,264,265,305,309,310,313],[189,192,247,264,265,269,309,310,313,314,401],[189,192,247,264,265,269,309,310,319,374,377,401],[189,192,247,264,265,309,310,313,314],[189,192,247,264,265,309,313],[189,192,247,259,264,265,269,309,310],[189,192,247,264,265,309,313,314],[189,192,247,264,265,305,309,310,313,314],[189,192,247,264,265,305,309,310,314],[189,192,247,264,265,309,314],[189,192,247,264,265,309],[189,192,247,264,265,305,309],[189,192,247,264,265,309,310,314],[189,192,247,259,264,265,269,307,308],[189,192,247,259,264,265,269,309,310,374,375,376],[192,247,264,265,405,411],[189,192,247,264,265,301],[192,247,264,265,403,404],[192,247,264,265,403],[192,247,264,265,402],[192,247,264,265,407,408],[192,247,264,265,407],[188,192,247,264,265],[192,244,245,247,264,265],[192,246,247,264,265],[247,264,265],[192,247,252,264,265,285],[192,247,248,253,258,264,265,267,282,293],[192,247,248,249,258,264,265,267],[192,247,250,264,265,294],[192,247,251,252,259,264,265,268],[192,247,252,264,265,282,290],[192,247,253,255,258,264,265,267],[192,246,247,254,264,265],[192,247,255,256,264,265],[192,247,257,258,264,265],[192,246,247,258,264,265],[192,247,258,259,260,264,265,282,293],[192,247,258,259,260,264,265,277,282,285],[192,239,247,255,258,261,264,265,267,282,293],[192,247,258,259,261,262,264,265,267,282,290,293],[192,247,261,263,264,265,282,290,293],[190,191,192,193,194,195,196,197,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299],[192,247,258,264,265],[192,247,264,265,266,293],[192,247,255,258,264,265,267,282],[192,247,264,265,268],[192,247,264,265,269],[192,246,247,264,265,270],[192,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299],[192,247,264,265,275],[192,247,264,265,276],[192,247,258,264,265,277,278],[192,247,264,265,277,279,294,296],[192,247,259,264,265],[192,247,258,264,265,282,283,285],[192,247,264,265,284,285],[192,247,264,265,282,283],[192,247,264,265,285],[192,247,264,265,286],[192,244,247,264,265,282,287,293],[192,247,258,264,265,288,289],[192,247,264,265,288,289],[192,247,252,264,265,267,282,290],[192,247,264,265,291],[192,247,264,265,267,292],[192,247,261,264,265,276,293],[192,247,252,264,265,294],[192,247,264,265,282,295],[192,247,264,265,266,296],[192,247,264,265,297],[192,247,252,264,265],[192,239,247,264,265],[192,247,264,265,298],[192,239,247,258,260,264,265,270,282,285,293,295,296,298],[192,247,264,265,282,299],[192,247,264,265,282,299,300],[192,247,264,265,293,300],[192,247,264,265,406,407,409],[192,247,264,265,300],[192,247,264,265,356],[192,247,264,265,337],[192,247,264,265,340],[192,247,264,265,357,358,359,360,361,362,363],[192,247,264,265,366,367],[192,247,264,265,368,369,370,371],[192,247,264,265,366],[192,247,264,265,366,367,368],[192,247,264,265,368,370],[192,247,264,265,367],[192,247,264,265,366,367,368,369,371,372],[192,247,264,265,356,357,358,359,360,361,362,363,364,365,373],[192,247,264,265,355],[192,247,264,265,333,334,336,340,341,342,343],[192,247,264,265,333,335,336,337,338,339],[192,247,264,265,321,324,325,326,330,331,332,333,334,341,344,345],[192,247,264,265,324],[192,247,264,265,328],[192,247,264,265,329],[192,247,264,265,321,322,323,346],[192,247,264,265,324,346],[192,247,264,265,327,329],[192,247,264,265,333,340],[192,247,264,265,333,336,341],[192,247,264,265,320,321,333,340,344,345,346,347,348,349,350,351,352,353,354],[192,247,264,265,320],[185,192,247,264,265],[90,91,171,184,192,247,248,259,264,265,282],[187,192,247,264,265],[186,192,247,264,265],[192,247,264,265,271,272],[192,205,208,211,212,247,264,265,293],[192,208,247,264,265,282,293],[192,208,212,247,264,265,293],[192,247,264,265,282],[192,202,247,264,265],[192,206,247,264,265],[192,204,205,208,247,264,265,293],[192,247,264,265,267,290],[192,202,247,264,265,300],[192,204,208,247,264,265,267,293],[192,199,200,201,203,207,247,258,264,265,282,293],[192,208,216,224,247,264,265],[192,200,206,247,264,265],[192,208,233,234,247,264,265],[192,200,203,208,247,264,265,285,293,300],[192,208,247,264,265],[192,204,208,247,264,265,293],[192,199,247,264,265],[192,202,203,204,206,207,208,209,210,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,234,235,236,237,238,247,264,265],[192,208,226,229,247,255,264,265],[192,208,216,217,218,247,264,265],[192,206,208,217,219,247,264,265],[192,207,247,264,265],[192,200,202,208,247,264,265],[192,208,212,217,219,247,264,265],[192,212,247,264,265],[192,206,208,211,247,264,265,293],[192,200,204,208,216,247,264,265],[192,208,226,247,264,265],[192,219,247,264,265],[192,202,208,233,247,264,265,285,298,300],[170,192,247,264,265],[172,173,184,192,247,264,265],[174,175,192,247,264,265],[172,173,174,176,177,182,192,247,264,265],[173,174,192,247,264,265],[182,192,247,264,265],[183,192,247,264,265],[174,192,247,264,265],[172,173,174,177,178,179,180,181,192,247,264,265],[161,192,247,264,265],[161,164,192,247,264,265],[96,156,159,161,162,163,164,165,166,167,168,169,192,247,264,265],[92,94,164,192,247,264,265],[161,162,192,247,264,265],[93,161,163,192,247,264,265],[94,96,98,99,100,101,192,247,264,265],[96,98,100,101,192,247,264,265],[96,98,100,192,247,264,265],[93,96,98,99,101,192,247,264,265],[92,94,95,96,97,98,99,100,101,102,103,156,157,158,159,160,192,247,264,265],[92,94,95,98,192,247,264,265],[94,95,98,192,247,264,265],[98,101,192,247,264,265],[92,93,95,96,97,99,100,101,192,247,264,265],[92,93,94,98,161,192,247,264,265],[98,99,100,101,192,247,264,265],[100,192,247,264,265],[104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,192,247,264,265],[192,247,264,265,410]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"681cf9768031b874fafdd81a20e8a20ca6c92a5cbf12e86532a69182e315b065","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"36eb5babc665b890786550d4a8cb20ef7105673a6d5551fbdd7012877bb26942","impliedFormat":1},{"version":"fec412ded391a7239ef58f455278154b62939370309c1fed322293d98c8796a6","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"93c3e73824ad57f98fd23b39335dbdae2db0bd98199b0dc0b9ccc60bf3c5134a","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"e5b810845dedef5aa0d682efa61be20dcb2e28c27a64ff5cc4cfc122f3f3980f","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"f02650de64b96593c1eb736f28a6a0a773c51662d8525b06cc735d77fa9c7af8","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"0904660ae854e6d41f6ff25356db1d654436c6305b0f0aa89d1532df0253486e","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"a016b2a26863dd6acb1f18c4ff37363c2b51e27ca7b3374dc6342aff1ddead2d","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"0e5974dfff7a97181c7c376545f126b20acf2f1341db7d3fccea4977bf3ce19c","impliedFormat":1},{"version":"c7f977ea78a1b060a30554c1c4ec0e2269c6e305a349ca2ada14931ac27ecc0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3806cdd6b48ba01a9198134e62a384ec217a98f316d4baef74dd46d62c947a63","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad7e61eca7f2f8bf47e72695f9f6663b75e41d87ef49abdb17c0cb843862f8aa","impliedFormat":1},{"version":"ecba2e44af95b0599c269a92628cec22e752868bce37396740deb51a5c547a26","impliedFormat":1},{"version":"46a9fb41a8f3bc7539eeebc15a6e04b9e55d7537a081615ad3614220d34c3e0f","impliedFormat":1},{"version":"b8bf3fe89ec8baa335f6370b9fa36308e1bc7a72e2eb2dad1e94f31e27fa28b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"35390d6fa94bdb432c5d0bcb6547bdd11406c2692a6b90b9e47be2105ea19bd6","impliedFormat":1},{"version":"3910dab597c40e173bf0e0d419d3ce9682c54ebf6ae84849f9b829b1451a17ec","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"486c074a5c0f2254345c0d1c9540380f5463999e42d7e1a159305ea823d3c4b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"8e7c3bed5f19ade8f911677ddc83052e2283e25b0a8654cd89db9079d4b323c7","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ccf3afaeebbeee4ca9092101e99fd6abd681116b6e5ec23e381bbb1e1f32262c","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"ab7818a9d57a9297b90e456fc68b77f84d74395a9210a3cfa9d87db33aff8b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb08062718a5470cd864c1fae0eb5b3a3adc5bcd05dcf87608d6f60b65eca3f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a815b7d1aebc0646b91548eab2fc19dada09ff255d04c71ced00bbd3058c8eb","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"836b36913830645ac3b28fe33731aac3fdb3524ee8adbb4cdab9a5c189f41943","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"85652d7bb13bd2141b3d0c68d07ac1a11e933dd32ca2bb4b1b83b8aa5f62251c","impliedFormat":1},"be0407982a2a74afaee605d03e031039e10745ed3788193124007f7218865016","38e491de7e00acd6d086c832d514b2197570819503af0a39ab9b71fc4c7ae22a","ec4774bae8ee62070f0a320451d424aca3f6efc178fbfc07fc120f4991626680","7ff60a40c12e729e419d7ecdc95b229676fe7a9cb4e7b5280a4444598b31354d","419392dd19bd5a6bfebe5c7e2f6a44952ad3e7f8b7eefb79449d589e8255ff40","7188bd91a6fc530c6709d9448019a1f3b2c82b6246616ba8e69cf74ec55b9fb8","a62d5dab2c07ea432fb8d4ee34e06bcc5a04cc0364bf974a03881899c47080ea","2fcc5e2b96d79cd181b9ca4522e8e6363e04966fe76b2ebe864f224fd3506e32","94b91a718cc86791b347f8fdd69578048f819596678f0627cdda3c1995202698","195e210db0fc4220e00c6d1af6b43dcb76c84327acefd5cc7d0802e79caa0d0c","4701e0a536034b493be94d3e2929b46cc4ab53ab90a7d06df9b0a6a17f112428","00080fecd5d674b1289d0949a03ff97a2a8122c27c379cccd8df2f0f1a26c2d0","63a85982924297661f88d7b2553d767bef98c103b3086e1033aaf50e54e9f0c2","1bcdfe96898aca2250c9a122fe74a821720c152a0e2d6e5c2e93f61a00a9d054","dc930a2a7b8e2e8a2e90256a683269508fa4e93ab4d7038d64c368452d6b8dab","34ae70f1ff59532fcd4e9ef4313ec77d8149d8d2bfc40f5a5fc379270c6ab142","7581286c1ed9afa463b058e8767319ded7634b56004e0f16c55013de6ff2274b",{"version":"522cb15ff9bef5a65c2f3dbd10dbba9e7ecae4de32f90f5c0b4198132be63ae4","impliedFormat":1},{"version":"2cc32cef1ae0e118f95d4bd7f0c2e8234401c53e483db1cdcdba8ef9459a378e","impliedFormat":1},{"version":"57e998fc9e7271711aa981892e2eefda24b79a0d60517bd193d8096fe605067b","impliedFormat":1},{"version":"60217ee6f9bdcfd23ef32ffeee3fc08951b3c4d1ffbcf9ad4955b662a67335c5","impliedFormat":1},{"version":"bc9e11b8e0cfd5abdd9c05ce17a42a6952a9f34a696bb51a05fff083dd9da000","impliedFormat":1},{"version":"6a242c69d6d07436856151059357739a2fba91ac954a7181e4e0027b7c603559","impliedFormat":1},{"version":"0c00a6db081a75e25a2ca207652e9e9e7b073ebb36a1e146d13fc198fb24de76","impliedFormat":1},{"version":"63fa9909c820305c84b4afa63017b3ba17eb5cd0f57633d2609a15e4bb7a7f72","impliedFormat":1},{"version":"54d979669cb741b26157c916692459ce998afa7969aef138296156bad2fe8272","impliedFormat":1},{"version":"32b789a883704fb6be047f8a8f600685933eeda17f1ca9898ec42af0951bc5b1","impliedFormat":1},{"version":"b0f25d7f2e82edf76b2c8a4423defa26747483d6e1e772ac8476d5b78f69fe4d","impliedFormat":1},{"version":"12ff67dcd2078121daf0dfec7f427c6bb39851bf0d6203200674d610e46b0069","impliedFormat":1},{"version":"d713078712400f84d8a7d4a2d1a1fd7eeb4879603ef87ee06580220ef12d1bc9","impliedFormat":1},{"version":"6fd12b67e326558a9a6a4ccbc40fc2e1f52d989adfec3657e7a49ca3e5c76dec","impliedFormat":1},{"version":"2e6a72672cf704485aadbc714b9f0dc3838dc925f1825bd65d7c60bf7bcc9a71","impliedFormat":1},{"version":"ebc2c560c659e98d96a491619b6d34834c4048189b1c3f148ae402670d03be9c","impliedFormat":1},{"version":"e82a51d5498c34f37bf96981223d5aa0b5051ced754d34b9747b1aa8a4f2174f","impliedFormat":1},{"version":"969d5abb573bcd263b2194b6eb4ab3d6d4e9a766ea995bdda680b2f1db79c07c","impliedFormat":1},{"version":"83e01ec16b5a8424ba35047471fe772e4fdeba7dfa7884d9ced04dd84c01a26c","impliedFormat":1},{"version":"2873f7d3fc801d897c9177e8bcc417d348e96c76490f55cd7237e87859af8f12","impliedFormat":1},{"version":"ede088b09b00760b9ce0997bc1669e25bd155241f369faacf09f3d810dc0ede3","impliedFormat":1},{"version":"f40a505310cfc1683e47db877484d1bbb7d2eafa5fca806dff499c5f86682a4f","impliedFormat":1},{"version":"8b2fe301f5a09a7d7e0362db4bee65edb64bfe73a714565784cf7ec80c66e69f","impliedFormat":1},{"version":"42a1a75a5b70388825e244af4ab7c268f052a021310385fe191e8ee12ed6d696","impliedFormat":1},{"version":"87dbcf55eaefffafe92e65ae0e1229d3ce578a76ffdad5f35fe69ebbe7203320","impliedFormat":1},{"version":"4d05c4b0471d8d97731c54dbe80541cde91c4e27fba189089cbce139bebdc884","impliedFormat":1},{"version":"ae30f8de1064dc9de7fb0e0b897b8435776422a12fe8064cfcb710ead17da508","impliedFormat":1},{"version":"6f2767614aba77fd6b0ca8c9b40d551640681c9fc8ef4bf486db9841f33aa36a","impliedFormat":1},{"version":"e43b4cdcc001801cad76c0d00b2e43c6233aeaa6b791ef1adc5c4e34b1874e70","impliedFormat":1},{"version":"22759dfadc7f47badde31230a0a34ba6810f88b29ff314fb5e0ffd5fe91ba379","impliedFormat":1},{"version":"adf4e3e90b25ce9064c485877e92e56a73119094530cfb3af5a5395a786aa42f","impliedFormat":1},{"version":"c81a187472459f2e3dd935a2eebd77cca096f5159c6b877c2eadfcebe946d795","impliedFormat":1},{"version":"2244d3a7dcb203968127e13d4d83d507fbe91529c434fc20426ae6c814e6e351","impliedFormat":1},{"version":"18e62091c64d5e780f4e652194630efe17d9f62de0af5a7f0bf1fb2b41236754","impliedFormat":1},{"version":"4764e86784bb88b8f3573279db3856c50a03e2b8bc184c06a40f897bff9d7e83","impliedFormat":1},{"version":"027a4481143e6e6e28440b7f79e34ec1fd7bb0ddfced3d701694a1940c19672e","impliedFormat":1},{"version":"8c748c9b4aa5a1e97d5d7e8d2ac6f22a2d1f43b4d5434b69b22bdfa1cb108ec1","impliedFormat":1},{"version":"dc11ac5030092409dd3183dbb24174beaf35739b9b5c90f268b3cf82b9453708","impliedFormat":99},{"version":"9be3f76dee2ab250c599d4da37cf666647b7a087b16d7236732fb8fe1eb83186","impliedFormat":99},{"version":"53a0a8b804bbcbfb9386d6dd1b6002bc4f6f2bb83c6e2e5930d6a740ffef851c","impliedFormat":99},{"version":"65a7b81a1c716122e6e2c992ba7a373f35d2eb0042b0410deb7c33595e21d7d5","impliedFormat":99},{"version":"369a2a17f4d4cbead57047d9d436bfa9e1f2367974fa918995ee64f4f2dd2cfc","impliedFormat":99},{"version":"288356452cc9594258a5090f7ff5cf14acd2dd37922f6df404d3c39b0524ff1e","impliedFormat":99},{"version":"d75c857606a057d0f93c84f7dda61e9093c3a51344740b8ef447a858706e4166","impliedFormat":99},{"version":"8b8299a10f33e46b8ccb4fabd79e07055abc8967ad392b9417773b4fa8972258","impliedFormat":99},{"version":"2274065b890147e47a8e9e7852d158dfed9ab595620bcb015f2b8650f62e58a1","impliedFormat":99},{"version":"8237fd00f121c7d77b507f26d9473b7ec2733cbee7f5712be3755ce62bf424f1","impliedFormat":99},{"version":"7c348160476621debe9dd7e29d2a937b74deaaad4a7adeb76be15d5d4ff5fc0f","impliedFormat":99},{"version":"273b6ae3de2d960eeb9876a8cf9e51d3a15da49766c1948402a18ea9ef116bd3","impliedFormat":99},{"version":"7322929350fdc57d8e9183fa6a37f2751bcc7a2238f220a8089b5c5e9aa043af","impliedFormat":99},{"version":"cc3103f7365eba37aada0d66f9be0153354b535d7479330cf598efbfcc1d3205","impliedFormat":99},{"version":"39adf431380a38beb62b2ffe9a7d569a7122d4d95917509d914ac1d03cc426ce","impliedFormat":99},{"version":"f4b6fe3f611d45962e4ba6995e2bcff511f9b3ade62f16e6644ec20a03bb3ea3","impliedFormat":99},{"version":"5c3b449aeced9e1aa790f996cd8f27f640fdd01897625fb95a8d0d53b220e1d9","impliedFormat":99},{"version":"97df6f53040698a3ce134103080dc557914c6f2d0656ed2c7255c9e213169a1f","impliedFormat":99},{"version":"5dc094621be6c0178661cf27f39743083d23669528fab5582c2aaa42e06987f9","impliedFormat":99},{"version":"427e58751647365dda9470fae5d5e426f3e3372e0fc292f7258fe2eafd0ccfa7","impliedFormat":99},{"version":"90ac19cb97ae85c7ccfd0c04322b02ce088bda9de7b42cc081cbb3674fe5446d","impliedFormat":1},"a1960c84fe4fffab27c72ff8330b7b5777058299db155aeaca454094cbcff1f0","ccd3862851143dcad9c1108b1086d7e834303be44f2eede0a3fc0ebbe9f28d44","c3a001dd769b471617f2e4935875967e6065475566322d6f70d6e37b50bf8e5f","619ab33cff8a6e7be9136e3da4a51fdb2ee568b741224c9dcf16427d31cb9707","a26c39f7e1c736b5ae2b1305727ab510228af507803ea57d898b6c6033c5591b","e9c59c9bad8297547fab124985e5a670440ecfaa8904a7b7a729a4f468772935","0cbc74a26c38d502a465647af9ffc49721f5e43f26e924cdfea0636cf7562b02","019eadd1e0413915979731f9f7c42fff836142ee022ce504db82abb00bcda239","61be481c52b8edc1de675ebdda959ba3c068dc7a35b82582042d321ba1984016","73aebd9d9952b93894655f3898edc36e0a5193d7a82f6fb9d310d57bdb889676","bf508fdbabfedb823d8c45d9ea2761c4f1084a35d1ca16b6b6da0769769dd025","7fd5199b46eb3b0df591352889386560529faec1db79880c518fafd1aa38127f","7cbe33708f145d903d4afdd2e6752e94efada97c3c7c9bbdb2c61b8b96a9e842","87dca1775ef418f281e8e99027a5bc4062d33a77eb64f1af01529d6ef9b13af1","72ccbb14ec1f68723c73dcafce7ba89fd93a0cec095c0fbdd7f76684d09088fb","46960df82619981aab731dbb5cf873ae9ff26538f4803dc7b2adde2f17f57042","b9061f312946e89e0ae32464cb0a54ba75a3a79102f891c78569dc6f22ed5cf4","d342256473d813440076fd8969ddf515a5225d9bfdf2c3054da62688e0c5561d","ca2c65217f6267736878f5a4a130e1d64ec140ac00b32773d90e8f2f88df963c","16c021688f64f1c1bdbd4794733d84ba8b0bbc73ebdab4fa8db6541ff9db060d","b6167aea9459802df09e1a44ad4d2049631ce8d0ab5326badc42de6a88a92a76","e7ad109d8eb992d8b3a698852fc51c0379d0cf05ac573504752bb077999d4c81","07c811d423dd11f7833e138804685ddefad9b5673c20f04adf92eca2d08c53a0","36f0345cee8cd4c9df0a067900c66c9d9a450ce271b76b8a7eed2dcacc2c5f22","1b01c921ad68eb01552e0ae65ef56824fc97d355c4cbc3d2aaa1f9f14c79b3bd",{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"3671af8f58c05e9c83409ae56cb2a3db3c2e0a4cd082e685933d72f1c1a621ae","impliedFormat":99},{"version":"ded607207bf06c710374236e35694d6149a2f709ebb7a8d0e82c7bbc9d76d622","impliedFormat":99},{"version":"8ffb6ccf8176d108abddd858ea8250aad7e1b1031f050b010ae3ecad3cd725e5","impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"3671af8f58c05e9c83409ae56cb2a3db3c2e0a4cd082e685933d72f1c1a621ae","impliedFormat":1},{"version":"0f6d2591c6dbab10e42a87df2e9cfdf1673cb4001a03f32c75ad1a327329080a","impliedFormat":1},{"version":"37ecd7aa9e464b72ca1286207dc7567bff2214cd73e9da6bf9b5d3274707e210","impliedFormat":1},{"version":"ba3cb8eac8836e194aab59cc7bc6a622d2a0d4bd4041b97550d0d1a21e45fd41","impliedFormat":1},"4687e709f57aac34d763476395b642c9da2dbb6ad31c50198b8fa60a827f4d4e",{"version":"17d0fb182ae466f0f6b8220e8c300816440c68f2e6df56366f6b68c733031fb2","impliedFormat":99}],"root":[[302,306],[309,318],[377,401],412],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[307,1],[304,2],[306,3],[311,4],[312,5],[315,6],[316,7],[317,8],[318,9],[378,10],[379,11],[380,12],[381,11],[382,13],[383,14],[384,15],[385,12],[386,16],[387,17],[388,5],[389,14],[390,14],[391,5],[392,15],[393,18],[394,19],[395,18],[396,18],[397,5],[398,20],[399,18],[400,5],[309,21],[310,2],[377,22],[313,19],[305,2],[314,18],[303,2],[412,23],[308,1],[302,24],[401,1],[405,25],[404,26],[407,27],[403,27],[409,28],[408,29],[189,30],[406,1],[402,1],[244,31],[245,31],[246,32],[192,33],[247,34],[248,35],[249,36],[190,1],[250,37],[251,38],[252,39],[253,40],[254,41],[255,42],[256,42],[257,43],[258,44],[259,45],[260,46],[193,1],[191,1],[261,47],[262,48],[263,49],[300,50],[264,51],[265,1],[266,52],[267,53],[268,54],[269,55],[270,56],[274,57],[275,58],[276,59],[277,60],[278,60],[279,61],[280,1],[281,62],[282,63],[284,64],[283,65],[285,66],[286,67],[287,68],[288,69],[289,70],[290,71],[291,72],[292,73],[293,74],[294,75],[295,76],[296,77],[297,78],[194,1],[195,79],[196,1],[197,1],[240,80],[241,81],[242,1],[243,66],[298,82],[299,83],[376,84],[198,1],[301,85],[410,86],[319,87],[365,1],[357,88],[358,89],[359,90],[364,91],[360,1],[361,1],[362,1],[363,1],[368,92],[372,93],[367,94],[369,95],[366,1],[371,96],[370,97],[373,98],[374,99],[356,100],[344,101],[336,1],[340,102],[350,1],[333,1],[345,1],[346,103],[347,1],[323,1],[327,104],[329,105],[328,1],[351,106],[324,107],[325,108],[326,104],[330,109],[331,109],[332,104],[322,1],[321,108],[337,1],[335,1],[338,1],[348,1],[352,110],[353,1],[349,1],[354,111],[355,112],[339,113],[320,1],[343,1],[341,110],[342,90],[334,1],[375,1],[186,114],[90,1],[91,114],[185,115],[188,116],[187,117],[271,1],[272,1],[273,118],[88,1],[89,1],[14,1],[15,1],[17,1],[16,1],[2,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[24,1],[25,1],[3,1],[26,1],[27,1],[4,1],[28,1],[32,1],[29,1],[30,1],[31,1],[33,1],[34,1],[35,1],[5,1],[36,1],[37,1],[38,1],[39,1],[6,1],[43,1],[40,1],[41,1],[42,1],[44,1],[7,1],[45,1],[50,1],[51,1],[46,1],[47,1],[48,1],[49,1],[8,1],[55,1],[52,1],[53,1],[54,1],[56,1],[9,1],[57,1],[58,1],[59,1],[61,1],[60,1],[62,1],[63,1],[10,1],[64,1],[65,1],[66,1],[11,1],[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[12,1],[73,1],[74,1],[75,1],[76,1],[77,1],[1,1],[78,1],[79,1],[13,1],[80,1],[81,1],[82,1],[83,1],[84,1],[85,1],[86,1],[87,1],[216,119],[228,120],[214,121],[229,122],[238,123],[205,124],[206,125],[204,126],[237,87],[232,127],[236,128],[208,129],[225,130],[207,131],[235,132],[202,133],[203,127],[209,134],[210,1],[215,135],[213,134],[200,136],[239,137],[230,138],[219,139],[218,134],[220,140],[223,141],[217,142],[221,143],[233,87],[211,144],[212,145],[224,146],[201,122],[227,147],[226,134],[222,148],[231,1],[199,1],[234,149],[171,150],[174,151],[176,152],[183,153],[178,1],[179,1],[177,154],[180,155],[172,1],[173,1],[184,156],[175,157],[181,1],[182,158],[165,159],[169,160],[166,160],[162,159],[170,161],[167,162],[168,160],[163,163],[164,164],[158,165],[99,166],[101,167],[157,1],[100,168],[161,169],[160,170],[159,171],[92,1],[102,166],[103,1],[94,172],[98,173],[93,1],[95,174],[96,175],[97,1],[104,176],[105,176],[106,176],[107,176],[108,176],[109,176],[110,176],[111,176],[112,176],[113,176],[114,176],[115,176],[116,176],[117,176],[119,176],[118,176],[120,176],[121,176],[122,176],[123,176],[124,176],[156,177],[125,176],[126,176],[127,176],[128,176],[129,176],[130,176],[131,176],[132,176],[133,176],[134,176],[135,176],[136,176],[137,176],[139,176],[138,176],[140,176],[141,176],[142,176],[143,176],[144,176],[145,176],[146,176],[147,176],[148,176],[149,176],[150,176],[151,176],[152,176],[155,176],[153,176],[154,176],[411,178]],"affectedFilesPendingEmit":[304,306,311,312,315,316,317,318,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,309,310,377,313,305,314,303,412,302],"version":"6.0.3"} \ No newline at end of file diff --git a/src/frontend/apps/impress/package.json b/src/frontend/apps/impress/package.json index 58eab3bea..277d362f9 100644 --- a/src/frontend/apps/impress/package.json +++ b/src/frontend/apps/impress/package.json @@ -43,7 +43,6 @@ "@gouvfr-lasuite/cunningham-react": "4.3.0", "@gouvfr-lasuite/integration": "1.0.3", "@gouvfr-lasuite/ui-kit": "0.23.2", - "@hocuspocus/provider": "3.4.4", "@mantine/core": "9.2.1", "@mantine/hooks": "9.2.1", "@react-aria/live-announcer": "3.5.0", @@ -78,6 +77,7 @@ "use-debounce": "10.1.1", "uuid": "14.0.0", "y-protocols": "1.0.7", + "y-websocket": "3.0.0", "yjs": "*", "zod": "4.4.3", "zustand": "5.0.13" diff --git a/src/frontend/apps/impress/src/core/config/hooks/useCollaborationUrl.tsx b/src/frontend/apps/impress/src/core/config/hooks/useCollaborationUrl.tsx index b06683729..273fc80d8 100644 --- a/src/frontend/apps/impress/src/core/config/hooks/useCollaborationUrl.tsx +++ b/src/frontend/apps/impress/src/core/config/hooks/useCollaborationUrl.tsx @@ -13,5 +13,10 @@ export const useCollaborationUrl = (room?: string) => { ? `wss://${window.location.host}/collaboration/ws/` : ''); - return `${base}?room=${room}`; + /** + * The y-websocket provider builds `${serverUrl}/${room}` itself; stripping + * the trailing slash keeps existing COLLABORATION_WS_URL values (which end + * with `/`) working unchanged. + */ + return base.replace(/\/+$/, ''); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-comments/hooks/useComments.ts b/src/frontend/apps/impress/src/features/docs/doc-comments/hooks/useComments.ts index ff2a4ac9e..c6dafc1b1 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-comments/hooks/useComments.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-comments/hooks/useComments.ts @@ -27,15 +27,9 @@ export function useComments( encodeURIComponent(user?.full_name || ''), canComment, ), - provider?.document, + provider?.doc, ); - }, [ - docId, - canComment, - provider?.awareness, - provider?.document, - user?.full_name, - ]); + }, [docId, canComment, provider?.awareness, provider?.doc, user?.full_name]); useEffect(() => { if (canComment) { diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/__tests__/DocEditor.spec.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/__tests__/DocEditor.spec.tsx index 3dbbb33fb..e27870b94 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/__tests__/DocEditor.spec.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/__tests__/DocEditor.spec.tsx @@ -28,8 +28,8 @@ vi.mock('../../doc-management', async () => { useIsCollaborativeEditable: () => ({ isEditable: true, isLoading: false }), useProviderStore: () => ({ provider: { - configuration: { name: 'test-doc-id' }, - document: { + roomname: 'test-doc-id', + doc: { getXmlFragment: () => null, }, }, diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx index be47df3d6..f6a116bb2 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteEditor.tsx @@ -17,11 +17,10 @@ import { ThreadsSidebar, useCreateBlockNote, } from '@blocknote/react'; -import { HocuspocusProvider } from '@hocuspocus/provider'; import { useEffect, useMemo, useRef } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; -import type { Awareness } from 'y-protocols/awareness'; +import { WebsocketProvider } from 'y-websocket'; import * as Y from 'yjs'; import { Box, TextErrors } from '@/components'; @@ -85,7 +84,7 @@ export const blockNoteSchema = (withMultiColumn?.(baseBlockNoteSchema) || interface BlockNoteEditorProps { doc: Doc; - provider: HocuspocusProvider; + provider: WebsocketProvider; } export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => { @@ -93,7 +92,7 @@ export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => { const { setEditor } = useEditorStore(); const { themeTokens } = useCunninghamTheme(); const refEditorContainer = useRef(null); - useSaveDoc(doc.id, provider.document); + useSaveDoc(doc.id, provider.doc); const { i18n, t } = useTranslation(); const langLocalesBN = @@ -150,8 +149,8 @@ export const BlockNoteEditor = ({ doc, provider }: BlockNoteEditorProps) => { const editor: DocsBlockNoteEditor = useCreateBlockNote( { collaboration: { - provider: provider as { awareness?: Awareness | undefined }, - fragment: provider.document.getXmlFragment('document-store'), + provider: provider, + fragment: provider.doc.getXmlFragment('document-store'), user: { name: cursorName, color: randomColor(), diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx index 96626f5c3..f24db166b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx @@ -142,16 +142,10 @@ interface DocCoreEditorProps { export const DocCoreEditor = ({ doc, readOnly }: DocCoreEditorProps) => { const { provider, isReady } = useProviderStore(); const isProviderReady = isReady && provider; - const showContent = !!( - isProviderReady && provider?.configuration.name === doc.id - ); + const showContent = !!(isProviderReady && provider?.roomname === doc.id); const { skeletonVisible, isFadingOut } = useSkeletonFadeOut(showContent); - if ( - skeletonVisible || - !isProviderReady || - provider?.configuration.name !== doc.id - ) { + if (skeletonVisible || !isProviderReady || provider?.roomname !== doc.id) { return ( { if (readOnly) { return ( ); diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useCollaboration.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useCollaboration.tsx index e32c41515..0d7b8c33b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useCollaboration.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useCollaboration.tsx @@ -71,7 +71,7 @@ export const useCollaboration = (room: string) => { * when the document visibility changes. */ useEffect(() => { - if (!room || broadcastProvider?.document?.guid !== room) { + if (!room || broadcastProvider?.doc?.guid !== room) { return; } @@ -80,7 +80,7 @@ export const useCollaboration = (room: string) => { queryKey: [KEY_DOC, { id: room }], }); }); - }, [addTask, room, queryClient, broadcastProvider?.document?.guid]); + }, [addTask, room, queryClient, broadcastProvider?.doc?.guid]); /** * Set the provider when the collaboration URL and the document content are available. diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx index b6ceb0230..5bff001eb 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/hook/useSaveDoc.tsx @@ -52,7 +52,7 @@ export const useSaveDoc = (docId: string, yDoc: Y.Doc) => { * so we check if the origin constructor to know where * the transaction comes from. * "PluginKey" constructor comes from the current user, but transaction.local is more reliable - * "HocuspocusProvider" constructor comes from other users from the collaboration server, + * "WebsocketProvider" constructor comes from other users from the collaboration server, * it seems quite reliable too. * The AI constructor name seems to not be reliable enough, but by deduction if it's not local * and not from other users, it has to be from the AI. @@ -61,7 +61,7 @@ export const useSaveDoc = (docId: string, yDoc: Y.Doc) => { */ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const transactionOrigin = transaction?.origin?.constructor?.name; - const PROVIDER_ORIGIN_CONSTRUCTOR = 'HocuspocusProvider'; + const PROVIDER_ORIGIN_CONSTRUCTOR = 'WebsocketProvider'; const isAIChange = !transaction.local && transactionOrigin !== PROVIDER_ORIGIN_CONSTRUCTOR; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/useDuplicateDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDuplicateDoc.tsx index 96ff43943..10f616546 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/api/useDuplicateDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDuplicateDoc.tsx @@ -70,14 +70,12 @@ export function useDuplicateDoc(options?: DuplicateDocOptions) { mutationFn: async (variables) => { // Save the document if we can first, to ensure the latest state is duplicated const canSave = - variables.canSave && - provider && - provider.document.guid === variables.docId; + variables.canSave && provider && provider.doc.guid === variables.docId; if (canSave) { await updateDocContent({ id: variables.docId, - content: toBase64(Y.encodeStateAsUpdate(provider.document)), + content: toBase64(Y.encodeStateAsUpdate(provider.doc)), }); } diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx index 5411cee6f..b9f87f897 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx @@ -1,5 +1,4 @@ -import { CloseEvent } from '@hocuspocus/common'; -import { HocuspocusProvider, WebSocketStatus } from '@hocuspocus/provider'; +import { WebsocketProvider } from 'y-websocket'; import * as Y from 'yjs'; import { create } from 'zustand'; @@ -7,15 +6,15 @@ import { Base64 } from '@/docs/doc-management'; export interface UseCollaborationStore { createProvider: ( - providerUrl: string, + serverUrl: string, storeId: string, initialDoc?: Base64, - ) => HocuspocusProvider; + ) => WebsocketProvider; destroyProvider: () => void; setReady: (value: boolean) => void; pauseForInactivity: () => void; resumeFromInactivity: () => void; - provider: HocuspocusProvider | undefined; + provider: WebsocketProvider | undefined; isConnected: boolean; isReady: boolean; isSynced: boolean; @@ -33,7 +32,29 @@ const defaultValues = { isPausedForInactivity: false, }; -type ExtendedCloseEvent = CloseEvent & { wasClean: boolean }; +/** + * Close code sent by the collaboration server when Django resets the + * connections of a room (permission change). The provider auto-reconnects + * and re-authenticates against the gateway with its updated rights. + */ +const KICK_CLOSE_CODE = 4000; + +/** + * The gateway rejects unauthorized or WS-blocked connections at the HTTP + * level, before the WebSocket handshake. After this many consecutive failed + * attempts we mark the editor as ready so the user can work without + * collaboration (direct Django save fallback) — but the provider keeps + * retrying in the background (backoff capped at MAX_BACKOFF_TIME_MS), so a + * transient outage such as a server deploy recovers automatically. + */ +const READY_WITHOUT_COLLAB_FAILURES = 3; + +/** + * Cap on y-websocket's exponential reconnect backoff. The default (2.5s) + * would hammer a WS-blocked network forever; 30s keeps retries cheap while + * still recovering from outages without a page reload. + */ +const MAX_BACKOFF_TIME_MS = 30000; /** * When a massive simultaneous disconnection occurs (e.g. infra restart), all @@ -41,15 +62,13 @@ type ExtendedCloseEvent = CloseEvent & { wasClean: boolean }; * time, causing a possible DB spike. Adding random jitter spreads these events over a * time window so the load is absorbed gradually. */ -const RECONNECT_BASE_DELAY_MS = 1000; const RECONNECT_JITTER_MAX_MS = 3000; -let reconnectTimeout: ReturnType | undefined; let lostConnectionTimeout: ReturnType | undefined; export const useProviderStore = create((set, get) => ({ ...defaultValues, - createProvider: (wsUrl, storeId, initialDoc) => { + createProvider: (serverUrl, storeId, initialDoc) => { const doc = new Y.Doc({ guid: storeId, }); @@ -58,102 +77,79 @@ export const useProviderStore = create((set, get) => ({ Y.applyUpdate(doc, Buffer.from(initialDoc, 'base64')); } - const provider = new HocuspocusProvider({ - url: wsUrl, - name: storeId, - document: doc, - onDisconnect(data) { - // Skip reconnect when the disconnect was triggered by inactivity: - // reconnection only happens once the user becomes active again. - if (get().isPausedForInactivity) { - return; - } + const provider = new WebsocketProvider(serverUrl, storeId, doc, { + // Cross-tab sync is handled by useBroadcastStore through the shared + // Y.Doc tasks; the provider reconnection logic is enough here. + disableBc: true, + maxBackoffTime: MAX_BACKOFF_TIME_MS, + }); - // Attempt to reconnect if the disconnection was clean (initiated by the client or server) - if ((data.event as ExtendedCloseEvent).wasClean) { - if (data.event.reason === 'No cookies' && data.event.code === 4001) { - console.error( - 'Disconnection due to missing cookies. Not attempting to reconnect.', - ); - void provider.disconnect(); - set({ - isReady: true, - isConnected: false, - }); - return; - } + let consecutiveFailures = 0; - clearTimeout(reconnectTimeout); + provider.on('status', ({ status }) => { + const isConnected = status === 'connected'; + const wasConnected = get().isConnected; - // Jitter spreading for reconnection attempts - // Math.random() generates a random delay to avoid all clients - // reconnecting at the same time - reconnectTimeout = setTimeout( - () => void provider.connect(), - RECONNECT_BASE_DELAY_MS + Math.random() * RECONNECT_JITTER_MAX_MS, - ); - } - }, - onAuthenticationFailed() { - set({ isReady: true, isConnected: false }); - }, - onAuthenticated() { - set({ isReady: true, isConnected: true }); - }, - onStatus: ({ status }) => { - const isConnected = status === WebSocketStatus.Connected; - const wasConnected = get().isConnected; + if (isConnected) { + // Connected implies authenticated: the gateway authenticates against + // the backend before accepting the WebSocket handshake. + consecutiveFailures = 0; + clearTimeout(lostConnectionTimeout); + set({ isConnected: true, isReady: true }); + return; + } - if (isConnected) { - clearTimeout(lostConnectionTimeout); - } - // If we were previously connected and now we're not, - // we might have lost the connection - else if (wasConnected && !get().isPausedForInactivity) { - clearTimeout(lostConnectionTimeout); - // Jitter spreading for reconnection attempts - // Math.random() generates a random delay to avoid all clients - // reconnecting at the same time - lostConnectionTimeout = setTimeout( - () => set({ hasLostConnection: true }), - Math.random() * RECONNECT_JITTER_MAX_MS, - ); - } + // If we were previously connected and now we're not, + // we might have lost the connection + if ( + status === 'disconnected' && + wasConnected && + !get().isPausedForInactivity + ) { + clearTimeout(lostConnectionTimeout); + // Math.random() generates a random delay to avoid all clients + // refetching at the same time + lostConnectionTimeout = setTimeout( + () => set({ hasLostConnection: true }), + Math.random() * RECONNECT_JITTER_MAX_MS, + ); + } - set((state) => { - /** - * status === WebSocketStatus.Connected does not mean we are totally connected - * because authentication can still be in progress and failed - * So we only update isConnected when we lose the connection - */ - const connected = - status !== WebSocketStatus.Connected - ? { - isConnected: false, - } - : undefined; + set((state) => ({ + isConnected: false, + isReady: state.isReady || status === 'disconnected', + })); + }); - return { - ...connected, - isReady: state.isReady || status === WebSocketStatus.Disconnected, - }; + provider.on('sync', (isSynced: boolean) => { + set({ isSynced, isReady: true }); + }); + + provider.on('connection-close', (event) => { + if (event?.code === KICK_CLOSE_CODE) { + // Server-side reset: the automatic reconnection re-authenticates + // with up-to-date permissions. Not a failure. + consecutiveFailures = 0; + } + }); + + provider.on('connection-error', () => { + if (get().isPausedForInactivity) { + return; + } + consecutiveFailures += 1; + if (consecutiveFailures === READY_WITHOUT_COLLAB_FAILURES) { + // Unblock the editor (Django save fallback); reconnection attempts + // keep running in the background and re-enable collaboration when + // the server becomes reachable again. + console.warn( + 'Collaboration server unreachable; editing without realtime sync.', + ); + set({ + isReady: true, + isConnected: false, }); - }, - onSynced: ({ state }) => { - set({ isSynced: state, isReady: true }); - }, - onClose(data) { - /** - * Handle the "Reset Connection" event from the server - * This is triggered when the server wants to reset the connection - * for clients in the room. - * A disconnect is made automatically but it takes time to be triggered, - * so we force the disconnection here. - */ - if (data.event.code === 1000) { - provider.disconnect(); - } - }, + } }); set({ @@ -163,7 +159,6 @@ export const useProviderStore = create((set, get) => ({ return provider; }, destroyProvider: () => { - clearTimeout(reconnectTimeout); clearTimeout(lostConnectionTimeout); const provider = get().provider; if (provider) { @@ -177,7 +172,6 @@ export const useProviderStore = create((set, get) => ({ if (get().isPausedForInactivity) { return; } - clearTimeout(reconnectTimeout); clearTimeout(lostConnectionTimeout); set({ isPausedForInactivity: true, hasLostConnection: false }); get().provider?.disconnect(); @@ -188,7 +182,7 @@ export const useProviderStore = create((set, get) => ({ } clearTimeout(lostConnectionTimeout); set({ isPausedForInactivity: false }); - void get().provider?.connect(); + get().provider?.connect(); }, resetLostConnection: () => set({ hasLostConnection: false }), })); diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalConfirmationVersion.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalConfirmationVersion.tsx index 851c541eb..73b2fb974 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalConfirmationVersion.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalConfirmationVersion.tsx @@ -58,11 +58,7 @@ export const ModalConfirmationVersion = ({ return; } - revertUpdate( - provider.document, - provider.document, - base64ToYDoc(version.content), - ); + revertUpdate(provider.doc, provider.doc, base64ToYDoc(version.content)); threadStore?.refreshThreads(); diff --git a/src/frontend/apps/impress/src/features/right-panel/components/RightPanel.tsx b/src/frontend/apps/impress/src/features/right-panel/components/RightPanel.tsx index 0afe2c7e0..4b77ca8aa 100644 --- a/src/frontend/apps/impress/src/features/right-panel/components/RightPanel.tsx +++ b/src/frontend/apps/impress/src/features/right-panel/components/RightPanel.tsx @@ -20,8 +20,7 @@ export const RightPanel = () => { const { setIsPanelOpen, isPanelOpen, activePanel } = useRightPanelStore(); const { isMobile } = useResponsiveStore(); const { provider, isReady } = useProviderStore(); - const isProviderReady = - isReady && provider && provider?.configuration.name === doc?.id; + const isProviderReady = isReady && provider && provider?.roomname === doc?.id; const { restoreFocus } = useFocusStore(); /** diff --git a/src/frontend/apps/impress/src/stores/useBroadcastStore.tsx b/src/frontend/apps/impress/src/stores/useBroadcastStore.tsx index 3876dcd02..69a8fca23 100644 --- a/src/frontend/apps/impress/src/stores/useBroadcastStore.tsx +++ b/src/frontend/apps/impress/src/stores/useBroadcastStore.tsx @@ -1,4 +1,4 @@ -import { HocuspocusProvider } from '@hocuspocus/provider'; +import { WebsocketProvider } from 'y-websocket'; import * as Y from 'yjs'; import { create } from 'zustand'; @@ -6,10 +6,10 @@ interface BroadcastState { addTask: (taskLabel: string, action: () => void) => void; broadcast: (taskLabel: string) => void; cleanupBroadcast: () => void; - getBroadcastProvider: () => HocuspocusProvider | undefined; + getBroadcastProvider: () => WebsocketProvider | undefined; handleProviderSync: () => void; - provider?: HocuspocusProvider; - setBroadcastProvider: (provider: HocuspocusProvider) => void; + provider?: WebsocketProvider; + setBroadcastProvider: (provider: WebsocketProvider) => void; setTask: ( taskLabel: string, task: Y.Array, @@ -34,10 +34,10 @@ export const useBroadcastStore = create((set, get) => ({ // Clean up old provider listeners const oldProvider = get().provider; if (oldProvider) { - oldProvider.off('synced', get().handleProviderSync); + oldProvider.off('sync', get().handleProviderSync); } - provider.on('synced', get().handleProviderSync); + provider.on('sync', get().handleProviderSync); set({ provider }); }, handleProviderSync: () => { @@ -61,7 +61,7 @@ export const useBroadcastStore = create((set, get) => ({ return; } - const task = provider.document.getArray(taskLabel); + const task = provider.doc.getArray(taskLabel); get().setTask(taskLabel, task, action); }, setTask: (taskLabel: string, task: Y.Array, action: () => void) => { @@ -102,7 +102,7 @@ export const useBroadcastStore = create((set, get) => ({ cleanupBroadcast: () => { const provider = get().provider; if (provider) { - provider.off('synced', get().handleProviderSync); + provider.off('sync', get().handleProviderSync); } // Unobserve all document-specific tasks diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index ba8f1d54c..57bd7a859 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -30144,6 +30144,96 @@ "dependencies": { "@y/hub": "^0.2.22" } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/src/frontend/package.json b/src/frontend/package.json index 2b4366443..f4e351189 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -17,19 +17,21 @@ "APP_E2E": "yarn workspace app-e2e", "I18N": "yarn workspace packages-i18n", "COLLABORATION_SERVER": "yarn workspace server-y-provider", + "YHUB_SERVER": "yarn workspace server-yhub", "app:dev": "yarn APP_IMPRESS run dev", "app:start": "yarn APP_IMPRESS run start", "app:build": "yarn APP_IMPRESS run build", "app:test": "yarn APP_IMPRESS run test", "ci:build": "yarn APP_IMPRESS run build:ci", - "build": "yarn APP_IMPRESS run build && yarn COLLABORATION_SERVER run build", + "build": "yarn APP_IMPRESS run build && yarn COLLABORATION_SERVER run build && yarn YHUB_SERVER run build", "e2e:test": "yarn APP_E2E run test", - "lint": "yarn APP_IMPRESS run lint && yarn APP_E2E run lint && yarn workspace eslint-plugin-docs run lint && yarn I18N run lint && yarn COLLABORATION_SERVER run lint", + "lint": "yarn APP_IMPRESS run lint && yarn APP_E2E run lint && yarn workspace eslint-plugin-docs run lint && yarn I18N run lint && yarn COLLABORATION_SERVER run lint && yarn YHUB_SERVER run lint", "i18n:extract": "yarn I18N run extract-translation", "i18n:deploy": "yarn I18N run format-deploy && yarn APP_IMPRESS prettier", "i18n:test": "yarn I18N run test", - "test": "yarn server:test && yarn app:test", - "server:test": "yarn COLLABORATION_SERVER run test" + "test": "yarn server:test && yarn yhub:test && yarn app:test", + "server:test": "yarn COLLABORATION_SERVER run test", + "yhub:test": "yarn YHUB_SERVER run test" }, "resolutions": { "@tiptap/extensions": "3.23.6", diff --git a/src/frontend/servers/YHUB_MIGRATION_PLAN.md b/src/frontend/servers/YHUB_MIGRATION_PLAN.md index e2547bd1b..3b86d8c66 100644 --- a/src/frontend/servers/YHUB_MIGRATION_PLAN.md +++ b/src/frontend/servers/YHUB_MIGRATION_PLAN.md @@ -1,10 +1,24 @@ # Collaboration server migration: y-provider (Hocuspocus) → yhub (@y/hub) -> Status: **proposed plan** — analysis date 2026-06-10, against `@y/hub@0.2.22`. +> Status: **implemented (Phase 1)** — plan written and executed 2026-06-10, against +> `@y/hub@0.2.22`. > Scope: a brand-new collaboration server in `src/frontend/servers/yhub`, replacing the > realtime part of `src/frontend/servers/y-provider`. The conversion endpoint > (`POST /api/convert/`) is **out of scope**: it stays in y-provider and will be moved to a > dedicated application later. +> +> Implementation status: +> - Step 0 spike **passed 13/13** (yjs-13 ↔ @y/y-14-rc round-trip incl. incremental +> merges/gc/state-vectors/PG path; purge primitive; HTTP-level auth rejection). +> - Server implemented in `servers/yhub` (44 unit + 2 integration tests, lint/build clean). +> - Frontend swapped to `y-websocket` (tsc/eslint clean, 250 impress tests pass). +> - Infra done: Dockerfile (node:22-trixie-slim, `yarn cache clean` in install layers), +> compose (`yhub-development` on :4444, redis:7, y-provider keeps the converter role), +> e2e compose (`yhub` + `y-provider-converter`), Makefile targets, nginx prod +> dual-location template, docker-hub/ghcr publish jobs, `uws` lockfile entry switched +> to git+https (CI-friendly). +> - Remaining: full-stack Playwright e2e run; production rollout per §3.12; Phase 2 +> (server-side write-back) is unstarted by design. Hard constraints driving every decision below: @@ -213,7 +227,7 @@ same auth plugin. | **Durable room state** (Redis+PG) vs Hocuspocus amnesia | Stale cache can resurrect content after an out-of-band Django change (restore/import). Needs an invalidation strategy (§3.5) | | Merge-only persistence — no rewind primitive | "Django wins" requires actual row deletion + stream trim, not `unsafePersistDoc` | | ESM-only; package `exports` allow only `.` and `./plugins/s3` | New server must be ESM; no reaching into internals like `protocol.js` | -| `uws` glibc-only | Docker base `node:22-slim`, **not** alpine | +| `uws` glibc-only | Docker base `node:22-trixie-slim` (glibc ≥ 2.38), **not** alpine or Debian ≤ 12 | | Redis ≥ 6.2 required (`XAUTOCLAIM` for worker task claiming) | Dev compose runs `redis:5` — must upgrade | | `@y/y@14-rc` server-side vs `yjs` 13 in the browser | Wire compatibility is the design intent ("y-websocket compatible") but must be **proven by a spike before anything else** (§3.10 step 0) | | Beta (0.2.x), CORS hardcoded `*` on its REST API | Pin the exact version; keep the uws server internal-only | @@ -366,7 +380,7 @@ same `_FILE` secret pattern, same logger style). package.json "type": "module"; deps: @y/hub 0.2.22 (PINNED), express 5.2.1, ws ^8, axios 1.16.1, redis ^5, cors 2.8.6, @sentry/node; devDeps += y-websocket + yjs + y-protocols (test clients) -Dockerfile node:22-slim (uws is glibc-only — NEVER alpine), y-provider stages +Dockerfile node:22-trixie-slim (uws needs glibc ≥ 2.38 — never alpine), y-provider stages src/ env.ts config (§3.7) routes.ts route constants @@ -444,7 +458,7 @@ New: healthy; side-by-side on host port `4453`, swapped to `4444` at switchover). Dev reuses the `postgresql:16` impress DB (`yhub_ydoc_v1` is namespaced); production guidance: dedicated database/instance so cache churn doesn't share Django's DB. -- **Dockerfile**: mirror y-provider's stages on `node:22-slim`, with a loud comment that +- **Dockerfile**: mirror y-provider's stages on `node:22-trixie-slim`, with a loud comment that alpine breaks `uws` at *runtime*, plus the AGPL notice (§3.13 #4). - **nginx prod template**: introduce `${YHUB_HOST}`; during transition: - `location = /collaboration/ws/` (exact: old `?room=` URLs from cached bundles) → @@ -464,7 +478,7 @@ New: booted `createYHub` (`stream.addMessage` → `getDoc` → re-apply in yjs 13; BlockNote fragment `document-store`) — *if the @y/y-14 ↔ yjs-13 binary formats don't round-trip, the architecture needs a transcode step and this plan stops here*; (b) redis:7 smoke - incl. Django; (c) `createYHub` boots on node:22-slim; (d) observe upgrade-rejection + incl. Django; (c) `createYHub` boots in the target container image; (d) observe upgrade-rejection statuses and `maxDocSize`-exceeded behavior. 1. Scaffold (`package.json` rewrite to ESM, configs copied, `/ping`, Sentry) — builds, starts, pings. diff --git a/src/frontend/servers/yhub/Dockerfile b/src/frontend/servers/yhub/Dockerfile new file mode 100644 index 000000000..20922cf23 --- /dev/null +++ b/src/frontend/servers/yhub/Dockerfile @@ -0,0 +1,72 @@ +# uws (a @y/hub dependency) only ships glibc prebuilt binaries requiring +# glibc >= 2.38: this image must stay on a Debian >= 13 (trixie) Node image. +# Switching to alpine/musl or an older Debian would fail at RUNTIME (not +# build time) when loading uws_linux_*.node. +FROM node:22-trixie-slim AS base + +# Upgrade system packages to install security updates. +# git is required by yarn to fetch the uws dependency (git+https). +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends git ca-certificates && \ + rm -rf /var/lib/apt/lists/* + +FROM base AS yhub-deps + +WORKDIR /home/frontend/ + +COPY ./src/frontend/package.json ./package.json +COPY ./src/frontend/yarn.lock ./yarn.lock +COPY ./src/frontend/servers/yhub/package.json ./servers/yhub/package.json +COPY ./src/frontend/packages/eslint-plugin-docs/package.json ./packages/eslint-plugin-docs/package.json + +# yarn v1 caches every package of the workspace lockfile (several GB); +# clean it in the same layer to keep the image small. +RUN yarn install && yarn cache clean + +COPY ./src/frontend/packages/eslint-plugin-docs ./packages/eslint-plugin-docs +COPY ./src/frontend/servers/yhub ./servers/yhub + +FROM yhub-deps AS yhub-development + +WORKDIR /home/frontend/servers/yhub + +EXPOSE 4444 + +CMD [ "yarn", "dev"] + +FROM yhub-deps AS yhub-builder + +WORKDIR /home/frontend/servers/yhub +RUN yarn build + +FROM base AS yhub + +WORKDIR /home/frontend/ + +COPY ./src/frontend/package.json ./package.json +COPY ./src/frontend/yarn.lock ./yarn.lock +COPY ./src/frontend/servers/yhub/package.json ./servers/yhub/package.json + +WORKDIR /home/frontend/servers/yhub + +COPY --from=yhub-builder \ + /home/frontend/servers/yhub/dist \ + ./dist + +RUN NODE_ENV=production yarn install --frozen-lockfile && yarn cache clean + +# Remove npm, contains CVE related to cross-spawn and we don't use it. +RUN rm -rf /usr/local/bin/npm /usr/local/lib/node_modules/npm + +ENV NODE_OPTIONS="--max-old-space-size=2048" + +# Un-privileged user running the application +ARG DOCKER_USER +USER ${DOCKER_USER} + +# Copy entrypoint +COPY ./docker/files/usr/local/bin/entrypoint /usr/local/bin/entrypoint +ENTRYPOINT [ "/usr/local/bin/entrypoint" ] + +CMD ["yarn", "start"] diff --git a/src/frontend/servers/yhub/LICENSE-NOTICE.md b/src/frontend/servers/yhub/LICENSE-NOTICE.md new file mode 100644 index 000000000..75dbb07b1 --- /dev/null +++ b/src/frontend/servers/yhub/LICENSE-NOTICE.md @@ -0,0 +1,13 @@ +# License notice — @y/hub (AGPL-3.0) + +This server embeds [`@y/hub`](https://github.com/yjs/yhub), which is +dual-licensed **AGPL-3.0** / proprietary. The project uses it under the AGPL. + +Consequence: running this collaboration server as a network service triggers +the AGPL source-availability obligation for the combined work. That obligation +is satisfied by this repository being publicly available; the project's own +code stays MIT-licensed, `@y/hub` itself remains AGPL. + +If this ever needs to change (closed-source deployment, objection to AGPL), +a proprietary license must be obtained from the @y/hub author +(kevin.jahns at pm.me) — see `node_modules/@y/hub/README.md`. diff --git a/src/frontend/servers/yhub/README.md b/src/frontend/servers/yhub/README.md new file mode 100644 index 000000000..aa52c846c --- /dev/null +++ b/src/frontend/servers/yhub/README.md @@ -0,0 +1,66 @@ +# yhub — docs collaboration server + +Realtime collaboration server for docs, built on [`@y/hub`](https://github.com/yjs/yhub) +(see `LICENSE-NOTICE.md` for the AGPL implications). It replaces the realtime part of +`servers/y-provider`; the conversion endpoint (`/api/convert/`) stays in y-provider. + +Architecture, rationale and rollout plan: `../YHUB_MIGRATION_PLAN.md`. + +## How it works + +One Node process containing two layers: + +- **Gateway** (Express + raw WebSocket upgrade, port `4444`, the only published port): + authenticates browsers against Django with their cookies + (`GET /api/v1.0/documents/{id}/` abilities), keeps the connection registry in Redis + (kick + count across replicas), purges a room's cached state when its first client + connects (Django is the source of truth — yhub state is a disposable cache), then + byte-pipes the WebSocket to the embedded @y/hub server using a single-use token. +- **Embedded @y/hub** (uws server on `YHUB_INTERNAL_PORT`, never published): the actual + y-websocket relay — Redis streams for fan-out, Postgres (`yhub_ydoc_v1`, blobs inline) + for spillover persistence, plus the compaction worker. + +HTTP surface (contracts identical to y-provider): + +| Route | Purpose | +|---|---| +| `WS /collaboration/ws/{room}` | y-websocket endpoint (cookies + allowed origin required) | +| `POST /collaboration/api/reset-connections/?room=` (+ opt. `x-user-id` header) | kick connections (close code `4000`), fanned out to all instances via Redis pub/sub | +| `GET /collaboration/api/get-connections/?room=&sessionKey=` | `{count, exists}` for Django's save arbitration (404 on empty room) | +| `GET /ping` | health check | + +## Configuration + +Carried over from y-provider: `PORT` (4444), `COLLABORATION_LOGGING`, +`COLLABORATION_SERVER_ORIGIN`, `COLLABORATION_SERVER_SECRET[_FILE]`, +`Y_PROVIDER_API_KEY[_FILE]`, `COLLABORATION_BACKEND_BASE_URL`, `SENTRY_DSN`. + +New: + +| Variable | Default | Purpose | +|---|---|---| +| `REDIS_URL` | `redis://redis:6379` | streams + registry + kick pub/sub (**Redis ≥ 6.2**) | +| `POSTGRES_URL` | dev impress DB | `yhub_ydoc_v1` table (dedicated DB recommended in production) | +| `YHUB_REDIS_PREFIX` | `yhub` | namespace for all Redis keys | +| `YHUB_INTERNAL_PORT` | `4445` | embedded uws server — never expose it | +| `YHUB_TASK_DEBOUNCE` / `YHUB_MIN_MESSAGE_LIFETIME` / `YHUB_TASK_CONCURRENCY` / `YHUB_MAX_DOC_SIZE` | @y/hub defaults | tuning passthrough | +| `CONN_TTL_SECONDS` / `CONN_HEARTBEAT_SECONDS` | `30` / `10` | registry liveness (crashed instances self-clean) | +| `AUTH_TOKEN_TTL_MS` | `10000` | gateway → embedded-yhub one-time token TTL | + +## Develop & test + +```bash +yarn dev # nodemon (build + start) +yarn test # unit tests (no infrastructure needed) + +# integration tests need a real Redis ≥ 7 and PostgreSQL: +docker run -d -p 16379:6379 redis:7 +docker run -d -p 15432:5432 -e POSTGRES_USER=yhub -e POSTGRES_PASSWORD=yhub \ + -e POSTGRES_DB=yhub postgres:16-alpine +REDIS_URL=redis://localhost:16379 \ + POSTGRES_URL=postgres://yhub:yhub@localhost:15432/yhub yarn test:integration +``` + +The Docker image must stay on a glibc ≥ 2.38 base (`node:22-trixie-slim`): `uws` +ships no musl binaries and its glibc builds require 2.38+ — alpine or Debian ≤ 12 +fail at runtime, not at build time. diff --git a/src/frontend/servers/yhub/__tests__/authPlugin.test.ts b/src/frontend/servers/yhub/__tests__/authPlugin.test.ts new file mode 100644 index 000000000..8715fd41d --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/authPlugin.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, test } from 'vitest'; + +import { createGatewayAuthPlugin } from '@/yhubauth/authPlugin'; +import { issueToken } from '@/yhubauth/internalToken'; + +const uwsRequest = (query: string) => + ({ getQuery: () => query }) as Parameters< + ReturnType['readAuthInfo'] + >[0]; + +describe('gateway auth plugin', () => { + const plugin = createGatewayAuthPlugin(); + + test('readAuthInfo resolves claims for a valid token', async () => { + const token = issueToken({ userid: 'u1', room: 'r1', canEdit: true }); + await expect( + plugin.readAuthInfo(uwsRequest(`yauth=${token}`)), + ).resolves.toEqual({ + userid: 'u1', + room: 'r1', + canEdit: true, + }); + }); + + // The plugin throws synchronously (before any await) — the upstream uws + // upgrade handler wraps the call in try/catch, so this surfaces as a 401. + test('readAuthInfo throws without a token', () => { + expect(() => plugin.readAuthInfo(uwsRequest(''))).toThrow(); + }); + + test('readAuthInfo throws for a replayed token (single use)', async () => { + const token = issueToken({ userid: 'u1', room: 'r1', canEdit: true }); + await plugin.readAuthInfo(uwsRequest(`yauth=${token}`)); + expect(() => plugin.readAuthInfo(uwsRequest(`yauth=${token}`))).toThrow(); + }); + + test.each([ + [{ org: 'docs', branch: 'main', docid: 'r1' }, true, 'rw'], + [{ org: 'docs', branch: 'main', docid: 'r1' }, false, 'r'], + [{ org: 'docs', branch: 'main', docid: 'other' }, true, null], + [{ org: 'evil', branch: 'main', docid: 'r1' }, true, null], + [{ org: 'docs', branch: 'dev', docid: 'r1' }, true, null], + ])( + 'getAccessType room binding: %o canEdit=%s → %s', + async (room, canEdit, expected) => { + await expect( + plugin.getAccessType({ userid: 'u1', room: 'r1', canEdit }, room), + ).resolves.toBe(expected); + }, + ); +}); diff --git a/src/frontend/servers/yhub/__tests__/collaborationBackend.test.ts b/src/frontend/servers/yhub/__tests__/collaborationBackend.test.ts new file mode 100644 index 000000000..543fe8b89 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/collaborationBackend.test.ts @@ -0,0 +1,62 @@ +import axios from 'axios'; +import { describe, expect, test, vi } from 'vitest'; + +vi.mock('../src/env', () => ({ + COLLABORATION_BACKEND_BASE_URL: 'http://app-dev:8000', + Y_PROVIDER_API_KEY: 'test-yprovider-key', +})); + +describe('collaborationBackend', () => { + test('fetchDocument forwards cookie/origin and the X-Y-Provider-Key header', async () => { + const axiosGetSpy = vi.spyOn(axios, 'get').mockResolvedValue({ + status: 200, + data: { + id: 'test-doc-id', + abilities: { retrieve: true, update: true }, + }, + }); + + const { fetchDocument } = await import('@/api/collaborationBackend'); + + await fetchDocument('test-document-123', { + cookie: 'test-cookie', + origin: 'http://localhost:3000', + }); + + expect(axiosGetSpy).toHaveBeenCalledWith( + 'http://app-dev:8000/api/v1.0/documents/test-document-123/', + expect.objectContaining({ + headers: expect.objectContaining({ + 'X-Y-Provider-Key': 'test-yprovider-key', + cookie: 'test-cookie', + origin: 'http://localhost:3000', + }), + }), + ); + + axiosGetSpy.mockRestore(); + }); + + test('fetchCurrentUser forwards headers', async () => { + const axiosGetSpy = vi.spyOn(axios, 'get').mockResolvedValue({ + status: 200, + data: { id: 'test-user-id', email: 'test@example.com' }, + }); + + const { fetchCurrentUser } = await import('@/api/collaborationBackend'); + + await fetchCurrentUser({ cookie: 'test-cookie' }); + + expect(axiosGetSpy).toHaveBeenCalledWith( + 'http://app-dev:8000/api/v1.0/users/me/', + expect.objectContaining({ + headers: expect.objectContaining({ + 'X-Y-Provider-Key': 'test-yprovider-key', + cookie: 'test-cookie', + }), + }), + ); + + axiosGetSpy.mockRestore(); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/fakeRedis.ts b/src/frontend/servers/yhub/__tests__/fakeRedis.ts new file mode 100644 index 000000000..b075c08fb --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/fakeRedis.ts @@ -0,0 +1,85 @@ +/** + * Minimal in-memory stand-in for the node-redis v5 client, covering only the + * surface the gateway uses (registry keys, lock, kick pub/sub). Preferred + * over a mocking library so SET NX / TTL semantics are real. + */ +export class FakeRedis { + store = new Map(); + published: Array<{ channel: string; message: string }> = []; + + private isExpired(key: string): boolean { + const entry = this.store.get(key); + return !!entry && entry.expiresAt !== null && entry.expiresAt <= Date.now(); + } + + private liveEntry(key: string) { + if (this.isExpired(key)) { + this.store.delete(key); + } + return this.store.get(key); + } + + set( + key: string, + value: string, + opts?: { EX?: number; PX?: number; NX?: boolean }, + ): Promise { + if (opts?.NX && this.liveEntry(key)) { + return Promise.resolve(null); + } + const ttlMs = opts?.PX ?? (opts?.EX !== undefined ? opts.EX * 1000 : null); + this.store.set(key, { + value, + expiresAt: ttlMs === null ? null : Date.now() + ttlMs, + }); + return Promise.resolve('OK'); + } + + get(key: string): Promise { + return Promise.resolve(this.liveEntry(key)?.value ?? null); + } + + del(key: string): Promise { + const existed = this.liveEntry(key) ? 1 : 0; + this.store.delete(key); + return Promise.resolve(existed); + } + + mGet(keys: string[]): Promise> { + return Promise.resolve( + keys.map((key) => this.liveEntry(key)?.value ?? null), + ); + } + + async *scanIterator(opts: { MATCH: string; COUNT?: number }) { + const prefix = opts.MATCH.endsWith('*') + ? opts.MATCH.slice(0, -1) + : opts.MATCH; + const matches = [...this.store.keys()].filter( + (key) => key.startsWith(prefix) && !this.isExpired(key), + ); + // node-redis v5 iterators yield batches + if (matches.length > 0) { + yield matches; + } + } + + eval( + script: string, + opts: { keys: string[]; arguments: string[] }, + ): Promise { + // Only the compare-and-delete lock release script is used. + const [key] = opts.keys; + const [token] = opts.arguments; + if (this.liveEntry(key)?.value === token) { + this.store.delete(key); + return Promise.resolve(1); + } + return Promise.resolve(0); + } + + publish(channel: string, message: string): Promise { + this.published.push({ channel, message }); + return Promise.resolve(1); + } +} diff --git a/src/frontend/servers/yhub/__tests__/gatewayGuards.test.ts b/src/frontend/servers/yhub/__tests__/gatewayGuards.test.ts new file mode 100644 index 000000000..4bf184658 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/gatewayGuards.test.ts @@ -0,0 +1,139 @@ +import { Server } from 'http'; +import { AddressInfo } from 'net'; + +import { YHub } from '@y/hub'; +import axios from 'axios'; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + test, + vi, +} from 'vitest'; +import { WebSocket } from 'ws'; + +import { ConnectionRegistry, RedisClient } from '@/registry/connectionRegistry'; +import { initServer } from '@/servers/appServer'; + +import { FakeRedis } from './fakeRedis'; + +const ROOM = '123e4567-e89b-42d3-a456-426614174000'; +const ORIGIN = 'http://localhost:3000'; // default COLLABORATION_SERVER_ORIGIN + +type Outcome = + | { outcome: 'http'; status: number } + | { outcome: 'open' } + | { outcome: 'error'; message: string } + | { outcome: 'timeout' }; + +const tryUpgrade = ( + url: string, + headers: Record, +): Promise => + new Promise((resolve) => { + const ws = new WebSocket(url, { headers }); + const timer = setTimeout(() => { + ws.terminate(); + resolve({ outcome: 'timeout' }); + }, 3000); + ws.on('unexpected-response', (_request, response) => { + clearTimeout(timer); + ws.terminate(); + resolve({ outcome: 'http', status: response.statusCode ?? 0 }); + }); + ws.on('open', () => { + clearTimeout(timer); + ws.close(); + resolve({ outcome: 'open' }); + }); + ws.on('error', (error) => { + clearTimeout(timer); + resolve({ outcome: 'error', message: error.message }); + }); + }); + +describe('gateway upgrade guards', () => { + let server: Server; + let base: string; + + beforeAll(async () => { + const redis = new FakeRedis(); + const registry = new ConnectionRegistry( + redis as unknown as RedisClient, + 'instance-1', + ); + server = initServer({ + yhub: {} as unknown as YHub, // guards reject before yhub is touched + redis: redis as unknown as RedisClient, + registry, + }); + await new Promise((resolve) => server.listen(0, resolve)); + base = `ws://127.0.0.1:${(server.address() as AddressInfo).port}`; + }); + + afterAll(() => { + server.close(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test('unknown path → 404', async () => { + await expect(tryUpgrade(`${base}/other/path`, {})).resolves.toEqual({ + outcome: 'http', + status: 404, + }); + }); + + test('invalid room → 400', async () => { + await expect( + tryUpgrade(`${base}/collaboration/ws/not-a-uuid`, { origin: ORIGIN }), + ).resolves.toEqual({ outcome: 'http', status: 400 }); + }); + + test('missing room → 400', async () => { + await expect( + tryUpgrade(`${base}/collaboration/ws/`, { origin: ORIGIN }), + ).resolves.toEqual({ outcome: 'http', status: 400 }); + }); + + test('bad origin → 403', async () => { + await expect( + tryUpgrade(`${base}/collaboration/ws/${ROOM}`, { + origin: 'http://evil.example', + }), + ).resolves.toEqual({ outcome: 'http', status: 403 }); + }); + + test('no cookies → 401', async () => { + await expect( + tryUpgrade(`${base}/collaboration/ws/${ROOM}`, { origin: ORIGIN }), + ).resolves.toEqual({ outcome: 'http', status: 401 }); + }); + + test('backend error → 403', async () => { + vi.spyOn(axios, 'get').mockRejectedValue(new Error('backend down')); + await expect( + tryUpgrade(`${base}/collaboration/ws/${ROOM}`, { + origin: ORIGIN, + cookie: 'docs_sessionid=abc', + }), + ).resolves.toEqual({ outcome: 'http', status: 403 }); + }); + + test('missing retrieve ability → 403', async () => { + vi.spyOn(axios, 'get').mockResolvedValue({ + status: 200, + data: { id: ROOM, abilities: { retrieve: false, update: false } }, + }); + await expect( + tryUpgrade(`${base}/collaboration/ws/${ROOM}`, { + origin: ORIGIN, + cookie: 'docs_sessionid=abc', + }), + ).resolves.toEqual({ outcome: 'http', status: 403 }); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/integration/collaboration.int.test.ts b/src/frontend/servers/yhub/__tests__/integration/collaboration.int.test.ts new file mode 100644 index 000000000..7b141d2da --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/integration/collaboration.int.test.ts @@ -0,0 +1,254 @@ +/** + * Integration tests — need a real Redis ≥ 7 and PostgreSQL: + * + * docker run -d -p 16379:6379 redis:7 + * docker run -d -p 15432:5432 -e POSTGRES_USER=yhub -e POSTGRES_PASSWORD=yhub \ + * -e POSTGRES_DB=yhub postgres:16-alpine + * + * Override with REDIS_URL / POSTGRES_URL. Run with `yarn test:integration`. + */ +import { randomUUID } from 'crypto'; +import { Server } from 'http'; +import { AddressInfo } from 'net'; + +import express from 'express'; +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; +import { WebSocket as WS } from 'ws'; +import { WebsocketProvider } from 'y-websocket'; +import * as Y from 'yjs'; + +// Must be set before '@/env' is imported (hence the dynamic import below). +process.env.REDIS_URL = process.env.REDIS_URL ?? 'redis://localhost:16379'; +process.env.POSTGRES_URL = + process.env.POSTGRES_URL ?? 'postgres://yhub:yhub@localhost:15432/yhub'; +process.env.YHUB_REDIS_PREFIX = `int-${randomUUID().slice(0, 8)}`; +process.env.YHUB_INTERNAL_PORT = '14545'; +process.env.YHUB_TASK_DEBOUNCE = '700'; +process.env.YHUB_MIN_MESSAGE_LIFETIME = '1500'; + +const ORIGIN = 'http://localhost:3000'; +const SECRET = 'secret-api-key'; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +const waitFor = async ( + condition: () => boolean | Promise, + what: string, + timeoutMs = 10_000, +) => { + const deadline = Date.now() + timeoutMs; + while (!(await condition())) { + if (Date.now() > deadline) { + throw new Error(`Timed out waiting for: ${what}`); + } + await sleep(50); + } +}; + +type Gateway = Awaited>; + +describe('collaboration through the gateway (integration)', () => { + let gateway: Gateway; + let gatewayPort: number; + let djangoStub: Server; + const providers: WebsocketProvider[] = []; + + /** Stub Django: cookie `mode=read` → read-only, `mode=none` → no access. */ + const startDjangoStub = async () => { + const app = express(); + app.get('/api/v1.0/documents/:id/', (req, res) => { + const cookie = req.headers.cookie ?? ''; + if (cookie.includes('mode=none')) { + res.status(403).json({ detail: 'forbidden' }); + return; + } + res.json({ + id: req.params.id, + abilities: { retrieve: true, update: !cookie.includes('mode=read') }, + }); + }); + app.get('/api/v1.0/users/me/', (req, res) => { + const match = /uid=([^;]+)/.exec(req.headers.cookie ?? ''); + if (!match) { + res.status(401).json({ detail: 'unauthenticated' }); + return; + } + res.json({ id: match[1], email: `${match[1]}@example.com` }); + }); + djangoStub = app.listen(0); + await new Promise((resolve) => djangoStub.once('listening', resolve)); + const { port } = djangoStub.address() as AddressInfo; + process.env.COLLABORATION_BACKEND_BASE_URL = `http://127.0.0.1:${port}`; + }; + + const connect = (room: string, cookie: string) => { + const doc = new Y.Doc(); + class WSWithHeaders extends WS { + constructor(url: string, protocols?: string | string[]) { + super(url, protocols, { headers: { origin: ORIGIN, cookie } }); + } + } + const provider = new WebsocketProvider( + `ws://127.0.0.1:${gatewayPort}/collaboration/ws`, + room, + doc, + { + WebSocketPolyfill: WSWithHeaders as unknown as typeof WebSocket, + disableBc: true, + }, + ); + providers.push(provider); + return { doc, provider }; + }; + + const gatewayHttp = (path: string, init?: RequestInit) => + fetch(`http://127.0.0.1:${gatewayPort}${path}`, { + ...init, + headers: { Authorization: SECRET, ...(init?.headers ?? {}) }, + }); + + beforeAll(async () => { + await startDjangoStub(); + const { bootGateway } = await import('@/boot'); + gateway = await bootGateway(); + await new Promise((resolve) => gateway.server.listen(0, resolve)); + gatewayPort = (gateway.server.address() as AddressInfo).port; + }, 30_000); + + afterAll(async () => { + providers.forEach((provider) => provider.destroy()); + await gateway?.shutdown(); + djangoStub?.close(); + }, 30_000); + + test('two clients sync edits and awareness; read-only edits are dropped; kick and purge behave', async () => { + const room = randomUUID(); + + // --- two read-write clients sync both ways + const a = connect(room, 'docs_sessionid=sessA; uid=userA'); + const b = connect(room, 'docs_sessionid=sessB; uid=userB'); + await waitFor(() => a.provider.synced && b.provider.synced, 'initial sync'); + + a.doc.getText('content').insert(0, 'hello'); + await waitFor( + () => b.doc.getText('content').toString() === 'hello', + 'A→B propagation', + ); + b.doc.getText('content').insert(5, ' world'); + await waitFor( + () => a.doc.getText('content').toString() === 'hello world', + 'B→A propagation', + ); + + // --- awareness propagates + a.provider.awareness.setLocalStateField('user', { name: 'Alice' }); + await waitFor( + () => + [...b.provider.awareness.getStates().values()].some( + (state) => + (state as { user?: { name?: string } }).user?.name === 'Alice', + ), + 'awareness propagation', + ); + + // --- read-only client: receives but cannot write + const r = connect(room, 'docs_sessionid=sessR; uid=userR; mode=read'); + await waitFor( + () => r.doc.getText('content').toString() === 'hello world', + 'read-only client receives state', + ); + r.doc.getText('content').insert(0, 'EVIL-'); + await sleep(700); + expect(a.doc.getText('content').toString()).toBe('hello world'); + + // --- get-connections: counts rw connections only, sessionKey matching + const connectionsResponse = await gatewayHttp( + `/collaboration/api/get-connections/?room=${room}&sessionKey=sessA`, + ); + expect(connectionsResponse.status).toBe(200); + expect(await connectionsResponse.json()).toEqual({ + count: 2, + exists: true, + }); + const strangerResponse = await gatewayHttp( + `/collaboration/api/get-connections/?room=${room}&sessionKey=nope`, + ); + expect( + (await strangerResponse.json()) as { exists: boolean }, + ).toMatchObject({ + exists: false, + }); + + // --- user-scoped kick: only userB is closed, with code 4000 + const closeCodes: number[] = []; + b.provider.on('connection-close', (event: { code?: number } | null) => { + if (event?.code) { + closeCodes.push(event.code); + } + }); + const resetResponse = await gatewayHttp( + `/collaboration/api/reset-connections/?room=${room}`, + { method: 'POST', headers: { 'X-User-Id': 'userB' } }, + ); + expect(resetResponse.status).toBe(200); + await waitFor(() => closeCodes.includes(4000), 'kick close code 4000'); + expect(a.provider.wsconnected).toBe(true); // userA untouched + + // --- disposable cache: disconnect everyone, then a fresh join purges + providers.forEach((provider) => provider.destroy()); + providers.length = 0; + await waitFor(async () => { + const response = await gatewayHttp( + `/collaboration/api/get-connections/?room=${room}&sessionKey=x`, + ); + return response.status === 404; + }, 'all connections deregistered'); + + // wait until the worker compacted the session into Postgres + await waitFor( + async () => { + const rows = await gateway.yhub.persistence.sql` + SELECT count(*)::int AS count FROM yhub_ydoc_v1 WHERE docid = ${room} + `; + return (rows[0] as { count: number }).count > 0; + }, + 'worker compaction persisted rows', + 15_000, + ); + + const fresh = connect(room, 'docs_sessionid=sessC; uid=userC'); + await waitFor(() => fresh.provider.synced, 'fresh client sync'); + // the previous session's content is gone: the cache was purged on 0→1 + expect(fresh.doc.getText('content').toString()).toBe(''); + const rowsAfter = await gateway.yhub.persistence.sql` + SELECT count(*)::int AS count FROM yhub_ydoc_v1 WHERE docid = ${room} + `; + expect((rowsAfter[0] as { count: number }).count).toBe(0); + }, 60_000); + + test('no-access user is rejected at the gateway', async () => { + const room = randomUUID(); + const outcome = await new Promise((resolve) => { + const ws = new WS( + `ws://127.0.0.1:${gatewayPort}/collaboration/ws/${room}`, + { headers: { origin: ORIGIN, cookie: 'docs_sessionid=x; mode=none' } }, + ); + const timer = setTimeout(() => { + ws.terminate(); + resolve('timeout'); + }, 4000); + ws.on('error', () => undefined); // aborted handshakes also emit 'error' + ws.on('unexpected-response', (_request, response) => { + clearTimeout(timer); + ws.terminate(); + resolve(`http-${response.statusCode}`); + }); + ws.on('open', () => { + clearTimeout(timer); + ws.close(); + resolve('open'); + }); + }); + expect(outcome).toBe('http-403'); + }, 15_000); +}); diff --git a/src/frontend/servers/yhub/__tests__/internalToken.test.ts b/src/frontend/servers/yhub/__tests__/internalToken.test.ts new file mode 100644 index 000000000..469abf0fe --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/internalToken.test.ts @@ -0,0 +1,50 @@ +import { afterEach, describe, expect, test, vi } from 'vitest'; + +import { + consumeToken, + issueToken, + sweepExpiredTokens, +} from '@/yhubauth/internalToken'; + +const claims = { userid: 'user-1', room: 'room-1', canEdit: true }; + +describe('internalToken', () => { + afterEach(() => { + vi.useRealTimers(); + }); + + test('issued token can be consumed once', () => { + const token = issueToken(claims); + expect(consumeToken(token)).toEqual(claims); + expect(consumeToken(token)).toBeNull(); + }); + + test('unknown token returns null', () => { + expect(consumeToken('not-a-token')).toBeNull(); + }); + + test('expired token returns null', () => { + vi.useFakeTimers(); + const token = issueToken(claims); + vi.advanceTimersByTime(10_001); // AUTH_TOKEN_TTL_MS default is 10s + expect(consumeToken(token)).toBeNull(); + }); + + test('tokens are unique and unguessable-sized', () => { + const a = issueToken(claims); + const b = issueToken(claims); + expect(a).not.toEqual(b); + expect(a.length).toBeGreaterThanOrEqual(43); // 32 bytes base64url + }); + + test('sweep removes expired tokens without touching live ones', () => { + vi.useFakeTimers(); + const oldToken = issueToken(claims); + vi.advanceTimersByTime(9_000); + const newToken = issueToken(claims); + sweepExpiredTokens(Date.now() + 2_000); // old is past TTL, new is not + vi.advanceTimersByTime(2_000); + expect(consumeToken(oldToken)).toBeNull(); + expect(consumeToken(newToken)).toEqual(claims); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/managementEndpoints.test.ts b/src/frontend/servers/yhub/__tests__/managementEndpoints.test.ts new file mode 100644 index 000000000..17822b6a0 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/managementEndpoints.test.ts @@ -0,0 +1,154 @@ +import { Server } from 'http'; + +import { YHub } from '@y/hub'; +import request from 'supertest'; +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; + +import { ConnectionRegistry, RedisClient } from '@/registry/connectionRegistry'; +import { initServer } from '@/servers/appServer'; + +import { FakeRedis } from './fakeRedis'; + +// Default secrets from src/env.ts +const SECRET = 'secret-api-key'; + +describe('management endpoints', () => { + let server: Server; + let redis: FakeRedis; + let registry: ConnectionRegistry; + + beforeAll(() => { + redis = new FakeRedis(); + registry = new ConnectionRegistry( + redis as unknown as RedisClient, + 'instance-1', + ); + server = initServer({ + yhub: {} as unknown as YHub, // not touched by these routes + redis: redis as unknown as RedisClient, + registry, + }); + }); + + afterAll(() => { + server.close(); + }); + + describe('GET /ping', () => { + test('returns pong', async () => { + const response = await request(server).get('/ping'); + expect(response.status).toBe(200); + expect(response.body).toEqual({ message: 'pong' }); + }); + }); + + describe('unknown routes', () => { + test('return 403', async () => { + const response = await request(server).get('/whatever'); + expect(response.status).toBe(403); + }); + }); + + describe('POST /collaboration/api/reset-connections/', () => { + test('requires authentication', async () => { + const response = await request(server).post( + '/collaboration/api/reset-connections/?room=room-1', + ); + expect(response.status).toBe(401); + }); + + test('rejects an invalid api key', async () => { + const response = await request(server) + .post('/collaboration/api/reset-connections/?room=room-1') + .set('Authorization', 'wrong-key'); + expect(response.status).toBe(401); + }); + + test('requires the room parameter', async () => { + const response = await request(server) + .post('/collaboration/api/reset-connections/') + .set('Authorization', SECRET); + expect(response.status).toBe(400); + }); + + test('publishes a room-wide kick (raw secret, as Django sends it)', async () => { + const response = await request(server) + .post('/collaboration/api/reset-connections/?room=room-1') + .set('Authorization', SECRET); + expect(response.status).toBe(200); + expect(response.body).toEqual({ message: 'Connections reset' }); + expect(redis.published).toContainEqual({ + channel: 'yhub:gw:kick', + message: JSON.stringify({ room: 'room-1' }), + }); + }); + + test('publishes a user-scoped kick with x-user-id (Bearer accepted too)', async () => { + const response = await request(server) + .post('/collaboration/api/reset-connections/?room=room-1') + .set('Authorization', `Bearer ${SECRET}`) + .set('X-User-Id', 'user-9'); + expect(response.status).toBe(200); + expect(redis.published).toContainEqual({ + channel: 'yhub:gw:kick', + message: JSON.stringify({ room: 'room-1', userId: 'user-9' }), + }); + }); + }); + + describe('GET /collaboration/api/get-connections/', () => { + test('requires authentication', async () => { + const response = await request(server).get( + '/collaboration/api/get-connections/?room=room-1&sessionKey=s1', + ); + expect(response.status).toBe(401); + }); + + test('requires room and sessionKey', async () => { + const noRoom = await request(server) + .get('/collaboration/api/get-connections/?sessionKey=s1') + .set('Authorization', SECRET); + expect(noRoom.status).toBe(400); + + const noKey = await request(server) + .get('/collaboration/api/get-connections/?room=room-1') + .set('Authorization', SECRET); + expect(noKey.status).toBe(400); + }); + + test('returns 404 for an empty room (Django maps it to 0/False)', async () => { + const response = await request(server) + .get('/collaboration/api/get-connections/?room=empty&sessionKey=s1') + .set('Authorization', SECRET); + expect(response.status).toBe(404); + }); + + test('counts only writable connections and matches sessionKey', async () => { + await registry.register({ + id: 'c1', + room: 'room-2', + sessionKey: 's-writer', + canEdit: true, + }); + await registry.register({ + id: 'c2', + room: 'room-2', + sessionKey: 's-reader', + canEdit: false, + }); + + const asWriter = await request(server) + .get( + '/collaboration/api/get-connections/?room=room-2&sessionKey=s-writer', + ) + .set('Authorization', SECRET); + expect(asWriter.status).toBe(200); + expect(asWriter.body).toEqual({ count: 1, exists: true }); + + const asStranger = await request(server) + .get('/collaboration/api/get-connections/?room=room-2&sessionKey=s-x') + .set('Authorization', SECRET); + expect(asStranger.body).toEqual({ count: 1, exists: false }); + }); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/registry.test.ts b/src/frontend/servers/yhub/__tests__/registry.test.ts new file mode 100644 index 000000000..ece620b69 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/registry.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, test } from 'vitest'; + +import { ConnectionRegistry, RedisClient } from '@/registry/connectionRegistry'; + +import { FakeRedis } from './fakeRedis'; + +const makeRegistry = () => { + const redis = new FakeRedis(); + const registry = new ConnectionRegistry( + redis as unknown as RedisClient, + 'instance-1', + ); + return { redis, registry }; +}; + +describe('ConnectionRegistry', () => { + test('register/listRoom/deregister round-trip', async () => { + const { registry } = makeRegistry(); + const conn = { + id: 'c1', + room: 'room-1', + userId: 'u1', + sessionKey: 's1', + canEdit: true, + }; + await registry.register(conn); + + const entries = await registry.listRoom('room-1'); + expect(entries).toEqual([ + { + connId: 'c1', + userId: 'u1', + sessionKey: 's1', + canEdit: true, + instanceId: 'instance-1', + }, + ]); + expect(registry.localRoom('room-1')).toHaveLength(1); + + await registry.deregister(conn); + expect(await registry.listRoom('room-1')).toEqual([]); + expect(registry.localRoom('room-1')).toHaveLength(0); + }); + + test('listRoom only matches the requested room', async () => { + const { registry } = makeRegistry(); + await registry.register({ id: 'c1', room: 'room-1', canEdit: true }); + await registry.register({ id: 'c2', room: 'room-2', canEdit: false }); + + expect(await registry.listRoom('room-1')).toHaveLength(1); + expect(await registry.listRoom('room-2')).toHaveLength(1); + expect(await registry.listRoom('room-3')).toHaveLength(0); + }); + + test('entries from other instances are listed too', async () => { + const { redis, registry } = makeRegistry(); + const other = new ConnectionRegistry( + redis as unknown as RedisClient, + 'instance-2', + ); + await registry.register({ id: 'c1', room: 'room-1', canEdit: true }); + await other.register({ id: 'c2', room: 'room-1', canEdit: false }); + + const entries = await registry.listRoom('room-1'); + expect(entries).toHaveLength(2); + expect(new Set(entries.map((entry) => entry.instanceId))).toEqual( + new Set(['instance-1', 'instance-2']), + ); + // but local sockets stay per-instance + expect(registry.localRoom('room-1')).toHaveLength(1); + }); + + test('unparsable redis entries are dropped', async () => { + const { redis, registry } = makeRegistry(); + await registry.register({ id: 'c1', room: 'room-1', canEdit: true }); + await redis.set('yhub:gw:conn:room-1:bad', 'not-json'); + + const entries = await registry.listRoom('room-1'); + expect(entries).toHaveLength(1); + expect(entries[0].connId).toBe('c1'); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/roomLifecycle.test.ts b/src/frontend/servers/yhub/__tests__/roomLifecycle.test.ts new file mode 100644 index 000000000..47cc4cbe8 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/roomLifecycle.test.ts @@ -0,0 +1,149 @@ +import { YHub } from '@y/hub'; +import { describe, expect, test, vi } from 'vitest'; + +import { ConnectionRegistry, RedisClient } from '@/registry/connectionRegistry'; +import { + ensureFreshRoomAndRegister, + purgeRoom, + withRedisLock, +} from '@/rooms/roomLifecycle'; + +import { FakeRedis } from './fakeRedis'; + +const fakeYHub = (references: unknown[] = [{ assetId: {}, asset: {} }]) => { + const retrieveDoc = vi.fn().mockResolvedValue({ references }); + const deleteReferences = vi.fn().mockResolvedValue(undefined); + return { + yhub: { persistence: { retrieveDoc, deleteReferences } } as unknown as YHub, + retrieveDoc, + deleteReferences, + }; +}; + +describe('withRedisLock', () => { + test('serializes concurrent critical sections', async () => { + const redis = new FakeRedis() as unknown as RedisClient; + const order: string[] = []; + await Promise.all([ + withRedisLock(redis, 'lock:a', async () => { + order.push('a-start'); + await new Promise((resolve) => setTimeout(resolve, 100)); + order.push('a-end'); + }), + (async () => { + await new Promise((resolve) => setTimeout(resolve, 10)); + await withRedisLock(redis, 'lock:a', () => { + order.push('b'); + return Promise.resolve(); + }); + })(), + ]); + expect(order).toEqual(['a-start', 'a-end', 'b']); + }); + + test('releases the lock on error', async () => { + const redis = new FakeRedis() as unknown as RedisClient; + await expect( + withRedisLock(redis, 'lock:b', () => Promise.reject(new Error('boom'))), + ).rejects.toThrow('boom'); + // lock is free again + await withRedisLock(redis, 'lock:b', () => Promise.resolve()); + }); +}); + +describe('purgeRoom', () => { + test('deletes persisted rows and the redis stream', async () => { + const redis = new FakeRedis(); + await redis.set('yhub:room:docs:room-1:main', 'stream-placeholder'); + const { yhub, retrieveDoc, deleteReferences } = fakeYHub(); + + await purgeRoom(yhub, redis as unknown as RedisClient, 'room-1'); + + expect(retrieveDoc).toHaveBeenCalledWith( + { org: 'docs', docid: 'room-1', branch: 'main' }, + { + gc: true, + nongc: true, + contentmap: true, + contentids: true, + references: true, + }, + ); + expect(deleteReferences).toHaveBeenCalled(); + expect(await redis.get('yhub:room:docs:room-1:main')).toBeNull(); + }); + + test('skips deleteReferences when nothing is persisted', async () => { + const redis = new FakeRedis(); + const { yhub, deleteReferences } = fakeYHub([]); + await purgeRoom(yhub, redis as unknown as RedisClient, 'room-1'); + expect(deleteReferences).not.toHaveBeenCalled(); + }); +}); + +describe('ensureFreshRoomAndRegister', () => { + const setup = () => { + const redis = new FakeRedis(); + const registry = new ConnectionRegistry( + redis as unknown as RedisClient, + 'instance-1', + ); + return { redis, registry }; + }; + + test('purges on the 0→1 transition then registers', async () => { + const { redis, registry } = setup(); + const { yhub, deleteReferences } = fakeYHub(); + const conn = { id: 'c1', room: 'room-1', canEdit: true }; + + await ensureFreshRoomAndRegister( + { yhub, redis: redis as unknown as RedisClient, registry }, + conn, + ); + + expect(deleteReferences).toHaveBeenCalledTimes(1); + expect(await registry.listRoom('room-1')).toHaveLength(1); + }); + + test('does not purge when the room is already occupied', async () => { + const { redis, registry } = setup(); + const { yhub, deleteReferences } = fakeYHub(); + const deps = { yhub, redis: redis as unknown as RedisClient, registry }; + + await ensureFreshRoomAndRegister(deps, { + id: 'c1', + room: 'room-1', + canEdit: true, + }); + await ensureFreshRoomAndRegister(deps, { + id: 'c2', + room: 'room-1', + canEdit: true, + }); + + expect(deleteReferences).toHaveBeenCalledTimes(1); // only the first join + expect(await registry.listRoom('room-1')).toHaveLength(2); + }); + + test('concurrent first joiners purge exactly once', async () => { + const { redis, registry } = setup(); + const { yhub, deleteReferences } = fakeYHub(); + const deps = { yhub, redis: redis as unknown as RedisClient, registry }; + + await Promise.all([ + ensureFreshRoomAndRegister(deps, { + id: 'c1', + room: 'room-1', + canEdit: true, + }), + ensureFreshRoomAndRegister(deps, { + id: 'c2', + room: 'room-1', + canEdit: true, + }), + ]); + + expect(deleteReferences).toHaveBeenCalledTimes(1); + expect(await registry.listRoom('room-1')).toHaveLength(2); + }); +}); diff --git a/src/frontend/servers/yhub/__tests__/upgradeLifecycle.test.ts b/src/frontend/servers/yhub/__tests__/upgradeLifecycle.test.ts new file mode 100644 index 000000000..01630dd49 --- /dev/null +++ b/src/frontend/servers/yhub/__tests__/upgradeLifecycle.test.ts @@ -0,0 +1,153 @@ +import { Server } from 'http'; +import { AddressInfo } from 'net'; + +import axios from 'axios'; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + test, + vi, +} from 'vitest'; +import { WebSocket } from 'ws'; + +import type { ConnectionRegistry as ConnectionRegistryType } from '@/registry/connectionRegistry'; +import type { initServer as initServerType } from '@/servers/appServer'; + +import { FakeRedis } from './fakeRedis'; + +// Must be set before '@/env' is loaded (hence the dynamic imports below): +// nothing listens on this port, so every upstream dial fails. +process.env.YHUB_INTERNAL_PORT = '14799'; + +const ROOM = '123e4567-e89b-42d3-a456-426614174000'; +const ORIGIN = 'http://localhost:3000'; + +const fakeYHub = { + persistence: { + retrieveDoc: () => Promise.resolve({ references: [] }), + deleteReferences: () => Promise.resolve(), + }, +}; + +const waitFor = async ( + condition: () => Promise | boolean, + what: string, +) => { + const deadline = Date.now() + 5_000; + while (!(await condition())) { + if (Date.now() > deadline) { + throw new Error(`Timed out waiting for ${what}`); + } + await new Promise((resolve) => setTimeout(resolve, 25)); + } +}; + +describe('upgrade lifecycle cleanup', () => { + let server: Server; + let base: string; + let registry: ConnectionRegistryType; + + beforeAll(async () => { + const { ConnectionRegistry } = + await import('@/registry/connectionRegistry'); + const { initServer }: { initServer: typeof initServerType } = + await import('@/servers/appServer'); + const redis = new FakeRedis(); + registry = new ConnectionRegistry(redis as never, 'instance-1'); + server = initServer({ + yhub: fakeYHub as never, + redis: redis as never, + registry, + }); + await new Promise((resolve) => server.listen(0, resolve)); + base = `ws://127.0.0.1:${(server.address() as AddressInfo).port}`; + }); + + afterAll(() => { + server.close(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + const grantAccess = () => + vi.spyOn(axios, 'get').mockImplementation((url) => + Promise.resolve( + String(url).includes('/users/me/') + ? { status: 200, data: { id: 'user-1' } } + : { + status: 200, + data: { id: ROOM, abilities: { retrieve: true, update: true } }, + }, + ), + ); + + test('rejects with 503 and releases the registration when the upstream dial fails', async () => { + grantAccess(); + + const outcome = await new Promise((resolve) => { + const ws = new WebSocket(`${base}/collaboration/ws/${ROOM}`, { + headers: { origin: ORIGIN, cookie: 'docs_sessionid=s1' }, + }); + const timer = setTimeout(() => { + ws.terminate(); + resolve('timeout'); + }, 5_000); + ws.on('error', () => undefined); + ws.on('unexpected-response', (_request, response) => { + clearTimeout(timer); + ws.terminate(); + resolve(`http-${response.statusCode}`); + }); + ws.on('open', () => { + clearTimeout(timer); + ws.close(); + resolve('open'); + }); + }); + + expect(outcome).toBe('http-503'); + // no ghost left behind: the failed dial must deregister the connection + await waitFor( + async () => (await registry.listRoom(ROOM)).length === 0, + 'deregistration after failed upstream dial', + ); + }); + + test('releases the registration when the client disappears during auth', async () => { + let resolveAuth: () => void = () => undefined; + vi.spyOn(axios, 'get').mockImplementation((url) => { + if (String(url).includes('/users/me/')) { + return Promise.resolve({ status: 200, data: { id: 'user-1' } }); + } + return new Promise((resolve) => { + resolveAuth = () => + resolve({ + status: 200, + data: { id: ROOM, abilities: { retrieve: true, update: true } }, + }); + }); + }); + + const ws = new WebSocket(`${base}/collaboration/ws/${ROOM}`, { + headers: { origin: ORIGIN, cookie: 'docs_sessionid=s2' }, + }); + ws.on('error', () => undefined); + + // let the upgrade reach the (blocked) Django auth call, then vanish + await new Promise((resolve) => setTimeout(resolve, 100)); + ws.terminate(); + await new Promise((resolve) => setTimeout(resolve, 50)); + resolveAuth(); + + await waitFor( + async () => (await registry.listRoom(ROOM)).length === 0, + 'no ghost registration after client vanished mid-auth', + ); + expect(registry.localRoom(ROOM)).toHaveLength(0); + }); +}); diff --git a/src/frontend/servers/yhub/eslint.config.mjs b/src/frontend/servers/yhub/eslint.config.mjs new file mode 100644 index 000000000..0fb15a31d --- /dev/null +++ b/src/frontend/servers/yhub/eslint.config.mjs @@ -0,0 +1,20 @@ +import { defineConfig } from '@eslint/config-helpers'; +import docsPlugin from 'eslint-plugin-docs'; + +const eslintConfig = defineConfig([ + { + ignores: ['dist/**'], + }, + { + files: ['**/*.mjs', '**/*.ts', '**/*.tsx'], + plugins: { + docs: docsPlugin, + }, + extends: ['docs/next'], + rules: { + '@next/next/no-html-link-for-pages': 'off', + }, + }, +]); + +export default eslintConfig; diff --git a/src/frontend/servers/yhub/nodemon.json b/src/frontend/servers/yhub/nodemon.json new file mode 100644 index 000000000..0c61bfb3f --- /dev/null +++ b/src/frontend/servers/yhub/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts", + "exec": "yarn build && yarn start" +} diff --git a/src/frontend/servers/yhub/package.json b/src/frontend/servers/yhub/package.json index 9ddabd00b..00c91e245 100644 --- a/src/frontend/servers/yhub/package.json +++ b/src/frontend/servers/yhub/package.json @@ -1,15 +1,48 @@ { - "name": "yhub", - "version": "1.0.0", - "description": "backend server for yjs collaboration", + "name": "server-yhub", + "version": "0.1.0", + "description": "Collaboration server for docs, built on @y/hub", + "repository": "https://github.com/suitenumerique/docs", "license": "MIT", - "author": "", - "type": "commonjs", - "main": "index.js", + "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "tsc -p tsconfig.build.json && tsc-alias", + "dev": "cross-env COLLABORATION_LOGGING=true && nodemon --config nodemon.json", + "start": "node ./dist/start-server.js", + "lint": "eslint", + "test": "vitest run --exclude '__tests__/integration/**'", + "test:integration": "vitest run __tests__/integration" + }, + "engines": { + "node": ">=22" }, "dependencies": { - "@y/hub": "^0.2.22" - } + "@sentry/node": "10.53.1", + "@sentry/profiling-node": "10.53.1", + "@y/hub": "0.2.22", + "axios": "1.16.1", + "cors": "2.8.6", + "express": "5.2.1", + "redis": "5.10.0", + "uuid": "14.0.0", + "ws": "8.21.0" + }, + "devDependencies": { + "@types/cors": "2.8.19", + "@types/express": "5.0.6", + "@types/node": "*", + "@types/supertest": "7.2.0", + "@types/ws": "8.18.1", + "cross-env": "10.1.0", + "eslint-plugin-docs": "*", + "nodemon": "3.1.14", + "supertest": "7.2.2", + "tsc-alias": "1.8.17", + "typescript": "*", + "vitest": "4.1.7", + "y-protocols": "1.0.7", + "y-websocket": "3.0.0", + "yjs": "*" + }, + "packageManager": "yarn@1.22.22" } diff --git a/src/frontend/servers/yhub/src/api/collaborationBackend.ts b/src/frontend/servers/yhub/src/api/collaborationBackend.ts new file mode 100644 index 000000000..a4c45ea97 --- /dev/null +++ b/src/frontend/servers/yhub/src/api/collaborationBackend.ts @@ -0,0 +1,88 @@ +import { IncomingHttpHeaders } from 'http'; + +import axios from 'axios'; + +import { COLLABORATION_BACKEND_BASE_URL, Y_PROVIDER_API_KEY } from '@/env'; + +export interface User { + id: string; + email: string; + full_name: string; + short_name: string; + language: string; +} + +type Base64 = string; + +export interface Doc { + id: string; + title?: string; + content?: Base64; + creator: string; + is_favorite: boolean; + link_reach: 'restricted' | 'public' | 'authenticated'; + link_role: 'reader' | 'editor'; + nb_accesses_ancestors: number; + nb_accesses_direct: number; + created_at: string; + updated_at: string; + abilities: { + accesses_manage: boolean; + accesses_view: boolean; + ai_proxy: boolean; + ai_transform: boolean; + ai_translate: boolean; + attachment_upload: boolean; + children_create: boolean; + children_list: boolean; + collaboration_auth: boolean; + destroy: boolean; + favorite: boolean; + invite_owner: boolean; + link_configuration: boolean; + media_auth: boolean; + move: boolean; + partial_update: boolean; + restore: boolean; + retrieve: boolean; + update: boolean; + versions_destroy: boolean; + versions_list: boolean; + versions_retrieve: boolean; + }; +} + +async function fetch( + path: string, + requestHeaders: IncomingHttpHeaders, +): Promise { + const response = await axios.get( + `${COLLABORATION_BACKEND_BASE_URL}${path}`, + { + headers: { + cookie: requestHeaders['cookie'], + origin: requestHeaders['origin'], + 'X-Y-Provider-Key': Y_PROVIDER_API_KEY, + }, + }, + ); + + if (response.status !== 200) { + throw new Error(`Failed to fetch ${path}: ${response.statusText}`); + } + + return response.data; +} + +export function fetchDocument( + room: string, + requestHeaders: IncomingHttpHeaders, +): Promise { + return fetch(`/api/v1.0/documents/${room}/`, requestHeaders); +} + +export function fetchCurrentUser( + requestHeaders: IncomingHttpHeaders, +): Promise { + return fetch('/api/v1.0/users/me/', requestHeaders); +} diff --git a/src/frontend/servers/yhub/src/boot.ts b/src/frontend/servers/yhub/src/boot.ts new file mode 100644 index 000000000..007f19d10 --- /dev/null +++ b/src/frontend/servers/yhub/src/boot.ts @@ -0,0 +1,67 @@ +import { randomUUID } from 'crypto'; +import { Server } from 'http'; + +import { YHub } from '@y/hub'; +import { createClient } from 'redis'; + +import { REDIS_URL } from '@/env'; +import { ConnectionRegistry, RedisClient } from '@/registry/connectionRegistry'; +import { KICK_CLOSE_CODE, subscribeKicks } from '@/registry/kickChannel'; +import { createEmbeddedYHub, ensureWorkerStream, initServer } from '@/servers'; +import { logger } from '@/utils'; + +export interface Gateway { + server: Server; + yhub: YHub; + registry: ConnectionRegistry; + redis: RedisClient; + shutdown: () => Promise; +} + +/** Boots the whole gateway: redis clients, embedded @y/hub, registry, kick + * subscription and the HTTP server (not yet listening). */ +export const bootGateway = async (): Promise => { + const redis = createClient({ url: REDIS_URL }); + await redis.connect(); + const subscriber = redis.duplicate(); + await subscriber.connect(); + + // The worker consumer group must exist before @y/hub's worker polls it. + await ensureWorkerStream(redis); + + const yhub = await createEmbeddedYHub(); + + const registry = new ConnectionRegistry(redis, randomUUID()); + registry.startHeartbeat(); + + await subscribeKicks(subscriber, ({ room, userId }) => { + for (const conn of registry.localRoom(room)) { + if (!userId || conn.userId === userId) { + logger('kicking connection', room, conn.userId ?? 'anonymous'); + // The flag covers connections whose handshake is still in flight + // (no socket to close yet): the upgrade handler closes them with + // the kick code as soon as the socket attaches. + conn.kicked = true; + conn.client?.close(KICK_CLOSE_CODE, 'connection-reset'); + } + } + }); + + const server = initServer({ yhub, redis, registry }); + + const shutdown = async () => { + server.close(); + for (const conn of registry.localConnections()) { + conn.client?.close(1001, 'Server shutting down'); + await registry.deregister(conn).catch(() => undefined); + } + registry.stopHeartbeat(); + yhub.stopWorker(); + await yhub.computePool.destroy().catch(() => undefined); + await yhub.server?.destroy().catch(() => undefined); + await subscriber.quit().catch(() => undefined); + await redis.quit().catch(() => undefined); + }; + + return { server, yhub, registry, redis, shutdown }; +}; diff --git a/src/frontend/servers/yhub/src/env.ts b/src/frontend/servers/yhub/src/env.ts new file mode 100644 index 000000000..acd19b108 --- /dev/null +++ b/src/frontend/servers/yhub/src/env.ts @@ -0,0 +1,52 @@ +import { readFileSync } from 'fs'; + +export const COLLABORATION_LOGGING = + process.env.COLLABORATION_LOGGING || 'false'; +export const COLLABORATION_SERVER_ORIGIN = + process.env.COLLABORATION_SERVER_ORIGIN || 'http://localhost:3000'; +export const COLLABORATION_SERVER_SECRET = process.env + .COLLABORATION_SERVER_SECRET_FILE + ? readFileSync(process.env.COLLABORATION_SERVER_SECRET_FILE, 'utf-8') + : process.env.COLLABORATION_SERVER_SECRET || 'secret-api-key'; +export const Y_PROVIDER_API_KEY = process.env.Y_PROVIDER_API_KEY_FILE + ? readFileSync(process.env.Y_PROVIDER_API_KEY_FILE, 'utf-8') + : process.env.Y_PROVIDER_API_KEY || 'yprovider-api-key'; +export const COLLABORATION_BACKEND_BASE_URL = + process.env.COLLABORATION_BACKEND_BASE_URL || 'http://app-dev:8000'; +export const PORT = Number(process.env.PORT || 4444); +export const SENTRY_DSN = process.env.SENTRY_DSN || ''; + +/** + * @y/hub backing services. In development both point at the shared compose + * services; in production a dedicated Redis/Postgres is recommended (the + * yhub state is a disposable cache, but its churn should not share the + * Django database). + */ +export const REDIS_URL = process.env.REDIS_URL || 'redis://redis:6379'; +export const POSTGRES_URL = + process.env.POSTGRES_URL || 'postgres://dinum:pass@postgresql:5432/impress'; +export const YHUB_REDIS_PREFIX = process.env.YHUB_REDIS_PREFIX || 'yhub'; +/** Internal @y/hub uws server. Must never be published outside the container. */ +export const YHUB_INTERNAL_PORT = Number( + process.env.YHUB_INTERNAL_PORT || 4445, +); +export const YHUB_TASK_DEBOUNCE = process.env.YHUB_TASK_DEBOUNCE + ? Number(process.env.YHUB_TASK_DEBOUNCE) + : undefined; +export const YHUB_MIN_MESSAGE_LIFETIME = process.env.YHUB_MIN_MESSAGE_LIFETIME + ? Number(process.env.YHUB_MIN_MESSAGE_LIFETIME) + : undefined; +export const YHUB_TASK_CONCURRENCY = Number( + process.env.YHUB_TASK_CONCURRENCY || 3, +); +export const YHUB_MAX_DOC_SIZE = process.env.YHUB_MAX_DOC_SIZE + ? Number(process.env.YHUB_MAX_DOC_SIZE) + : undefined; + +/** Connection registry liveness (crash entries expire after CONN_TTL_SECONDS). */ +export const CONN_TTL_SECONDS = Number(process.env.CONN_TTL_SECONDS || 30); +export const CONN_HEARTBEAT_SECONDS = Number( + process.env.CONN_HEARTBEAT_SECONDS || 10, +); +/** One-time internal tokens handed from the gateway to the embedded yhub. */ +export const AUTH_TOKEN_TTL_MS = Number(process.env.AUTH_TOKEN_TTL_MS || 10000); diff --git a/src/frontend/servers/yhub/src/handlers/collaborationUpgradeHandler.ts b/src/frontend/servers/yhub/src/handlers/collaborationUpgradeHandler.ts new file mode 100644 index 000000000..41d623b3f --- /dev/null +++ b/src/frontend/servers/yhub/src/handlers/collaborationUpgradeHandler.ts @@ -0,0 +1,200 @@ +import { randomUUID } from 'crypto'; +import { IncomingMessage } from 'http'; +import { Duplex } from 'stream'; + +import { WebSocket, WebSocketServer } from 'ws'; + +import { fetchCurrentUser, fetchDocument } from '@/api/collaborationBackend'; +import { YHUB_INTERNAL_PORT } from '@/env'; +import { allowedOrigins } from '@/middlewares'; +import { GatewayConnection } from '@/registry/connectionRegistry'; +import { KICK_CLOSE_CODE } from '@/registry/kickChannel'; +import { + RoomLifecycleDeps, + ensureFreshRoomAndRegister, +} from '@/rooms/roomLifecycle'; +import { YHUB_ORG, routes } from '@/routes'; +import { getCookieValue, isValidRoom, logger } from '@/utils'; +import { issueToken } from '@/yhubauth/internalToken'; + +import { startPipe } from './wsPipe'; + +const UPSTREAM_DIAL_TIMEOUT_MS = 10_000; + +/** + * Rejecting before the 101 handshake means y-websocket clients see a failed + * connection attempt (`connection-error` + backoff) instead of an + * open-then-close — and unauthorized clients never reach @y/hub. + */ +const rejectUpgrade = (socket: Duplex, status: number, message: string) => { + if (socket.writable) { + socket.write( + `HTTP/1.1 ${status} ${message}\r\nConnection: close\r\nContent-Length: 0\r\n\r\n`, + ); + } + socket.destroy(); +}; + +/** Extracts the room from `/collaboration/ws/{room}` (or legacy `?room=`). */ +export const extractRoom = (url: URL): string | null => { + if (!url.pathname.startsWith(routes.COLLABORATION_WS)) { + return null; + } + const segment = decodeURIComponent( + url.pathname.slice(routes.COLLABORATION_WS.length), + ).replace(/\/+$/, ''); + return segment || url.searchParams.get('room'); +}; + +export interface UpgradeHandlerDeps extends RoomLifecycleDeps { + wss: WebSocketServer; +} + +export const createUpgradeHandler = + (deps: UpgradeHandlerDeps) => + async (req: IncomingMessage, socket: Duplex, head: Buffer) => { + const { wss, registry } = deps; + let conn: GatewayConnection | null = null; + try { + const url = new URL(req.url ?? '', 'http://gateway.internal'); + const room = extractRoom(url); + if (room === null && !url.pathname.startsWith(routes.COLLABORATION_WS)) { + rejectUpgrade(socket, 404, 'Not Found'); + return; + } + if (!room || !isValidRoom(room)) { + logger('upgrade rejected: invalid room', req.url); + rejectUpgrade(socket, 400, 'Bad Request'); + return; + } + + const origin = req.headers.origin; + if (!origin || !allowedOrigins.includes(origin)) { + logger('upgrade rejected: origin not allowed', origin); + rejectUpgrade(socket, 403, 'Forbidden'); + return; + } + if (!req.headers.cookie) { + logger('upgrade rejected: no cookies'); + rejectUpgrade(socket, 401, 'Unauthorized'); + return; + } + + let canEdit = false; + try { + const document = await fetchDocument(room, req.headers); + if (!document.abilities.retrieve) { + logger('upgrade rejected: no retrieve ability', room); + rejectUpgrade(socket, 403, 'Forbidden'); + return; + } + canEdit = document.abilities.update === true; + } catch (error) { + logger('upgrade rejected: backend error', error); + rejectUpgrade(socket, 403, 'Forbidden'); + return; + } + + let userId: string | undefined; + try { + userId = (await fetchCurrentUser(req.headers)).id; + } catch { + // Anonymous users on public documents are legitimate. + userId = undefined; + } + const sessionKey = getCookieValue(req.headers.cookie, 'docs_sessionid'); + + conn = { id: randomUUID(), room, userId, sessionKey, canEdit }; + await ensureFreshRoomAndRegister(deps, conn); + const registered = conn; + + const token = issueToken({ + userid: userId ?? `anon:${conn.id}`, + room, + canEdit, + }); + const upstream = new WebSocket( + `ws://127.0.0.1:${YHUB_INTERNAL_PORT}/ws/${YHUB_ORG}/${room}?yauth=${token}`, + { handshakeTimeout: UPSTREAM_DIAL_TIMEOUT_MS }, + ); + + /** + * Single cleanup path for everything that can go wrong between + * registration and pipe start. Idempotent: once the pipe has started + * (or a cleanup ran), `settled` short-circuits every later signal. + */ + let settled = false; + const failBeforePipe = (status: number, message: string) => { + if (settled) { + return; + } + settled = true; + socket.off('close', onClientGone); + socket.off('error', onClientGone); + upstream.terminate(); + void registry.deregister(registered); + rejectUpgrade(socket, status, message); + }; + // If the browser disappears while we wait on the upstream dial, + // release the registration immediately: wss.handleUpgrade aborts on a + // dead socket WITHOUT invoking its callback, so the pipe (and its + // deregister hook) would never attach — the connection would otherwise + // stay registered forever, kept alive by the registry heartbeat. + const onClientGone = () => failBeforePipe(400, 'Client Closed'); + socket.once('close', onClientGone); + socket.once('error', onClientGone); + if (socket.destroyed) { + // 'close' may already have fired before the listeners were attached + onClientGone(); + return; + } + + upstream.once('open', () => { + if (settled) { + upstream.terminate(); + return; + } + if (!socket.writable) { + failBeforePipe(400, 'Client Closed'); + return; + } + wss.handleUpgrade(req, socket, head, (client) => { + if (settled) { + client.terminate(); + upstream.terminate(); + return; + } + settled = true; + socket.off('close', onClientGone); + socket.off('error', onClientGone); + registered.client = client; + registered.upstream = upstream; + logger('client connected', room, registered.userId ?? 'anonymous'); + startPipe(client, upstream, () => { + logger('client disconnected', room); + void registry.deregister(registered); + }); + if (registered.kicked) { + // A reset-connections arrived while this handshake was in + // flight (it could not close a socket that did not exist yet): + // close now so the client reconnects with fresh permissions. + client.close(KICK_CLOSE_CODE, 'connection-reset'); + } + }); + }); + // Covers dial failures AND handshake rejections. Do not gate this on + // readyState: when the upstream answers with a non-101 response, ws + // runs abortHandshake which sets readyState to CLOSING *before* + // emitting 'error' on the next tick. + upstream.on('error', (error) => { + logger('upstream connection error', error.message); + failBeforePipe(503, 'Service Unavailable'); + }); + } catch (error) { + logger('upgrade error', error); + if (conn) { + void registry.deregister(conn); + } + rejectUpgrade(socket, 500, 'Internal Server Error'); + } + }; diff --git a/src/frontend/servers/yhub/src/handlers/getConnectionsHandler.ts b/src/frontend/servers/yhub/src/handlers/getConnectionsHandler.ts new file mode 100644 index 000000000..e8a80d40c --- /dev/null +++ b/src/frontend/servers/yhub/src/handlers/getConnectionsHandler.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; + +import { ConnectionRegistry } from '@/registry/connectionRegistry'; +import { logger } from '@/utils'; + +/** + * Used by Django's save arbitration (`_can_user_edit_document`). Response + * contract is identical to y-provider: `count` only counts connections with + * write access, `exists` tells whether the given session is among them. + * 404 on an empty room — Django maps it to (0, False). + */ +export const createGetConnectionsHandler = + (registry: ConnectionRegistry) => async (req: Request, res: Response) => { + const room = req.query.room as string | undefined; + const sessionKey = req.query.sessionKey as string | undefined; + + if (!room) { + res.status(400).json({ error: 'Room name not provided' }); + return; + } + if (!sessionKey) { + res.status(400).json({ error: 'Session key not provided' }); + return; + } + + try { + const entries = await registry.listRoom(room); + if (entries.length === 0) { + res.status(404).json({ error: 'Room not found' }); + return; + } + res.status(200).json({ + count: entries.filter((entry) => entry.canEdit).length, + exists: entries.some((entry) => entry.sessionKey === sessionKey), + }); + } catch (error) { + logger('get-connections error', error); + res.status(500).json({ error: 'Failed to get connections' }); + } + }; diff --git a/src/frontend/servers/yhub/src/handlers/index.ts b/src/frontend/servers/yhub/src/handlers/index.ts new file mode 100644 index 000000000..f6c5746eb --- /dev/null +++ b/src/frontend/servers/yhub/src/handlers/index.ts @@ -0,0 +1,4 @@ +export * from './collaborationUpgradeHandler'; +export * from './getConnectionsHandler'; +export * from './resetConnectionsHandler'; +export * from './wsPipe'; diff --git a/src/frontend/servers/yhub/src/handlers/resetConnectionsHandler.ts b/src/frontend/servers/yhub/src/handlers/resetConnectionsHandler.ts new file mode 100644 index 000000000..5de24991a --- /dev/null +++ b/src/frontend/servers/yhub/src/handlers/resetConnectionsHandler.ts @@ -0,0 +1,29 @@ +import { Request, Response } from 'express'; + +import { RedisClient } from '@/registry/connectionRegistry'; +import { publishKick } from '@/registry/kickChannel'; +import { logger } from '@/utils'; + +/** + * Called by Django when permissions change. The kick is published on Redis so + * every gateway instance closes its matching local sockets (code 4000); the + * clients then reconnect and re-run the gateway auth with their new rights. + */ +export const createResetConnectionsHandler = + (redis: RedisClient) => async (req: Request, res: Response) => { + const room = req.query.room as string | undefined; + const userId = req.headers['x-user-id'] as string | undefined; + + if (!room) { + res.status(400).json({ error: 'Room name not provided' }); + return; + } + + try { + await publishKick(redis, { room, ...(userId && { userId }) }); + res.status(200).json({ message: 'Connections reset' }); + } catch (error) { + logger('reset-connections error', error); + res.status(500).json({ error: 'Failed to reset connections' }); + } + }; diff --git a/src/frontend/servers/yhub/src/handlers/wsPipe.ts b/src/frontend/servers/yhub/src/handlers/wsPipe.ts new file mode 100644 index 000000000..01c991773 --- /dev/null +++ b/src/frontend/servers/yhub/src/handlers/wsPipe.ts @@ -0,0 +1,83 @@ +import { WebSocket } from 'ws'; + +import { logger } from '@/utils'; + +/** Slow-consumer protection: terminate clients that stop draining. */ +const MAX_BUFFERED_BYTES = 8 * 1024 * 1024; + +/** `ws` only allows sending 1000-1003, 1007-1014 (minus reserved) and 3000-4999. */ +const sanitizeCloseCode = (code: number): number => + code === 1000 || + code === 1001 || + code === 1011 || + (code >= 3000 && code <= 4999) + ? code + : 1000; + +const safeClose = (ws: WebSocket, code: number, reason: string) => { + if ( + ws.readyState === WebSocket.OPEN || + ws.readyState === WebSocket.CONNECTING + ) { + try { + ws.close(sanitizeCloseCode(code), reason.slice(0, 100)); + } catch { + ws.terminate(); + } + } +}; + +/** + * Bidirectional byte relay between the browser socket and the embedded + * @y/hub socket. Both legs speak the y-websocket wire protocol; the gateway + * never decodes frames (read-only enforcement happens inside @y/hub). + */ +export const startPipe = ( + client: WebSocket, + upstream: WebSocket, + onClose: () => void, +) => { + let closed = false; + const finish = () => { + if (!closed) { + closed = true; + onClose(); + } + }; + + client.on('message', (data: Buffer, isBinary: boolean) => { + if (upstream.readyState === WebSocket.OPEN) { + upstream.send(data, { binary: isBinary }); + } + }); + + upstream.on('message', (data: Buffer, isBinary: boolean) => { + if (client.readyState === WebSocket.OPEN) { + client.send(data, { binary: isBinary }); + if (client.bufferedAmount > MAX_BUFFERED_BYTES) { + logger('pipe: closing slow consumer', client.bufferedAmount); + client.terminate(); + } + } + }); + + client.on('close', (code, reason) => { + safeClose(upstream, code, reason.toString()); + finish(); + }); + + upstream.on('close', (code, reason) => { + safeClose(client, code, reason.toString()); + finish(); + }); + + client.on('error', (error) => { + logger('pipe client error', error.message); + client.terminate(); + }); + + upstream.on('error', (error) => { + logger('pipe upstream error', error.message); + upstream.terminate(); + }); +}; diff --git a/src/frontend/servers/yhub/src/middlewares.ts b/src/frontend/servers/yhub/src/middlewares.ts new file mode 100644 index 000000000..b36e6a80e --- /dev/null +++ b/src/frontend/servers/yhub/src/middlewares.ts @@ -0,0 +1,41 @@ +import cors from 'cors'; +import { NextFunction, Request, Response } from 'express'; + +import { + COLLABORATION_SERVER_ORIGIN, + COLLABORATION_SERVER_SECRET, + Y_PROVIDER_API_KEY, +} from '@/env'; + +const VALID_API_KEYS = [COLLABORATION_SERVER_SECRET, Y_PROVIDER_API_KEY]; +export const allowedOrigins = COLLABORATION_SERVER_ORIGIN.split(','); + +export const corsMiddleware = cors({ + origin: allowedOrigins, + methods: ['GET', 'POST'], + credentials: true, +}); + +export const httpSecurity = ( + req: Request, + res: Response, + next: NextFunction, +): void => { + let apiKey = req.headers['authorization']; + + if (!apiKey) { + res.status(401).json({ error: 'Unauthorized: No credentials given' }); + return; + } + + if (apiKey?.startsWith('Bearer ')) { + apiKey = apiKey.slice('Bearer '.length); + } + + if (!VALID_API_KEYS.includes(apiKey)) { + res.status(401).json({ error: 'Unauthorized: Invalid API Key' }); + return; + } + + next(); +}; diff --git a/src/frontend/servers/yhub/src/registry/connectionRegistry.ts b/src/frontend/servers/yhub/src/registry/connectionRegistry.ts new file mode 100644 index 000000000..4db086c36 --- /dev/null +++ b/src/frontend/servers/yhub/src/registry/connectionRegistry.ts @@ -0,0 +1,146 @@ +import { createClient } from 'redis'; +import { WebSocket } from 'ws'; + +import { + CONN_HEARTBEAT_SECONDS, + CONN_TTL_SECONDS, + YHUB_REDIS_PREFIX, +} from '@/env'; +import { logger } from '@/utils'; + +export type RedisClient = ReturnType; + +export interface GatewayConnection { + id: string; + room: string; + userId?: string; + sessionKey?: string; + canEdit: boolean; + client?: WebSocket; + upstream?: WebSocket; + /** Set when a kick targets this connection before its socket is attached. */ + kicked?: boolean; +} + +export interface RegistryEntry { + connId: string; + userId?: string; + sessionKey?: string; + canEdit: boolean; + instanceId: string; +} + +/** + * Tracks gateway connections. The local Map holds the sockets (for kicks); + * Redis holds one TTL'd key per connection so that counts are correct across + * gateway instances and crashed instances self-clean within CONN_TTL_SECONDS. + */ +export class ConnectionRegistry { + private local = new Map>(); + private heartbeat: NodeJS.Timeout | null = null; + + constructor( + private redis: RedisClient, + readonly instanceId: string, + ) {} + + private key(room: string, connId: string) { + return `${YHUB_REDIS_PREFIX}:gw:conn:${room}:${connId}`; + } + + private entryValue(conn: GatewayConnection): string { + return JSON.stringify({ + userId: conn.userId, + sessionKey: conn.sessionKey, + canEdit: conn.canEdit, + instanceId: this.instanceId, + }); + } + + async register(conn: GatewayConnection) { + let conns = this.local.get(conn.room); + if (!conns) { + conns = new Set(); + this.local.set(conn.room, conns); + } + conns.add(conn); + await this.redis.set(this.key(conn.room, conn.id), this.entryValue(conn), { + EX: CONN_TTL_SECONDS, + }); + } + + async deregister(conn: GatewayConnection) { + const conns = this.local.get(conn.room); + if (conns) { + conns.delete(conn); + if (conns.size === 0) { + this.local.delete(conn.room); + } + } + await this.redis.del(this.key(conn.room, conn.id)); + } + + localRoom(room: string): GatewayConnection[] { + return [...(this.local.get(room) ?? [])]; + } + + localConnections(): GatewayConnection[] { + return [...this.local.values()].flatMap((conns) => [...conns]); + } + + async listRoom(room: string): Promise { + const keys: string[] = []; + for await (const reply of this.redis.scanIterator({ + MATCH: `${YHUB_REDIS_PREFIX}:gw:conn:${room}:*`, + COUNT: 100, + })) { + // node-redis v5 iterators yield batches, v4 yielded single keys + keys.push(...(Array.isArray(reply) ? reply : [reply])); + } + if (keys.length === 0) { + return []; + } + const values = await this.redis.mGet(keys); + const entries: RegistryEntry[] = []; + values.forEach((value, index) => { + if (value === null) { + return; // expired between SCAN and MGET + } + try { + const parsed = JSON.parse(value) as Omit; + entries.push({ + ...parsed, + connId: keys[index].split(':').pop() ?? '', + }); + } catch { + logger('registry: dropping unparsable entry', keys[index]); + } + }); + return entries; + } + + startHeartbeat() { + if (this.heartbeat) { + return; + } + this.heartbeat = setInterval(() => { + void (async () => { + for (const conn of this.localConnections()) { + await this.redis + .set(this.key(conn.room, conn.id), this.entryValue(conn), { + EX: CONN_TTL_SECONDS, + }) + .catch((error) => logger('registry heartbeat error', error)); + } + })(); + }, CONN_HEARTBEAT_SECONDS * 1000); + this.heartbeat.unref(); + } + + stopHeartbeat() { + if (this.heartbeat) { + clearInterval(this.heartbeat); + this.heartbeat = null; + } + } +} diff --git a/src/frontend/servers/yhub/src/registry/kickChannel.ts b/src/frontend/servers/yhub/src/registry/kickChannel.ts new file mode 100644 index 000000000..f0b93d60f --- /dev/null +++ b/src/frontend/servers/yhub/src/registry/kickChannel.ts @@ -0,0 +1,39 @@ +import { YHUB_REDIS_PREFIX } from '@/env'; +import { logger } from '@/utils'; + +import { RedisClient } from './connectionRegistry'; + +export interface KickMessage { + room: string; + userId?: string; +} + +/** Close code received by kicked clients; they reconnect and re-auth. */ +export const KICK_CLOSE_CODE = 4000; + +export const kickChannel = () => `${YHUB_REDIS_PREFIX}:gw:kick`; + +export const publishKick = async (redis: RedisClient, message: KickMessage) => { + await redis.publish(kickChannel(), JSON.stringify(message)); +}; + +/** + * Every gateway instance subscribes (on a dedicated subscriber connection) + * and closes its matching local sockets — that is what makes reset-connections + * correct with multiple gateway replicas. + */ +export const subscribeKicks = async ( + subscriber: RedisClient, + onKick: (message: KickMessage) => void, +) => { + await subscriber.subscribe(kickChannel(), (raw) => { + try { + const message = JSON.parse(raw) as KickMessage; + if (typeof message.room === 'string') { + onKick(message); + } + } catch { + logger('kick channel: dropping unparsable message', raw); + } + }); +}; diff --git a/src/frontend/servers/yhub/src/rooms/roomLifecycle.ts b/src/frontend/servers/yhub/src/rooms/roomLifecycle.ts new file mode 100644 index 000000000..afc022942 --- /dev/null +++ b/src/frontend/servers/yhub/src/rooms/roomLifecycle.ts @@ -0,0 +1,107 @@ +import { randomUUID } from 'crypto'; + +import { YHub } from '@y/hub'; + +import { YHUB_REDIS_PREFIX } from '@/env'; +import { + ConnectionRegistry, + GatewayConnection, + RedisClient, +} from '@/registry/connectionRegistry'; +import { YHUB_BRANCH, YHUB_ORG } from '@/routes'; +import { logger } from '@/utils'; + +const LOCK_TTL_MS = 5_000; +const LOCK_ACQUIRE_TIMEOUT_MS = 5_000; +const LOCK_RETRY_MS = 50; + +const RELEASE_SCRIPT = `if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end`; + +export const withRedisLock = async ( + redis: RedisClient, + key: string, + fn: () => Promise, +): Promise => { + const token = randomUUID(); + const deadline = Date.now() + LOCK_ACQUIRE_TIMEOUT_MS; + while ( + (await redis.set(key, token, { NX: true, PX: LOCK_TTL_MS })) === null + ) { + if (Date.now() > deadline) { + throw new Error(`Timed out acquiring lock ${key}`); + } + await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS)); + } + try { + return await fn(); + } finally { + await redis + .eval(RELEASE_SCRIPT, { keys: [key], arguments: [token] }) + .catch((error) => logger('lock release error', key, error)); + } +}; + +/** + * Drops everything @y/hub knows about a room: the persisted Postgres rows + * (and any plugin-stored assets) plus the Redis stream backlog. + */ +export const purgeRoom = async ( + yhub: YHub, + redis: RedisClient, + room: string, +) => { + const yroom = { org: YHUB_ORG, docid: room, branch: YHUB_BRANCH }; + // All columns must be included: retrieveDoc only reports references for + // the columns it actually read, and deleteReferences deletes rows by their + // referenced timestamps. + const { references } = await yhub.persistence.retrieveDoc(yroom, { + gc: true, + nongc: true, + contentmap: true, + contentids: true, + references: true, + }); + if (references && references.length > 0) { + await yhub.persistence.deleteReferences(references); + } + await redis.del( + `${YHUB_REDIS_PREFIX}:room:${YHUB_ORG}:${room}:${YHUB_BRANCH}`, + ); + logger('purged room', room, `(${references?.length ?? 0} persisted rows)`); +}; + +export interface RoomLifecycleDeps { + yhub: YHub; + redis: RedisClient; + registry: ConnectionRegistry; +} + +/** + * Disposable-cache semantics (plan §3.5): when the first client (re)opens a + * room, drop whatever @y/hub cached from the previous session — the client + * arrives seeded with Django's content (the source of truth) and re-seeds the + * room through the normal sync. The lock serializes concurrent first joiners: + * whoever wins purges, the loser then sees a non-empty registry and skips. + * + * Residual races (both benign — same Y.Doc lineage merges cleanly): + * - rejoin while a compaction task is still in flight may re-insert last + * session's rows after the purge; + * - ghost registry keys after an instance crash make the room look occupied + * for up to CONN_TTL_SECONDS, skipping the purge. + */ +export const ensureFreshRoomAndRegister = async ( + { yhub, redis, registry }: RoomLifecycleDeps, + conn: GatewayConnection, +) => { + await withRedisLock( + redis, + `${YHUB_REDIS_PREFIX}:gw:purgelock:${conn.room}`, + async () => { + const entries = await registry.listRoom(conn.room); + if (entries.length === 0) { + await purgeRoom(yhub, redis, conn.room); + } + await registry.register(conn); + }, + ); +}; diff --git a/src/frontend/servers/yhub/src/routes.ts b/src/frontend/servers/yhub/src/routes.ts new file mode 100644 index 000000000..01adf3540 --- /dev/null +++ b/src/frontend/servers/yhub/src/routes.ts @@ -0,0 +1,10 @@ +export const routes = { + /** Prefix only — the room UUID is appended as a path segment by y-websocket. */ + COLLABORATION_WS: '/collaboration/ws/', + COLLABORATION_RESET_CONNECTIONS: '/collaboration/api/reset-connections/', + COLLABORATION_GET_CONNECTIONS: '/collaboration/api/get-connections/', +}; + +/** Fixed @y/hub room addressing for docs. */ +export const YHUB_ORG = 'docs'; +export const YHUB_BRANCH = 'main'; diff --git a/src/frontend/servers/yhub/src/servers/appServer.ts b/src/frontend/servers/yhub/src/servers/appServer.ts new file mode 100644 index 000000000..2cf18cdb9 --- /dev/null +++ b/src/frontend/servers/yhub/src/servers/appServer.ts @@ -0,0 +1,60 @@ +import { Server, createServer } from 'http'; + +import * as Sentry from '@sentry/node'; +import express from 'express'; +import { WebSocketServer } from 'ws'; + +import { + createGetConnectionsHandler, + createResetConnectionsHandler, + createUpgradeHandler, +} from '@/handlers'; +import { corsMiddleware, httpSecurity } from '@/middlewares'; +import { RoomLifecycleDeps } from '@/rooms/roomLifecycle'; +import { routes } from '@/routes'; +import { logger } from '@/utils'; + +import '../services/sentry'; + +/** + * The gateway: Express for the HTTP surface, a raw `upgrade` listener for the + * WebSocket endpoint (auth happens before the 101 handshake). + */ +export const initServer = (deps: RoomLifecycleDeps): Server => { + const app = express(); + + app.use(corsMiddleware); + + app.post( + routes.COLLABORATION_RESET_CONNECTIONS, + httpSecurity, + express.json(), + createResetConnectionsHandler(deps.redis), + ); + + app.get( + routes.COLLABORATION_GET_CONNECTIONS, + httpSecurity, + createGetConnectionsHandler(deps.registry), + ); + + Sentry.setupExpressErrorHandler(app); + + app.get('/ping', (req, res) => { + res.status(200).json({ message: 'pong' }); + }); + + app.use((req, res) => { + logger('Invalid route:', req.url); + res.status(403).json({ error: 'Forbidden' }); + }); + + const server = createServer(app); + const wss = new WebSocketServer({ noServer: true }); + const handleUpgrade = createUpgradeHandler({ ...deps, wss }); + server.on('upgrade', (req, socket, head) => { + void handleUpgrade(req, socket, head); + }); + + return server; +}; diff --git a/src/frontend/servers/yhub/src/servers/index.ts b/src/frontend/servers/yhub/src/servers/index.ts new file mode 100644 index 000000000..7d3a6fe94 --- /dev/null +++ b/src/frontend/servers/yhub/src/servers/index.ts @@ -0,0 +1,2 @@ +export * from './appServer'; +export * from './yhubServer'; diff --git a/src/frontend/servers/yhub/src/servers/yhubServer.ts b/src/frontend/servers/yhub/src/servers/yhubServer.ts new file mode 100644 index 000000000..05ef722fd --- /dev/null +++ b/src/frontend/servers/yhub/src/servers/yhubServer.ts @@ -0,0 +1,79 @@ +import { YHub, createYHub } from '@y/hub'; + +import { + POSTGRES_URL, + REDIS_URL, + YHUB_INTERNAL_PORT, + YHUB_MAX_DOC_SIZE, + YHUB_MIN_MESSAGE_LIFETIME, + YHUB_REDIS_PREFIX, + YHUB_TASK_CONCURRENCY, + YHUB_TASK_DEBOUNCE, +} from '@/env'; +import { RedisClient } from '@/registry/connectionRegistry'; +import { createGatewayAuthPlugin } from '@/yhubauth/authPlugin'; + +/** + * Replicates @y/hub's bin/init-db.js: the worker claims compaction tasks from + * a Redis consumer group that must exist before the worker polls it. + */ +export const ensureWorkerStream = async (redis: RedisClient) => { + const name = `${YHUB_REDIS_PREFIX}:worker`; + try { + await redis.xGroupCreate(name, name, '0', { MKSTREAM: true }); + } catch (error) { + if (!(error instanceof Error) || !error.message.includes('BUSYGROUP')) { + throw error; + } + } +}; + +/** Replicates the yhub_ydoc_v1 table creation from @y/hub's bin/init-db.js. */ +export const ensureSchema = async (yhub: YHub) => { + await yhub.persistence.sql` + CREATE TABLE IF NOT EXISTS yhub_ydoc_v1 ( + org text, + docid text, + branch text, + t text, + created INT8, + gcDoc bytea, + nongcDoc bytea, + contentmap bytea, + contentids bytea, + PRIMARY KEY (org,docid,branch,t) + ); + `; +}; + +/** + * Boots the embedded @y/hub: the internal uws WebSocket server on + * YHUB_INTERNAL_PORT (never published outside the container — only the + * gateway dials it, with single-use tokens) and the compaction worker. + */ +export const createEmbeddedYHub = async (): Promise => { + const yhub = await createYHub({ + redis: { + url: REDIS_URL, + prefix: YHUB_REDIS_PREFIX, + ...(YHUB_TASK_DEBOUNCE !== undefined && { + taskDebounce: YHUB_TASK_DEBOUNCE, + }), + ...(YHUB_MIN_MESSAGE_LIFETIME !== undefined && { + minMessageLifetime: YHUB_MIN_MESSAGE_LIFETIME, + }), + }, + postgres: POSTGRES_URL, + persistence: [], + server: { + port: YHUB_INTERNAL_PORT, + auth: createGatewayAuthPlugin(), + // Note: @y/hub 0.2.22 overwrites maxDocSize with 500MB in the YHub + // constructor; kept here for forward compatibility. + ...(YHUB_MAX_DOC_SIZE !== undefined && { maxDocSize: YHUB_MAX_DOC_SIZE }), + }, + worker: { taskConcurrency: YHUB_TASK_CONCURRENCY }, + }); + await ensureSchema(yhub); + return yhub; +}; diff --git a/src/frontend/servers/yhub/src/services/sentry.ts b/src/frontend/servers/yhub/src/services/sentry.ts new file mode 100644 index 000000000..623fb85a3 --- /dev/null +++ b/src/frontend/servers/yhub/src/services/sentry.ts @@ -0,0 +1,12 @@ +import * as Sentry from '@sentry/node'; +import { nodeProfilingIntegration } from '@sentry/profiling-node'; + +import { SENTRY_DSN } from '../env'; + +Sentry.init({ + dsn: SENTRY_DSN, + integrations: [nodeProfilingIntegration()], + tracesSampleRate: 0.1, + profilesSampleRate: 1.0, +}); +Sentry.setTag('application', 'yhub'); diff --git a/src/frontend/servers/yhub/src/start-server.ts b/src/frontend/servers/yhub/src/start-server.ts new file mode 100644 index 000000000..d57ed23da --- /dev/null +++ b/src/frontend/servers/yhub/src/start-server.ts @@ -0,0 +1,25 @@ +import { bootGateway } from '@/boot'; +import { PORT } from '@/env'; + +const main = async () => { + const gateway = await bootGateway(); + gateway.server.listen(PORT, () => + console.log('App listening on port :', PORT), + ); + + let shuttingDown = false; + const shutdown = () => { + if (shuttingDown) { + return; + } + shuttingDown = true; + void gateway.shutdown().then(() => process.exit(0)); + }; + process.on('SIGTERM', shutdown); + process.on('SIGINT', shutdown); +}; + +main().catch((error) => { + console.error('Failed to start yhub server:', error); + process.exit(1); +}); diff --git a/src/frontend/servers/yhub/src/utils.ts b/src/frontend/servers/yhub/src/utils.ts new file mode 100644 index 000000000..2f06d119f --- /dev/null +++ b/src/frontend/servers/yhub/src/utils.ts @@ -0,0 +1,22 @@ +import { validate as uuidValidate, version as uuidVersion } from 'uuid'; + +import { COLLABORATION_LOGGING } from './env'; + +export function logger(...args: unknown[]) { + if (COLLABORATION_LOGGING === 'true') { + console.log(new Date().toISOString(), ' --- ', ...args); + } +} + +export const isValidRoom = (room: string): boolean => + uuidValidate(room) && uuidVersion(room) === 4; + +export const getCookieValue = ( + cookieHeader: string | undefined, + name: string, +): string | undefined => + cookieHeader + ?.split(';') + .map((cookie) => cookie.trim()) + .find((cookie) => cookie.startsWith(`${name}=`)) + ?.split('=')[1]; diff --git a/src/frontend/servers/yhub/src/yhubauth/authPlugin.ts b/src/frontend/servers/yhub/src/yhubauth/authPlugin.ts new file mode 100644 index 000000000..866ba56cc --- /dev/null +++ b/src/frontend/servers/yhub/src/yhubauth/authPlugin.ts @@ -0,0 +1,39 @@ +import { createAuthPlugin } from '@y/hub'; + +import { YHUB_BRANCH, YHUB_ORG } from '@/routes'; +import { logger } from '@/utils'; + +import { TokenClaims, consumeToken } from './internalToken'; + +/** + * Auth plugin for the embedded @y/hub server. The gateway has already + * authenticated the user against Django; it hands the result over through a + * single-use token in the `yauth` query parameter of the internal dial. + */ +export const createGatewayAuthPlugin = () => + createAuthPlugin({ + readAuthInfo: (req) => { + // The uws request is only valid synchronously — read the query before + // any await. consumeToken is a synchronous Map lookup, so this whole + // handler completes before uws invalidates the request. + const token = new URLSearchParams(req.getQuery() ?? '').get('yauth'); + const claims = token ? consumeToken(token) : null; + if (!claims) { + logger('yhub auth: invalid or expired internal token'); + throw new Error('Invalid internal token'); + } + return Promise.resolve(claims); + }, + getAccessType: (authInfo, room) => { + // The token is bound to a single room: a replayed or misrouted token + // cannot open any other document. + if ( + room.org !== YHUB_ORG || + room.branch !== YHUB_BRANCH || + room.docid !== authInfo.room + ) { + return Promise.resolve(null); + } + return Promise.resolve(authInfo.canEdit ? 'rw' : 'r'); + }, + }); diff --git a/src/frontend/servers/yhub/src/yhubauth/internalToken.ts b/src/frontend/servers/yhub/src/yhubauth/internalToken.ts new file mode 100644 index 000000000..b8b11dcfe --- /dev/null +++ b/src/frontend/servers/yhub/src/yhubauth/internalToken.ts @@ -0,0 +1,50 @@ +import { randomBytes } from 'crypto'; + +import { AUTH_TOKEN_TTL_MS } from '@/env'; + +/** + * Claims handed from the gateway to the embedded @y/hub server. `userid` is + * required by @y/hub (used for content attributions); `room` binds the token + * to a single document. + */ +export interface TokenClaims { + userid: string; + room: string; + canEdit: boolean; +} + +const tokens = new Map(); + +const SWEEP_INTERVAL_MS = 30_000; +setInterval(() => sweepExpiredTokens(), SWEEP_INTERVAL_MS).unref(); + +export const sweepExpiredTokens = (now = Date.now()) => { + for (const [token, entry] of tokens) { + if (entry.expiresAt < now) { + tokens.delete(token); + } + } +}; + +export const issueToken = (claims: TokenClaims): string => { + const token = randomBytes(32).toString('base64url'); + tokens.set(token, { claims, expiresAt: Date.now() + AUTH_TOKEN_TTL_MS }); + return token; +}; + +/** + * Single use: the token is deleted on first read. The lookup is synchronous + * on purpose — it lets the @y/hub auth plugin satisfy the uws constraint of + * reading the request before any await. + */ +export const consumeToken = (token: string): TokenClaims | null => { + const entry = tokens.get(token); + if (!entry) { + return null; + } + tokens.delete(token); + if (entry.expiresAt < Date.now()) { + return null; + } + return entry.claims; +}; diff --git a/src/frontend/servers/yhub/tsconfig.build.json b/src/frontend/servers/yhub/tsconfig.build.json new file mode 100644 index 000000000..64ed03649 --- /dev/null +++ b/src/frontend/servers/yhub/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + }, + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist", "__tests__"], +} diff --git a/src/frontend/servers/yhub/tsconfig.json b/src/frontend/servers/yhub/tsconfig.json new file mode 100644 index 000000000..3b9a9bff0 --- /dev/null +++ b/src/frontend/servers/yhub/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": false, + "outDir": "./dist", + "paths": { + "@/*": ["./src/*"] + } + }, + "tsc-alias": { + "resolveFullPaths": true, + "verbose": false + }, + "include": ["**/*.ts", "**/*.mjs"], + "exclude": ["node_modules"] +} diff --git a/src/frontend/servers/yhub/vitest.config.mts b/src/frontend/servers/yhub/vitest.config.mts new file mode 100644 index 000000000..765285378 --- /dev/null +++ b/src/frontend/servers/yhub/vitest.config.mts @@ -0,0 +1,11 @@ +import { URL, fileURLToPath } from 'url'; + +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +}); diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index e619d7bb3..e157286bb 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -38,7 +38,7 @@ "@ai-sdk/provider" "3.0.10" "@ai-sdk/provider-utils" "4.0.27" -"@ai-sdk/provider-utils@^4.0.2", "@ai-sdk/provider-utils@4.0.15": +"@ai-sdk/provider-utils@4.0.15", "@ai-sdk/provider-utils@^4.0.2": version "4.0.15" resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.15.tgz" integrity sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w== @@ -155,7 +155,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz" integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.0 || ^8.0.0-0", "@babel/core@^7.11.0 || ^8.0.0-beta.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@>=7.0.0-beta.0 <8": +"@babel/core@^7.0.0", "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4": version "7.28.4" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz" integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== @@ -1136,12 +1136,7 @@ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz" integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== -"@babel/runtime@^7.29.2": - version "7.29.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" - integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== - -"@babel/runtime@^7.7.2": +"@babel/runtime@^7.29.2", "@babel/runtime@^7.7.2": version "7.29.2" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== @@ -1490,7 +1485,7 @@ dependencies: tslib "^2.0.0" -"@dnd-kit/core@^6.3.0", "@dnd-kit/core@6.3.1": +"@dnd-kit/core@6.3.1": version "6.3.1" resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz" integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ== @@ -1527,7 +1522,51 @@ resolved "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz" integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== -"@emoji-mart/data@^1.2.1", "@emoji-mart/data@1.2.1": +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + +"@emnapi/core@^1.4.3": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.0.tgz#8a655042dbbb10d0266670c9903c34a7001c705b" + integrity sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q== + dependencies: + "@emnapi/wasi-threads" "1.2.2" + tslib "^2.4.0" + +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.7.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.0.tgz#ce16b3674ff7266bbf50f9668bde8a04f3014d4e" + integrity sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz#4c93becf5bfa3b13d1bbdcc06aee38321ad8139a" + integrity sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA== + dependencies: + tslib "^2.4.0" + +"@emoji-mart/data@1.2.1", "@emoji-mart/data@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz" integrity sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw== @@ -1637,11 +1676,136 @@ resolved "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz" integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== +"@esbuild/aix-ppc64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz#2ae33300598132cc4cf580dbbb28d30fed3c5c49" + integrity sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg== + +"@esbuild/android-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz#927708b3db5d739d6cb7709136924cc81bec9b03" + integrity sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ== + +"@esbuild/android-arm@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.11.tgz#571f94e7f4068957ec4c2cfb907deae3d01b55ae" + integrity sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg== + +"@esbuild/android-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.11.tgz#8a3bf5cae6c560c7ececa3150b2bde76e0fb81e6" + integrity sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g== + +"@esbuild/darwin-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz#0a678c4ac4bf8717e67481e1a797e6c152f93c84" + integrity sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w== + +"@esbuild/darwin-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz#70f5e925a30c8309f1294d407a5e5e002e0315fe" + integrity sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ== + +"@esbuild/freebsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz#4ec1db687c5b2b78b44148025da9632397553e8a" + integrity sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA== + +"@esbuild/freebsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz#4c81abd1b142f1e9acfef8c5153d438ca53f44bb" + integrity sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw== + +"@esbuild/linux-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz#69517a111acfc2b93aa0fb5eaeb834c0202ccda5" + integrity sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA== + +"@esbuild/linux-arm@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz#58dac26eae2dba0fac5405052b9002dac088d38f" + integrity sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw== + +"@esbuild/linux-ia32@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz#b89d4efe9bdad46ba944f0f3b8ddd40834268c2b" + integrity sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw== + +"@esbuild/linux-loong64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz#11f603cb60ad14392c3f5c94d64b3cc8b630fbeb" + integrity sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw== + +"@esbuild/linux-mips64el@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz#b7d447ff0676b8ab247d69dac40a5cf08e5eeaf5" + integrity sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ== + +"@esbuild/linux-ppc64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz#b3a28ed7cc252a61b07ff7c8fd8a984ffd3a2f74" + integrity sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw== + +"@esbuild/linux-riscv64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz#ce75b08f7d871a75edcf4d2125f50b21dc9dc273" + integrity sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww== + +"@esbuild/linux-s390x@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz#cd08f6c73b6b6ff9ccdaabbd3ff6ad3dca99c263" + integrity sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw== + "@esbuild/linux-x64@0.25.11": version "0.25.11" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz" integrity sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ== +"@esbuild/netbsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz#b4c767082401e3a4e8595fe53c47cd7f097c8077" + integrity sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg== + +"@esbuild/netbsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz#f2a930458ed2941d1f11ebc34b9c7d61f7a4d034" + integrity sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A== + +"@esbuild/openbsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz#b4ae93c75aec48bc1e8a0154957a05f0641f2dad" + integrity sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg== + +"@esbuild/openbsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz#b42863959c8dcf9b01581522e40012d2c70045e2" + integrity sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw== + +"@esbuild/openharmony-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz#b2e717141c8fdf6bddd4010f0912e6b39e1640f1" + integrity sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ== + +"@esbuild/sunos-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz#9fbea1febe8778927804828883ec0f6dd80eb244" + integrity sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA== + +"@esbuild/win32-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz#501539cedb24468336073383989a7323005a8935" + integrity sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q== + +"@esbuild/win32-ia32@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz#8ac7229aa82cef8f16ffb58f1176a973a7a15343" + integrity sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA== + +"@esbuild/win32-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz#5ecda6f3fe138b7e456f4e429edde33c823f392f" + integrity sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA== + "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" @@ -1991,16 +2155,105 @@ resolved "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz" integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw== +"@img/sharp-darwin-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz#6e0732dcade126b6670af7aa17060b926835ea86" + integrity sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.2.4" + +"@img/sharp-darwin-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz#19bc1dd6eba6d5a96283498b9c9f401180ee9c7b" + integrity sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.2.4" + +"@img/sharp-libvips-darwin-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz#2894c0cb87d42276c3889942e8e2db517a492c43" + integrity sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g== + +"@img/sharp-libvips-darwin-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz#e63681f4539a94af9cd17246ed8881734386f8cc" + integrity sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg== + +"@img/sharp-libvips-linux-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz#b1b288b36864b3bce545ad91fa6dadcf1a4ad318" + integrity sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw== + +"@img/sharp-libvips-linux-arm@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz#b9260dd1ebe6f9e3bdbcbdcac9d2ac125f35852d" + integrity sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A== + +"@img/sharp-libvips-linux-ppc64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz#4b83ecf2a829057222b38848c7b022e7b4d07aa7" + integrity sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA== + +"@img/sharp-libvips-linux-riscv64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz#880b4678009e5a2080af192332b00b0aaf8a48de" + integrity sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA== + +"@img/sharp-libvips-linux-s390x@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz#74f343c8e10fad821b38f75ced30488939dc59ec" + integrity sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ== + "@img/sharp-libvips-linux-x64@1.2.4": version "1.2.4" resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz" integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw== +"@img/sharp-libvips-linuxmusl-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz#c8d6b48211df67137541007ee8d1b7b1f8ca8e06" + integrity sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw== + "@img/sharp-libvips-linuxmusl-x64@1.2.4": version "1.2.4" resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz" integrity sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg== +"@img/sharp-linux-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz#7aa7764ef9c001f15e610546d42fce56911790cc" + integrity sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.2.4" + +"@img/sharp-linux-arm@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz#5fb0c3695dd12522d39c3ff7a6bc816461780a0d" + integrity sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.2.4" + +"@img/sharp-linux-ppc64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz#9c213a81520a20caf66978f3d4c07456ff2e0813" + integrity sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA== + optionalDependencies: + "@img/sharp-libvips-linux-ppc64" "1.2.4" + +"@img/sharp-linux-riscv64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz#cdd28182774eadbe04f62675a16aabbccb833f60" + integrity sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw== + optionalDependencies: + "@img/sharp-libvips-linux-riscv64" "1.2.4" + +"@img/sharp-linux-s390x@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz#93eac601b9f329bb27917e0e19098c722d630df7" + integrity sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.2.4" + "@img/sharp-linux-x64@0.34.5": version "0.34.5" resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz" @@ -2008,6 +2261,13 @@ optionalDependencies: "@img/sharp-libvips-linux-x64" "1.2.4" +"@img/sharp-linuxmusl-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz#d6515ee971bb62f73001a4829b9d865a11b77086" + integrity sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + "@img/sharp-linuxmusl-x64@0.34.5": version "0.34.5" resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz" @@ -2015,6 +2275,35 @@ optionalDependencies: "@img/sharp-libvips-linuxmusl-x64" "1.2.4" +"@img/sharp-wasm32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz#2f15803aa626f8c59dd7c9d0bbc766f1ab52cfa0" + integrity sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw== + dependencies: + "@emnapi/runtime" "^1.7.0" + +"@img/sharp-win32-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz#3706e9e3ac35fddfc1c87f94e849f1b75307ce0a" + integrity sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g== + +"@img/sharp-win32-ia32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz#0b71166599b049e032f085fb9263e02f4e4788de" + integrity sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg== + +"@img/sharp-win32-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8" + integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw== + +"@internationalized/date@3.12.0", "@internationalized/date@^3.12.0": + version "3.12.0" + resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.12.0.tgz" + integrity sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ== + dependencies: + "@swc/helpers" "^0.5.0" + "@internationalized/date@^3.10.0": version "3.10.0" resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz" @@ -2022,13 +2311,6 @@ dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/date@^3.12.0", "@internationalized/date@3.12.0": - version "3.12.0" - resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.12.0.tgz" - integrity sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ== - dependencies: - "@swc/helpers" "^0.5.0" - "@internationalized/date@^3.12.1": version "3.12.1" resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.12.1.tgz" @@ -2313,7 +2595,7 @@ jest-haste-map "30.4.1" slash "^3.0.0" -"@jest/transform@^29.0.0 || ^30.0.0", "@jest/transform@30.4.1": +"@jest/transform@30.4.1": version "30.4.1" resolved "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz" integrity sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ== @@ -2333,19 +2615,6 @@ slash "^3.0.0" write-file-atomic "^5.0.1" -"@jest/types@^29.0.0 || ^30.0.0", "@jest/types@30.4.1": - version "30.4.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz" - integrity sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ== - dependencies: - "@jest/pattern" "30.4.0" - "@jest/schemas" "30.4.1" - "@types/istanbul-lib-coverage" "^2.0.6" - "@types/istanbul-reports" "^3.0.4" - "@types/node" "*" - "@types/yargs" "^17.0.33" - chalk "^4.1.2" - "@jest/types@30.2.0": version "30.2.0" resolved "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz" @@ -2359,6 +2628,19 @@ "@types/yargs" "^17.0.33" chalk "^4.1.2" +"@jest/types@30.4.1": + version "30.4.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz" + integrity sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ== + dependencies: + "@jest/pattern" "30.4.0" + "@jest/schemas" "30.4.1" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" + "@types/node" "*" + "@types/yargs" "^17.0.33" + chalk "^4.1.2" + "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" @@ -2393,14 +2675,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" @@ -2409,6 +2683,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@keyv/bigmap@^1.3.0": version "1.3.1" resolved "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz" @@ -2427,7 +2709,7 @@ resolved "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.1.0.tgz" integrity sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw== -"@mantine/core@^8.3.11 || ^9.0.2", "@mantine/core@9.2.1": +"@mantine/core@9.2.1": version "9.2.1" resolved "https://registry.npmjs.org/@mantine/core/-/core-9.2.1.tgz" integrity sha512-CicPg9i2dM2pGp1jj+dMiR/63OFDsPjgJke4v5+0nbfJ+C7gn4C+7ltrp4RIETDMZHcj0fFuDRG0qtbiyBxvWA== @@ -2438,11 +2720,116 @@ react-remove-scroll "^2.7.2" type-fest "^5.6.0" -"@mantine/hooks@^8.3.11 || ^9.0.2", "@mantine/hooks@9.2.1": +"@mantine/hooks@9.2.1": version "9.2.1" resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.2.1.tgz" integrity sha512-IX/ztVG9eWmQTRsN7G8odyW4JckNvN8qv5A2ULzXyazjtAKLuaUpuMz0c6XhRp10J0g4bVfV3rhrTgWeImqxqg== +"@napi-rs/canvas-android-arm64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.100.tgz#b7c68b91d57702a5fc523fa82de72ea741e6766e" + integrity sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ== + +"@napi-rs/canvas-android-arm64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz#2779ca5c8aaeb46c85eb72d29f1eb34efd46fb45" + integrity sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ== + +"@napi-rs/canvas-android-arm64@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.90.tgz#c5f2a17e68395f8c695a90bff4356dbdce4bc5d3" + integrity sha512-3JBULVF+BIgr7yy7Rf8UjfbkfFx4CtXrkJFD1MDgKJ83b56o0U9ciT8ZGTCNmwWkzu8RbNKlyqPP3KYRG88y7Q== + +"@napi-rs/canvas-darwin-arm64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.100.tgz#d1686fa6ca699b07640efa5f45425db0a4e725e2" + integrity sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A== + +"@napi-rs/canvas-darwin-arm64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b" + integrity sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ== + +"@napi-rs/canvas-darwin-arm64@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.90.tgz#6141f9dcaffebaa7c5ca3cbdcc1664298bd817d3" + integrity sha512-L8XVTXl+8vd8u7nPqcX77NyG5RuFdVsJapQrKV9WE3jBayq1aSMht/IH7Dwiz/RNJ86E5ZSg9pyUPFIlx52PZA== + +"@napi-rs/canvas-darwin-x64@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.100.tgz#92978fd7eca21f7f1b59bd13ba3ce7c0e7c879a1" + integrity sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw== + +"@napi-rs/canvas-darwin-x64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978" + integrity sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA== + +"@napi-rs/canvas-darwin-x64@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.90.tgz#4f35e54b33ccd437d577e91075d4af1a00f042a9" + integrity sha512-h0ukhlnGhacbn798VWYTQZpf6JPDzQYaow+vtQ2Fat7j7ImDdpg6tfeqvOTO1r8wS+s+VhBIFITC7aA1Aik0ZQ== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.100.tgz#95f9892e1d5a8274871d8ee406374e9ef692bd9f" + integrity sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789" + integrity sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.90.tgz#1ab8a389c853f4a1c48d37ad11aca3ccbb620165" + integrity sha512-JCvTl99b/RfdBtgftqrf+5UNF7GIbp7c5YBFZ+Bd6++4Y3phaXG/4vD9ZcF1bw1P4VpALagHmxvodHuQ9/TfTg== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.100.tgz#6b2b7c4bb016b8f5308115ac9ae909df4967a94b" + integrity sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d" + integrity sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.90.tgz#f4cb9d795e7b6b4cda6846a3e90da96dfb9f2bb3" + integrity sha512-vbWFp8lrP8NIM5L4zNOwnsqKIkJo0+GIRUDcLFV9XEJCptCc1FY6/tM02PT7GN4PBgochUPB1nBHdji6q3ieyQ== + +"@napi-rs/canvas-linux-arm64-musl@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.100.tgz#48cf6342543e4f87cf1f8e9b1aaa19ad85bcc178" + integrity sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ== + +"@napi-rs/canvas-linux-arm64-musl@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3" + integrity sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg== + +"@napi-rs/canvas-linux-arm64-musl@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.90.tgz#233160e64397370d84068c258cf3ee927f6d8730" + integrity sha512-8Bc0BgGEeOaux4EfIfNzcRRw0JE+lO9v6RWQFCJNM9dJFE4QJffTf88hnmbOaI6TEMpgWOKipbha3dpIdUqb/g== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.100.tgz#71b011007b03755c834a961735302c5837b041da" + integrity sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8" + integrity sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.90.tgz#9d8dbecc8653cd7611ab0fd241c3909fee18a423" + integrity sha512-0iiVDG5IH+gJb/YUrY/pRdbsjcgvwUmeckL/0gShWAA7004ygX2ST69M1wcfyxXrzFYjdF8S/Sn6aCAeBi89XQ== + "@napi-rs/canvas-linux-x64-gnu@0.1.100": version "0.1.100" resolved "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.100.tgz" @@ -2473,6 +2860,47 @@ resolved "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.90.tgz" integrity sha512-o6QgS10gAS4vvELGDOOWYfmERXtkVRYFWBCjomILWfMgCvBVutn8M97fsMW5CrEuJI8YuxuJ7U+/DQ9oG93vDA== +"@napi-rs/canvas-win32-arm64-msvc@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.100.tgz#8a1728b455dd17965f95c0bfdf6753be8c5851c0" + integrity sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw== + +"@napi-rs/canvas-win32-arm64-msvc@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.90.tgz#293325cbdad36a40654760699b87c59b9003cae7" + integrity sha512-2UHO/DC1oyuSjeCAhHA0bTD9qsg58kknRqjJqRfvIEFtdqdtNTcWXMCT9rQCuJ8Yx5ldhyh2SSp7+UDqD2tXZQ== + +"@napi-rs/canvas-win32-x64-msvc@0.1.100": + version "0.1.100" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.100.tgz#1e52883f8784ffdbe52dc2d47b05a0886aa6e9cf" + integrity sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA== + +"@napi-rs/canvas-win32-x64-msvc@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a" + integrity sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg== + +"@napi-rs/canvas-win32-x64-msvc@0.1.90": + version "0.1.90" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.90.tgz#57601aa9be595693168d27fb0cd0c4060284c668" + integrity sha512-48CxEbzua5BP4+OumSZdi3+9fNiRO8cGNBlO2bKwx1PoyD1R2AXzPtqd/no1f1uSl0W2+ihOO1v3pqT3USbmgQ== + +"@napi-rs/canvas@0.1.80": + version "0.1.80" + resolved "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz" + integrity sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww== + optionalDependencies: + "@napi-rs/canvas-android-arm64" "0.1.80" + "@napi-rs/canvas-darwin-arm64" "0.1.80" + "@napi-rs/canvas-darwin-x64" "0.1.80" + "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.80" + "@napi-rs/canvas-linux-arm64-gnu" "0.1.80" + "@napi-rs/canvas-linux-arm64-musl" "0.1.80" + "@napi-rs/canvas-linux-riscv64-gnu" "0.1.80" + "@napi-rs/canvas-linux-x64-gnu" "0.1.80" + "@napi-rs/canvas-linux-x64-musl" "0.1.80" + "@napi-rs/canvas-win32-x64-msvc" "0.1.80" + "@napi-rs/canvas@^0.1.71": version "0.1.100" resolved "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.100.tgz" @@ -2507,21 +2935,21 @@ "@napi-rs/canvas-win32-arm64-msvc" "0.1.90" "@napi-rs/canvas-win32-x64-msvc" "0.1.90" -"@napi-rs/canvas@0.1.80": - version "0.1.80" - resolved "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz" - integrity sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww== - optionalDependencies: - "@napi-rs/canvas-android-arm64" "0.1.80" - "@napi-rs/canvas-darwin-arm64" "0.1.80" - "@napi-rs/canvas-darwin-x64" "0.1.80" - "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.80" - "@napi-rs/canvas-linux-arm64-gnu" "0.1.80" - "@napi-rs/canvas-linux-arm64-musl" "0.1.80" - "@napi-rs/canvas-linux-riscv64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-musl" "0.1.80" - "@napi-rs/canvas-win32-x64-msvc" "0.1.80" +"@napi-rs/wasm-runtime@^0.2.11": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" + integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.10.0" + +"@napi-rs/wasm-runtime@^1.1.4": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz#cccd6ebc40b991dea6936f9126b1b8155b6c4c95" + integrity sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q== + dependencies: + "@tybys/wasm-util" "^0.10.2" "@next/env@16.2.6": version "16.2.6" @@ -2535,6 +2963,26 @@ dependencies: fast-glob "3.3.1" +"@next/swc-darwin-arm64@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz#0e19055594fbd2d198ce95cf5842bdbe57235d4e" + integrity sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg== + +"@next/swc-darwin-x64@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz#487086280b56017bb547f5975ef1a3d6235a070f" + integrity sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ== + +"@next/swc-linux-arm64-gnu@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz#b28ffbc31ee527a3ad48f29c2fd7b7f75bbdf180" + integrity sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w== + +"@next/swc-linux-arm64-musl@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz#d2eac5600e7083527669fa8cb8758efbbf9c8210" + integrity sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA== + "@next/swc-linux-x64-gnu@16.2.6": version "16.2.6" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz" @@ -2545,13 +2993,25 @@ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz" integrity sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g== -"@noble/hashes@^1.8.0 || ^2.0.0", "@noble/hashes@^2.0.1": +"@next/swc-win32-arm64-msvc@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz#8a6dfec005364e1cf4fa1724c3d7fa0093660406" + integrity sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg== + +"@next/swc-win32-x64-msvc@16.2.6": + version "16.2.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz#4fb656ccfcf60cbf8ffedb40fc1b625987c82742" + integrity sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA== + +"@noble/hashes@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz" integrity sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw== "@nodable/entities@^2.1.0": version "2.1.1" + resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-2.1.1.tgz#ce41931e9b72606d7f0598d665e46e889285d78a" + integrity sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2561,7 +3021,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2579,13 +3039,6 @@ resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@opentelemetry/api-logs@^0.208.0", "@opentelemetry/api-logs@0.208.0": - version "0.208.0" - resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz" - integrity sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg== - dependencies: - "@opentelemetry/api" "^1.3.0" - "@opentelemetry/api-logs@0.207.0": version "0.207.0" resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz" @@ -2593,6 +3046,13 @@ dependencies: "@opentelemetry/api" "^1.3.0" +"@opentelemetry/api-logs@0.208.0", "@opentelemetry/api-logs@^0.208.0": + version "0.208.0" + resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz" + integrity sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg== + dependencies: + "@opentelemetry/api" "^1.3.0" + "@opentelemetry/api-logs@0.212.0": version "0.212.0" resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz" @@ -2607,35 +3067,23 @@ dependencies: "@opentelemetry/api" "^1.3.0" -"@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9.0", "@opentelemetry/api@^1.9.1", "@opentelemetry/api@>=1 <2", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0": - version "1.9.1" - resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz" - integrity sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q== - -"@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@>=1.9.0 <1.10.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" - integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== - "@opentelemetry/api@1.9.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== -"@opentelemetry/core@^1.30.1 || ^2.1.0", "@opentelemetry/core@^2.0.0", "@opentelemetry/core@2.2.0": +"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.0", "@opentelemetry/api@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz" + integrity sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q== + +"@opentelemetry/core@2.2.0", "@opentelemetry/core@^2.0.0": version "2.2.0" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz" integrity sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw== dependencies: "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/core@^2.6.1": - version "2.7.1" - resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz" - integrity sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw== - dependencies: - "@opentelemetry/semantic-conventions" "^1.29.0" - "@opentelemetry/core@2.6.1": version "2.6.1" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz" @@ -2643,7 +3091,7 @@ dependencies: "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/core@2.7.1": +"@opentelemetry/core@2.7.1", "@opentelemetry/core@^2.6.1": version "2.7.1" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz" integrity sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw== @@ -2777,15 +3225,6 @@ "@opentelemetry/instrumentation" "^0.214.0" "@opentelemetry/semantic-conventions" "^1.33.0" -"@opentelemetry/instrumentation-mysql@0.60.0": - version "0.60.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.60.0.tgz" - integrity sha512-08pO8GFPEIz2zquKDGteBZDNmwketdgH8hTe9rVYgW9kCJXq1Psj3wPQGx+VaX4ZJKCfPeoLMYup9+cxHvZyVQ== - dependencies: - "@opentelemetry/instrumentation" "^0.214.0" - "@opentelemetry/semantic-conventions" "^1.33.0" - "@types/mysql" "2.15.27" - "@opentelemetry/instrumentation-mysql2@0.60.0": version "0.60.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.60.0.tgz" @@ -2795,6 +3234,15 @@ "@opentelemetry/semantic-conventions" "^1.33.0" "@opentelemetry/sql-common" "^0.41.2" +"@opentelemetry/instrumentation-mysql@0.60.0": + version "0.60.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.60.0.tgz" + integrity sha512-08pO8GFPEIz2zquKDGteBZDNmwketdgH8hTe9rVYgW9kCJXq1Psj3wPQGx+VaX4ZJKCfPeoLMYup9+cxHvZyVQ== + dependencies: + "@opentelemetry/instrumentation" "^0.214.0" + "@opentelemetry/semantic-conventions" "^1.33.0" + "@types/mysql" "2.15.27" + "@opentelemetry/instrumentation-pg@0.66.0": version "0.66.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.66.0.tgz" @@ -2816,6 +3264,15 @@ "@opentelemetry/semantic-conventions" "^1.33.0" "@types/tedious" "^4.0.14" +"@opentelemetry/instrumentation@0.214.0", "@opentelemetry/instrumentation@^0.214.0": + version "0.214.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz" + integrity sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w== + dependencies: + "@opentelemetry/api-logs" "0.214.0" + import-in-the-middle "^3.0.0" + require-in-the-middle "^8.0.0" + "@opentelemetry/instrumentation@^0.207.0": version "0.207.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.207.0.tgz" @@ -2834,15 +3291,6 @@ import-in-the-middle "^2.0.6" require-in-the-middle "^8.0.0" -"@opentelemetry/instrumentation@^0.214.0", "@opentelemetry/instrumentation@>=0.57.1 <1", "@opentelemetry/instrumentation@0.214.0": - version "0.214.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz" - integrity sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w== - dependencies: - "@opentelemetry/api-logs" "0.214.0" - import-in-the-middle "^3.0.0" - require-in-the-middle "^8.0.0" - "@opentelemetry/otlp-exporter-base@0.208.0": version "0.208.0" resolved "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.208.0.tgz" @@ -2864,7 +3312,7 @@ "@opentelemetry/sdk-trace-base" "2.2.0" protobufjs "^7.3.0" -"@opentelemetry/resources@^2.2.0", "@opentelemetry/resources@2.2.0": +"@opentelemetry/resources@2.2.0", "@opentelemetry/resources@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz" integrity sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A== @@ -2872,7 +3320,7 @@ "@opentelemetry/core" "2.2.0" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/resources@^2.6.1": +"@opentelemetry/resources@2.7.1", "@opentelemetry/resources@^2.6.1": version "2.7.1" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz" integrity sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ== @@ -2880,15 +3328,7 @@ "@opentelemetry/core" "2.7.1" "@opentelemetry/semantic-conventions" "^1.29.0" -"@opentelemetry/resources@2.7.1": - version "2.7.1" - resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz" - integrity sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ== - dependencies: - "@opentelemetry/core" "2.7.1" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/sdk-logs@^0.208.0", "@opentelemetry/sdk-logs@0.208.0": +"@opentelemetry/sdk-logs@0.208.0", "@opentelemetry/sdk-logs@^0.208.0": version "0.208.0" resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz" integrity sha512-QlAyL1jRpOeaqx7/leG1vJMp84g0xKP6gJmfELBpnI4O/9xPX+Hu5m1POk9Kl+veNkyth5t19hRlN6tNY1sjbA== @@ -2905,15 +3345,6 @@ "@opentelemetry/core" "2.2.0" "@opentelemetry/resources" "2.2.0" -"@opentelemetry/sdk-trace-base@^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base@^2.6.1": - version "2.7.1" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz" - integrity sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw== - dependencies: - "@opentelemetry/core" "2.7.1" - "@opentelemetry/resources" "2.7.1" - "@opentelemetry/semantic-conventions" "^1.29.0" - "@opentelemetry/sdk-trace-base@2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz" @@ -2923,31 +3354,30 @@ "@opentelemetry/resources" "2.2.0" "@opentelemetry/semantic-conventions" "^1.29.0" +"@opentelemetry/sdk-trace-base@^2.6.1": + version "2.7.1" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz" + integrity sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw== + dependencies: + "@opentelemetry/core" "2.7.1" + "@opentelemetry/resources" "2.7.1" + "@opentelemetry/semantic-conventions" "^1.29.0" + "@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@^1.29.0", "@opentelemetry/semantic-conventions@^1.30.0", "@opentelemetry/semantic-conventions@^1.33.1", "@opentelemetry/semantic-conventions@^1.34.0": version "1.37.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz" integrity sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA== -"@opentelemetry/semantic-conventions@^1.28.0": +"@opentelemetry/semantic-conventions@^1.28.0", "@opentelemetry/semantic-conventions@^1.40.0": version "1.40.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz" integrity sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw== -"@opentelemetry/semantic-conventions@^1.33.0": +"@opentelemetry/semantic-conventions@^1.33.0", "@opentelemetry/semantic-conventions@^1.36.0": version "1.38.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz" integrity sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg== -"@opentelemetry/semantic-conventions@^1.36.0": - version "1.38.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz" - integrity sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg== - -"@opentelemetry/semantic-conventions@^1.39.0", "@opentelemetry/semantic-conventions@^1.40.0": - version "1.40.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz" - integrity sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw== - "@opentelemetry/sql-common@^0.41.2": version "0.41.2" resolved "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz" @@ -2975,6 +3405,8 @@ "@pinojs/redact@^0.4.0": version "0.4.0" + resolved "https://registry.yarnpkg.com/@pinojs/redact/-/redact-0.4.0.tgz#c3de060dd12640dcc838516aa2a6803cc7b2e9d6" + integrity sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg== "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -2986,7 +3418,7 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz" integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== -"@playwright/test@^1.51.1", "@playwright/test@1.60.0": +"@playwright/test@1.60.0": version "1.60.0" resolved "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz" integrity sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag== @@ -3075,7 +3507,7 @@ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz" integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== -"@radix-ui/react-compose-refs@^1.1.1", "@radix-ui/react-compose-refs@1.1.2": +"@radix-ui/react-compose-refs@1.1.2", "@radix-ui/react-compose-refs@^1.1.1": version "1.1.2" resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== @@ -3130,7 +3562,7 @@ "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" -"@radix-ui/react-id@^1.1.0", "@radix-ui/react-id@1.1.1": +"@radix-ui/react-id@1.1.1", "@radix-ui/react-id@^1.1.0": version "1.1.1" resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz" integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== @@ -3153,7 +3585,7 @@ "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-layout-effect" "1.1.1" -"@radix-ui/react-primitive@^2.0.0", "@radix-ui/react-primitive@^2.0.2", "@radix-ui/react-primitive@2.1.3": +"@radix-ui/react-primitive@2.1.3", "@radix-ui/react-primitive@^2.0.0", "@radix-ui/react-primitive@^2.0.2": version "2.1.3" resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== @@ -3244,7 +3676,7 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" -"@react-aria/calendar@^3.9.5", "@react-aria/calendar@3.9.5": +"@react-aria/calendar@3.9.5", "@react-aria/calendar@^3.9.5": version "3.9.5" resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.9.5.tgz" integrity sha512-k0kvceYdZZu+DoeqephtlmIvh1CxqdFyoN52iqVzTz9O0pe5Xfhq7zxPGbeCp4pC61xzp8Lu/6uFA/YNfQQNag== @@ -3331,7 +3763,7 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" -"@react-aria/datepicker@^3.16.1", "@react-aria/datepicker@3.16.1": +"@react-aria/datepicker@3.16.1", "@react-aria/datepicker@^3.16.1": version "3.16.1" resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.16.1.tgz" integrity sha512-6BltCVWt09yefTkGjb2gViGCwoddx9HKJiZbY9u6Es/Q+VhwNJQRtczbnZ3K32p262hIknukNf/5nZaCOI1AKA== @@ -3452,7 +3884,7 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.12.16", "@react-aria/i18n@3.12.16": +"@react-aria/i18n@3.12.16", "@react-aria/i18n@^3.12.16": version "3.12.16" resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.16.tgz" integrity sha512-Km2CAz6MFQOUEaattaW+2jBdWOHUF8WX7VQoNbjlqElCP58nSaqi9yxTWUDRhAcn8/xFUnkFh4MFweNgtrHuEA== @@ -3522,13 +3954,6 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" -"@react-aria/live-announcer@^3.4.4": - version "3.4.4" - resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.4.tgz" - integrity sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA== - dependencies: - "@swc/helpers" "^0.5.0" - "@react-aria/live-announcer@3.5.0": version "3.5.0" resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.5.0.tgz" @@ -3537,6 +3962,13 @@ "@swc/helpers" "^0.5.0" react-aria "3.48.0" +"@react-aria/live-announcer@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.4.tgz" + integrity sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA== + dependencies: + "@swc/helpers" "^0.5.0" + "@react-aria/menu@^3.21.0": version "3.21.0" resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.21.0.tgz" @@ -3997,7 +4429,7 @@ parse-svg-path "^0.1.2" svg-arc-to-cubic-bezier "^3.2.0" -"@react-pdf/renderer@^2.0.2 || ^3.0.0 || ^4.0.0", "@react-pdf/renderer@^4.3.0", "@react-pdf/renderer@4.3.1": +"@react-pdf/renderer@4.3.1", "@react-pdf/renderer@^4.3.0": version "4.3.1" resolved "https://registry.npmjs.org/@react-pdf/renderer/-/renderer-4.3.1.tgz" integrity sha512-dPKHiwGTaOsKqNWCHPYYrx8CDfAGsUnV4tvRsEu0VPGxuot1AOq/M+YgfN/Pb+MeXCTe2/lv6NvA8haUtj3tsA== @@ -4016,7 +4448,7 @@ prop-types "^15.6.2" queue "^6.0.1" -"@react-pdf/stylesheet@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "@react-pdf/stylesheet@^6.1.2": +"@react-pdf/stylesheet@^6.1.2": version "6.1.2" resolved "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-6.1.2.tgz" integrity sha512-E3ftGRYUQGKiN3JOgtGsLDo0hGekA6dmkmi/MYACytmPTKxQRBSO3126MebmCq+t1rgU9uRlREIEawJ+8nzSbw== @@ -4055,6 +4487,17 @@ "@react-stately/utils" "^3.11.0" "@swc/helpers" "^0.5.0" +"@react-stately/calendar@3.9.3", "@react-stately/calendar@^3.9.3": + version "3.9.3" + resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.3.tgz" + integrity sha512-uw7fCZXoypSBBUsVkbNvJMQWTihZReRbyLIGG3o/ZM630N3OCZhb/h4Uxke4pNu7n527H0V1bAnZgAldIzOYqg== + dependencies: + "@internationalized/date" "^3.12.0" + "@react-stately/utils" "^3.11.0" + "@react-types/calendar" "^3.8.3" + "@react-types/shared" "^3.33.1" + "@swc/helpers" "^0.5.0" + "@react-stately/calendar@^3.8.0": version "3.9.0" resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.0.tgz" @@ -4066,17 +4509,6 @@ "@react-types/shared" "^3.32.1" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@^3.9.3", "@react-stately/calendar@3.9.3": - version "3.9.3" - resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.3.tgz" - integrity sha512-uw7fCZXoypSBBUsVkbNvJMQWTihZReRbyLIGG3o/ZM630N3OCZhb/h4Uxke4pNu7n527H0V1bAnZgAldIzOYqg== - dependencies: - "@internationalized/date" "^3.12.0" - "@react-stately/utils" "^3.11.0" - "@react-types/calendar" "^3.8.3" - "@react-types/shared" "^3.33.1" - "@swc/helpers" "^0.5.0" - "@react-stately/checkbox@^3.6.13": version "3.7.2" resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.7.2.tgz" @@ -4189,21 +4621,7 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@^3.14.0": - version "3.15.2" - resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.15.2.tgz" - integrity sha512-S5GL+W37chvV8knv9v0JRv0L6hKo732qqabCCHXzOpYxkLIkV4f/y3cHdEzFWzpZ0O0Gkg7WgeYo160xOdBKYg== - dependencies: - "@internationalized/date" "^3.10.0" - "@internationalized/string" "^3.2.7" - "@react-stately/form" "^3.2.2" - "@react-stately/overlays" "^3.6.20" - "@react-stately/utils" "^3.10.8" - "@react-types/datepicker" "^3.13.2" - "@react-types/shared" "^3.32.1" - "@swc/helpers" "^0.5.0" - -"@react-stately/datepicker@^3.16.1", "@react-stately/datepicker@3.16.1": +"@react-stately/datepicker@3.16.1", "@react-stately/datepicker@^3.16.1": version "3.16.1" resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.16.1.tgz" integrity sha512-BtAMDvxd1OZxkxjqq5tN5TYmp6Hm8+o3+IDA4qmem2/pfQfVbOZeWS2WitcPBImj4n4T+W1A5+PI7mT/6DUBVg== @@ -4218,6 +4636,20 @@ "@react-types/shared" "^3.33.1" "@swc/helpers" "^0.5.0" +"@react-stately/datepicker@^3.14.0": + version "3.15.2" + resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.15.2.tgz" + integrity sha512-S5GL+W37chvV8knv9v0JRv0L6hKo732qqabCCHXzOpYxkLIkV4f/y3cHdEzFWzpZ0O0Gkg7WgeYo160xOdBKYg== + dependencies: + "@internationalized/date" "^3.10.0" + "@internationalized/string" "^3.2.7" + "@react-stately/form" "^3.2.2" + "@react-stately/overlays" "^3.6.20" + "@react-stately/utils" "^3.10.8" + "@react-types/datepicker" "^3.13.2" + "@react-types/shared" "^3.32.1" + "@swc/helpers" "^0.5.0" + "@react-stately/disclosure@^3.0.11": version "3.0.11" resolved "https://registry.npmjs.org/@react-stately/disclosure/-/disclosure-3.0.11.tgz" @@ -4993,28 +5425,110 @@ "@react-types/overlays" "^3.9.4" "@react-types/shared" "^3.33.1" +"@redis/bloom@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-5.10.0.tgz#1079373583b82a8b61b0d3721755245686b4a602" + integrity sha512-doIF37ob+l47n0rkpRNgU8n4iacBlKM9xLiP1LtTZTvz8TloJB8qx/MgvhMhKdYG+CvCY2aPBnN2706izFn/4A== + "@redis/bloom@5.12.1": version "5.12.1" + resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-5.12.1.tgz#047dbfce93cfa7e5879fb58ad1b2afe87ebb2dc4" + integrity sha512-PUUfv+ms7jgPSBVoo/DN4AkPHj4D5TZSd6SbJX7egzBplkYUcKmHRE8RKia7UtZ8bSQbLguLvxVO+asKtQfZWA== -"@redis/client@^5.12.1", "@redis/client@5.12.1": - version "5.12.1" +"@redis/client@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-5.10.0.tgz#621d5de1898a4f2c3a813769779ca5902ef9d57a" + integrity sha512-JXmM4XCoso6C75Mr3lhKA3eNxSzkYi3nCzxDIKY+YOszYsJjuKbFgVtguVPbLMOttN4iu2fXoc2BGhdnYhIOxA== dependencies: cluster-key-slot "1.1.2" +"@redis/client@5.12.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-5.12.1.tgz#a35a2bac546c727d7915d2d91b63a77111e51ebd" + integrity sha512-7aPGWeqA3uFm43o19umzdl16CEjK/JQGtSXVPevplTaOU3VJA/rseBC1QvYUz9lLDIMBimc4SW/zrW4S89BaCA== + dependencies: + cluster-key-slot "1.1.2" + +"@redis/json@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@redis/json/-/json-5.10.0.tgz#a550a7859c3cbae45535aad157fcaa8e6bd3e7d3" + integrity sha512-B2G8XlOmTPUuZtD44EMGbtoepQG34RCDXLZbjrtON1Djet0t5Ri7/YPXvL9aomXqP8lLTreaprtyLKF4tmXEEA== + "@redis/json@5.12.1": version "5.12.1" + resolved "https://registry.yarnpkg.com/@redis/json/-/json-5.12.1.tgz#52aff987abe4d41ec9644857fb00f16c7a97fdb7" + integrity sha512-eOze75esLve4vfqDel7aMX08CNaiLLQS2fV8mpRN9NxPe1rVR4vQyYiW/OgtGUysF6QOr9ANhfxABKNOJfXdKg== + +"@redis/search@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-5.10.0.tgz#587851479c6abb9b40b31ab9b31c234db7a04919" + integrity sha512-3SVcPswoSfp2HnmWbAGUzlbUPn7fOohVu2weUQ0S+EMiQi8jwjL+aN2p6V3TI65eNfVsJ8vyPvqWklm6H6esmg== "@redis/search@5.12.1": version "5.12.1" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-5.12.1.tgz#b7a738be918c8a7af91e39c5bd2023f30f392981" + integrity sha512-ItlxbxC9cKI6IU1TLWoczwJCRb6TdmkEpWv05UrPawqaAnWGRu3rcIqsc5vN483T2fSociuyV1UkWIL5I4//2w== + +"@redis/time-series@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-5.10.0.tgz#9c7de35fe023e36233fba5c8478ce25832ead64c" + integrity sha512-cPkpddXH5kc/SdRhF0YG0qtjL+noqFT0AcHbQ6axhsPsO7iqPi1cjxgdkE9TNeKiBUUdCaU1DbqkR/LzbzPBhg== "@redis/time-series@5.12.1": version "5.12.1" + resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-5.12.1.tgz#15b6deaaf3716bc2633311c0ed18201c9299392d" + integrity sha512-c6JL6E3EcZJuNqKFz+KM+l9l5mpcQiKvTwgA3blt5glWJ8hjDk0yeHN3beE/MpqYIQ8UEX44ItQzgkE/gCBELQ== "@remirror/core-constants@3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz" integrity sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg== +"@rolldown/binding-android-arm64@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz#0a502a88c39d0ffa81aa30b561dade6f6217dcc5" + integrity sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ== + +"@rolldown/binding-darwin-arm64@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz#8b7f05ac9000ab19161a79a0346b1b64a1bc7ba3" + integrity sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw== + +"@rolldown/binding-darwin-x64@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz#f8b465b3a4e992053890b162f1ae19e4f1719a6a" + integrity sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw== + +"@rolldown/binding-freebsd-x64@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz#a8281e14fa9c243fe22dc2d0e54900e66b31935e" + integrity sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw== + +"@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz#cd29cf869ddd4fac8d6929abf94b91ddb0494650" + integrity sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ== + +"@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz#91c331236ec3728366218d61a62f0bd226546c6c" + integrity sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q== + +"@rolldown/binding-linux-arm64-musl@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz#80108957db752e7826836e22240e56b8140e9684" + integrity sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg== + +"@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz#1dce51148cbc6bab3c3f9157b5323d2a31aac924" + integrity sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA== + +"@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz#d4a0d2e01d8d441e4ac3af3fa68eec17a7d0e9cd" + integrity sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA== + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.17": version "1.0.0-rc.17" resolved "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz" @@ -5025,16 +5539,40 @@ resolved "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz" integrity sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw== -"@rolldown/pluginutils@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz" - integrity sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw== +"@rolldown/binding-openharmony-arm64@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz#56c1afbf6c592819abf47b4a983987dc288b30c1" + integrity sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA== + +"@rolldown/binding-wasm32-wasi@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz#5d112ff4dd0d268a60fb4e0eb3077e3ea2531f0d" + integrity sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz#5125a85222d64a543201d28e16a395cc45bf4d17" + integrity sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA== + +"@rolldown/binding-win32-x64-msvc@1.0.0-rc.17": + version "1.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz#fc6b78e759a0bb2054b5c0a3489da12b2cae54b4" + integrity sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg== "@rolldown/pluginutils@1.0.0-rc.17": version "1.0.0-rc.17" resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz" integrity sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg== +"@rolldown/pluginutils@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz" + integrity sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw== + "@rollup/plugin-babel@^5.2.0": version "5.3.1" resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" @@ -5102,6 +5640,91 @@ estree-walker "^2.0.2" picomatch "^4.0.2" +"@rollup/rollup-android-arm-eabi@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.0.tgz#ed752e9e43df342fd92622887504a602b4fd7ae5" + integrity sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ== + +"@rollup/rollup-android-arm64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.0.tgz#d6633e72089db2d78e4381fe6d6c305d5d94231c" + integrity sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg== + +"@rollup/rollup-darwin-arm64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.0.tgz#66cde30c6a1b96726ce696b78c5199fb80c0f3a4" + integrity sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w== + +"@rollup/rollup-darwin-x64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.0.tgz#6f7faec49f7a08fa730fb4f0f5b2fd90abc41116" + integrity sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg== + +"@rollup/rollup-freebsd-arm64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.0.tgz#32e9da0aeffc41933764d61b89ddd22990d6542d" + integrity sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw== + +"@rollup/rollup-freebsd-x64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.0.tgz#33f50994184254b0e5255a7bf0b717f71f5d1ca7" + integrity sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.0.tgz#58e7d4e8ced6c47124a08b8e8505362a66831708" + integrity sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g== + +"@rollup/rollup-linux-arm-musleabihf@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.0.tgz#b575a01753296e7d8c6abd064e891700cab8e055" + integrity sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw== + +"@rollup/rollup-linux-arm64-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.0.tgz#cf5de70bc5cbc823b0cbede8670a9d57d11b0d89" + integrity sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q== + +"@rollup/rollup-linux-arm64-musl@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.0.tgz#4496911458d3cf209dea2cda5e7b34212480b256" + integrity sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw== + +"@rollup/rollup-linux-loong64-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.0.tgz#dfacc7f16caff327bcc39d879295532cf378cf6a" + integrity sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA== + +"@rollup/rollup-linux-loong64-musl@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.0.tgz#70499ef68f7dff6d2c3f81d9f3f204fa82d76f1c" + integrity sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g== + +"@rollup/rollup-linux-ppc64-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.0.tgz#55862e0a1d1e7c0cc6b492941d1774b087228361" + integrity sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA== + +"@rollup/rollup-linux-ppc64-musl@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.0.tgz#7ecc78fa72f948174d576ff45902319c96f1305d" + integrity sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw== + +"@rollup/rollup-linux-riscv64-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.0.tgz#419c89109979b487f716cb39e091b872c1cc006e" + integrity sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg== + +"@rollup/rollup-linux-riscv64-musl@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.0.tgz#6a62ebc09cffda372e8547c92c4c90ff01fdc9b1" + integrity sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw== + +"@rollup/rollup-linux-s390x-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.0.tgz#d8dde03f3ebf969f4e8a395e19fa6e4f4c3a5479" + integrity sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA== + "@rollup/rollup-linux-x64-gnu@4.61.0": version "4.61.0" resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.0.tgz" @@ -5112,6 +5735,36 @@ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.0.tgz" integrity sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw== +"@rollup/rollup-openbsd-x64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.0.tgz#89222507dd71e7e7561bc4f0613a22b63e798cff" + integrity sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg== + +"@rollup/rollup-openharmony-arm64@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.0.tgz#0cd26688fef998c2bf0eb320a24d3b4a757f8ed8" + integrity sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w== + +"@rollup/rollup-win32-arm64-msvc@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.0.tgz#bf60767e016c15afb08924fe5168e638c99b53b5" + integrity sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg== + +"@rollup/rollup-win32-ia32-msvc@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.0.tgz#215270f214886109cbf35ed81e966b27bff99e47" + integrity sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg== + +"@rollup/rollup-win32-x64-gnu@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.0.tgz#5c09f4f79c8c082b6be817307b2263eadad9f2a7" + integrity sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ== + +"@rollup/rollup-win32-x64-msvc@4.61.0": + version "4.61.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.0.tgz#f8e95dd237f7acc53a2d0fc35926f1c36489e274" + integrity sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw== + "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" @@ -5171,7 +5824,7 @@ "@sentry-internal/replay-canvas" "10.53.1" "@sentry/core" "10.53.1" -"@sentry/bundler-plugin-core@^5.3.0", "@sentry/bundler-plugin-core@5.3.0": +"@sentry/bundler-plugin-core@5.3.0", "@sentry/bundler-plugin-core@^5.3.0": version "5.3.0" resolved "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-5.3.0.tgz" integrity sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q== @@ -5184,11 +5837,46 @@ glob "^13.0.6" magic-string "~0.30.8" +"@sentry/cli-darwin@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.58.5.tgz#ea9c4ab41161f15c636d0d2dcf126202cb49a588" + integrity sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ== + +"@sentry/cli-linux-arm64@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.5.tgz#38e866ee11ca88f6fb2164a6afd6cff4156b33d4" + integrity sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ== + +"@sentry/cli-linux-arm@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.5.tgz#12da36dd10166c09275b8a91366ad0906a8482fd" + integrity sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw== + +"@sentry/cli-linux-i686@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.5.tgz#9434360fb67fee3028886de2b143fbed93c627ac" + integrity sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw== + "@sentry/cli-linux-x64@2.58.5": version "2.58.5" resolved "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.5.tgz" integrity sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g== +"@sentry/cli-win32-arm64@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.5.tgz#0807783f9fa67b32703154533c31c09355149d3c" + integrity sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA== + +"@sentry/cli-win32-i686@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.5.tgz#79586eab70341ebde3bbcb0be6d436da3840ef64" + integrity sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g== + +"@sentry/cli-win32-x64@2.58.5": + version "2.58.5" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.5.tgz#4937c0821abfd346da50a3cf1ecbd752f75f8ef4" + integrity sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg== + "@sentry/cli@^2.58.5": version "2.58.5" resolved "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.5.tgz" @@ -5361,7 +6049,7 @@ dependencies: "@shikijs/types" "4.0.2" -"@shikijs/types@^1.29.2 || ^2.0.0 || ^3.0.0 || ^4.0.0", "@shikijs/types@^4", "@shikijs/types@4.0.2": +"@shikijs/types@4.0.2", "@shikijs/types@^4": version "4.0.2" resolved "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz" integrity sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg== @@ -5462,7 +6150,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@*", "@svgr/core@8.1.0": +"@svgr/core@8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== @@ -5514,13 +6202,6 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/helpers@^0.5.0", "@swc/helpers@^0.5.12": - version "0.5.17" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz" - integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== - dependencies: - tslib "^2.8.0" - "@swc/helpers@0.5.15": version "0.5.15" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz" @@ -5528,6 +6209,13 @@ dependencies: tslib "^2.8.0" +"@swc/helpers@^0.5.0", "@swc/helpers@^0.5.12": + version "0.5.17" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz" + integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== + dependencies: + tslib "^2.8.0" + "@tanstack/eslint-plugin-query@5.100.14": version "5.100.14" resolved "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.100.14.tgz" @@ -5552,7 +6240,7 @@ dependencies: "@tanstack/query-devtools" "5.100.14" -"@tanstack/react-query@^5", "@tanstack/react-query@^5.100.14", "@tanstack/react-query@5.100.14": +"@tanstack/react-query@5.100.14": version "5.100.14" resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.14.tgz" integrity sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw== @@ -5574,7 +6262,7 @@ dependencies: "@tanstack/table-core" "8.21.3" -"@tanstack/store@^0.7.7", "@tanstack/store@0.7.7": +"@tanstack/store@0.7.7", "@tanstack/store@^0.7.7": version "0.7.7" resolved "https://registry.npmjs.org/@tanstack/store/-/store-0.7.7.tgz" integrity sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ== @@ -5584,7 +6272,7 @@ resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz" integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== -"@testing-library/dom@^10.0.0", "@testing-library/dom@>=7.21.4", "@testing-library/dom@10.4.1": +"@testing-library/dom@10.4.1": version "10.4.1" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz" integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== @@ -5622,7 +6310,7 @@ resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz" integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== -"@tiptap/core@^3.13.0", "@tiptap/core@^3.14.0", "@tiptap/core@^3.17.0", "@tiptap/core@3.23.6": +"@tiptap/core@^3.13.0": version "3.14.0" resolved "https://registry.npmjs.org/@tiptap/core/-/core-3.14.0.tgz" integrity sha512-nm0VWVA1Vq/jaKY3wyRXViL/kf78yMdH7qETpv4qZXDQLU+pdWV3IGoRTQTKESc7d8L1wL/2uCeByLNUJfrSIw== @@ -5679,12 +6367,12 @@ resolved "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.14.0.tgz" integrity sha512-zmnWlsi2g/tMlThHby0Je9O+v24j4d+qcXF3nuzLUUaDsGCEtOyC9RzwITft59ViK+Nc2PD2W/J14rsB0j+qoQ== -"@tiptap/extensions@*", "@tiptap/extensions@^3.13.0": +"@tiptap/extensions@*", "@tiptap/extensions@3.23.6", "@tiptap/extensions@^3.13.0": version "3.23.6" - resolved "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.23.6.tgz" + resolved "https://registry.yarnpkg.com/@tiptap/extensions/-/extensions-3.23.6.tgz#96fde5cae89459581c6d5356728444bd0299a8f2" integrity sha512-X09/Db1teB+ifXzDGVVFmOeQRx7wTAayE9/280spxpsHkHZvJ5bHRvWIzUzviMIjbBz+NPDIKYPK7gMfh9iaig== -"@tiptap/pm@^3.13.0", "@tiptap/pm@^3.14.0", "@tiptap/pm@^3.17.0", "@tiptap/pm@3.23.6": +"@tiptap/pm@^3.13.0": version "3.14.0" resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-3.14.0.tgz" integrity sha512-xrZmqI5jl4yMeAsu8p8gVP9S3An5h2MBi8BQHNnZmpyzkUrlpd40vlT6u13SWIqVi5ZWhBZ6U3rL7mkVLZuRKg== @@ -5740,12 +6428,19 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tybys/wasm-util@^0.10.0", "@tybys/wasm-util@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz#12b3a1b33db1f9cad4ddff1f604ab7dd00bf464e" + integrity sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg== + dependencies: + tslib "^2.4.0" + "@types/aria-query@^5.0.1": version "5.0.4" resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/babel__core@^7.1.9", "@types/babel__core@^7.20.5": +"@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -5981,9 +6676,9 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20.0.0 || ^22.0.0 || >=24.0.0", "@types/node@^20.19.0 || >=22.12.0", "@types/node@^25.2.3", "@types/node@>= 12", "@types/node@>=13.7.0", "@types/node@22.10.7": +"@types/node@*", "@types/node@22.10.7", "@types/node@24.12.4", "@types/node@>=13.7.0", "@types/node@^25.2.3": version "24.12.4" - resolved "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.12.4.tgz#2709745569811dcbdc57c097fafdd387c6330382" integrity sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA== dependencies: undici-types "~7.16.0" @@ -6047,9 +6742,9 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom@^18.0.0 || ^19.0.0": +"@types/react-dom@*", "@types/react-dom@19.2.3": version "19.2.3" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== "@types/react-modal@3.16.3": @@ -6064,9 +6759,9 @@ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.0.0 || ^19.0.0", "@types/react@^19.2.0", "@types/react@>= 16", "@types/react@>=18.0.0": +"@types/react@*", "@types/react@19.2.15": version "19.2.15" - resolved "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.15.tgz#9e2c6a4251a290f5c525c3143caa872fa6e01e0d" integrity sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q== dependencies: csstype "^3.2.2" @@ -6153,16 +6848,16 @@ resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/use-sync-external-store@^0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz" - integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== - "@types/use-sync-external-store@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" integrity sha512-5dyB8nLC/qogMrlCizZnYWQTA4lnb/v+It+sqNl5YnSRAPMlIqY/X0Xn+gZw8vOL+TgTTr28VEbn3uf8fUtAkw== +"@types/use-sync-external-store@^0.0.6": + version "0.0.6" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz" + integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== + "@types/ws@*", "@types/ws@8.18.1": version "8.18.1" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" @@ -6182,20 +6877,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@*", "@typescript-eslint/eslint-plugin@^8.0.0", "@typescript-eslint/eslint-plugin@8.59.4": - version "8.59.4" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz" - integrity sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.59.4" - "@typescript-eslint/type-utils" "8.59.4" - "@typescript-eslint/utils" "8.59.4" - "@typescript-eslint/visitor-keys" "8.59.4" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.5.0" - "@typescript-eslint/eslint-plugin@8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz" @@ -6210,7 +6891,21 @@ natural-compare "^1.4.0" ts-api-utils "^2.4.0" -"@typescript-eslint/parser@^8.57.0", "@typescript-eslint/parser@8.57.0": +"@typescript-eslint/eslint-plugin@8.59.4": + version "8.59.4" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz" + integrity sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.59.4" + "@typescript-eslint/type-utils" "8.59.4" + "@typescript-eslint/utils" "8.59.4" + "@typescript-eslint/visitor-keys" "8.59.4" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + +"@typescript-eslint/parser@8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz" integrity sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g== @@ -6221,15 +6916,6 @@ "@typescript-eslint/visitor-keys" "8.57.0" debug "^4.4.3" -"@typescript-eslint/parser@^8.59.4": - version "8.59.4" - dependencies: - "@typescript-eslint/scope-manager" "8.59.4" - "@typescript-eslint/types" "8.59.4" - "@typescript-eslint/typescript-estree" "8.59.4" - "@typescript-eslint/visitor-keys" "8.59.4" - debug "^4.4.3" - "@typescript-eslint/parser@8.59.4": version "8.59.4" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz" @@ -6259,15 +6945,6 @@ "@typescript-eslint/types" "^8.57.0" debug "^4.4.3" -"@typescript-eslint/project-service@8.57.2": - version "8.57.2" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz" - integrity sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.57.2" - "@typescript-eslint/types" "^8.57.2" - debug "^4.4.3" - "@typescript-eslint/project-service@8.59.1": version "8.59.1" resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz" @@ -6286,22 +6963,6 @@ "@typescript-eslint/types" "^8.59.4" debug "^4.4.3" -"@typescript-eslint/scope-manager@^8.56.0", "@typescript-eslint/scope-manager@8.57.2": - version "8.57.2" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz" - integrity sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw== - dependencies: - "@typescript-eslint/types" "8.57.2" - "@typescript-eslint/visitor-keys" "8.57.2" - -"@typescript-eslint/scope-manager@^8.58.0", "@typescript-eslint/scope-manager@8.59.1": - version "8.59.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz" - integrity sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg== - dependencies: - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/visitor-keys" "8.59.1" - "@typescript-eslint/scope-manager@8.56.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz" @@ -6318,6 +6979,14 @@ "@typescript-eslint/types" "8.57.0" "@typescript-eslint/visitor-keys" "8.57.0" +"@typescript-eslint/scope-manager@8.59.1", "@typescript-eslint/scope-manager@^8.58.0": + version "8.59.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz" + integrity sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg== + dependencies: + "@typescript-eslint/types" "8.59.1" + "@typescript-eslint/visitor-keys" "8.59.1" + "@typescript-eslint/scope-manager@8.59.4": version "8.59.4" resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz" @@ -6326,41 +6995,39 @@ "@typescript-eslint/types" "8.59.4" "@typescript-eslint/visitor-keys" "8.59.4" -"@typescript-eslint/tsconfig-utils@^8.56.0", "@typescript-eslint/tsconfig-utils@8.56.0": +"@typescript-eslint/scope-manager@^8.56.0": + version "8.57.2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz" + integrity sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw== + dependencies: + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/visitor-keys" "8.57.2" + +"@typescript-eslint/tsconfig-utils@8.56.0", "@typescript-eslint/tsconfig-utils@^8.56.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz" integrity sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg== -"@typescript-eslint/tsconfig-utils@^8.57.0": +"@typescript-eslint/tsconfig-utils@8.57.0", "@typescript-eslint/tsconfig-utils@^8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz" integrity sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA== -"@typescript-eslint/tsconfig-utils@^8.57.2", "@typescript-eslint/tsconfig-utils@8.57.2": - version "8.57.2" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz" - integrity sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw== - -"@typescript-eslint/tsconfig-utils@^8.59.1", "@typescript-eslint/tsconfig-utils@8.59.1": +"@typescript-eslint/tsconfig-utils@8.59.1", "@typescript-eslint/tsconfig-utils@^8.59.1": version "8.59.1" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz" integrity sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA== -"@typescript-eslint/tsconfig-utils@^8.59.4": - version "8.60.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz" - integrity sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ== - -"@typescript-eslint/tsconfig-utils@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz" - integrity sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA== - "@typescript-eslint/tsconfig-utils@8.59.4": version "8.59.4" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz" integrity sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA== +"@typescript-eslint/tsconfig-utils@^8.59.4": + version "8.60.0" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz" + integrity sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ== + "@typescript-eslint/type-utils@8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz" @@ -6383,36 +7050,36 @@ debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@^8.56.0", "@typescript-eslint/types@8.56.0": +"@typescript-eslint/types@8.56.0", "@typescript-eslint/types@^8.56.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz" integrity sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ== -"@typescript-eslint/types@^8.57.0", "@typescript-eslint/types@8.57.0": +"@typescript-eslint/types@8.57.0", "@typescript-eslint/types@^8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz" integrity sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg== -"@typescript-eslint/types@^8.57.2", "@typescript-eslint/types@8.57.2": +"@typescript-eslint/types@8.57.2": version "8.57.2" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz" integrity sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA== -"@typescript-eslint/types@^8.59.1", "@typescript-eslint/types@8.59.1": +"@typescript-eslint/types@8.59.1", "@typescript-eslint/types@^8.59.1": version "8.59.1" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz" integrity sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A== -"@typescript-eslint/types@^8.59.4": - version "8.60.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz" - integrity sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA== - "@typescript-eslint/types@8.59.4": version "8.59.4" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz" integrity sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q== +"@typescript-eslint/types@^8.59.4": + version "8.60.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz" + integrity sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA== + "@typescript-eslint/typescript-estree@8.56.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz" @@ -6443,21 +7110,6 @@ tinyglobby "^0.2.15" ts-api-utils "^2.4.0" -"@typescript-eslint/typescript-estree@8.57.2": - version "8.57.2" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz" - integrity sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA== - dependencies: - "@typescript-eslint/project-service" "8.57.2" - "@typescript-eslint/tsconfig-utils" "8.57.2" - "@typescript-eslint/types" "8.57.2" - "@typescript-eslint/visitor-keys" "8.57.2" - debug "^4.4.3" - minimatch "^10.2.2" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.4.0" - "@typescript-eslint/typescript-estree@8.59.1": version "8.59.1" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz" @@ -6488,6 +7140,26 @@ tinyglobby "^0.2.15" ts-api-utils "^2.5.0" +"@typescript-eslint/utils@8.57.0": + version "8.57.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz" + integrity sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.57.0" + "@typescript-eslint/types" "8.57.0" + "@typescript-eslint/typescript-estree" "8.57.0" + +"@typescript-eslint/utils@8.59.4", "@typescript-eslint/utils@^8.56.0": + version "8.59.4" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz" + integrity sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.59.4" + "@typescript-eslint/types" "8.59.4" + "@typescript-eslint/typescript-estree" "8.59.4" + "@typescript-eslint/utils@^8.0.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz" @@ -6498,17 +7170,7 @@ "@typescript-eslint/types" "8.56.0" "@typescript-eslint/typescript-estree" "8.56.0" -"@typescript-eslint/utils@^8.56.0", "@typescript-eslint/utils@8.59.4": - version "8.59.4" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz" - integrity sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.4" - "@typescript-eslint/types" "8.59.4" - "@typescript-eslint/typescript-estree" "8.59.4" - -"@typescript-eslint/utils@^8.58.0": +"@typescript-eslint/utils@^8.58.0", "@typescript-eslint/utils@^8.58.1": version "8.59.1" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz" integrity sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA== @@ -6518,26 +7180,6 @@ "@typescript-eslint/types" "8.59.1" "@typescript-eslint/typescript-estree" "8.59.1" -"@typescript-eslint/utils@^8.58.1": - version "8.59.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz" - integrity sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.1" - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/typescript-estree" "8.59.1" - -"@typescript-eslint/utils@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz" - integrity sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.57.0" - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/typescript-estree" "8.57.0" - "@typescript-eslint/visitor-keys@8.56.0": version "8.56.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz" @@ -6583,6 +7225,71 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@unrs/resolver-binding-android-arm-eabi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81" + integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== + +"@unrs/resolver-binding-android-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f" + integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== + +"@unrs/resolver-binding-darwin-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf" + integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== + +"@unrs/resolver-binding-darwin-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc" + integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== + +"@unrs/resolver-binding-freebsd-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b" + integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a" + integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3" + integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== + +"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d" + integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== + +"@unrs/resolver-binding-linux-arm64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0" + integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44" + integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9" + integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== + +"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165" + integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== + +"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94" + integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== + "@unrs/resolver-binding-linux-x64-gnu@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz" @@ -6593,6 +7300,28 @@ resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz" integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== +"@unrs/resolver-binding-wasm32-wasi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d" + integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== + dependencies: + "@napi-rs/wasm-runtime" "^0.2.11" + +"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35" + integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== + +"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6" + integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== + +"@unrs/resolver-binding-win32-x64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" + integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== + "@vercel/oidc@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz" @@ -6678,7 +7407,7 @@ convert-source-map "^2.0.0" tinyrainbow "^3.1.0" -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -6779,7 +7508,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -6811,10 +7540,12 @@ "@y-crdt/yn@^0.1.2": version "0.1.2" + resolved "https://registry.yarnpkg.com/@y-crdt/yn/-/yn-0.1.2.tgz#3430560e210d697bd77737f2bc89ecc169347382" + integrity sha512-zw72B5vtfjr+l8FH1uu9D6afLYAKDoJcLJYz6STDS+VgKfBm1+q4bT3ny3tPu6e6COXEh2ZT/vM4ptH3QxR4cw== -"@y/hub@^0.2.22": +"@y/hub@0.2.22": version "0.2.22" - resolved "https://registry.npmjs.org/@y/hub/-/hub-0.2.22.tgz" + resolved "https://registry.yarnpkg.com/@y/hub/-/hub-0.2.22.tgz#cc5f1c93b9d85469865fa8ad685ee4d62d4819d2" integrity sha512-L+7X84PbKvCPkYOcJ36wopLfgTkluDHuOo2vQEQvk393gHWrI5a84UVwCpAbpEcVRDIZlm37sFWe/lTevZBy1Q== dependencies: "@y-crdt/yn" "^0.1.2" @@ -6829,11 +7560,15 @@ "@y/protocols@^1.0.6-rc.1": version "1.0.6-rc.1" + resolved "https://registry.yarnpkg.com/@y/protocols/-/protocols-1.0.6-rc.1.tgz#c892d26317e0cdd323ff3137cda53e300c1c5f8d" + integrity sha512-e/qs7hXcLk/SeNitxMXv2ymozyWFTULwbJEi7cAf/K/iXw9nGwGXHrR5TNluQ/bMwOX1cwuUT0hjEojkfH0gsA== dependencies: lib0 "^1.0.0-rc.1" -"@y/y@*", "@y/y@^14.0.0-rc.16": +"@y/y@^14.0.0-rc.16": version "14.0.0-rc.17" + resolved "https://registry.yarnpkg.com/@y/y/-/y-14.0.0-rc.17.tgz#c408caabcc8e19b45357efff15031c087105b65c" + integrity sha512-qzKOdjFcZBHxnbxc+4TKx/DCk9UwLCgXQjyQn4bbN9aEzDVQtzN7L18VaGrN4HTEDbHNrlevxvdIdz92Vk5TBA== dependencies: lib0 "^1.0.0-rc.13" @@ -6877,20 +7612,15 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.16.0: - version "8.16.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" - integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== - -acorn@^8, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.4.1: +acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.4.1: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.4" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" - integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== +acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== agent-base@6: version "6.0.2" @@ -6899,7 +7629,12 @@ agent-base@6: dependencies: debug "4" -ai@^6.0.5, ai@6.0.101: +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ai@6.0.101, ai@^6.0.5: version "6.0.101" resolved "https://registry.npmjs.org/ai/-/ai-6.0.101.tgz" integrity sha512-Ur/NgbgOp1rdhyDiKDk6EOpSgd1g5ADlbcD1cjQJtQsnmhEngz3Rf8nK5JetDh0vnbLy2aEBpaQeL+zvLRWuaA== @@ -6943,7 +7678,7 @@ ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.0, ajv@^8.8.2, ajv@^8.9.0, ajv@>=8: +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.0, ajv@^8.9.0: version "8.18.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz" integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== @@ -6965,12 +7700,7 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-regex@^6.2.2: +ansi-regex@^6.0.1, ansi-regex@^6.2.2: version "6.2.2" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== @@ -6982,12 +7712,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^5.2.0: +ansi-styles@^5.0.0, ansi-styles@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== @@ -7005,80 +7730,10 @@ anymatch@^3.1.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -"app-e2e@file:/home/manu/dev/dinum/docs/src/frontend/apps/e2e": - version "5.2.1" - resolved "file:apps/e2e" - dependencies: - "@types/pngjs" "6.0.5" - convert-stream "1.0.2" - dotenv "17.4.2" - pdf-parse "2.4.5" - pixelmatch "7.2.0" - pngjs "7.0.0" - -"app-impress@file:/home/manu/dev/dinum/docs/src/frontend/apps/impress": - version "5.2.1" - resolved "file:apps/impress" - dependencies: - "@ag-media/react-pdf-table" "2.0.3" - "@ai-sdk/openai" "3.0.65" - "@blocknote/code-block" "0.51.4" - "@blocknote/core" "0.51.4" - "@blocknote/mantine" "0.51.4" - "@blocknote/react" "0.51.4" - "@blocknote/xl-ai" "0.51.4" - "@blocknote/xl-docx-exporter" "0.51.4" - "@blocknote/xl-multi-column" "0.51.4" - "@blocknote/xl-odt-exporter" "0.51.4" - "@blocknote/xl-pdf-exporter" "0.51.4" - "@dnd-kit/core" "6.3.1" - "@dnd-kit/modifiers" "9.0.0" - "@emoji-mart/data" "1.2.1" - "@emoji-mart/react" "1.1.1" - "@fontsource-variable/inter" "5.2.8" - "@fontsource-variable/material-symbols-outlined" "5.2.45" - "@fontsource/material-icons" "5.2.7" - "@gouvfr-lasuite/cunningham-react" "4.3.0" - "@gouvfr-lasuite/integration" "1.0.3" - "@gouvfr-lasuite/ui-kit" "0.23.2" - "@hocuspocus/provider" "3.4.4" - "@mantine/core" "9.2.1" - "@mantine/hooks" "9.2.1" - "@react-aria/live-announcer" "3.5.0" - "@react-pdf/renderer" "4.3.1" - "@sentry/nextjs" "10.53.1" - "@tanstack/react-query" "5.100.14" - "@tiptap/extensions" "*" - ai "6.0.191" - canvg "4.0.3" - clsx "2.1.1" - cmdk "1.1.1" - crisp-sdk-web "1.1.2" - emoji-datasource-apple "16.0.0" - emoji-mart "5.6.0" - emoji-regex "10.6.0" - i18next "26.2.0" - i18next-browser-languagedetector "8.2.1" - idb "8.0.3" - lodash "4.18.1" - luxon "3.7.2" - next "16.2.6" - posthog-js "1.376.0" - react "*" - react-aria-components "1.17.0" - react-dom "*" - react-dropzone "15.0.0" - react-i18next "17.0.8" - react-intersection-observer "10.0.3" - react-resizable-panels "3.0.6" - react-select "5.10.2" - styled-components "6.4.2" - use-debounce "10.1.1" - uuid "14.0.0" - y-protocols "1.0.7" - yjs "*" - zod "4.4.3" - zustand "5.0.13" +anynum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/anynum/-/anynum-1.0.0.tgz#afe3f3a78c6621fbdf1e107154fac01eef711cc5" + integrity sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA== arg@^4.1.0: version "4.1.3" @@ -7104,11 +7759,6 @@ aria-hidden@^1.2.3, aria-hidden@^1.2.4: dependencies: tslib "^2.0.0" -aria-query@^5.0.0, aria-query@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - aria-query@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" @@ -7116,6 +7766,11 @@ aria-query@5.3.0: dependencies: dequal "^2.0.3" +aria-query@^5.0.0, aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" @@ -7266,6 +7921,8 @@ at-least-node@^1.0.0: atomic-sleep@^1.0.0: version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== attr-accept@^2.2.4: version "2.2.5" @@ -7304,7 +7961,7 @@ b4a@^1.6.4: resolved "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz" integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== -"babel-jest@^29.0.0 || ^30.0.0", babel-jest@30.4.1: +babel-jest@30.4.1: version "30.4.1" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz" integrity sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw== @@ -7417,16 +8074,16 @@ bare-events@^2.7.0: resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz" integrity sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA== -base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - base64-js@0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz" integrity sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw== +base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + baseline-browser-mapping@^2.8.9, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: version "2.10.10" resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz" @@ -7455,6 +8112,8 @@ bl@^5.0.0: block-stream2@^2.1.0: version "2.1.0" + resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-2.1.0.tgz#ac0c5ef4298b3857796e05be8ebed72196fa054b" + integrity sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg== dependencies: readable-stream "^3.4.0" @@ -7553,6 +8212,8 @@ brotli@^1.3.2: browser-or-node@^2.1.1: version "2.1.1" + resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" + integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== browserify-zlib@^0.2.0: version "0.2.0" @@ -7561,7 +8222,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.24.0, browserslist@^4.26.3, "browserslist@>= 4.21.0": +browserslist@^4.24.0, browserslist@^4.26.3: version "4.26.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz" integrity sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w== @@ -7599,6 +8260,8 @@ bser@2.1.1: buffer-crc32@^1.0.0: version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz#a10993b9055081d55304bd9feb4a072de179f405" + integrity sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w== buffer-from@^1.0.0: version "1.1.2" @@ -7706,7 +8369,7 @@ chai@^6.2.2: resolved "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz" integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== -chalk@^4.1.2, chalk@4.1.2: +chalk@4.1.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -7808,7 +8471,7 @@ classnames@2.5.1: resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== -client-only@^0.0.1, client-only@0.0.1: +client-only@0.0.1, client-only@^0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== @@ -7836,18 +8499,20 @@ clone@^2.1.2: resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== +clsx@2.1.1, clsx@^2.0.0, clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + clsx@^1.0.4: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -clsx@^2.0.0, clsx@^2.1.1, clsx@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - cluster-key-slot@1.1.2: version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== cmdk@1.0.4: version "1.0.4" @@ -7921,6 +8586,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@13.1.0: + version "13.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + commander@^12.1.0: version "12.1.0" resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" @@ -7941,11 +8611,6 @@ commander@^9.0.0: resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -commander@13.1.0: - version "13.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" - integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== - comment-parser@^1.4.1: version "1.4.5" resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz" @@ -8156,15 +8821,7 @@ css-tree@^2.3.1: mdn-data "2.0.30" source-map-js "^1.0.1" -css-tree@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz" - integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== - dependencies: - mdn-data "2.12.2" - source-map-js "^1.0.1" - -css-tree@^3.1.0: +css-tree@^3.0.0, css-tree@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz" integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== @@ -8218,21 +8875,16 @@ cssstyle@^4.1.0: "@asamuzakjp/css-color" "^3.2.0" rrweb-cssom "^0.8.0" +csstype@3.2.3, csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + csstype@^3.0.2: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -csstype@^3.2.2: - version "3.2.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - -csstype@3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" @@ -8281,6 +8933,13 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -8295,13 +8954,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3, debug@4: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - decimal.js@^10.4.3, decimal.js@^10.6.0: version "10.6.0" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" @@ -8309,6 +8961,8 @@ decimal.js@^10.4.3, decimal.js@^10.6.0: decode-uri-component@^0.2.2: version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== dedent@^1.6.0: version "1.7.0" @@ -8320,7 +8974,7 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2, deepmerge@^4.3.1, deepmerge@4.3.1: +deepmerge@4.3.1, deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -8348,7 +9002,7 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@^2.0.0, depd@~2.0.0, depd@2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -8496,16 +9150,16 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dotenv@^16.3.1: - version "16.6.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - dotenv@17.4.2: version "17.4.2" resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz" integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== +dotenv@^16.3.1: + version "16.6.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== + downshift@9.0.9: version "9.0.9" resolved "https://registry.npmjs.org/downshift/-/downshift-9.0.9.tgz" @@ -8563,7 +9217,7 @@ emoji-datasource-apple@16.0.0: resolved "https://registry.npmjs.org/emoji-datasource-apple/-/emoji-datasource-apple-16.0.0.tgz" integrity sha512-dVYjsK0FnCry9F+PBtnivhG2K0xdwlmqYaSgiUtztUdAGPYiHYhZcVKvNBqC791g2qyEcFNTBO6utg4eQ3uLTw== -emoji-mart@^5.2, emoji-mart@^5.6.0, emoji-mart@5.6.0: +emoji-mart@5.6.0, emoji-mart@^5.6.0: version "5.6.0" resolved "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz" integrity sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow== @@ -8573,7 +9227,7 @@ emoji-regex-xs@^1.0.0: resolved "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz" integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== -emoji-regex@^10.3.0, emoji-regex@10.6.0: +emoji-regex@10.6.0, emoji-regex@^10.3.0: version "10.6.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== @@ -8786,7 +9440,7 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild@^0.25.0, "esbuild@^0.27.0 || ^0.28.0": +esbuild@^0.25.0: version "0.25.11" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz" integrity sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q== @@ -8853,7 +9507,7 @@ eslint-config-next@16.2.6: globals "16.4.0" typescript-eslint "^8.46.0" -"eslint-config-prettier@>= 7.0.0 <10.0.0 || >=10.1.0", eslint-config-prettier@10.1.8: +eslint-config-prettier@10.1.8: version "10.1.8" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz" integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== @@ -8866,7 +9520,7 @@ eslint-import-context@^0.1.9: get-tsconfig "^4.10.1" stable-hash-x "^0.2.0" -eslint-import-resolver-node@*, eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -8895,30 +9549,7 @@ eslint-module-utils@^2.12.1: dependencies: debug "^3.2.7" -eslint-plugin-docs@*, "eslint-plugin-docs@file:/home/manu/dev/dinum/docs/src/frontend/packages/eslint-plugin-docs": - version "5.2.1" - resolved "file:packages/eslint-plugin-docs" - dependencies: - "@eslint/js" "10.0.1" - "@next/eslint-plugin-next" "16.2.6" - "@tanstack/eslint-plugin-query" "5.100.14" - "@typescript-eslint/eslint-plugin" "8.59.4" - "@typescript-eslint/parser" "8.59.4" - "@typescript-eslint/utils" "8.59.4" - "@vitest/eslint-plugin" "1.6.18" - eslint-config-next "16.2.6" - eslint-config-prettier "10.1.8" - eslint-plugin-import-x "4.16.2" - eslint-plugin-jest "29.15.2" - eslint-plugin-jsx-a11y "6.10.2" - eslint-plugin-playwright "2.10.4" - eslint-plugin-prettier "5.5.5" - eslint-plugin-react "7.37.5" - eslint-plugin-react-hooks "7.1.1" - eslint-plugin-testing-library "7.16.2" - prettier "3.8.3" - -eslint-plugin-import-x@*, eslint-plugin-import-x@4.16.2: +eslint-plugin-import-x@4.16.2: version "4.16.2" resolved "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz" integrity sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw== @@ -8934,7 +9565,7 @@ eslint-plugin-import-x@*, eslint-plugin-import-x@4.16.2: stable-hash-x "^0.2.0" unrs-resolver "^1.9.2" -eslint-plugin-import@*, eslint-plugin-import@^2.32.0, eslint-plugin-import@2.32.0: +eslint-plugin-import@2.32.0, eslint-plugin-import@^2.32.0: version "2.32.0" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== @@ -8966,7 +9597,7 @@ eslint-plugin-jest@29.15.2: dependencies: "@typescript-eslint/utils" "^8.0.0" -eslint-plugin-jsx-a11y@^6.10.0, eslint-plugin-jsx-a11y@6.10.2: +eslint-plugin-jsx-a11y@6.10.2, eslint-plugin-jsx-a11y@^6.10.0: version "6.10.2" resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz" integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== @@ -9002,17 +9633,6 @@ eslint-plugin-prettier@5.5.5: prettier-linter-helpers "^1.0.1" synckit "^0.11.12" -eslint-plugin-react-hooks@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz" - integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== - dependencies: - "@babel/core" "^7.24.4" - "@babel/parser" "^7.24.4" - hermes-parser "^0.25.1" - zod "^3.25.0 || ^4.0.0" - zod-validation-error "^3.5.0 || ^4.0.0" - eslint-plugin-react-hooks@7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz" @@ -9024,7 +9644,18 @@ eslint-plugin-react-hooks@7.1.1: zod "^3.25.0 || ^4.0.0" zod-validation-error "^3.5.0 || ^4.0.0" -eslint-plugin-react@^7.37.0, eslint-plugin-react@7.37.5: +eslint-plugin-react-hooks@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz" + integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== + dependencies: + "@babel/core" "^7.24.4" + "@babel/parser" "^7.24.4" + hermes-parser "^0.25.1" + zod "^3.25.0 || ^4.0.0" + zod-validation-error "^3.5.0 || ^4.0.0" + +eslint-plugin-react@7.37.5, eslint-plugin-react@^7.37.0: version "7.37.5" resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== @@ -9056,6 +9687,14 @@ eslint-plugin-testing-library@7.16.2: "@typescript-eslint/scope-manager" "^8.56.0" "@typescript-eslint/utils" "^8.56.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^9.1.2: version "9.1.2" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz" @@ -9066,14 +9705,6 @@ eslint-scope@^9.1.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" @@ -9084,8 +9715,10 @@ eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@*, eslint@^10.0.0, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0 || ^10.0.0", eslint@>=10.0.1, eslint@>=7.0.0, eslint@>=8.0.0, eslint@>=8.40.0, eslint@>=8.57.0, eslint@>=9.0.0: +eslint@10.4.0: version "10.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.4.0.tgz#d86b6c405de0f19f3318c47139b8cb6771b3f592" + integrity sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" @@ -9185,6 +9818,8 @@ etag@^1.8.1: eventemitter3@^5.0.1: version "5.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== events-universal@^1.0.0: version "1.0.1" @@ -9238,18 +9873,6 @@ expect-type@^1.3.0: resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz" integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== -expect@^30.0.0: - version "30.2.0" - resolved "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz" - integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== - dependencies: - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - expect@30.4.1: version "30.4.1" resolved "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz" @@ -9262,6 +9885,18 @@ expect@30.4.1: jest-mock "30.4.1" jest-util "30.4.1" +expect@^30.0.0: + version "30.2.0" + resolved "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz" + integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== + dependencies: + "@jest/expect-utils" "30.2.0" + "@jest/get-type" "30.1.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-util "30.2.0" + express-ws@5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/express-ws/-/express-ws-5.0.2.tgz" @@ -9269,7 +9904,7 @@ express-ws@5.0.2: dependencies: ws "^7.4.6" -"express@^4.0.0 || ^5.0.0-alpha.1", express@5.2.1: +express@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/express/-/express-5.2.1.tgz" integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== @@ -9323,17 +9958,6 @@ fast-fifo@^1.3.2: resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^3.2.9, fast-glob@^3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - fast-glob@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" @@ -9345,7 +9969,18 @@ fast-glob@3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: +fast-glob@^3.2.9, fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9367,12 +10002,16 @@ fast-uri@^3.0.1: fast-xml-builder@^1.2.0: version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz#abd2363145a7625d9789ad96da375fabe3cff28c" + integrity sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q== dependencies: path-expression-matcher "^1.5.0" xml-naming "^0.1.0" fast-xml-parser@^5.3.4: version "5.8.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz#64d71f0f8d4bf23621dffd762aef7e98c1884fc1" + integrity sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg== dependencies: "@nodable/entities" "^2.1.0" fast-xml-builder "^1.2.0" @@ -9467,6 +10106,8 @@ fill-range@^7.1.1: filter-obj@^1.1.0: version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== finalhandler@^2.1.0: version "2.1.0" @@ -9667,6 +10308,16 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@^2.3.3, fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -9863,16 +10514,16 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^17.3.0: - version "17.4.0" - resolved "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz" - integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw== - globals@16.4.0: version "16.4.0" resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz" integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== +globals@^17.3.0: + version "17.4.0" + resolved "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz" + integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw== + globalthis@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" @@ -10197,6 +10848,11 @@ i18next-parser@9.4.0: vinyl "^3.0.0" vinyl-fs "^4.0.0" +i18next@26.2.0: + version "26.2.0" + resolved "https://registry.npmjs.org/i18next/-/i18next-26.2.0.tgz" + integrity sha512-zwBHldHdTmwN7r6UNc7lC6GWNN+YYg3DrRSeHR5PRRBf5QnJZcYHrQc0uaU26qZeYxR7iFZD+Y315dPnKP47wA== + "i18next@^23.5.1 || ^24.2.0": version "24.2.3" resolved "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz" @@ -10204,42 +10860,30 @@ i18next-parser@9.4.0: dependencies: "@babel/runtime" "^7.26.10" -"i18next@>= 26.2.0", i18next@26.2.0: - version "26.2.0" - resolved "https://registry.npmjs.org/i18next/-/i18next-26.2.0.tgz" - integrity sha512-zwBHldHdTmwN7r6UNc7lC6GWNN+YYg3DrRSeHR5PRRBf5QnJZcYHrQc0uaU26qZeYxR7iFZD+Y315dPnKP47wA== - -iconv-lite@^0.6.3, iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@^0.7.0: +iconv-lite@^0.7.0, iconv-lite@~0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" - integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -idb@^7.0.1: - version "7.1.1" - resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - idb@8.0.3: version "8.0.3" resolved "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz" integrity sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg== +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" @@ -10334,7 +10978,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -10363,14 +11007,16 @@ intl-messageformat@^10.1.0: "@formatjs/icu-messageformat-parser" "2.11.4" tslib "^2.8.0" -ipaddr.js@^2.0.1: - version "2.4.0" - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.4.0.tgz#038e9ceaf8219efc5bb76347b7eb787875d5095b" + integrity sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ== + is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" @@ -11003,7 +11649,7 @@ jest-resolve-dependencies@30.4.2: jest-regex-util "30.4.0" jest-snapshot "30.4.1" -jest-resolve@*, jest-resolve@30.4.1: +jest-resolve@30.4.1: version "30.4.1" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz" integrity sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q== @@ -11100,18 +11746,6 @@ jest-snapshot@30.4.1: semver "^7.7.2" synckit "^0.11.8" -"jest-util@^29.0.0 || ^30.0.0", jest-util@30.4.1: - version "30.4.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz" - integrity sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw== - dependencies: - "@jest/types" "30.4.1" - "@types/node" "*" - chalk "^4.1.2" - ci-info "^4.2.0" - graceful-fs "^4.2.11" - picomatch "^4.0.3" - jest-util@30.2.0: version "30.2.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz" @@ -11124,6 +11758,18 @@ jest-util@30.2.0: graceful-fs "^4.2.11" picomatch "^4.0.2" +jest-util@30.4.1: + version "30.4.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz" + integrity sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw== + dependencies: + "@jest/types" "30.4.1" + "@types/node" "*" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.3" + jest-validate@30.4.1: version "30.4.1" resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz" @@ -11150,15 +11796,6 @@ jest-watcher@30.4.1: jest-util "30.4.1" string-length "^4.0.2" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest-worker@30.4.1: version "30.4.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz" @@ -11170,7 +11807,16 @@ jest-worker@30.4.1: merge-stream "^2.0.0" supports-color "^8.1.1" -jest@*, "jest@^29.0.0 || ^30.0.0", jest@30.4.2: +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@30.4.2: version "30.4.2" resolved "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz" integrity sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ== @@ -11200,7 +11846,7 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsdom@*, jsdom@29.1.1: +jsdom@29.1.1: version "29.1.1" resolved "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz" integrity sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q== @@ -11401,6 +12047,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lib0@^0.2.102, lib0@^0.2.99: + version "0.2.117" + resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz" + integrity sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw== + dependencies: + isomorphic.js "^0.2.4" + lib0@^0.2.109, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87: version "0.2.114" resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz" @@ -11408,18 +12061,10 @@ lib0@^0.2.109, lib0@^0.2.47, lib0@^0.2.85, lib0@^0.2.87: dependencies: isomorphic.js "^0.2.4" -lib0@^0.2.99: - version "0.2.117" - resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz" - integrity sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw== - dependencies: - isomorphic.js "^0.2.4" - -lib0@^1.0.0-rc.1: - version "1.0.0-rc.13" - -lib0@^1.0.0-rc.13: - version "1.0.0-rc.13" +lib0@^1.0.0-rc.1, lib0@^1.0.0-rc.13: + version "1.0.0-rc.14" + resolved "https://registry.yarnpkg.com/lib0/-/lib0-1.0.0-rc.14.tgz#4ff999959286c6b833b7c1b74e83c2becbb1c989" + integrity sha512-zXdJpWHTbkKGw7MsjillED5+CTl44I5UeZr2MViWFVhoAsoyNJmQGG5lm9ecnI2ZeV5tGhj47WGN2V+tY42LGg== lie@~3.3.0: version "3.3.0" @@ -11428,6 +12073,41 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + lightningcss-linux-x64-gnu@1.32.0: version "1.32.0" resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz" @@ -11438,6 +12118,16 @@ lightningcss-linux-x64-musl@1.32.0: resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz" integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + +lightningcss-win32-x64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" + integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== + lightningcss@^1.32.0: version "1.32.0" resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" @@ -11531,7 +12221,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.20, lodash@^4.17.21, lodash@4.18.1: +lodash@4.18.1, lodash@^4.17.20, lodash@^4.17.21: version "4.18.1" resolved "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -11587,14 +12277,7 @@ lz-string@^1.5.0: resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== -magic-string@^0.25.0: - version "0.25.9" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.25.7: +magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== @@ -11724,16 +12407,16 @@ media-typer@^1.1.0: resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - "memoize-one@>=3.1.1 <6": version "5.2.1" resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + meow@^13.2.0: version "13.2.0" resolved "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz" @@ -11804,28 +12487,23 @@ micromatch@^4.0.4, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^2.1.12, mime-types@^2.1.35: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime-types@^2.1.35: - version "2.1.35" - dependencies: - mime-db "1.52.0" - mime-types@^3.0.0, mime-types@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" @@ -11860,28 +12538,7 @@ minimatch@^10.2.1, minimatch@^10.2.2, minimatch@^10.2.4, "minimatch@^9.0.3 || ^1 dependencies: brace-expansion "^5.0.2" -minimatch@^3.0.2: - version "3.1.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" - integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4: - version "3.1.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" - integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.1: - version "3.1.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" - integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -11895,14 +12552,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: - version "9.0.9" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" - integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== - dependencies: - brace-expansion "^2.0.2" - -minimatch@^9.0.5: +minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.9" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== @@ -11916,6 +12566,8 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: minio@^8.0.6: version "8.0.7" + resolved "https://registry.yarnpkg.com/minio/-/minio-8.0.7.tgz#6a651151f3d2df1077ca894e46efc47f4a1ec25c" + integrity sha512-E737MgufW8CeQAsTAtnEMrxZ9scMSf29kkhZoXzDTKj/Jszzo2SfeZUH9wbDQH2Rsq6TCtl/yQL0+XdVKZansQ== dependencies: async "^3.2.4" block-stream2 "^2.1.0" @@ -11931,7 +12583,7 @@ minio@^8.0.6: through2 "^4.0.2" xml2js "^0.5.0 || ^0.6.2" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.3: version "7.1.3" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== @@ -11941,11 +12593,6 @@ minipass@^7.1.2: resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minipass@^7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" - integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== - mktemp@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/mktemp/-/mktemp-0.4.0.tgz" @@ -11956,16 +12603,16 @@ module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz" integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mylas@^2.1.9: version "2.1.13" resolved "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz" @@ -12001,7 +12648,7 @@ neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -"next@^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0", next@16.2.6: +next@16.2.6: version "16.2.6" resolved "https://registry.npmjs.org/next/-/next-16.2.6.tgz" integrity sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw== @@ -12038,7 +12685,7 @@ node-abi@^3.73.0: dependencies: semver "^7.3.5" -node-fetch@*, node-fetch@^2.6.7, node-fetch@2.7.0: +node-fetch@2.7.0, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -12076,7 +12723,7 @@ nodemon@3.1.14: touch "^3.1.0" undefsafe "^2.0.5" -normalize-path@^3.0.0, normalize-path@~3.0.0, normalize-path@3.0.0: +normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -12187,6 +12834,8 @@ obug@^2.1.1: on-exit-leak-free@^2.1.0: version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== on-finished@^2.4.1: version "2.4.1" @@ -12287,20 +12936,6 @@ package-json-from-dist@^1.0.0: resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -"packages-i18n@file:/home/manu/dev/dinum/docs/src/frontend/packages/i18n": - version "5.2.1" - resolved "file:packages/i18n" - dependencies: - "@types/jest" "30.0.0" - "@types/node" "*" - eslint-plugin-docs "*" - eslint-plugin-import "2.32.0" - i18next-parser "9.4.0" - jest "30.4.2" - ts-jest "29.4.11" - typescript "*" - yargs "18.0.0" - pako@^0.2.5: version "0.2.9" resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" @@ -12374,6 +13009,8 @@ path-exists@^4.0.0: path-expression-matcher@^1.5.0: version "1.5.0" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz#3b98545dc88ffebb593e2d8458d0929da9275f4a" + integrity sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ== path-is-absolute@^1.0.0: version "1.0.1" @@ -12479,46 +13116,37 @@ pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -picocolors@^1.0.0, picocolors@^1.1.1, picocolors@1.1.1: +picocolors@1.1.1, picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.2" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== -picomatch@^2.2.1: - version "2.3.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -picomatch@^2.2.2: - version "2.3.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -picomatch@^2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: +picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pino-abstract-transport@^3.0.0: version "3.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz#b21e5f33a297e8c4c915c62b3ce5dd4a87a52c23" + integrity sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg== dependencies: split2 "^4.0.0" pino-std-serializers@^7.0.0: version "7.1.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz#a7b0cd65225f29e92540e7853bd73b07479893fc" + integrity sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw== pino@^10.3.1: version "10.3.1" + resolved "https://registry.yarnpkg.com/pino/-/pino-10.3.1.tgz#6552c8f8d8481844c9e452e7bf0be90bff1939ce" + integrity sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg== dependencies: "@pinojs/redact" "^0.4.0" atomic-sleep "^1.0.0" @@ -12572,7 +13200,7 @@ plimit-lit@^1.2.6: dependencies: queue-lit "^1.5.1" -pngjs@^7.0.0, pngjs@7.0.0: +pngjs@7.0.0, pngjs@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz" integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== @@ -12592,7 +13220,7 @@ postcss-safe-parser@^7.0.1: resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz" integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== -postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0: +postcss-selector-parser@^7.1.0: version "7.1.1" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz" integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== @@ -12605,9 +13233,9 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.31, postcss@^8.5.10, postcss@^8.5.6, postcss@8.4.31: +postcss@8.4.31, postcss@8.5.15, postcss@^8.5.10, postcss@^8.5.6: version "8.5.15" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c" integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== dependencies: nanoid "^3.3.12" @@ -12638,6 +13266,8 @@ postgres-interval@^1.1.0: postgres@^3.4.3: version "3.4.9" + resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.4.9.tgz#8e9a49cecb1b0e7d67a607f32a53ed54b3055271" + integrity sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw== posthog-js@1.376.0: version "1.376.0" @@ -12682,7 +13312,7 @@ prettier-linter-helpers@^1.0.1: dependencies: fast-diff "^1.1.2" -prettier@>=3.0.0, prettier@3.8.3: +prettier@3.8.3: version "3.8.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz" integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw== @@ -12692,16 +13322,7 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^27.0.2: - version "27.5.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^30.0.0, pretty-format@30.2.0: +pretty-format@30.2.0, pretty-format@^30.0.0: version "30.2.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz" integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== @@ -12720,6 +13341,15 @@ pretty-format@30.4.1: react-is-18 "npm:react-is@^18.3.1" react-is-19 "npm:react-is@^19.2.5" +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -12727,6 +13357,8 @@ process-nextick-args@~2.0.0: process-warning@^5.0.0: version "5.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-5.0.0.tgz#566e0bf79d1dff30a72d8bbbe9e8ecefe8d378d7" + integrity sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA== progress@^2.0.3: version "2.0.3" @@ -12851,7 +13483,7 @@ prosemirror-menu@^1.2.4: prosemirror-history "^1.0.0" prosemirror-state "^1.0.0" -prosemirror-model@^1.0.0, prosemirror-model@^1.19.3, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.22.1, prosemirror-model@^1.24.1, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4, prosemirror-model@^1.7.1: +prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.24.1, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4: version "1.25.4" resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz" integrity sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA== @@ -12874,7 +13506,7 @@ prosemirror-schema-list@^1.5.0: prosemirror-state "^1.0.0" prosemirror-transform "^1.7.3" -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.2.3, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3, prosemirror-state@^1.4.4: +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.3, prosemirror-state@^1.4.4: version "1.4.4" resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz" integrity sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw== @@ -12913,16 +13545,16 @@ prosemirror-trailing-node@^3.0.0: "@remirror/core-constants" "3.0.0" escape-string-regexp "^4.0.0" -prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2, prosemirror-transform@^1.10.3, prosemirror-transform@^1.10.5, prosemirror-transform@^1.11.0, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2, prosemirror-transform@^1.10.3, prosemirror-transform@^1.10.5, prosemirror-transform@^1.11.0, prosemirror-transform@^1.7.3: version "1.12.0" resolved "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz" integrity sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w== dependencies: prosemirror-model "^1.21.0" -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.32.4, prosemirror-view@^1.33.8, prosemirror-view@^1.38.1, prosemirror-view@^1.39.1, prosemirror-view@^1.41.4, prosemirror-view@^1.9.10: +prosemirror-view@1.41.8, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.38.1, prosemirror-view@^1.39.1, prosemirror-view@^1.41.4: version "1.41.8" - resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.8.tgz" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.8.tgz#bfb48d9dc328f1aa2a0eea1600b0828818be03f1" integrity sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA== dependencies: prosemirror-model "^1.20.0" @@ -13006,6 +13638,8 @@ query-selector-shadow-dom@^1.0.1: query-string@^7.1.3: version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: decode-uri-component "^0.2.2" filter-obj "^1.1.0" @@ -13036,6 +13670,8 @@ queue@^6.0.1: quick-format-unescaped@^4.0.3: version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== quick-temp@^0.1.8: version "0.1.8" @@ -13126,7 +13762,7 @@ react-aria-components@1.17.0: react-aria "3.48.0" react-stately "3.46.0" -react-aria@^3.47.0, react-aria@3.47.0: +react-aria@3.47.0, react-aria@^3.47.0: version "3.47.0" resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.47.0.tgz" integrity sha512-nvahimIqdByl/PXk/xPkG30LPRzcin+/Uk0uFfwbbKRRFC9aa22a6BRULZLqVHwa9GaNyKe6CDUxO1Dde4v0kA== @@ -13207,9 +13843,9 @@ react-dnd@^14.0.3: fast-deep-equal "^3.1.3" hoist-non-react-statics "^3.3.2" -react-dom@*, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0 || ^19.0 || >= 19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.1.2, react-dom@^19.2.0, react-dom@^19.2.5, "react-dom@>= 16.14", "react-dom@>= 16.8.0", react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=17.0.0: +react-dom@*, react-dom@19.2.6, react-dom@^19.2.5: version "19.2.6" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.6.tgz#44a81b0bcca22da814c00847d09d01c8615529b7" integrity sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g== dependencies: scheduler "^0.27.0" @@ -13252,6 +13888,11 @@ react-intersection-observer@10.0.3: resolved "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz" integrity sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw== +react-is@18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -13267,11 +13908,6 @@ react-is@^18.3.1: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-is@18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" @@ -13361,38 +13997,6 @@ react-select@5.10.2: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.2.0" -react-stately@^3.45.0, react-stately@3.45.0: - version "3.45.0" - resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.45.0.tgz" - integrity sha512-G3bYr0BIiookpt4H05VeZUuVS/FslQAj2TeT8vDfCiL314Y+LtPXIPe/a3eamCA0wljy7z1EDYKV50Qbz7pcJg== - dependencies: - "@react-stately/calendar" "^3.9.3" - "@react-stately/checkbox" "^3.7.5" - "@react-stately/collections" "^3.12.10" - "@react-stately/color" "^3.9.5" - "@react-stately/combobox" "^3.13.0" - "@react-stately/data" "^3.15.2" - "@react-stately/datepicker" "^3.16.1" - "@react-stately/disclosure" "^3.0.11" - "@react-stately/dnd" "^3.7.4" - "@react-stately/form" "^3.2.4" - "@react-stately/list" "^3.13.4" - "@react-stately/menu" "^3.9.11" - "@react-stately/numberfield" "^3.11.0" - "@react-stately/overlays" "^3.6.23" - "@react-stately/radio" "^3.11.5" - "@react-stately/searchfield" "^3.5.19" - "@react-stately/select" "^3.9.2" - "@react-stately/selection" "^3.20.9" - "@react-stately/slider" "^3.7.5" - "@react-stately/table" "^3.15.4" - "@react-stately/tabs" "^3.8.9" - "@react-stately/toast" "^3.1.3" - "@react-stately/toggle" "^3.9.5" - "@react-stately/tooltip" "^3.5.11" - "@react-stately/tree" "^3.9.6" - "@react-types/shared" "^3.33.1" - react-stately@3.37.0: version "3.37.0" resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.37.0.tgz" @@ -13425,6 +14029,38 @@ react-stately@3.37.0: "@react-stately/tree" "^3.8.9" "@react-types/shared" "^3.29.0" +react-stately@3.45.0, react-stately@^3.45.0: + version "3.45.0" + resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.45.0.tgz" + integrity sha512-G3bYr0BIiookpt4H05VeZUuVS/FslQAj2TeT8vDfCiL314Y+LtPXIPe/a3eamCA0wljy7z1EDYKV50Qbz7pcJg== + dependencies: + "@react-stately/calendar" "^3.9.3" + "@react-stately/checkbox" "^3.7.5" + "@react-stately/collections" "^3.12.10" + "@react-stately/color" "^3.9.5" + "@react-stately/combobox" "^3.13.0" + "@react-stately/data" "^3.15.2" + "@react-stately/datepicker" "^3.16.1" + "@react-stately/disclosure" "^3.0.11" + "@react-stately/dnd" "^3.7.4" + "@react-stately/form" "^3.2.4" + "@react-stately/list" "^3.13.4" + "@react-stately/menu" "^3.9.11" + "@react-stately/numberfield" "^3.11.0" + "@react-stately/overlays" "^3.6.23" + "@react-stately/radio" "^3.11.5" + "@react-stately/searchfield" "^3.5.19" + "@react-stately/select" "^3.9.2" + "@react-stately/selection" "^3.20.9" + "@react-stately/slider" "^3.7.5" + "@react-stately/table" "^3.15.4" + "@react-stately/tabs" "^3.8.9" + "@react-stately/toast" "^3.1.3" + "@react-stately/toggle" "^3.9.5" + "@react-stately/tooltip" "^3.5.11" + "@react-stately/tree" "^3.9.6" + "@react-types/shared" "^3.33.1" + react-stately@3.46.0: version "3.46.0" resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.46.0.tgz" @@ -13475,12 +14111,12 @@ react-window@^1.8.11: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@*, "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.14.0 || 17.x || 18.x || 19.x", "react@^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react@^16.8.6 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", "react@^18.0 || ^19.0 || >= 19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.1.2, react@^19.2.0, react@^19.2.5, react@^19.2.6, "react@>= 16.14", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@>=16.12.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17.0.0, react@>=18.0.0: +react@*, react@19.2.6, react@^19.2.5: version "19.2.6" - resolved "https://registry.npmjs.org/react/-/react-19.2.6.tgz" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.6.tgz#3dadb8e12b2a7934c1d5317973e5dce1301f9a4d" integrity sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q== -readable-stream@^3.4.0: +readable-stream@3, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -13502,13 +14138,6 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@3: - version "3.6.2" - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -13518,9 +14147,13 @@ readdirp@~3.6.0: real-require@^0.2.0: version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== real-require@^1.0.0: version "1.0.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-1.0.0.tgz#e4f0a3737e8060c513b60c2652c58b8ef56bc8a9" + integrity sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g== redent@^3.0.0: version "3.0.0" @@ -13530,8 +14163,21 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redis@5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-5.10.0.tgz#c1b26ba2acd9c5fcc0d1724a3c7f0984ca43f48b" + integrity sha512-0/Y+7IEiTgVGPrLFKy8oAEArSyEJkU0zvgV5xyi9NzNQ+SLZmyFbUsWIbgPcd4UdUh00opXGKlXJwMmsis5Byw== + dependencies: + "@redis/bloom" "5.10.0" + "@redis/client" "5.10.0" + "@redis/json" "5.10.0" + "@redis/search" "5.10.0" + "@redis/time-series" "5.10.0" + redis@^5.10.0: version "5.12.1" + resolved "https://registry.yarnpkg.com/redis/-/redis-5.12.1.tgz#f95297e01eca8b87a109601a2418647e05f16bee" + integrity sha512-LDsoVvb/CpoV9EN3FXvgvSHNJWuCIzl9MiO3ppOevuGLpSGJhwfQjpEwfFJcQvNSddHADDdZaWx0HnmMxRXG7g== dependencies: "@redis/bloom" "5.12.1" "@redis/client" "5.12.1" @@ -13760,14 +14406,14 @@ rolldown@1.0.0-rc.17: "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.17" "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.17" -"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0||^3.0.0||^4.0.0, rollup@^2.43.1, rollup@^2.78.0||^3.0.0||^4.0.0: +rollup@^2.43.1: version "2.80.0" resolved "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz" integrity sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ== optionalDependencies: fsevents "~2.3.2" -rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@^4.60.3: +rollup@^4.60.3: version "4.61.0" resolved "https://registry.npmjs.org/rollup/-/rollup-4.61.0.tgz" integrity sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g== @@ -13855,21 +14501,16 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-push-apply@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" @@ -13889,13 +14530,15 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: safe-stable-stringify@^2.3.1: version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4, sax@>=0.6.0: +sax@>=0.6.0, sax@^1.2.4: version "1.4.1" resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== @@ -13912,16 +14555,16 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== - scheduler@0.25.0-rc-603e6108-20241029: version "0.25.0-rc-603e6108-20241029" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz" integrity sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA== +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + schema-utils@^4.3.0, schema-utils@^4.3.3: version "4.3.3" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz" @@ -13964,8 +14607,10 @@ send@^1.1.0, send@^1.2.0: range-parser "^1.2.1" statuses "^2.0.1" -serialize-javascript@^6.0.1: +serialize-javascript@7.0.5, serialize-javascript@^6.0.1: version "7.0.5" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" + integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== serve-static@^2.2.0: version "2.2.0" @@ -13977,23 +14622,6 @@ serve-static@^2.2.0: parseurl "^1.3.3" send "^1.2.0" -"server-y-provider@file:/home/manu/dev/dinum/docs/src/frontend/servers/y-provider": - version "5.2.1" - resolved "file:servers/y-provider" - dependencies: - "@blocknote/server-util" "0.51.4" - "@hocuspocus/server" "3.4.4" - "@sentry/node" "10.53.1" - "@sentry/profiling-node" "10.53.1" - "@tiptap/extensions" "*" - axios "1.16.1" - cors "2.8.6" - express "5.2.1" - express-ws "5.0.2" - uuid "14.0.0" - y-protocols "1.0.7" - yjs "*" - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -14030,7 +14658,7 @@ setimmediate@^1.0.5: resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -setprototypeof@~1.2.0, setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -14179,6 +14807,8 @@ snake-case@^3.0.4: sonic-boom@^4.0.1: version "4.2.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.1.tgz#28598250df4899c0ac572d7e2f0460690ba6a030" + integrity sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q== dependencies: atomic-sleep "^1.0.0" @@ -14199,14 +14829,6 @@ source-map-js@^1.0.1, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -14215,6 +14837,14 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" @@ -14244,9 +14874,13 @@ space-separated-tokens@^2.0.0: split-on-first@^1.0.0: version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== split2@^4.0.0: version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@^1.1.1: version "1.1.3" @@ -14292,16 +14926,16 @@ stacktrace-parser@^0.1.11: dependencies: type-fest "^0.7.1" -statuses@^2.0.1, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@^2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + std-env@^4.0.0-rc.1: version "4.0.0" resolved "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz" @@ -14317,6 +14951,8 @@ stop-iteration-iterator@^1.1.0: stream-chain@^2.2.5: version "2.2.5" + resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" + integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== stream-composer@^1.0.2: version "1.0.2" @@ -14327,6 +14963,8 @@ stream-composer@^1.0.2: stream-json@^1.8.0: version "1.9.1" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.9.1.tgz#e3fec03e984a503718946c170db7d74556c2a187" + integrity sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw== dependencies: stream-chain "^2.2.5" @@ -14341,20 +14979,8 @@ streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: strict-uri-encode@^2.0.0: version "2.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== string-length@^4.0.2: version "4.0.2" @@ -14476,6 +15102,20 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" @@ -14507,7 +15147,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.2: version "7.2.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== @@ -14521,13 +15161,6 @@ strip-ansi@^7.1.0: dependencies: ansi-regex "^6.0.1" -strip-ansi@^7.1.2: - version "7.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" - integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== - dependencies: - ansi-regex "^6.2.2" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -14561,7 +15194,11 @@ strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strnum@^2.3.0: - version "2.3.0" + version "2.4.0" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.4.0.tgz#304881c3299b017855f1934a4ce85bfb60b1ca2a" + integrity sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg== + dependencies: + anynum "^1.0.0" styled-components@6.4.2: version "6.4.2" @@ -14599,7 +15236,7 @@ stylelint-prettier@5.0.3: dependencies: prettier-linter-helpers "^1.0.0" -stylelint@^16.23.0, stylelint@>=16.0.0, stylelint@16.26.1: +stylelint@16.26.1: version "16.26.1" resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz" integrity sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw== @@ -14692,14 +15329,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -14847,7 +15477,7 @@ terser-webpack-plugin@^5.5.0: schema-utils "^4.3.0" terser "^5.31.1" -terser@^5.16.0, terser@^5.17.4, terser@^5.31.1: +terser@^5.17.4, terser@^5.31.1: version "5.44.0" resolved "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz" integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== @@ -14875,6 +15505,8 @@ text-decoder@^1.1.0: thread-stream@^4.0.0: version "4.2.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-4.2.0.tgz#054063e93baab22363d05b784d6c7e439230cac7" + integrity sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ== dependencies: real-require "^1.0.0" @@ -14893,6 +15525,8 @@ through2@^2.0.1: through2@^4.0.2: version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" @@ -14980,7 +15614,7 @@ to-through@^3.0.0: dependencies: streamx "^2.12.5" -toidentifier@~1.0.1, toidentifier@1.0.1: +toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -15065,7 +15699,7 @@ ts-jest@29.4.11: type-fest "^4.41.0" yargs-parser "^21.1.1" -ts-node@>=9.0.0, ts-node@10.9.2: +ts-node@10.9.2: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -15215,9 +15849,9 @@ typescript-eslint@^8.46.0: "@typescript-eslint/typescript-estree" "8.57.0" "@typescript-eslint/utils" "8.57.0" -typescript@*, typescript@^5, "typescript@^5 || ^6", typescript@^5.0.4, "typescript@^5.4.0 || ^6.0.0", typescript@>=2.7, typescript@>=3.3.1, "typescript@>=4.3 <7", typescript@>=4.5.0, typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0", "typescript@>=4.8.4 <6.1.0", "typescript@>=4.8.4 <7.0.0", typescript@>=4.9.5, typescript@>=5.0.0, "typescript@3.x || 4.x || 5.x || 6.x": +typescript@*, typescript@6.0.3, typescript@^5.0.4: version "6.0.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== uc.micro@^2.0.0, uc.micro@^2.1.0: @@ -15367,7 +16001,7 @@ unpipe@~1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unrs-resolver@^1.0.0, unrs-resolver@^1.6.2, unrs-resolver@^1.7.11, unrs-resolver@^1.9.2: +unrs-resolver@^1.6.2, unrs-resolver@^1.7.11, unrs-resolver@^1.9.2: version "1.11.1" resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== @@ -15447,7 +16081,7 @@ use-sidecar@^1.1.3: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@^1.2.0, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0, use-sync-external-store@^1.6.0, use-sync-external-store@>=1.2.0, use-sync-external-store@1.6.0: +use-sync-external-store@1.6.0, use-sync-external-store@^1.2.0, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0, use-sync-external-store@^1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== @@ -15464,7 +16098,7 @@ uuid@14.0.0: "uws@github:uNetworking/uWebSockets.js#v20.57.0": version "20.57.0" - resolved "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#fcfc622a4286909593b7f390056d89e0ca3b56b9" + resolved "git+https://github.com/uNetworking/uWebSockets.js.git#fcfc622a4286909593b7f390056d89e0ca3b56b9" v8-compile-cache-lib@^3.0.1: version "3.0.1" @@ -15565,7 +16199,7 @@ vite-compatible-readable-stream@^3.6.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -"vite@^6.0.0 || ^7.0.0 || ^8.0.0", vite@^8.0.0: +"vite@^6.0.0 || ^7.0.0 || ^8.0.0": version "8.0.10" resolved "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz" integrity sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw== @@ -15585,7 +16219,7 @@ vitest-mock-extended@4.0.0: dependencies: ts-essentials ">=10.0.0" -vitest@*, vitest@>=4.0.0, vitest@4.1.7: +vitest@4.1.7: version "4.1.7" resolved "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz" integrity sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA== @@ -15698,7 +16332,7 @@ webpack-sources@^3.4.1: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz" integrity sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ== -"webpack@^4.4.0 || ^5.91.0", webpack@^5.1.0, webpack@>=5.0.0, webpack@5.107.1: +webpack@5.107.1: version "5.107.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.107.1.tgz" integrity sha512-mvdIWxj/H6QsfgDdH9djne3a5dYcmEmtsXGESkypaGN5jXjF/b+9KDlmTDQ2TKlFUeA2fI9Y65kihD30JOdB+Q== @@ -15752,16 +16386,7 @@ whatwg-url@^14.0.0: tr46 "^5.1.0" webidl-conversions "^7.0.0" -whatwg-url@^16.0.0: - version "16.0.1" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz" - integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== - dependencies: - "@exodus/bytes" "^1.11.0" - tr46 "^6.0.0" - webidl-conversions "^8.0.1" - -whatwg-url@^16.0.1: +whatwg-url@^16.0.0, whatwg-url@^16.0.1: version "16.0.1" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz" integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== @@ -16059,8 +16684,10 @@ workbox-window@7.1.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0, wrap-ansi@^8.1.0, wrap-ansi@^9.0.0: +wrap-ansi@10.0.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0, wrap-ansi@^9.0.0: version "10.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-10.0.0.tgz#b83ddcc14dbc5596f1b07e153bf6f863c1acbb57" + integrity sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ== dependencies: ansi-styles "^6.2.3" string-width "^8.2.0" @@ -16079,6 +16706,11 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" +ws@8.21.0: + version "8.21.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz" + integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== + ws@^7.4.6: version "7.5.10" resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" @@ -16089,11 +16721,6 @@ ws@^8.17.1, ws@^8.18.0, ws@^8.5.0: resolved "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz" integrity sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w== -ws@8.21.0: - version "8.21.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz" - integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== - xml-js@^1.6.8: version "1.6.11" resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" @@ -16108,20 +16735,26 @@ xml-name-validator@^5.0.0: xml-naming@^0.1.0: version "0.1.0" + resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" + integrity sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw== + +"xml2js@^0.5.0 || ^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" xml@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== -"xml2js@^0.5.0 || ^0.6.2": - version "0.6.2" - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - xmlbuilder@~11.0.0: version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== xmlchars@^2.2.0: version "2.2.0" @@ -16140,18 +16773,21 @@ y-prosemirror@^1.3.7: dependencies: lib0 "^0.2.109" -y-protocols@^1.0.1: - version "1.0.6" - dependencies: - lib0 "^0.2.85" - -y-protocols@^1.0.6, y-protocols@1.0.7: +y-protocols@1.0.7, y-protocols@^1.0.5, y-protocols@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz" integrity sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw== dependencies: lib0 "^0.2.85" +y-websocket@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-3.0.0.tgz#e86bdb29cc0a53cb8d6e33ec8d24614a723832af" + integrity sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg== + dependencies: + lib0 "^0.2.102" + y-protocols "^1.0.5" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" @@ -16162,7 +16798,7 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0, yaml@^2.4.2: +yaml@^1.10.0: version "1.10.3" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz" integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== @@ -16177,6 +16813,18 @@ yargs-parser@^22.0.0: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz" integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== +yargs@18.0.0: + version "18.0.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz" + integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== + dependencies: + cliui "^9.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + string-width "^7.2.0" + y18n "^5.0.5" + yargs-parser "^22.0.0" + yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" @@ -16190,27 +16838,9 @@ yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@18.0.0: - version "18.0.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz" - integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== - dependencies: - cliui "^9.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - string-width "^7.2.0" - y18n "^5.0.5" - yargs-parser "^22.0.0" - -"yhub@file:/home/manu/dev/dinum/docs/src/frontend/servers/yhub": - version "1.0.0" - resolved "file:servers/yhub" - dependencies: - "@y/hub" "^0.2.22" - -yjs@*, yjs@^13.0.0, yjs@^13.5.38, yjs@^13.6.27, yjs@^13.6.8: +yjs@*, yjs@13.6.30, yjs@^13.6.27: version "13.6.30" - resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.30.tgz" + resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.30.tgz#cd7ee5399431fcd35812d7a43694b57bfa2f005d" integrity sha512-vv/9h42eCMC81ZHDFswuu/MKzkl/vyq1BhaNGfHyOonwlG4CJbQF4oiBBJPvfdeCt/PlVDWh7Nov9D34YY09uQ== dependencies: lib0 "^0.2.99" @@ -16235,16 +16865,16 @@ yoga-layout@^3.2.1: resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz" integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== +zod@4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== + "zod@^3.25.0 || ^4.0.0": version "4.3.6" resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz" integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== -"zod@^3.25.76 || ^4.1.8", zod@4.4.3: - version "4.4.3" - resolved "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz" - integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== - zustand@5.0.13: version "5.0.13" resolved "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz"