From aba6a65bd5be91c9205c5bbe26bcc47ed99fb483 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 9 Dec 2025 12:58:48 +0200 Subject: [PATCH 001/123] chore(ci): configure release/core-2 branch for production releases (#7404) --- .github/workflows/ci.yml | 4 +- .github/workflows/nightly-checks.yml | 102 -------------------------- .github/workflows/preview.retheme.yml | 67 ----------------- .github/workflows/release-canary.yml | 82 --------------------- .github/workflows/release.yml | 16 ++-- 5 files changed, 10 insertions(+), 261 deletions(-) delete mode 100644 .github/workflows/nightly-checks.yml delete mode 100644 .github/workflows/preview.retheme.yml delete mode 100644 .github/workflows/release-canary.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 61953716e78..54bd7368245 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,9 +4,7 @@ on: merge_group: pull_request: branches: - - main - - release/v4 - - vincent-and-the-doctor + - release/core-2 permissions: contents: read diff --git a/.github/workflows/nightly-checks.yml b/.github/workflows/nightly-checks.yml deleted file mode 100644 index b8edac5a23a..00000000000 --- a/.github/workflows/nightly-checks.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: Nightly upstream tests -on: - workflow_dispatch: - schedule: - - cron: '0 7 * * *' - -jobs: - integration-tests: - name: Integration Tests - runs-on: ${{ vars.RUNNER_NORMAL || 'ubuntu-latest' }} - timeout-minutes: ${{ vars.TIMEOUT_MINUTES_EXTENDED && fromJSON(vars.TIMEOUT_MINUTES_EXTENDED) || 30 }} - - strategy: - matrix: - test-name: ['nextjs'] - - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - show-progress: false - - - name: Setup - id: config - uses: ./.github/actions/init - with: - turbo-signature: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} - turbo-team: ${{ vars.TURBO_TEAM }} - turbo-token: ${{ secrets.TURBO_TOKEN }} - playwright-enabled: true - - - name: Verdaccio - uses: ./.github/actions/verdaccio - with: - publish-cmd: | - if [ "$(npm config get registry)" = "https://registry.npmjs.org/" ]; then echo 'Error: Using default registry' && exit 1; else pnpm turbo build $TURBO_ARGS --only && pnpm changeset publish --no-git-tag; fi - - - name: Install @clerk/backend in /integration - working-directory: ./integration - run: pnpm init && pnpm add @clerk/backend - - - name: Install @clerk/clerk-js in os temp - working-directory: ${{runner.temp}} - run: mkdir clerk-js && cd clerk-js && pnpm init && pnpm add @clerk/clerk-js - - - name: Run Integration Tests - id: integration_tests - continue-on-error: true - run: | - # Capture the output and exit code - OUTPUT_FILE="${{runner.temp}}/test-output.log" - # Only run Typedoc tests for one matrix version - if [ "${{ matrix.test-name }}" == "nextjs" ]; then - E2E_DEBUG=1 E2E_APP_ID=quickstart.next.appRouter pnpm test:integration:base --grep @quickstart 2>&1 | tee "$OUTPUT_FILE" - else - E2E_DEBUG=1 pnpm turbo test:integration:${{ matrix.test-name }} $TURBO_ARGS --only 2>&1 | tee "$OUTPUT_FILE" - fi - echo "exit_code=${PIPESTATUS[0]}" >> $GITHUB_OUTPUT - env: - E2E_APP_CLERK_JS_DIR: ${{runner.temp}} - E2E_CLERK_VERSION: 'latest' - E2E_NEXTJS_VERSION: 'canary' - E2E_NPM_FORCE: 'true' - E2E_REACT_DOM_VERSION: '19.1.0' - E2E_REACT_VERSION: '19.1.0' - INTEGRATION_INSTANCE_KEYS: ${{ secrets.INTEGRATION_INSTANCE_KEYS }} - MAILSAC_API_KEY: ${{ secrets.MAILSAC_API_KEY }} - - # Upload test artifacts if tests failed - - name: Upload Test Artifacts - if: steps.integration_tests.outputs.exit_code != '0' - uses: actions/upload-artifact@v4 - with: - name: test-artifacts-${{ matrix.test-name }} - path: | - ${{runner.temp}}/test-output.log - integration/test-results/ - integration/.next/ - ${{runner.temp}}/clerk-js/node_modules/ - retention-days: 7 - - - name: Report Status - if: always() - uses: ravsamhq/notify-slack-action@v1 - with: - status: ${{ steps.integration_tests.outputs.exit_code == '0' && 'success' || 'failure' }} - notify_when: 'failure' - notification_title: 'Integration Test Failure - ${{ matrix.test-name }}' - message_format: | - *Job:* ${{ github.workflow }} (${{ matrix.test-name }}) - *Status:* ${{ steps.integration_tests.outputs.exit_code == '0' && 'Success' || 'Failed' }} - *Commit:* ${{ github.sha }} - *PR:* ${{ github.event.pull_request.html_url }} - *Artifacts:* ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_SDK_E2E_ALERTS_WEBHOOK_URL }} - - # Fail the workflow if tests failed - - name: Check Test Status - if: steps.integration_tests.outputs.exit_code != '0' - run: exit 1 diff --git a/.github/workflows/preview.retheme.yml b/.github/workflows/preview.retheme.yml deleted file mode 100644 index bd54bb93071..00000000000 --- a/.github/workflows/preview.retheme.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: Deploy Retheme Preview -run-name: Deploy Retheme Preview - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_CLERK_PROD_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_JS_RETHEME_PROJECT_ID }} - -on: - push: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.actor }} - cancel-in-progress: true - -jobs: - preview: - runs-on: ${{ vars.RUNNER_NORMAL || 'ubuntu-latest' }} - timeout-minutes: ${{ vars.TIMEOUT_MINUTES_NORMAL && fromJSON(vars.TIMEOUT_MINUTES_NORMAL) || 10 }} - permissions: - contents: write - pull-requests: write - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup - id: config - uses: ./.github/actions/init - with: - turbo-signature: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} - turbo-team: ${{ vars.TURBO_TEAM }} - turbo-token: ${{ secrets.TURBO_TOKEN }} - registry-url: 'https://registry.npmjs.org' - - - name: Build packages - run: pnpm turbo build $TURBO_ARGS - - - name: Install site in isolation - run: node scripts/install-site-in-isolation.mjs playground/nextjs - - - name: Install Vercel CLI - run: pnpm add -g vercel@latest - - - name: Pull Vercel environment information - run: | - cd $FULL_TMP_FOLDER - vercel pull --yes --environment=production --token=${{ secrets.VERCEL_CLERK_COOKIE_TOKEN }} - - - name: Copy clerk-js/dist into public/clerk-js of test site - run: | - cp -r $GITHUB_WORKSPACE/packages/clerk-js/dist $FULL_TMP_FOLDER/public/clerk-js - - - name: Build with Vercel - run: | - cd $FULL_TMP_FOLDER - vercel build --yes --prod - env: - NEXT_PUBLIC_CLERK_JS_URL: /clerk-js/clerk.browser.js - - - name: Deploy to Vercel (prebuilt) - id: vercel-deploy - run: | - cd $FULL_TMP_FOLDER - vercel deploy --prebuilt --token=${{ secrets.VERCEL_CLERK_COOKIE_TOKEN }} --no-wait --prod > deployment_url.txt - echo "url=$(cat deployment_url.txt)" >> $GITHUB_OUTPUT diff --git a/.github/workflows/release-canary.yml b/.github/workflows/release-canary.yml deleted file mode 100644 index d62475ce52b..00000000000 --- a/.github/workflows/release-canary.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Canary release -run-name: Canary release from ${{ github.ref_name }} - -on: - push: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - canary-release: - if: ${{ github.repository == 'clerk/javascript' }} - runs-on: ${{ vars.RUNNER_NORMAL || 'ubuntu-latest' }} - timeout-minutes: ${{ vars.TIMEOUT_MINUTES_NORMAL && fromJSON(vars.TIMEOUT_MINUTES_NORMAL) || 10 }} - env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ vars.TURBO_TEAM }} - TURBO_CACHE: remote:rw - permissions: - contents: read - id-token: write - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup - id: config - uses: ./.github/actions/init - with: - turbo-signature: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} - turbo-team: ${{ vars.TURBO_TEAM }} - turbo-token: ${{ secrets.TURBO_TOKEN }} - playwright-enabled: true # Must be present to enable caching on branched workflows - registry-url: "https://registry.npmjs.org" - - - name: Version packages for canary - id: version-packages - run: pnpm version-packages:canary | tail -1 >> "$GITHUB_OUTPUT" - - - name: Build release - if: steps.version-packages.outputs.success == '1' - run: pnpm turbo build $TURBO_ARGS - - - name: Canary release - if: steps.version-packages.outputs.success == '1' - run: pnpm release:canary - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_CONFIG_PROVENANCE: true - - - name: Trigger workflows on related repos - uses: actions/github-script@v7 - with: - result-encoding: string - retries: 3 - retry-exempt-status-codes: 400,401 - github-token: ${{ secrets.CLERK_COOKIE_PAT }} - script: | - const clerkjsVersion = require('./packages/clerk-js/package.json').version; - const nextjsVersion = require('./packages/nextjs/package.json').version; - - github.rest.actions.createWorkflowDispatch({ - owner: 'clerk', - repo: 'sdk-infra-workers', - workflow_id: 'update-pkg-versions.yml', - ref: 'main', - inputs: { clerkjsVersion: clerkjsVersion } - }) - - if (nextjsVersion.includes('canary')) { - console.log('clerk/nextjs changed, will notify clerk/accounts'); - github.rest.actions.createWorkflowDispatch({ - owner: 'clerk', - repo: 'accounts', - workflow_id: 'release-staging.yml', - ref: 'main', - inputs: { version: nextjsVersion } - }) - } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8bb4c2020e7..043c9b36cbe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,8 +4,7 @@ run-name: Release on: push: branches: - - main - - release/v4 + - release/core-2 concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -43,10 +42,10 @@ jobs: id: config uses: ./.github/actions/init with: - turbo-signature: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} - turbo-team: ${{ vars.TURBO_TEAM }} - turbo-token: ${{ secrets.TURBO_TOKEN }} playwright-enabled: true # Must be present to enable caching on branched workflows + # turbo-signature: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} + # turbo-team: ${{ vars.TURBO_TEAM }} + # turbo-token: ${{ secrets.TURBO_TOKEN }} - name: Build release run: pnpm turbo build $TURBO_ARGS --force @@ -55,8 +54,8 @@ jobs: id: changesets uses: changesets/action@v1 with: - commit: "ci(repo): Version packages" - title: "ci(repo): Version packages" + commit: "ci(repo): Version packages (Core 2)" + title: "ci(repo): Version packages (Core 2)" publish: pnpm release # Workaround for https://github.com/changesets/changesets/issues/421 version: pnpm version-packages @@ -139,6 +138,9 @@ jobs: - name: Checkout Repo uses: actions/checkout@v4 with: + fetch-depth: 1 + fetch-tags: false + filter: "blob:none" show-progress: false - name: Cache node_modules (Node v${{ matrix.version }}) From 038e09572e61b1b04af976180eed3e4083f49d56 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 9 Dec 2025 13:10:09 +0200 Subject: [PATCH 002/123] ci(repo): update base branch references for release/core-2 (#7410) --- .changeset/config.json | 2 +- .github/workflows/ci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index ace011cb04b..bce23d1858d 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -10,7 +10,7 @@ "fixed": [], "linked": [], "access": "public", - "baseBranch": "origin/main", + "baseBranch": "origin/release/core-2", "updateInternalDependencies": "patch", "snapshot": { "useCalculatedVersion": true, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54bd7368245..ad05f9acdc3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,7 @@ jobs: echo 'Skipping'; exit 0; else - pnpm changeset status --since=origin/main; + pnpm changeset status --since=origin/release/core-2; fi build-packages: From 7852956414e9b33fd644bb1bed3ce7c5c6d3bdae Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 9 Dec 2025 13:15:44 +0200 Subject: [PATCH 003/123] fix(tests): Update password compromise message in sign-in reset password tests (#7407) --- .changeset/old-socks-mate.md | 2 ++ .../tests/session-tasks-sign-in-reset-password.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 .changeset/old-socks-mate.md diff --git a/.changeset/old-socks-mate.md b/.changeset/old-socks-mate.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/old-socks-mate.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/integration/tests/session-tasks-sign-in-reset-password.test.ts b/integration/tests/session-tasks-sign-in-reset-password.test.ts index cf82347cf09..ac303f19473 100644 --- a/integration/tests/session-tasks-sign-in-reset-password.test.ts +++ b/integration/tests/session-tasks-sign-in-reset-password.test.ts @@ -30,7 +30,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword await expect( u.page.getByText( - "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + 'Your password may be compromised. To protect your account, please continue with an alternative sign-in method. You will be required to reset your password after signing in.', ), ).toBeVisible(); await u.po.signIn.getAltMethodsEmailCodeButton().click(); @@ -83,7 +83,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword await expect( u.page.getByText( - "Your password appears to have been compromised or it's no longer trusted and cannot be used. Please use another method to continue.", + 'Your password may be compromised. To protect your account, please continue with an alternative sign-in method. You will be required to reset your password after signing in.', ), ).toBeVisible(); await u.po.signIn.getAltMethodsEmailCodeButton().click(); From 8c4ce9cca75e31e58e86d0b73a74185d0ae5f6e5 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 9 Dec 2025 17:29:34 +0200 Subject: [PATCH 004/123] chore(ci): rename workflow to indicate Core 2 version --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 043c9b36cbe..ae9d68fce0a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,5 @@ -name: Release -run-name: Release +name: Release (Core 2) +run-name: Release (Core 2) on: push: From e448757cd3d24a509a3a312e3a376c235fba32a1 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 9 Dec 2025 11:53:43 -0800 Subject: [PATCH 005/123] chore(backend): Add API keys get, delete and update methods (#7400) --- .changeset/early-clouds-shake.md | 18 + integration/testUtils/usersService.ts | 5 +- .../tests/machine-auth/api-keys.test.ts | 2 +- .../src/api/__tests__/APIKeysApi.test.ts | 393 ++++++++++++++++++ .../backend/src/api/endpoints/APIKeysApi.ts | 53 ++- 5 files changed, 466 insertions(+), 5 deletions(-) create mode 100644 .changeset/early-clouds-shake.md create mode 100644 packages/backend/src/api/__tests__/APIKeysApi.test.ts diff --git a/.changeset/early-clouds-shake.md b/.changeset/early-clouds-shake.md new file mode 100644 index 00000000000..2321ff80cea --- /dev/null +++ b/.changeset/early-clouds-shake.md @@ -0,0 +1,18 @@ +--- +"@clerk/backend": minor +--- + +Added API keys `get`, `delete` and `update` methods. + +Usage: + +```ts +await clerkClient.apiKeys.get('api_key_id') + +await clerkClient.apiKeys.update({ + apiKeyId: 'api_key_id', + scopes: ['scope1', 'scope2'] +}) + +await clerkClient.apiKeys.delete('api_key_id') +``` diff --git a/integration/testUtils/usersService.ts b/integration/testUtils/usersService.ts index 52814990c92..2e7b184af45 100644 --- a/integration/testUtils/usersService.ts +++ b/integration/testUtils/usersService.ts @@ -62,7 +62,7 @@ export type FakeOrganization = { export type FakeAPIKey = { apiKey: APIKey; secret: string; - revoke: () => Promise; + revoke: (reason?: string | null) => Promise; }; export type UserService = { @@ -208,7 +208,8 @@ export const createUserService = (clerkClient: ClerkClient) => { return { apiKey, secret: apiKey.secret ?? '', - revoke: () => clerkClient.apiKeys.revoke({ apiKeyId: apiKey.id, revocationReason: 'For testing purposes' }), + revoke: (reason?: string | null) => + clerkClient.apiKeys.revoke({ apiKeyId: apiKey.id, revocationReason: reason }), } satisfies FakeAPIKey; }, passwordCompromised: async (userId: string) => { diff --git a/integration/tests/machine-auth/api-keys.test.ts b/integration/tests/machine-auth/api-keys.test.ts index 88697e43b08..73912c550e5 100644 --- a/integration/tests/machine-auth/api-keys.test.ts +++ b/integration/tests/machine-auth/api-keys.test.ts @@ -65,7 +65,7 @@ test.describe('Next.js API key auth within clerkMiddleware() @machine', () => { }); test.afterAll(async () => { - await fakeAPIKey.revoke(); + await fakeAPIKey.revoke('Testing purposes within clerkMiddleware()'); await fakeUser.deleteIfExists(); await app.teardown(); }); diff --git a/packages/backend/src/api/__tests__/APIKeysApi.test.ts b/packages/backend/src/api/__tests__/APIKeysApi.test.ts new file mode 100644 index 00000000000..4e57891b709 --- /dev/null +++ b/packages/backend/src/api/__tests__/APIKeysApi.test.ts @@ -0,0 +1,393 @@ +import { http, HttpResponse } from 'msw'; +import { describe, expect, it } from 'vitest'; + +import { server, validateHeaders } from '../../mock-server'; +import { createBackendApiClient } from '../factory'; + +describe('APIKeys', () => { + const apiKeyId = 'ak_xxxxx'; + const subject = 'user_xxxxx'; + const apiKeySecret = 'ak_secret_xxxxx'; + + const mockAPIKey = { + object: 'api_key', + id: apiKeyId, + type: 'secret_key', + name: 'Test API Key', + subject: subject, + scopes: ['scope1', 'scope2'], + claims: { foo: 'bar' }, + revoked: false, + revocation_reason: null, + expired: false, + expiration: null, + created_by: 'user_xxxxx', + description: 'Test description', + last_used_at: null, + created_at: 1753743316590, + updated_at: 1753743316590, + }; + + describe('list', () => { + it('retrieves a list of API keys with query parameters', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + const mockPaginatedResponse = { + data: [mockAPIKey], + total_count: 1, + }; + + server.use( + http.get( + 'https://api.clerk.test/api_keys', + validateHeaders(({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + return HttpResponse.json(mockPaginatedResponse); + }), + ), + ); + + const response = await apiClient.apiKeys.list({ + subject, + includeInvalid: true, + limit: 10, + offset: 0, + }); + + expect(response.data).toHaveLength(1); + expect(response.data[0].id).toBe(apiKeyId); + expect(response.data[0].name).toBe('Test API Key'); + expect(response.totalCount).toBe(1); + }); + }); + + describe('create', () => { + it('creates an API key with all parameters', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + const mockCreatedAPIKey = { + ...mockAPIKey, + secret: apiKeySecret, + }; + + server.use( + http.post( + 'https://api.clerk.test/api_keys', + validateHeaders(async ({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + const body = (await request.json()) as Record; + expect(body.name).toBe('New API Key'); + expect(body.subject).toBe(subject); + expect(body.description).toBe('New description'); + expect(body.scopes).toEqual(['scope1', 'scope2']); + expect(body.claims).toEqual({ foo: 'bar' }); + expect(body.seconds_until_expiration).toBe(3600); + return HttpResponse.json(mockCreatedAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.create({ + name: 'New API Key', + subject, + description: 'New description', + scopes: ['scope1', 'scope2'], + claims: { foo: 'bar' }, + secondsUntilExpiration: 3600, + }); + + expect(response.id).toBe(apiKeyId); + expect(response.name).toBe('Test API Key'); + expect(response.subject).toBe(subject); + expect(response.scopes).toEqual(['scope1', 'scope2']); + expect(response.claims).toEqual({ foo: 'bar' }); + }); + + it('creates an API key with minimal parameters', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + const mockCreatedAPIKey = { + ...mockAPIKey, + name: 'Minimal API Key', + secret: apiKeySecret, + }; + + server.use( + http.post( + 'https://api.clerk.test/api_keys', + validateHeaders(async ({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + const body = (await request.json()) as Record; + expect(body.name).toBe('Minimal API Key'); + expect(body.subject).toBe(subject); + return HttpResponse.json(mockCreatedAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.create({ + name: 'Minimal API Key', + subject, + }); + + expect(response.id).toBe(apiKeyId); + expect(response.name).toBe('Minimal API Key'); + }); + }); + + describe('get', () => { + it('retrieves an API key by ID', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + server.use( + http.get( + `https://api.clerk.test/api_keys/${apiKeyId}`, + validateHeaders(({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + return HttpResponse.json(mockAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.get(apiKeyId); + + expect(response.id).toBe(apiKeyId); + expect(response.name).toBe('Test API Key'); + expect(response.subject).toBe(subject); + expect(response.scopes).toEqual(['scope1', 'scope2']); + expect(response.claims).toEqual({ foo: 'bar' }); + expect(response.revoked).toBe(false); + }); + + it('throws error when API key ID is missing', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + await expect(apiClient.apiKeys.get('')).rejects.toThrow('A valid resource ID is required.'); + }); + }); + + describe('update', () => { + it('updates an API key with optional fields', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + const updatedClaims = { foo: 'bar', baz: 'qux' }; + const expirationTimestamp = 1753746916590; + const updatedMockAPIKey = { + ...mockAPIKey, + description: 'Updated description', + scopes: ['scope1', 'scope2', 'scope3'], + claims: updatedClaims, + expiration: expirationTimestamp, + updated_at: 1753746916590, + }; + + server.use( + http.patch( + `https://api.clerk.test/api_keys/${apiKeyId}`, + validateHeaders(({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + return HttpResponse.json(updatedMockAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.update({ + apiKeyId, + subject, + description: 'Updated description', + scopes: ['scope1', 'scope2', 'scope3'], + claims: updatedClaims, + secondsUntilExpiration: 3600, + }); + + expect(response.id).toBe(apiKeyId); + expect(response.description).toBe('Updated description'); + expect(response.scopes).toEqual(['scope1', 'scope2', 'scope3']); + expect(response.claims).toEqual(updatedClaims); + expect(response.expiration).toBe(expirationTimestamp); + expect(response.updatedAt).toBe(1753746916590); + }); + + it('throws error when API key ID is missing', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + await expect( + apiClient.apiKeys.update({ + apiKeyId: '', + subject, + }), + ).rejects.toThrow('A valid resource ID is required.'); + }); + }); + + describe('delete', () => { + const mockDeletedObject = { + object: 'api_key', + id: apiKeyId, + deleted: true, + }; + + it('deletes an API key by ID', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + server.use( + http.delete( + `https://api.clerk.test/api_keys/${apiKeyId}`, + validateHeaders(({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + return HttpResponse.json(mockDeletedObject); + }), + ), + ); + + const response = await apiClient.apiKeys.delete(apiKeyId); + + expect(response.id).toBe(apiKeyId); + expect(response.deleted).toBe(true); + expect(response.object).toBe('api_key'); + }); + + it('throws error when API key ID is missing', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + await expect(apiClient.apiKeys.delete('')).rejects.toThrow('A valid resource ID is required.'); + }); + }); + + describe('revoke', () => { + const mockRevokedAPIKey = { + ...mockAPIKey, + revoked: true, + revocation_reason: 'revoked by test', + }; + + it('revokes an API key with revocation reason', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + server.use( + http.post( + `https://api.clerk.test/api_keys/${apiKeyId}/revoke`, + validateHeaders(async ({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + const body = (await request.json()) as Record; + expect(body.revocation_reason).toBe('revoked by test'); + return HttpResponse.json(mockRevokedAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.revoke({ + apiKeyId, + revocationReason: 'revoked by test', + }); + + expect(response.revoked).toBe(true); + expect(response.revocationReason).toBe('revoked by test'); + expect(response.id).toBe(apiKeyId); + }); + + it('revokes an API key without revocation reason', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + const mockRevokedAPIKeyNoReason = { + ...mockAPIKey, + revoked: true, + revocation_reason: null, + }; + + server.use( + http.post( + `https://api.clerk.test/api_keys/${apiKeyId}/revoke`, + validateHeaders(async ({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + const body = (await request.json()) as Record; + expect(body.revocation_reason).toBeNull(); + return HttpResponse.json(mockRevokedAPIKeyNoReason); + }), + ), + ); + + const response = await apiClient.apiKeys.revoke({ + apiKeyId, + }); + + expect(response.revoked).toBe(true); + expect(response.revocationReason).toBeNull(); + }); + + it('throws error when API key ID is missing', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + await expect( + apiClient.apiKeys.revoke({ + apiKeyId: '', + }), + ).rejects.toThrow('A valid resource ID is required.'); + }); + }); + + describe('verify', () => { + it('verifies an API key secret', async () => { + const apiClient = createBackendApiClient({ + apiUrl: 'https://api.clerk.test', + secretKey: 'sk_xxxxx', + }); + + server.use( + http.post( + 'https://api.clerk.test/api_keys/verify', + validateHeaders(async ({ request }) => { + expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx'); + const body = (await request.json()) as Record; + expect(body.secret).toBe(apiKeySecret); + return HttpResponse.json(mockAPIKey); + }), + ), + ); + + const response = await apiClient.apiKeys.verify(apiKeySecret); + + expect(response.id).toBe(apiKeyId); + expect(response.name).toBe('Test API Key'); + expect(response.subject).toBe(subject); + expect(response.scopes).toEqual(['scope1', 'scope2']); + expect(response.claims).toEqual({ foo: 'bar' }); + }); + }); +}); diff --git a/packages/backend/src/api/endpoints/APIKeysApi.ts b/packages/backend/src/api/endpoints/APIKeysApi.ts index e12316db915..fce1e3da030 100644 --- a/packages/backend/src/api/endpoints/APIKeysApi.ts +++ b/packages/backend/src/api/endpoints/APIKeysApi.ts @@ -4,6 +4,7 @@ import type { PaginatedResourceResponse } from '../../api/resources/Deserializer import { joinPaths } from '../../util/path'; import { deprecated } from '../../util/shared'; import type { APIKey } from '../resources/APIKey'; +import type { DeletedObject } from '../resources/DeletedObject'; import { AbstractAPI } from './AbstractApi'; const basePath = '/api_keys'; @@ -51,6 +52,24 @@ type RevokeAPIKeyParams = { revocationReason?: string | null; }; +type UpdateAPIKeyParams = { + /** + * API key ID + */ + apiKeyId: string; + /** + * The user or Organization ID to associate the API key with + */ + subject: string; + /** + * API key description + */ + description?: string | null; + claims?: Record | null; + scopes?: string[]; + secondsUntilExpiration?: number | null; +}; + export class APIKeysAPI extends AbstractAPI { async list(queryParams: GetAPIKeyListParams) { return this.request>({ @@ -68,15 +87,45 @@ export class APIKeysAPI extends AbstractAPI { }); } - async revoke(params: RevokeAPIKeyParams) { + async get(apiKeyId: string) { + this.requireId(apiKeyId); + + return this.request({ + method: 'GET', + path: joinPaths(basePath, apiKeyId), + }); + } + + async update(params: UpdateAPIKeyParams) { const { apiKeyId, ...bodyParams } = params; this.requireId(apiKeyId); + return this.request({ + method: 'PATCH', + path: joinPaths(basePath, apiKeyId), + bodyParams, + }); + } + + async delete(apiKeyId: string) { + this.requireId(apiKeyId); + + return this.request({ + method: 'DELETE', + path: joinPaths(basePath, apiKeyId), + }); + } + + async revoke(params: RevokeAPIKeyParams) { + const { apiKeyId, revocationReason = null } = params; + + this.requireId(apiKeyId); + return this.request({ method: 'POST', path: joinPaths(basePath, apiKeyId, 'revoke'), - bodyParams, + bodyParams: { revocationReason }, }); } From 893d3e4c4ca1f4f7c9ee13961319ea9423628de9 Mon Sep 17 00:00:00 2001 From: Kamil Homernik <31961734+kamil-homer@users.noreply.github.com> Date: Wed, 10 Dec 2025 02:01:06 +0100 Subject: [PATCH 006/123] Fix(localization): add missing translations in Polish (#7390) Co-authored-by: Robert Soriano --- .changeset/whole-bikes-dig.md | 5 +++ packages/localizations/src/pl-PL.ts | 56 ++++++++++++++--------------- 2 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 .changeset/whole-bikes-dig.md diff --git a/.changeset/whole-bikes-dig.md b/.changeset/whole-bikes-dig.md new file mode 100644 index 00000000000..488a51da02b --- /dev/null +++ b/.changeset/whole-bikes-dig.md @@ -0,0 +1,5 @@ +--- +"@clerk/localizations": patch +--- + +Added translations for Polish in UI elements for Organizations diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 5037147e910..f481f854808 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -264,19 +264,19 @@ export const plPL: LocalizationResource = { membershipRole__basicMember: 'Użytkownik', membershipRole__guestMember: 'Gość', organizationList: { - action__createOrganization: 'Stwórz organizację', + action__createOrganization: 'Utwórz organizację', action__invitationAccept: 'Dołącz', action__suggestionsAccept: 'Poproś o dołączenie', - createOrganization: 'Stwórz organizację', + createOrganization: 'Utwórz organizację', invitationAcceptedLabel: 'Dołączono', - subtitle: 'to continue to {{applicationName}}', - suggestionsAcceptedLabel: 'Pending approval', + subtitle: 'aby przejść do {{applicationName}}', + suggestionsAcceptedLabel: 'Prośby o dołączenie', title: 'Wybierz konto', titleWithoutPersonal: 'Wybierz organizację', }, organizationProfile: { apiKeysPage: { - title: undefined, + title: 'Klucze API', }, badge__automaticInvitation: 'Automatyczne zaproszenia', badge__automaticSuggestion: 'Automatyczne sugestie', @@ -495,12 +495,12 @@ export const plPL: LocalizationResource = { }, }, organizationSwitcher: { - action__closeOrganizationSwitcher: undefined, + action__closeOrganizationSwitcher: 'Zamknij', action__createOrganization: 'Utwórz organizację', action__invitationAccept: 'Dołącz', action__manageOrganization: 'Zarządzaj organizacją', - action__openOrganizationSwitcher: undefined, - action__suggestionsAccept: 'Prośba o dołączenie', + action__openOrganizationSwitcher: 'Otwórz', + action__suggestionsAccept: 'Poproś o dołączenie', notSelected: 'Nie wybrano organizacji', personalWorkspace: 'Przestrzeń osobista', suggestionsAcceptedLabel: 'Oczekiwanie na zatwierdzenie', @@ -850,36 +850,36 @@ export const plPL: LocalizationResource = { socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { chooseOrganization: { - action__createOrganization: undefined, - action__invitationAccept: undefined, - action__suggestionsAccept: undefined, - subtitle: undefined, - suggestionsAcceptedLabel: undefined, - title: undefined, + action__createOrganization: 'Utwórz organizację', + action__invitationAccept: 'Dołącz', + action__suggestionsAccept: 'Poproś o dołączenie', + subtitle: 'Dołącz do istniejącej organizacji lub utwórz nową', + suggestionsAcceptedLabel: 'Oczekiwanie na dołączenie', + title: 'Wybierz organizację', }, createOrganization: { - formButtonReset: undefined, - formButtonSubmit: undefined, - formFieldInputPlaceholder__name: undefined, - formFieldInputPlaceholder__slug: undefined, - formFieldLabel__name: undefined, - formFieldLabel__slug: undefined, - subtitle: undefined, - title: undefined, + formButtonReset: 'Anuluj', + formButtonSubmit: 'Kontynuuj', + formFieldInputPlaceholder__name: 'Moja Organizacja', + formFieldInputPlaceholder__slug: 'moja-organizacja', + formFieldLabel__name: 'Nazwa', + formFieldLabel__slug: 'Slug', + subtitle: 'Wprowadź szczegóły swojej organizacji', + title: 'Utwórz swoją organizację', }, signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Wyloguj', + actionText: 'Zalogowano jako {{identifier}}', }, }, taskResetPassword: { - formButtonPrimary: undefined, + formButtonPrimary: 'Zresetuj hasło', signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Wyloguj', + actionText: 'Zalogowano jako {{identifier}}', }, + title: 'Zresetuj hasło', subtitle: undefined, - title: undefined, }, unstable__errors: { already_a_member_in_organization: '{{email}} jest już członkiem organizacji.', From 3d9e063129dae124f67771cefa94d3f0bdaae6dc Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Wed, 10 Dec 2025 03:08:42 -0600 Subject: [PATCH 007/123] ci(repo): Version packages (Core 2) (#7416) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/early-clouds-shake.md | 18 ------------------ .changeset/old-socks-mate.md | 2 -- .changeset/whole-bikes-dig.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 7 +++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 7 +++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 19 +++++++++++++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 8 ++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 7 +++++++ packages/clerk-js/package.json | 2 +- packages/expo/CHANGELOG.md | 8 ++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 7 +++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 7 +++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 6 ++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 8 ++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 7 +++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 8 ++++++++ packages/react-router/package.json | 2 +- packages/remix/CHANGELOG.md | 8 ++++++++ packages/remix/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 8 ++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 7 +++++++ packages/testing/package.json | 2 +- 33 files changed, 137 insertions(+), 40 deletions(-) delete mode 100644 .changeset/early-clouds-shake.md delete mode 100644 .changeset/old-socks-mate.md delete mode 100644 .changeset/whole-bikes-dig.md diff --git a/.changeset/early-clouds-shake.md b/.changeset/early-clouds-shake.md deleted file mode 100644 index 2321ff80cea..00000000000 --- a/.changeset/early-clouds-shake.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"@clerk/backend": minor ---- - -Added API keys `get`, `delete` and `update` methods. - -Usage: - -```ts -await clerkClient.apiKeys.get('api_key_id') - -await clerkClient.apiKeys.update({ - apiKeyId: 'api_key_id', - scopes: ['scope1', 'scope2'] -}) - -await clerkClient.apiKeys.delete('api_key_id') -``` diff --git a/.changeset/old-socks-mate.md b/.changeset/old-socks-mate.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/old-socks-mate.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/whole-bikes-dig.md b/.changeset/whole-bikes-dig.md deleted file mode 100644 index 488a51da02b..00000000000 --- a/.changeset/whole-bikes-dig.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Added translations for Polish in UI elements for Organizations diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 55e6ff9f4c6..a3cfb6edf80 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/agent-toolkit +## 0.2.9 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 0.2.8 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index 2a5ff9188ec..3214906a70f 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.8", + "version": "0.2.9", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 7d312d740ca..412b655f8b3 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/astro +## 2.16.7 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 2.16.6 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 094ad371e7e..5ec3495ab60 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.6", + "version": "2.16.7", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 7366e973a40..6612a23cd4d 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,24 @@ # Change Log +## 2.27.0 + +### Minor Changes + +- Added API keys `get`, `delete` and `update` methods. ([#7400](https://github.com/clerk/javascript/pull/7400)) by [@wobsoriano](https://github.com/wobsoriano) + + Usage: + + ```ts + await clerkClient.apiKeys.get('api_key_id'); + + await clerkClient.apiKeys.update({ + apiKeyId: 'api_key_id', + scopes: ['scope1', 'scope2'], + }); + + await clerkClient.apiKeys.delete('api_key_id'); + ``` + ## 2.26.0 ### Minor Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 48d1eb8489d..ac28c5fc5c4 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.26.0", + "version": "2.27.0", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index d397efd58aa..82c8e9865d7 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.8.11 + +### Patch Changes + +- Updated dependencies []: + - @clerk/clerk-js@5.114.1 + - @clerk/clerk-react@5.58.1 + ## 2.8.10 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 4b75c451924..df2f68e0d10 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.8.10", + "version": "2.8.11", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 7e04118dd29..4bca6735f23 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 5.114.1 + +### Patch Changes + +- Updated dependencies [[`893d3e4`](https://github.com/clerk/javascript/commit/893d3e4c4ca1f4f7c9ee13961319ea9423628de9)]: + - @clerk/localizations@3.30.1 + ## 5.114.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 2d46da3cc89..183768878ec 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.114.0", + "version": "5.114.1", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 6222317dedd..ac8b417a5bf 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.19.11 + +### Patch Changes + +- Updated dependencies []: + - @clerk/clerk-js@5.114.1 + - @clerk/clerk-react@5.58.1 + ## 2.19.10 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 44ec6b09d9c..ea95ce2d576 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.10", + "version": "2.19.11", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 710ae126bf2..23b45eee9f6 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 1.7.57 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 1.7.56 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 9de82c69819..c52453680f4 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.56", + "version": "1.7.57", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index d54e24f4ee4..bc9eaabfcbe 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.6.9 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 2.6.8 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 4a7eef8eebd..f8304a2fd9c 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.8", + "version": "2.6.9", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 08ee8953b88..110befa6f90 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.30.1 + +### Patch Changes + +- Added translations for Polish in UI elements for Organizations ([#7390](https://github.com/clerk/javascript/pull/7390)) by [@kamil-homer](https://github.com/kamil-homer) + ## 3.30.0 ### Minor Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 3f3daa791b0..51831dbe54a 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.30.0", + "version": "3.30.1", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 5f9169532b8..c704054d7ae 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 6.36.2 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + - @clerk/clerk-react@5.58.1 + ## 6.36.1 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 5ac702de8f6..89f5ede4d26 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.36.1", + "version": "6.36.2", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index e78f93807b7..6e0667887c8 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/nuxt +## 1.13.7 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 1.13.6 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 0a582dc48c2..b3198b60b3f 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.6", + "version": "1.13.7", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 48256a9caa5..e05776e4949 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.3.4 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + - @clerk/clerk-react@5.58.1 + ## 2.3.3 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 145d6d50406..e18955f082f 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.3.3", + "version": "2.3.4", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 0c650bf3a1b..b06f53a74bb 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 4.13.24 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + - @clerk/clerk-react@5.58.1 + ## 4.13.23 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 92c8745176b..7b1b7621871 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.23", + "version": "4.13.24", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index c78e3942862..dc9fa445243 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/tanstack-react-start +## 0.27.9 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + - @clerk/clerk-react@5.58.1 + ## 0.27.8 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index f6ad2b00038..4c13607d1f4 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.27.8", + "version": "0.27.9", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 37dc8f0e32f..5ed27cf1a7b 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/testing +## 1.13.23 + +### Patch Changes + +- Updated dependencies [[`e448757`](https://github.com/clerk/javascript/commit/e448757cd3d24a509a3a312e3a376c235fba32a1)]: + - @clerk/backend@2.27.0 + ## 1.13.22 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index ca024cc1545..eca5c4a5555 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.22", + "version": "1.13.23", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", From f626046c589956022b1e1ac70382c986822f4733 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 10 Dec 2025 12:16:52 -0500 Subject: [PATCH 008/123] feat(clerk-js,clerk-react,shared,types): Add sign in with Solana feature support (#7293) Signed-off-by: Kenton Duprey Co-authored-by: Dylan Staley <88163+dstaley@users.noreply.github.com> --- .changeset/legal-jokes-beg.md | 9 + packages/clerk-js/bundle-check.mjs | 4 +- packages/clerk-js/bundlewatch.config.json | 18 +- packages/clerk-js/package.json | 4 + packages/clerk-js/rspack.config.js | 30 +- packages/clerk-js/src/core/clerk.ts | 27 +- .../clerk-js/src/core/resources/SignIn.ts | 49 +- .../clerk-js/src/core/resources/SignUp.ts | 40 +- .../src/ui/common/WalletInitialIcon.tsx | 43 + .../SignInFactorOneSolanaWalletsCard.tsx | 94 ++ .../components/SignIn/SignInSocialButtons.tsx | 4 + .../src/ui/components/SignIn/index.tsx | 4 + .../components/SignUp/SignUpSocialButtons.tsx | 4 + .../SignUp/SignUpStartSolanaWalletsCard.tsx | 75 + .../src/ui/components/SignUp/index.tsx | 4 + .../ui/customizables/elementDescriptors.ts | 11 + .../ui/elements/Web3SolanaWalletButtons.tsx | 280 ++++ .../src/ui/elements/contexts/index.tsx | 3 +- .../src/ui/utils/web3CallbackErrorHandler.ts | 4 +- ...oviders.ts => injectedWeb3EthProviders.ts} | 20 +- .../src/utils/injectedWeb3SolanaProviders.ts | 66 + packages/clerk-js/src/utils/web3.ts | 94 +- .../hooks/use-third-party-provider.hook.ts | 4 + packages/localizations/src/ar-SA.ts | 15 + packages/localizations/src/be-BY.ts | 15 + packages/localizations/src/bg-BG.ts | 15 + packages/localizations/src/bn-IN.ts | 15 + packages/localizations/src/ca-ES.ts | 15 + packages/localizations/src/cs-CZ.ts | 15 + packages/localizations/src/da-DK.ts | 15 + packages/localizations/src/de-DE.ts | 15 + packages/localizations/src/el-GR.ts | 15 + packages/localizations/src/en-GB.ts | 15 + packages/localizations/src/en-US.ts | 17 + packages/localizations/src/es-CR.ts | 15 + packages/localizations/src/es-ES.ts | 15 + packages/localizations/src/es-MX.ts | 15 + packages/localizations/src/es-UY.ts | 15 + packages/localizations/src/fa-IR.ts | 15 + packages/localizations/src/fi-FI.ts | 15 + packages/localizations/src/fr-FR.ts | 15 + packages/localizations/src/he-IL.ts | 15 + packages/localizations/src/hi-IN.ts | 15 + packages/localizations/src/hr-HR.ts | 15 + packages/localizations/src/hu-HU.ts | 15 + packages/localizations/src/id-ID.ts | 15 + packages/localizations/src/is-IS.ts | 15 + packages/localizations/src/it-IT.ts | 15 + packages/localizations/src/ja-JP.ts | 15 + packages/localizations/src/kk-KZ.ts | 15 + packages/localizations/src/ko-KR.ts | 15 + packages/localizations/src/mn-MN.ts | 15 + packages/localizations/src/ms-MY.ts | 15 + packages/localizations/src/nb-NO.ts | 15 + packages/localizations/src/nl-BE.ts | 15 + packages/localizations/src/nl-NL.ts | 15 + packages/localizations/src/pl-PL.ts | 15 + packages/localizations/src/pt-BR.ts | 15 + packages/localizations/src/pt-PT.ts | 15 + packages/localizations/src/ro-RO.ts | 15 + packages/localizations/src/ru-RU.ts | 15 + packages/localizations/src/sk-SK.ts | 15 + packages/localizations/src/sr-RS.ts | 15 + packages/localizations/src/sv-SE.ts | 15 + packages/localizations/src/ta-IN.ts | 15 + packages/localizations/src/te-IN.ts | 15 + packages/localizations/src/th-TH.ts | 15 + packages/localizations/src/tr-TR.ts | 15 + packages/localizations/src/uk-UA.ts | 15 + packages/localizations/src/vi-VN.ts | 15 + packages/localizations/src/zh-CN.ts | 15 + packages/localizations/src/zh-TW.ts | 15 + packages/react/src/isomorphicClerk.ts | 10 + packages/shared/src/types/appearance.ts | 11 + packages/shared/src/types/clerk.ts | 15 + packages/shared/src/types/factors.ts | 1 + packages/shared/src/types/localization.ts | 16 + packages/shared/src/types/signIn.ts | 3 + packages/shared/src/types/signInCommon.ts | 4 + packages/shared/src/types/signInFuture.ts | 9 + packages/shared/src/types/signUp.ts | 2 + packages/shared/src/types/signUpCommon.ts | 5 + packages/shared/src/types/web3.ts | 9 +- packages/shared/src/types/web3Wallet.ts | 4 +- packages/shared/src/web3.ts | 5 + pnpm-lock.yaml | 1249 +++++++++++++---- 86 files changed, 2630 insertions(+), 341 deletions(-) create mode 100644 .changeset/legal-jokes-beg.md create mode 100644 packages/clerk-js/src/ui/common/WalletInitialIcon.tsx create mode 100644 packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx create mode 100644 packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx create mode 100644 packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx rename packages/clerk-js/src/utils/{injectedWeb3Providers.ts => injectedWeb3EthProviders.ts} (76%) create mode 100644 packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts diff --git a/.changeset/legal-jokes-beg.md b/.changeset/legal-jokes-beg.md new file mode 100644 index 00000000000..981ea036ecc --- /dev/null +++ b/.changeset/legal-jokes-beg.md @@ -0,0 +1,9 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/elements': minor +'@clerk/shared': minor +'@clerk/clerk-react': minor +--- + +Add support for Sign in with Solana. diff --git a/packages/clerk-js/bundle-check.mjs b/packages/clerk-js/bundle-check.mjs index b3058837813..ee31203690a 100644 --- a/packages/clerk-js/bundle-check.mjs +++ b/packages/clerk-js/bundle-check.mjs @@ -5,7 +5,7 @@ import path from 'node:path'; import { pipeline } from 'node:stream'; import zlib from 'node:zlib'; -import { chromium } from 'playwright'; +import { chromium } from '@playwright/test'; /** * This script generates a CLI report detailing the gzipped size of JavaScript resources loaded by `clerk-js` for a @@ -212,7 +212,7 @@ function report(url, responses) { /** * Loads the given `url` in `browser`, capturing all HTTP requests that occur. - * @param {import('playwright').Browser} browser + * @param {import('@playwright/test').Browser} browser * @param {string} url */ async function getResponseSizes(browser, url) { diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 3425146261d..f1ff076fd5b 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,12 +1,12 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "840KB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "83KB" }, - { "path": "./dist/clerk.legacy.browser.js", "maxSize": "127KB" }, - { "path": "./dist/clerk.headless*.js", "maxSize": "65KB" }, - { "path": "./dist/ui-common*.js", "maxSize": "119KB" }, - { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "122KB" }, - { "path": "./dist/vendors*.js", "maxSize": "47KB" }, + { "path": "./dist/clerk.js", "maxSize": "922.1KB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, + { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, + { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, + { "path": "./dist/ui-common*.js", "maxSize": "119.1KB" }, + { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "123KB" }, + { "path": "./dist/vendors*.js", "maxSize": "50KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" }, { "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" }, { "path": "./dist/createorganization*.js", "maxSize": "5KB" }, @@ -15,11 +15,11 @@ { "path": "./dist/organizationswitcher*.js", "maxSize": "5KB" }, { "path": "./dist/organizationlist*.js", "maxSize": "5.5KB" }, { "path": "./dist/signin*.js", "maxSize": "18KB" }, - { "path": "./dist/signup*.js", "maxSize": "9.5KB" }, + { "path": "./dist/signup*.js", "maxSize": "11KB" }, { "path": "./dist/userbutton*.js", "maxSize": "5KB" }, { "path": "./dist/userprofile*.js", "maxSize": "16KB" }, { "path": "./dist/userverification*.js", "maxSize": "5KB" }, - { "path": "./dist/onetap*.js", "maxSize": "1KB" }, + { "path": "./dist/onetap*.js", "maxSize": "3KB" }, { "path": "./dist/waitlist*.js", "maxSize": "1.5KB" }, { "path": "./dist/keylessPrompt*.js", "maxSize": "6.5KB" }, { "path": "./dist/enableOrganizationsPrompt*.js", "maxSize": "6.5KB" }, diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 183768878ec..07a34f016e0 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -68,9 +68,13 @@ "@floating-ui/react": "0.27.12", "@floating-ui/react-dom": "^2.1.3", "@formkit/auto-animate": "^0.8.2", + "@solana/wallet-adapter-base": "0.9.27", + "@solana/wallet-adapter-react": "0.15.39", + "@solana/wallet-standard": "1.1.4", "@stripe/stripe-js": "5.6.0", "@swc/helpers": "^0.5.17", "@tanstack/query-core": "5.87.4", + "@wallet-standard/core": "1.1.1", "@zxcvbn-ts/core": "3.0.4", "@zxcvbn-ts/language-common": "3.0.4", "alien-signals": "2.0.6", diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js index 9b082397aa8..ff22955e6f7 100644 --- a/packages/clerk-js/rspack.config.js +++ b/packages/clerk-js/rspack.config.js @@ -126,17 +126,41 @@ const common = ({ mode, variant, disableRHC = false }) => { signUp: { minChunks: 1, name: 'signup', - test: module => !!(module.resource && module.resource.includes('/ui/components/SignUp')), + test: module => + !!( + module instanceof rspack.NormalModule && + module.resource && + module.resource.includes('/ui/components/SignUp') + ), }, common: { minChunks: 1, name: 'ui-common', priority: -20, - test: module => !!(module.resource && !module.resource.includes('/ui/components')), + test: module => + !!( + module instanceof rspack.NormalModule && + module.resource && + !module.resource.includes('/ui/components') && + !module.resource.includes('node_modules') + ), }, defaultVendors: { minChunks: 1, - test: /[\\/]node_modules[\\/]/, + test: module => { + if (!(module instanceof rspack.NormalModule) || !module.resource) { + return false; + } + // Exclude Solana packages and their known transitive dependencies + if ( + /[\\/]node_modules[\\/](@solana|@solana-mobile|@wallet-standard|bn\.js|borsh|buffer|superstruct|bs58|jayson|rpc-websockets|qrcode)[\\/]/.test( + module.resource, + ) + ) { + return false; + } + return /[\\/]node_modules[\\/]/.test(module.resource); + }, name: 'vendors', priority: -10, }, diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 66c90865c04..081f50af569 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -37,6 +37,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk as ClerkInterface, ClerkAPIError, @@ -51,7 +52,7 @@ import type { EnvironmentJSON, EnvironmentJSONSnapshot, EnvironmentResource, - GenerateSignatureParams, + GenerateSignature, GoogleOneTapProps, HandleEmailLinkVerificationParams, HandleOAuthCallbackParams, @@ -120,6 +121,7 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getClerkQueryParam, getWeb3Identifier, hasExternalAccountSignUpError, @@ -2380,6 +2382,13 @@ export class Clerk implements ClerkInterface { }); }; + public authenticateWithSolana = async (props: AuthenticateWithSolanaParams): Promise => { + await this.authenticateWithWeb3({ + ...props, + strategy: 'web3_solana_signature', + }); + }; + public authenticateWithWeb3 = async ({ redirectUrl, signUpContinueUrl, @@ -2388,6 +2397,7 @@ export class Clerk implements ClerkInterface { strategy, legalAccepted, secondFactorUrl, + walletName, }: ClerkAuthenticateWithWeb3Params): Promise => { if (!this.client || !this.environment) { return; @@ -2396,8 +2406,8 @@ export class Clerk implements ClerkInterface { const { displayConfig } = this.environment; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; - const identifier = await getWeb3Identifier({ provider }); - let generateSignature: (params: GenerateSignatureParams) => Promise; + const identifier = await getWeb3Identifier({ provider, walletName }); + let generateSignature: GenerateSignature; switch (provider) { case 'metamask': generateSignature = generateSignatureWithMetamask; @@ -2408,6 +2418,15 @@ export class Clerk implements ClerkInterface { case 'coinbase_wallet': generateSignature = generateSignatureWithCoinbaseWallet; break; + case 'solana': + if (!walletName) { + throw new ClerkRuntimeError('Wallet name is required for Solana authentication.', { + code: 'web3_solana_wallet_name_required', + }); + } + // Solana requires walletName; bind it into the helper + generateSignature = params => generateSignatureWithSolana({ ...params, walletName }); + break; default: generateSignature = generateSignatureWithOKXWallet; break; @@ -2437,6 +2456,7 @@ export class Clerk implements ClerkInterface { identifier, generateSignature, strategy, + walletName, }); } catch (err) { if (isError(err, ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND)) { @@ -2446,6 +2466,7 @@ export class Clerk implements ClerkInterface { unsafeMetadata, strategy, legalAccepted, + walletName, }); if ( diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 73f43de78e6..9074b69ed93 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -15,6 +15,7 @@ import type { EmailLinkConfig, EmailLinkFactor, EnterpriseSSOConfig, + GenerateSignature, PassKeyConfig, PasskeyFactor, PhoneCodeConfig, @@ -25,6 +26,7 @@ import type { ResetPasswordParams, ResetPasswordPhoneCodeFactorConfig, SamlConfig, + SignInAuthenticateWithSolanaParams, SignInCreateParams, SignInFirstFactor, SignInFutureBackupCodeVerifyParams, @@ -69,12 +71,14 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getBaseIdentifier, getBrowserLocale, getClerkQueryParam, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, + getSolanaIdentifier, windowNavigate, } from '../../utils'; import { @@ -212,6 +216,7 @@ export class SignIn extends BaseResource implements SignInResource { case 'web3_base_signature': case 'web3_coinbase_wallet_signature': case 'web3_okx_wallet_signature': + case 'web3_solana_signature': config = { web3WalletId: params.web3WalletId } as Web3SignatureConfig; break; case 'reset_password_phone_code': @@ -379,13 +384,17 @@ export class SignIn extends BaseResource implements SignInResource { }; public authenticateWithWeb3 = async (params: AuthenticateWithWeb3Params): Promise => { - const { identifier, generateSignature, strategy = 'web3_metamask_signature' } = params || {}; + const { identifier, generateSignature, strategy = 'web3_metamask_signature', walletName } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; if (!(typeof generateSignature === 'function')) { clerkMissingOptionError('generateSignature'); } + if (provider === 'solana' && !walletName) { + clerkMissingOptionError('walletName'); + } + await this.create({ identifier }); const web3FirstFactor = this.supportedFirstFactors?.find(f => f.strategy === strategy) as Web3SignatureFactor; @@ -403,7 +412,7 @@ export class SignIn extends BaseResource implements SignInResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, walletName, provider }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -412,7 +421,7 @@ export class SignIn extends BaseResource implements SignInResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName }); } else { throw err; } @@ -460,6 +469,16 @@ export class SignIn extends BaseResource implements SignInResource { }); }; + public authenticateWithSolana = async (params: SignInAuthenticateWithSolanaParams): Promise => { + const identifier = await getSolanaIdentifier(params.walletName); + return this.authenticateWithWeb3({ + identifier, + generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }), + strategy: 'web3_solana_signature', + walletName: params.walletName, + }); + }; + public authenticateWithPasskey = async (params?: AuthenticateWithPasskeyParams): Promise => { const { flow } = params || {}; @@ -972,7 +991,7 @@ class SignInFuture implements SignInFutureResource { return runAsyncResourceTask(this.#resource, async () => { let identifier; - let generateSignature; + let generateSignature: GenerateSignature; switch (provider) { case 'metamask': identifier = await getMetamaskIdentifier(); @@ -990,6 +1009,15 @@ class SignInFuture implements SignInFutureResource { identifier = await getOKXWalletIdentifier(); generateSignature = generateSignatureWithOKXWallet; break; + case 'solana': + if (!params.walletName) { + throw new ClerkRuntimeError('Wallet name is required for Solana authentication.', { + code: 'web3_solana_wallet_name_required', + }); + } + identifier = await getSolanaIdentifier(params.walletName); + generateSignature = p => generateSignatureWithSolana({ ...p, walletName: params.walletName as string }); + break; default: throw new Error(`Unsupported Web3 provider: ${provider}`); } @@ -1015,7 +1043,12 @@ class SignInFuture implements SignInFutureResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message }); + signature = await generateSignature({ + identifier, + nonce: message, + walletName: params?.walletName, + provider, + }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -1024,7 +1057,11 @@ class SignInFuture implements SignInFutureResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce: message }); + signature = await generateSignature({ + identifier, + nonce: message, + provider, + }); } else { throw err; } diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index f234ded2ddd..0d9a3ba57b6 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -14,6 +14,7 @@ import type { PreparePhoneNumberVerificationParams, PrepareVerificationParams, PrepareWeb3WalletVerificationParams, + SignUpAuthenticateWithSolanaParams, SignUpAuthenticateWithWeb3Params, SignUpCreateParams, SignUpEnterpriseConnectionJSON, @@ -47,12 +48,14 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getBaseIdentifier, getBrowserLocale, getClerkQueryParam, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, + getSolanaIdentifier, windowNavigate, } from '../../utils'; import { @@ -278,6 +281,7 @@ export class SignUp extends BaseResource implements SignUpResource { unsafeMetadata, strategy = 'web3_metamask_signature', legalAccepted, + walletName, } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; @@ -297,7 +301,7 @@ export class SignUp extends BaseResource implements SignUpResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName }); } catch (err) { // There is a chance that as a first time visitor when you try to setup and use the // Coinbase Wallet from scratch in order to authenticate, the initial generate @@ -316,11 +320,7 @@ export class SignUp extends BaseResource implements SignUpResource { return this.attemptWeb3WalletVerification({ signature, strategy }); }; - public authenticateWithMetamask = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithMetamask = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getMetamaskIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -332,9 +332,7 @@ export class SignUp extends BaseResource implements SignUpResource { }; public authenticateWithCoinbaseWallet = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, + params?: SignUpAuthenticateWithWeb3Params, ): Promise => { const identifier = await getCoinbaseWalletIdentifier(); return this.authenticateWithWeb3({ @@ -346,11 +344,7 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; - public authenticateWithBase = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithBase = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getBaseIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -361,11 +355,7 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; - public authenticateWithOKXWallet = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithOKXWallet = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getOKXWalletIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -376,6 +366,18 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; + public authenticateWithSolana = async (params: SignUpAuthenticateWithSolanaParams): Promise => { + const identifier = await getSolanaIdentifier(params.walletName); + return this.authenticateWithWeb3({ + identifier, + generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }), + unsafeMetadata: params?.unsafeMetadata, + strategy: 'web3_solana_signature', + legalAccepted: params?.legalAccepted, + walletName: params.walletName, + }); + }; + private authenticateWithRedirectOrPopup = async ( params: AuthenticateWithRedirectParams & { unsafeMetadata?: SignUpUnsafeMetadata; diff --git a/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx new file mode 100644 index 00000000000..362a9f64312 --- /dev/null +++ b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx @@ -0,0 +1,43 @@ +import { Box, descriptors, Text } from '../customizables'; +import type { PropsOfComponent } from '../styledSystem'; +import { common } from '../styledSystem'; + +type WalletInitialIconProps = PropsOfComponent & { + value: string; + /** + * The wallet provider name + */ + id: string; +}; + +export const WalletInitialIcon = (props: WalletInitialIconProps) => { + const { value, id, ...rest } = props; + + return ( + ({ + ...common.centeredFlex('inline-flex'), + width: t.space.$4, + height: t.space.$4, + borderRadius: t.radii.$sm, + color: t.colors.$colorPrimaryForeground, + backgroundColor: t.colors.$primary500, + })} + {...rest} + > + + {value[0].toUpperCase()} + + + ); +}; diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx new file mode 100644 index 00000000000..321ac4ee56d --- /dev/null +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -0,0 +1,94 @@ +import { useClerk } from '@clerk/shared/react'; +import { lazy, Suspense } from 'react'; + +import { withRedirectToAfterSignIn, withRedirectToSignInTask } from '@/ui/common/withRedirect'; +import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables'; +import { BackLink } from '@/ui/elements/BackLink'; +import { Card } from '@/ui/elements/Card'; +import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Header } from '@/ui/elements/Header'; +import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; + +const Web3WalletButtons = lazy(() => + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ + default: m.Web3SolanaWalletButtons, + })), +); + +import { useSignInContext } from '../../contexts'; +import { useRouter } from '../../router'; + +const SignInFactorOneSolanaWalletsCardInner = () => { + const clerk = useClerk(); + const card = useCardState(); + const router = useRouter(); + const ctx = useSignInContext(); + + const onBackLinkClick = () => { + void router.navigate('../'); + }; + + return ( + + + + + + + + {card.error} + + ({ + height: '100%', + minHeight: t.sizes.$32, + })} + > + + + } + > + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignInUrl || '/', + secondFactorUrl: 'factor-two', + signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl, + strategy: 'web3_solana_signature', + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> + + + + + + + + + ); +}; + +export const SignInFactorOneSolanaWalletsCard = withRedirectToSignInTask( + withRedirectToAfterSignIn(withCardStateProvider(SignInFactorOneSolanaWalletsCardInner)), +); diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx index 5a03b610c4e..15ceae5c035 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx @@ -80,6 +80,10 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps) .catch(err => handleError(err)); }} web3Callback={strategy => { + if (strategy === 'web3_solana_signature') { + return navigate(`choose-wallet?strategy=${strategy}`); + } + return clerk .authenticateWithWeb3({ customNavigate: navigate, diff --git a/packages/clerk-js/src/ui/components/SignIn/index.tsx b/packages/clerk-js/src/ui/components/SignIn/index.tsx index 7cdea9e8d30..62c3abe2d13 100644 --- a/packages/clerk-js/src/ui/components/SignIn/index.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/index.tsx @@ -3,6 +3,7 @@ import type { SignInModalProps, SignInProps } from '@clerk/shared/types'; import React from 'react'; import { SignInEmailLinkFlowComplete, SignUpEmailLinkFlowComplete } from '@/ui/common/EmailLinkCompleteFlowCard'; +import { SignInFactorOneSolanaWalletsCard } from '@/ui/components/SignIn/SignInFactorOneSolanaWalletsCard'; import { SignInContext, SignUpContext, @@ -77,6 +78,9 @@ function SignInRoutes(): JSX.Element { + + + handleError(err, [], card.setError)); }} web3Callback={strategy => { + if (strategy === 'web3_solana_signature') { + return navigate(`choose-wallet?strategy=${strategy}`); + } + return clerk .authenticateWithWeb3({ customNavigate: navigate, diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx new file mode 100644 index 00000000000..6968e59052a --- /dev/null +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -0,0 +1,75 @@ +import { useClerk } from '@clerk/shared/react'; +import { lazy, Suspense } from 'react'; + +import { withRedirectToAfterSignUp, withRedirectToSignUpTask } from '@/ui/common/withRedirect'; +import { descriptors, Flex, Flow, localizationKeys } from '@/ui/customizables'; +import { BackLink } from '@/ui/elements/BackLink'; +import { Card } from '@/ui/elements/Card'; +import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Header } from '@/ui/elements/Header'; +import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; + +const Web3WalletButtons = lazy(() => + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ + default: m.Web3SolanaWalletButtons, + })), +); + +import { useSignUpContext } from '../../contexts'; +import { useRouter } from '../../router'; + +const SignUpStartSolanaWalletsCardInner = () => { + const clerk = useClerk(); + const card = useCardState(); + const router = useRouter(); + const ctx = useSignUpContext(); + + const onBackLinkClick = () => { + void router.navigate('../'); + }; + + return ( + + + + + + + + {card.error} + + + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignUpUrl || '/', + signUpContinueUrl: '../continue', + strategy: 'web3_solana_signature', + unsafeMetadata: ctx.unsafeMetadata, + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> + + + + + + + + ); +}; + +export const SignUpStartSolanaWalletsCard = withRedirectToSignUpTask( + withRedirectToAfterSignUp(withCardStateProvider(SignUpStartSolanaWalletsCardInner)), +); diff --git a/packages/clerk-js/src/ui/components/SignUp/index.tsx b/packages/clerk-js/src/ui/components/SignUp/index.tsx index 3ba8a39b6be..eae05b32e1c 100644 --- a/packages/clerk-js/src/ui/components/SignUp/index.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/index.tsx @@ -2,6 +2,7 @@ import { useClerk } from '@clerk/shared/react'; import type { SignUpModalProps, SignUpProps } from '@clerk/shared/types'; import React from 'react'; +import { SignUpStartSolanaWalletsCard } from '@/ui/components/SignUp/SignUpStartSolanaWalletsCard'; import { usePreloadTasks } from '@/ui/hooks/usePreloadTasks'; import { SessionTasks as LazySessionTasks } from '../../../ui/lazyModules/components'; @@ -86,6 +87,9 @@ function SignUpRoutes(): JSX.Element { + + + diff --git a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts index 9d0dfae51dc..f302c79941b 100644 --- a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts +++ b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts @@ -515,6 +515,17 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([ 'enterpriseConnectionsRoot', 'enterpriseConnectionButton', 'enterpriseConnectionButtonText', + + 'web3WalletButtonsRoot', + 'web3WalletButtons', + 'web3WalletButtonsIconButton', + 'web3WalletButtonsBlockButton', + 'web3WalletButtonsBlockButtonText', + 'web3WalletButtonsWalletIcon', + 'web3WalletButtonsWalletInitialIcon', + + 'walletIcon', + 'walletInitialIcon', ] as const).map(camelize) as (keyof ElementsConfig)[]; type TargettableClassname = `${typeof CLASS_PREFIX}${K}`; diff --git a/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx new file mode 100644 index 00000000000..4ca1f61e226 --- /dev/null +++ b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx @@ -0,0 +1,280 @@ +import { WalletReadyState } from '@solana/wallet-adapter-base'; +import { ConnectionProvider, useWallet, WalletProvider } from '@solana/wallet-adapter-react'; +import { MAINNET_ENDPOINT } from '@solana/wallet-standard'; +import type { Ref } from 'react'; +import React, { forwardRef, isValidElement, useMemo } from 'react'; + +import { WalletInitialIcon } from '@/ui/common/WalletInitialIcon'; +import { + Button, + descriptors, + Flex, + Grid, + Icon, + Image, + localizationKeys, + SimpleButton, + Spinner, + Text, + useLocalizations, +} from '@/ui/customizables'; +import { Card } from '@/ui/elements/Card'; +import { useCardState } from '@/ui/elements/contexts'; +import { LinkRenderer } from '@/ui/elements/LinkRenderer'; +import { distributeStrategiesIntoRows } from '@/ui/elements/utils'; +import { mqu, type PropsOfComponent } from '@/ui/styledSystem'; +import { sleep } from '@/ui/utils/sleep'; + +type Web3WalletButtonsProps = { + web3AuthCallback: ({ walletName }: { walletName: string }) => Promise; +}; + +const SOCIAL_BUTTON_BLOCK_THRESHOLD = 2; +const SOCIAL_BUTTON_PRE_TEXT_THRESHOLD = 1; +const MAX_STRATEGIES_PER_ROW = 5; + +const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => { + const card = useCardState(); + const { wallets } = useWallet(); + const { t } = useLocalizations(); + + // Filter to only show installed wallets + const installedWallets = React.useMemo( + () => + wallets + .filter(w => { + return w.readyState === WalletReadyState.Installed; + }) + .map(wallet => { + return { + name: wallet.adapter.name, + icon: wallet.adapter.icon, + }; + }), + [wallets], + ); + + const startWeb3AuthFlow = (walletName: string) => async () => { + card.setLoading(walletName); + try { + await web3AuthCallback({ walletName }); + } catch { + await sleep(1000); + } finally { + card.setIdle(); + } + }; + + const { strategyRows } = distributeStrategiesIntoRows(installedWallets, MAX_STRATEGIES_PER_ROW, undefined); + const strategyRowOneLength = strategyRows.at(0)?.length ?? 0; + const shouldForceSingleColumnOnMobile = installedWallets.length === 2; + const ButtonElement = installedWallets.length <= SOCIAL_BUTTON_BLOCK_THRESHOLD ? WalletButtonBlock : WalletButtonIcon; + + if (installedWallets.length === 0) { + return ( + + ({ + textDecoration: 'underline', + textUnderlineOffset: t.space.$1, + color: 'inherit', + })} + /> + + ); + } + + return ( + + {strategyRows.map((row, rowIndex) => ( + { + return r.name; + }) + .join('-')} + elementDescriptor={descriptors.web3WalletButtons} + gap={2} + sx={t => ({ + justifyContent: 'center', + [mqu.sm]: { + // Force single-column on mobile when 2 strategies are present (without last auth) to prevent + // label overflow. When last auth is present, only 1 strategy remains here, so overflow isn't a concern. + gridTemplateColumns: shouldForceSingleColumnOnMobile ? 'repeat(1, minmax(0, 1fr))' : undefined, + }, + gridTemplateColumns: + wallets.length < 1 + ? `repeat(1, minmax(0, 1fr))` + : `repeat(${row.length}, ${ + rowIndex === 0 + ? `minmax(0, 1fr)` + : // Calculate the width of each button based on the width of the buttons within the first row. + // t.sizes.$2 is used here to represent the gap defined on the Grid component. + `minmax(0, calc((100% - (${strategyRowOneLength} - 1) * ${t.sizes.$2}) / ${strategyRowOneLength}))` + })`, + })} + > + {row.map(w => { + const shouldShowPreText = installedWallets.length === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD; + const label = shouldShowPreText + ? localizationKeys('web3WalletButtons.continue', { walletName: w.name }) + : w.name; + + const imageOrInitial = w.icon ? ( + {t(localizationKeys('web3WalletButtons.connect', ({ width: theme.sizes.$4, height: 'auto', maxWidth: '100%' })} + /> + ) : ( + + ); + + return ( + + ); + })} + + ))} + + ); +}; + +type WalletButtonProps = PropsOfComponent & { + icon: React.ReactElement; + id: string; + label: string; +}; + +const WalletButtonIcon = forwardRef((props: WalletButtonProps, ref: Ref | null): JSX.Element => { + const { icon, label, id, ...rest } = props; + + return ( + + ); +}); + +const WalletButtonBlock = forwardRef((props: WalletButtonProps, ref: Ref | null): JSX.Element => { + const { id, icon, isLoading, label, ...rest } = props; + const isIconElement = isValidElement(icon); + + return ( + [ + { + gap: theme.space.$4, + position: 'relative', + justifyContent: 'flex-start', + }, + props.sx, + ]} + > + + {(isLoading || icon) && ( + ({ flex: `0 0 ${theme.space.$4}` })} + > + {isLoading ? ( + + ) : !isIconElement && icon ? ( + ({ + color: theme.colors.$neutralAlpha600, + width: theme.sizes.$4, + position: 'absolute', + }), + ]} + /> + ) : ( + icon + )} + + )} + + {label} + + + + ); +}); + +export const Web3SolanaWalletButtons = (props: Web3WalletButtonsProps) => { + const network = MAINNET_ENDPOINT; + const wallets = useMemo(() => [], [network]); + return ( + + { + console.error(err); + }} + > + + + + ); +}; diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx index 6f660525375..1a719083777 100644 --- a/packages/clerk-js/src/ui/elements/contexts/index.tsx +++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx @@ -128,7 +128,8 @@ export type FlowMetadata = { | 'complete' | 'accountSwitcher' | 'chooseOrganization' - | 'enterpriseConnections'; + | 'enterpriseConnections' + | 'chooseWallet'; }; const [FlowMetadataCtx, useFlowMetadata] = createContextAndHook('FlowMetadata'); diff --git a/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts b/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts index 62fd98dcfe8..985b73f2861 100644 --- a/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts +++ b/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts @@ -10,8 +10,8 @@ type Web3CallbackErrorHandler = { export const web3CallbackErrorHandler: Web3CallbackErrorHandler = (err, setError) => { if ( isClerkAPIResponseError(err) && - err.errors[0].meta?.paramName === 'identifier' && - err.errors[0].code === 'form_param_nil' + err.errors?.[0]?.meta?.paramName === 'identifier' && + err.errors?.[0]?.code === 'form_param_nil' ) { const error = new ClerkRuntimeError('A Web3 Wallet extension cannot be found. Please install one to continue.', { code: 'web3_missing_identifier', diff --git a/packages/clerk-js/src/utils/injectedWeb3Providers.ts b/packages/clerk-js/src/utils/injectedWeb3EthProviders.ts similarity index 76% rename from packages/clerk-js/src/utils/injectedWeb3Providers.ts rename to packages/clerk-js/src/utils/injectedWeb3EthProviders.ts index 7b6c6557e8e..bd8ad799874 100644 --- a/packages/clerk-js/src/utils/injectedWeb3Providers.ts +++ b/packages/clerk-js/src/utils/injectedWeb3EthProviders.ts @@ -27,15 +27,15 @@ interface EIP6963ProviderDetail { } type EIP6963AnnounceProviderEvent = CustomEvent; -type InjectedWeb3Provider = MetamaskWeb3Provider | OKXWalletWeb3Provider; +type InjectedWeb3EthProvider = MetamaskWeb3Provider | OKXWalletWeb3Provider; -class InjectedWeb3Providers { +class InjectedWeb3EthProviders { #providers: EIP6963ProviderDetail[] = []; - #providerIdMap: Record = { + #providerIdMap: Record = { metamask: 'MetaMask', okx_wallet: 'OKX Wallet', } as const; - static #instance: InjectedWeb3Providers | null = null; + static #instance: InjectedWeb3EthProviders | null = null; private constructor() { if (typeof window === 'undefined') { @@ -45,14 +45,14 @@ class InjectedWeb3Providers { window.dispatchEvent(new Event('eip6963:requestProvider')); } - public static getInstance(): InjectedWeb3Providers { - if (!InjectedWeb3Providers.#instance) { - InjectedWeb3Providers.#instance = new InjectedWeb3Providers(); + public static getInstance(): InjectedWeb3EthProviders { + if (!InjectedWeb3EthProviders.#instance) { + InjectedWeb3EthProviders.#instance = new InjectedWeb3EthProviders(); } - return InjectedWeb3Providers.#instance; + return InjectedWeb3EthProviders.#instance; } - get = (provider: InjectedWeb3Provider) => { + get = (provider: InjectedWeb3EthProvider) => { const ethProvider = this.#providers.find(p => p.info.name === this.#providerIdMap[provider])?.provider; if (ethProvider !== undefined) { return ethProvider; @@ -72,4 +72,4 @@ class InjectedWeb3Providers { }; } -export const getInjectedWeb3Providers = () => InjectedWeb3Providers.getInstance(); +export const getInjectedWeb3EthProviders = () => InjectedWeb3EthProviders.getInstance(); diff --git a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts new file mode 100644 index 00000000000..c2514cd78ac --- /dev/null +++ b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts @@ -0,0 +1,66 @@ +import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; +import type { Wallet } from '@wallet-standard/core'; + +//https://eips.ethereum.org/EIPS/eip-4361 + +class InjectedWeb3SolanaProviders { + #wallets: readonly Wallet[] | undefined = undefined; + static #instance: InjectedWeb3SolanaProviders | null = null; + + private constructor() {} + + async #initialize() { + const wallets = await import('@wallet-standard/core').then(mod => mod.getWallets()); + this.#wallets = wallets.get(); + + wallets.on('register', () => { + this.#wallets = wallets.get(); + }); + wallets.on('unregister', () => { + this.#wallets = wallets.get(); + }); + } + + #isSolanaWallet(wallet: Wallet): wallet is SolanaWalletAdapterWallet { + return wallet.chains?.some(chain => chain.startsWith('solana:')) ?? false; + } + + #hasSignMessage(wallet: Wallet): boolean { + return 'solana:signMessage' in wallet.features; + } + + public static getInstance(): InjectedWeb3SolanaProviders { + if (!InjectedWeb3SolanaProviders.#instance) { + InjectedWeb3SolanaProviders.#instance = new InjectedWeb3SolanaProviders(); + } + return InjectedWeb3SolanaProviders.#instance; + } + + get = async (walletName: string): Promise => { + await this.#initialize(); + const wallet = (this.#wallets || []).find( + w => w.name === walletName && this.#isSolanaWallet(w) && this.#hasSignMessage(w), + ); + if (wallet && this.#isSolanaWallet(wallet)) { + return wallet; + } + + if (typeof window === 'undefined') { + return undefined; + } + // In case we weren't able to find the requested provider, fallback to the + // global injected provider instead, if any, to allow the user to continue + // the flow rather than blocking it + const fallbackProvider = (window as any).solana; + if ( + fallbackProvider && + typeof fallbackProvider.connect === 'function' && + typeof fallbackProvider.signMessage === 'function' + ) { + return fallbackProvider as SolanaWalletAdapterWallet; + } + return undefined; + }; +} + +export const getInjectedWeb3SolanaProviders = () => InjectedWeb3SolanaProviders.getInstance(); diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index fc494876f78..9e2664cdc6f 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,50 +1,88 @@ -import type { Web3Provider } from '@clerk/shared/types'; +import { ClerkRuntimeError } from '@clerk/shared/error'; +import type { GenerateSignature, Web3Provider } from '@clerk/shared/types'; +import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; +import { errorThrower } from '@/utils/errorThrower'; +import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; import { toHex } from './hex'; -import { getInjectedWeb3Providers } from './injectedWeb3Providers'; +import { getInjectedWeb3EthProviders } from './injectedWeb3EthProviders'; type GetWeb3IdentifierParams = { provider: Web3Provider; + walletName?: string; }; +// '@solana/wallet-standard' +const StandardConnect = `standard:connect`; +const SolanaSignMessage = `solana:signMessage`; + export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise { - const { provider } = params; - const ethereum = await getEthereumProvider(provider); + const { provider, walletName } = params; + const walletProvider = await getWeb3Wallet(provider, walletName); // TODO - core-3: Improve error handling for the case when the provider is not found - if (!ethereum) { + if (!walletProvider) { // If a plugin for the requested provider is not found, // the flow will fail as it has been the expected behavior so far. return ''; } - const identifiers = await ethereum.request({ method: 'eth_requestAccounts' }); + if (provider === 'solana') { + const identifiers = await walletProvider.features[StandardConnect].connect(); + return (identifiers && identifiers.accounts[0].address) || ''; + } + + // Ethereum providers + const identifiers = await walletProvider.request({ method: 'eth_requestAccounts' }); // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present return (identifiers && identifiers[0]) || ''; } -type GenerateWeb3SignatureParams = GenerateSignatureParams & { - provider: Web3Provider; -}; - -export async function generateWeb3Signature(params: GenerateWeb3SignatureParams): Promise { - const { identifier, nonce, provider } = params; - const ethereum = await getEthereumProvider(provider); +export const generateWeb3Signature: GenerateSignature = async (params): Promise => { + const { identifier, nonce, provider, walletName = '' } = params; + const wallet = await getWeb3Wallet(provider, walletName); // TODO - core-3: Improve error handling for the case when the provider is not found - if (!ethereum) { + if (!wallet) { // If a plugin for the requested provider is not found, // the flow will fail as it has been the expected behavior so far. return ''; } - return await ethereum.request({ + if (provider === 'solana') { + try { + const solanaWallet = wallet as SolanaWalletAdapterWallet; + const walletAccount = solanaWallet.accounts.find(a => a.address === identifier); + if (!walletAccount) { + console.warn(`Wallet account with address ${identifier} not found`); + return ''; + } + const signedMessages = await solanaWallet.features[SolanaSignMessage]?.signMessage({ + account: walletAccount, + message: new TextEncoder().encode(nonce), + }); + // Convert signature Uint8Array to base64 string + return signedMessages?.[0]?.signature ? btoa(String.fromCharCode(...signedMessages[0].signature)) : ''; + } catch (err) { + if (err instanceof Error && err.message.includes('User rejected the request.')) { + throw new ClerkRuntimeError('Web3 signature request was rejected by the user.', { + code: 'web3_signature_request_rejected', + }); + } + throw new ClerkRuntimeError('An error occurred while generating the Solana signature.', { + code: 'web3_solana_signature_generation_failed', + cause: err, + }); + } + } + + return await wallet.request({ method: 'personal_sign', params: [`0x${toHex(nonce)}`, identifier], }); -} +}; export async function getMetamaskIdentifier(): Promise { return await getWeb3Identifier({ provider: 'metamask' }); @@ -62,11 +100,19 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } +export async function getSolanaIdentifier(walletName: string): Promise { + return await getWeb3Identifier({ provider: 'solana', walletName }); +} + type GenerateSignatureParams = { identifier: string; nonce: string; }; +type GenerateSolanaSignatureParams = GenerateSignatureParams & { + walletName: string; +}; + export async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'metamask' }); } @@ -83,7 +129,11 @@ export async function generateSignatureWithBase(params: GenerateSignatureParams) return await generateWeb3Signature({ ...params, provider: 'base' }); } -async function getEthereumProvider(provider: Web3Provider) { +export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { + return await generateWeb3Signature({ ...params, provider: 'solana' }); +} + +async function getWeb3Wallet(provider: Web3Provider, walletName?: string) { if (provider === 'coinbase_wallet') { if (__BUILD_DISABLE_RHC__) { clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); @@ -120,5 +170,13 @@ async function getEthereumProvider(provider: Web3Provider) { } } - return getInjectedWeb3Providers().get(provider); + if (provider === 'solana') { + if (!walletName || walletName.length === 0) { + errorThrower.throw('Wallet name must be provided to get Solana wallet provider'); + return; + } + return await getInjectedWeb3SolanaProviders().get(walletName); + } + + return getInjectedWeb3EthProviders().get(provider); } diff --git a/packages/elements/src/react/hooks/use-third-party-provider.hook.ts b/packages/elements/src/react/hooks/use-third-party-provider.hook.ts index 226243625a6..ed144305b93 100644 --- a/packages/elements/src/react/hooks/use-third-party-provider.hook.ts +++ b/packages/elements/src/react/hooks/use-third-party-provider.hook.ts @@ -97,6 +97,10 @@ export const useThirdPartyProvider = < return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_okx_wallet_signature' }); } + if (provider === 'solana') { + return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_solana_signature' }); + } + return ref.send({ type: 'AUTHENTICATE.OAUTH', strategy: `oauth_${provider}` }); }, [provider, isProviderEnabled, isSaml, isEnterpriseSSO, ref], diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index b53225be7bc..716eb160e89 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -747,6 +747,10 @@ export const arSA: LocalizationResource = { subtitle: 'للمتابعة، يرجى إدخال رمز التحقق الذي تم إنشاؤه بواسطة تطبيق المصادقة الخاص بك', title: 'نظام التحقق بخطوتين', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'إدخل كلمة المرور', signUp: { @@ -837,6 +841,10 @@ export const arSA: LocalizationResource = { title: 'أنشاء حساب جديد', titleCombined: 'أنشاء حساب جديد', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'للمتابعة مع {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -937,6 +945,8 @@ export const arSA: LocalizationResource = { phone_number_exists: 'هذا الرقم مأخوذ الرجاء أختيار رقم آخر', session_exists: 'لقد قمت بتسجيل الدخول بالفعل', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'كلمة مرورك سليمة من الأفضل ان تكون اقوى. الرجاء أضافة حروف أكثر', goodPassword: 'كلمة مرورك طابقت جميع المتطلبات الازمة', @@ -1336,4 +1346,9 @@ export const arSA: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index 46615db43f9..f90b0172dc2 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -753,6 +753,10 @@ export const beBY: LocalizationResource = { subtitle: 'Увядзіце код, атрыманы з вашага TOTP-генератара.', title: 'Двухфактарная верыфікацыя', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: undefined, signUp: { @@ -845,6 +849,10 @@ export const beBY: LocalizationResource = { title: 'Стварыце Ваш акаўнт', titleCombined: 'Стварыце Ваш акаўнт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Працягнуць з дапамогай {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -947,6 +955,8 @@ export const beBY: LocalizationResource = { phone_number_exists: 'Гэты нумар тэлефона ўжо заняты. Калі ласка, паспрабуйце іншы.', session_exists: 'Вы ўжо ўвайшлі.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль падыходзіць, але мог бы быць надзейнейшым. Паспрабуйце дадаць больш сімвалаў.', goodPassword: 'Добрая праца. Гэта выдатны пароль.', @@ -1354,4 +1364,9 @@ export const beBY: LocalizationResource = { title: 'Вы ў чакальным спісе', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 45fdeecc376..b666678c4fa 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -750,6 +750,10 @@ export const bgBG: LocalizationResource = { 'За да продължите, моля въведете кода за потвърждение, генериран от вашето приложение за удостоверяване', title: 'Двустепенна верификация', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Въведете вашата парола', signUp: { @@ -841,6 +845,10 @@ export const bgBG: LocalizationResource = { title: 'Създайте своя акаунт', titleCombined: 'Създайте своя акаунт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продължи с {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -940,6 +948,8 @@ export const bgBG: LocalizationResource = { phone_number_exists: 'Този телефонен номер е зает. Моля, опитайте с друг.', session_exists: 'Вече сте влезнали.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Вашата парола работи, но може да бъде по-сигурна. Опитайте да добавите повече символи.', goodPassword: 'Вашата парола отговаря на всички необходими изисквания.', @@ -1345,4 +1355,9 @@ export const bgBG: LocalizationResource = { title: 'Waitlist successful', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index 6f081b51975..c67cdb07c5f 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -753,6 +753,10 @@ export const bnIN: LocalizationResource = { subtitle: 'চালিয়ে যেতে, আপনার অথেনটিকেটর অ্যাপ দ্বারা উৎপন্ন যাচাইকরণ কোড লিখুন', title: 'দুই-ধাপ যাচাইকরণ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'আপনার পাসওয়ার্ড লিখুন', signUp: { @@ -845,6 +849,10 @@ export const bnIN: LocalizationResource = { title: 'আপনার অ্যাকাউন্ট তৈরি করুন', titleCombined: 'আপনার অ্যাকাউন্ট তৈরি করুন', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} দিয়ে চালিয়ে যান', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -950,6 +958,8 @@ export const bnIN: LocalizationResource = { phone_number_exists: 'এই ফোন নম্বর ব্যবহৃত হয়েছে। দয়া করে অন্য একটি ব্যবহার করুন।', session_exists: undefined, web3_missing_identifier: 'একটি Web3 ওয়ালেট এক্সটেনশন পাওয়া যায়নি। চালিয়ে যেতে দয়া করে একটি ইনস্টল করুন।', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'আপনার পাসওয়ার্ড কাজ করে, কিন্তু আরও শক্তিশালী হতে পারে। আরও অক্ষর যোগ করার চেষ্টা করুন।', goodPassword: 'আপনার পাসওয়ার্ড সমস্ত প্রয়োজনীয় শর্ত পূরণ করে।', @@ -1355,4 +1365,9 @@ export const bnIN: LocalizationResource = { title: 'ওয়েটলিস্টে যোগ দেওয়ার জন্য ধন্যবাদ!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 6795c763418..7a35168bfa9 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -750,6 +750,10 @@ export const caES: LocalizationResource = { subtitle: "Per continuar, introdueix el codi de verificació generat per la teva aplicació d'autenticació", title: 'Verificació de dos passos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Introdueix la teva contrasenya', signUp: { @@ -840,6 +844,10 @@ export const caES: LocalizationResource = { title: 'Crea el teu compte', titleCombined: 'Crea el teu compte', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continua amb {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -942,6 +950,8 @@ export const caES: LocalizationResource = { phone_number_exists: "Aquest número de telèfon ja està en ús. Si us plau, prova'n un altre.", session_exists: 'Ja estàs connectat.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'La teva contrasenya funciona, però podria ser més forta. Prova afegint més caràcters.', goodPassword: 'La teva contrasenya compleix tots els requisits necessaris.', @@ -1351,4 +1361,9 @@ export const caES: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 347288d015a..b8b569c95ca 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -757,6 +757,10 @@ export const csCZ: LocalizationResource = { subtitle: 'Pro pokračování zadejte ověřovací kód vygenerovaný vaší aplikací pro ověřování', title: 'Dvoufázové ověření', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Zadejte své heslo', signUp: { @@ -851,6 +855,10 @@ export const csCZ: LocalizationResource = { title: 'Vytvořte si účet', titleCombined: 'Vytvořte si účet', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Pokračovat s {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -952,6 +960,8 @@ export const csCZ: LocalizationResource = { phone_number_exists: 'Toto telefonní číslo se používá. Zkuste prosím jiný.', session_exists: 'Jste již přihlášen.', web3_missing_identifier: 'Rozšíření peněženky Web3 nebylo nalezeno. Pro pokračování prosím nainstalujte jednu.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaše heslo funguje, ale mohlo by být silnější. Zkuste přidat více znaků.', goodPassword: 'Vaše heslo splňuje všechny potřebné požadavky.', @@ -1358,4 +1368,9 @@ export const csCZ: LocalizationResource = { title: 'Děkujeme za připojení k čekací listině!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 39e7d41de54..8a60c8f062c 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -748,6 +748,10 @@ export const daDK: LocalizationResource = { subtitle: undefined, title: 'Totrinsbekræftelse', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Indtast din adgangskode', signUp: { @@ -838,6 +842,10 @@ export const daDK: LocalizationResource = { title: 'Opret din konto', titleCombined: 'Opret din konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Forsæt med {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -938,6 +946,8 @@ export const daDK: LocalizationResource = { phone_number_exists: 'Dette telefonnummer er allerede taget. Prøv et andet.', session_exists: 'Du er allerede logget ind.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Din adgangskode virker, men kunne være stærkere. Prøv at tilføje flere tegn.', goodPassword: 'Din adgangskode opfylder alle nødvendige krav.', @@ -1342,4 +1352,9 @@ export const daDK: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 1bbdec3e5e2..17679603d2e 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -764,6 +764,10 @@ export const deDE: LocalizationResource = { 'Um fortzufahren, geben Sie bitte den Verifizierungscode ein, der von Ihrer Authenticator-App generiert wurde.', title: 'Bestätigung in zwei Schritten', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Geben Sie Ihr Passwort ein', signUp: { @@ -855,6 +859,10 @@ export const deDE: LocalizationResource = { title: 'Erstellen Sie Ihr Konto', titleCombined: 'Erstellen Sie Ihr Konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Weiter mit {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -968,6 +976,8 @@ export const deDE: LocalizationResource = { session_exists: 'Sie sind bereits angemeldet.', web3_missing_identifier: 'Eine Web3 Wallet-Erweiterung wurde nicht gefunden. Bitte installieren Sie eine, um fortzufahren.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ihr Passwort funktioniert, könnte aber besser sein. Versuchen Sie, mehr Zeichen hinzuzufügen.', goodPassword: 'Ihr Passwort erfüllt alle notwendigen Anforderungen.', @@ -1379,4 +1389,9 @@ export const deDE: LocalizationResource = { title: 'Erfolgreich auf die Warteliste gesetzt', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 7cf247ee85e..ddb4276807e 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -751,6 +751,10 @@ export const elGR: LocalizationResource = { subtitle: undefined, title: 'Aυθεντικοποίηση δύο βημάτων', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Εισαγωγή κωδικού πρόσβασης', signUp: { @@ -842,6 +846,10 @@ export const elGR: LocalizationResource = { title: 'Δημιουργήστε τον λογαριασμό σας', titleCombined: 'Δημιουργήστε τον λογαριασμό σας', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Συνέχεια με {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -944,6 +952,8 @@ export const elGR: LocalizationResource = { phone_number_exists: 'Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη. Δοκιμάστε έναν άλλο.', session_exists: 'Έχετε ήδη συνδεθεί.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ο κωδικός πρόσβασής σας είναι αρκετός, αλλά θα μπορούσε να είναι πιο ισχυρός. Δοκιμάστε να προσθέσετε περισσότερους χαρακτήρες.', @@ -1354,4 +1364,9 @@ export const elGR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index b3dd9f7131e..166c4df9ff7 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -750,6 +750,10 @@ export const enGB: LocalizationResource = { subtitle: 'To continue, please enter the verification code generated by your authenticator app', title: 'Two-step verification', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Enter your password', signUp: { @@ -842,6 +846,10 @@ export const enGB: LocalizationResource = { title: 'Create your account', titleCombined: 'Create your account', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -946,6 +954,8 @@ export const enGB: LocalizationResource = { phone_number_exists: 'This phone number is taken. Please try another.', session_exists: "You're already signed in.", web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Your password works, but could be stronger. Try adding more characters.', goodPassword: 'Your password meets all the necessary requirements.', @@ -1350,4 +1360,9 @@ export const enGB: LocalizationResource = { title: 'Thanks for joining the waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 4473eaf6733..f1107e8617d 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -747,6 +747,10 @@ export const enUS: LocalizationResource = { subtitle: 'To continue, please enter the verification code generated by your authenticator app', title: 'Two-step verification', }, + web3Solana: { + subtitle: 'Select a wallet below to sign in', + title: 'Sign in with Solana', + }, }, signInEnterPasswordTitle: 'Enter your password', signUp: { @@ -839,6 +843,10 @@ export const enUS: LocalizationResource = { title: 'Create your account', titleCombined: 'Create your account', }, + web3Solana: { + subtitle: 'Select a wallet below to sign up', + title: 'Sign up with Solana', + }, }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -941,6 +949,9 @@ export const enUS: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'A Web3 Wallet extension cannot be found. Please install one to continue.', + web3_signature_request_rejected: 'You have rejected the signature request. Please try again to continue.', + web3_solana_signature_generation_failed: + 'An error occurred while generating the signature. Please try again to continue.', zxcvbn: { couldBeStronger: 'Your password works, but could be stronger. Try adding more characters.', goodPassword: 'Your password meets all the necessary requirements.', @@ -1346,4 +1357,10 @@ export const enUS: LocalizationResource = { title: 'Thanks for joining the waitlist!', }, }, + web3WalletButtons: { + connect: 'Connect with {{walletName}}', + continue: 'Continue with {{walletName}}', + noneAvailable: + 'No Solana Web3 wallets detected. Please install a Web3 supported {{ solanaWalletsLink || link("wallet extension") }}.', + }, } as const; diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 5b8e09767da..2a70709d379 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -755,6 +755,10 @@ export const esCR: LocalizationResource = { subtitle: 'Para continuar, por favor introduce el código generado por tu aplicación de autenticación', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -847,6 +851,10 @@ export const esCR: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -951,6 +959,8 @@ export const esCR: LocalizationResource = { phone_number_exists: 'Este número de telefónico ya está en uso.', session_exists: undefined, web3_missing_identifier: 'No se puede encontrar la extension de la billetera Web3. Instala una para continuar', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero puede ser más segura. Prueba añadiendo más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1358,4 +1368,9 @@ export const esCR: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index c03a7b3702f..a5101b19e86 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -750,6 +750,10 @@ export const esES: LocalizationResource = { subtitle: 'Introduce el código que te enviamos a tu dispositivo', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -841,6 +845,10 @@ export const esES: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -945,6 +953,8 @@ export const esES: LocalizationResource = { phone_number_exists: 'Este número de teléfono ya está en uso. Por favor, inténtelo con otro.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: undefined, goodPassword: undefined, @@ -1352,4 +1362,9 @@ export const esES: LocalizationResource = { title: '¡Te has unido a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 2d675787ae1..74368afe63b 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -756,6 +756,10 @@ export const esMX: LocalizationResource = { subtitle: 'Para continuar, por favor introduce el código generado por tu aplicación de autenticación', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -848,6 +852,10 @@ export const esMX: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -952,6 +960,8 @@ export const esMX: LocalizationResource = { phone_number_exists: 'Este número de telefónico ya está en uso.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: 'No se puede encontrar la extension de la billetera Web3. Instala una para continuar', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero puede ser más segura. Prueba añadiendo más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1359,4 +1369,9 @@ export const esMX: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index 4608a3b4838..a800464fb03 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -753,6 +753,10 @@ export const esUY: LocalizationResource = { subtitle: 'Para continuar, ingresá el código generado por tu aplicación autenticadora', title: 'Verificación en dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresá tu contraseña', signUp: { @@ -847,6 +851,10 @@ export const esUY: LocalizationResource = { title: 'Creá tu cuenta', titleCombined: 'Creá tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -953,6 +961,8 @@ export const esUY: LocalizationResource = { phone_number_exists: 'Este número de teléfono ya está en uso. Por favor, probá con otro.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: 'No se encontró una extensión de cartera Web3. Por favor, instalá una para continuar.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero podría ser más fuerte. Intentá agregar más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1358,4 +1368,9 @@ export const esUY: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 5bc5a22764a..d02d5a149dc 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -758,6 +758,10 @@ export const faIR: LocalizationResource = { subtitle: 'برای ادامه، لطفاً کد تأیید تولید شده توسط برنامه تأیید هویت خود را وارد کنید', title: 'تأیید دو مرحله‌ای', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'رمز عبور خود را وارد کنید', signUp: { @@ -851,6 +855,10 @@ export const faIR: LocalizationResource = { title: 'حساب کاربری خود را ایجاد کنید', titleCombined: 'حساب کاربری خود را ایجاد کنید', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'ادامه با {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -950,6 +958,8 @@ export const faIR: LocalizationResource = { phone_number_exists: 'این شماره تلفن قبلاً استفاده شده است.', session_exists: 'جلسه از قبل وجود دارد.', web3_missing_identifier: 'افزونه‌ی کیف پول وب۳ پیدا نشد. برای ادامه، لطفاً یکی نصب کنید.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'رمز عبور شما کار می‌کند، اما می‌توانست قوی‌تر باشد. سعی کنید کاراکترهای بیشتری اضافه کنید.', goodPassword: 'رمز عبور شما تمام شرایط لازم را برآورده می‌کند.', @@ -1354,4 +1364,9 @@ export const faIR: LocalizationResource = { title: 'ممنون که به لیست انتظار پیوستید!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index b79f1a1af10..02123dab25e 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -750,6 +750,10 @@ export const fiFI: LocalizationResource = { subtitle: 'Syötä todennuskoodi autentikointisovelluksestasi', title: 'Kaksivaiheinen todennus', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Syötä salasanasi', signUp: { @@ -841,6 +845,10 @@ export const fiFI: LocalizationResource = { title: 'Luo tili', titleCombined: 'Luo tili', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Jatka palvelun {{provider|titleize}} avulla', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -941,6 +949,8 @@ export const fiFI: LocalizationResource = { phone_number_exists: 'Tämä puhelinnumero on jo käytössä. Kokeile toista.', session_exists: 'Olet jo kirjautunut sisään.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Salasanasi toimii, mutta se voisi olla vahvempi. Kokeile lisätä erikoismerkkejä tai numeroita.', goodPassword: 'Salasanasi täyttää kaikki tarvittavat vaatimukset.', @@ -1347,4 +1357,9 @@ export const fiFI: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index cb9f6fa9afc..a19d796c46b 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -764,6 +764,10 @@ export const frFR: LocalizationResource = { subtitle: "Entrez le code de l'application d'authentification.", title: 'Vérification en deux étapes', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Tapez votre mot de passe', signUp: { @@ -856,6 +860,10 @@ export const frFR: LocalizationResource = { title: 'Créez votre compte', titleCombined: 'Créez votre compte', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuer avec {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -961,6 +969,8 @@ export const frFR: LocalizationResource = { phone_number_exists: 'Ce numéro de téléphone est déjà utilisé. Veuillez essayer un autre.', session_exists: 'Vous êtes déjà connecté.', web3_missing_identifier: 'Aucune extension de portefeuille Web3 trouvée. Veuillez en installer une pour continuer.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: "Votre mot de passe fonctionne mais pourrait être plus sûr. Essayez d'ajouter des caractères.", goodPassword: "Bien joué. C'est un excellent mot de passe.", @@ -1369,4 +1379,9 @@ export const frFR: LocalizationResource = { title: 'Inscription réussie', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 8f4417e263a..fd5cc00e23d 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -741,6 +741,10 @@ export const heIL: LocalizationResource = { subtitle: 'להמשך, אנא הכנס את קוד האימות שנוצר על ידי אפליקציית האימות שלך', title: 'אימות שני שלבים', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'הזן את הסיסמה שלך', signUp: { @@ -831,6 +835,10 @@ export const heIL: LocalizationResource = { title: 'צור את החשבון שלך', titleCombined: 'צור את החשבון שלך', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'המשך עם {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -930,6 +938,8 @@ export const heIL: LocalizationResource = { phone_number_exists: 'מספר הטלפון הזה כבר בשימוש. אנא נסה מספר אחר.', session_exists: 'אתה כבר מחובר לחשבון.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'הסיסמה שלך תקפה, אך יכולה להיות חזקה יותר. נסה להוסיף יותר תווים.', goodPassword: 'עבודה טובה. זו סיסמה מצוינת.', @@ -1323,4 +1333,9 @@ export const heIL: LocalizationResource = { title: 'תודה שהצטרפת לרשימת ההמתנה!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 20c676fd0f1..6d9fa386d9e 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -752,6 +752,10 @@ export const hiIN: LocalizationResource = { subtitle: 'जारी रखने के लिए, कृपया अपने प्रमाणकर्ता ऐप द्वारा जनरेट किए गए कोड को दर्ज करें', title: 'दो-चरण सत्यापन', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'अपना पासवर्ड दर्ज करें', signUp: { @@ -845,6 +849,10 @@ export const hiIN: LocalizationResource = { title: 'अपना खाता बनाएं', titleCombined: 'अपना खाता बनाएं', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} के साथ जारी रखें', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -951,6 +959,8 @@ export const hiIN: LocalizationResource = { phone_number_exists: 'यह फोन नंबर पहले से लिया गया है। कृपया दूसरा प्रयास करें।', session_exists: undefined, web3_missing_identifier: 'Web3 वॉलेट एक्सटेंशन नहीं मिल सका। जारी रखने के लिए कृपया एक इंस्टॉल करें।', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'आपका पासवर्ड काम करता है, लेकिन मजबूत हो सकता है। अधिक अक्षर जोड़ने का प्रयास करें।', goodPassword: 'आपका पासवर्ड सभी आवश्यक आवश्यकताओं को पूरा करता है।', @@ -1355,4 +1365,9 @@ export const hiIN: LocalizationResource = { title: 'प्रतीक्षा सूची में शामिल होने के लिए धन्यवाद!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 7f200827522..379f95a1b2a 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -750,6 +750,10 @@ export const hrHR: LocalizationResource = { subtitle: 'Za nastavak, unesite verifikacijski kod generiran vašom aplikacijom za autentifikaciju', title: 'Dvostupanjska verifikacija', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Unesite svoju lozinku', signUp: { @@ -842,6 +846,10 @@ export const hrHR: LocalizationResource = { title: 'Kreirajte svoj račun', titleCombined: 'Kreirajte svoj račun', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Nastavite s {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const hrHR: LocalizationResource = { phone_number_exists: 'Ovaj telefonski broj je zauzet. Molimo pokušajte s drugim.', session_exists: 'Već ste prijavljeni.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaša lozinka funkcionira, ali mogla bi biti jača. Pokušajte dodati više znakova.', goodPassword: 'Vaša lozinka zadovoljava sve potrebne zahtjeve.', @@ -1350,4 +1360,9 @@ export const hrHR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 4639bc50d0f..1111a42c293 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -749,6 +749,10 @@ export const huHU: LocalizationResource = { subtitle: 'A folytatáshoz, kérlek írd be a visszaigazoló kódot, amit a hitelesítő app készített.', title: 'Két lépécsős azonosítás', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Írd be a jelszavad', signUp: { @@ -839,6 +843,10 @@ export const huHU: LocalizationResource = { title: 'Fiók létrehozása', titleCombined: 'Fiók létrehozása', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Folytatás {{provider|titleize}} segítségével', socialButtonsBlockButtonManyInView: undefined, @@ -941,6 +949,8 @@ export const huHU: LocalizationResource = { phone_number_exists: 'Ez a telefonszám már foglalt. Kérlek próbálj meg egy másikat.', session_exists: 'Már be vagy jelentkezve.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'A jelszavad, jó, de lehetne erősebb. Adj hozzá több karaktert.', goodPassword: 'A jelszavad megfelel az elvárásoknak.', @@ -1347,4 +1357,9 @@ export const huHU: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index 51fe316c300..a26544203db 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -752,6 +752,10 @@ export const idID: LocalizationResource = { subtitle: 'Untuk melanjutkan, masukkan kode verifikasi yang dihasilkan oleh aplikasi autentikator Anda', title: 'Verifikasi dua langkah', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Masukkan kata sandi Anda', signUp: { @@ -846,6 +850,10 @@ export const idID: LocalizationResource = { title: 'Buat akun Anda', titleCombined: 'Buat akun Anda', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Lanjutkan dengan {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -950,6 +958,8 @@ export const idID: LocalizationResource = { phone_number_exists: 'Nomor telepon ini sudah digunakan. Silakan coba yang lain.', session_exists: 'Anda sudah masuk.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Kata sandi Anda berfungsi, tapi bisa lebih kuat. Coba tambahkan lebih banyak karakter.', goodPassword: 'Kata sandi Anda memenuhi semua persyaratan yang diperlukan.', @@ -1344,4 +1354,9 @@ export const idID: LocalizationResource = { title: 'Terima kasih telah bergabung dengan daftar tunggu!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index e3057b8cd80..7b40b3afd33 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -751,6 +751,10 @@ export const isIS: LocalizationResource = { subtitle: 'Til að halda áfram, vinsamlegast sláðu inn staðfestingarkóðann sem auðkennisforritið þitt bjó til', title: 'Tveggja þrepa auðkenning', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Sláðu inn lykilorðið þitt', signUp: { @@ -842,6 +846,10 @@ export const isIS: LocalizationResource = { title: 'Stofna reikning', titleCombined: 'Stofna reikning', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Halda áfram með {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -945,6 +953,8 @@ export const isIS: LocalizationResource = { phone_number_exists: 'Þetta símanúmer er þegar í notkun. Vinsamlegast reyndu annað.', session_exists: 'Þú ert nú þegar innskráður.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Lykilorðið þitt virkar, en gæti verið sterkara. Reyndu að bæta við fleiri stöfum.', goodPassword: 'Lykilorðið þitt uppfyllir allar nauðsynlegar kröfur.', @@ -1351,4 +1361,9 @@ export const isIS: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 972d54a68e9..496afb2fa24 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -756,6 +756,10 @@ export const itIT: LocalizationResource = { subtitle: 'Inserisci il codice di verifica dalla tua app di autenticazione.', title: 'Verifica in due passaggi', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Inserisci la tua password', signUp: { @@ -848,6 +852,10 @@ export const itIT: LocalizationResource = { title: 'Crea il tuo account', titleCombined: 'Crea il tuo account', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continua con {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -949,6 +957,8 @@ export const itIT: LocalizationResource = { phone_number_exists: 'Questo numero di telefono è già in uso. Per favore, prova con un altro.', session_exists: 'Sei già loggato.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: undefined, goodPassword: undefined, @@ -1356,4 +1366,9 @@ export const itIT: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index 32056235b1e..4456bf56493 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -759,6 +759,10 @@ export const jaJP: LocalizationResource = { subtitle: '続行するには、認証アプリで生成された検証コードを入力してください', title: '二段階認証', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'パスワードを入力してください', signUp: { @@ -852,6 +856,10 @@ export const jaJP: LocalizationResource = { title: 'アカウントを作成', titleCombined: 'アカウントを作成', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}で続ける', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -954,6 +962,8 @@ export const jaJP: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Web3ウォレット拡張機能が見つかりません。続行するにはインストールしてください。', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'パスワードは有効ですが、もう少し強化できます。文字を追加してみてください。', goodPassword: 'パスワードはすべての要件を満たしています。', @@ -1355,4 +1365,9 @@ export const jaJP: LocalizationResource = { title: '待機リストへの参加ありがとうございます!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index a6fafe75c28..dfe8e8ea0cf 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -741,6 +741,10 @@ export const kkKZ: LocalizationResource = { subtitle: 'Аутентификатор қолданбасындағы кодты енгізіңіз', title: 'Екі қадамды растау', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Құпия сөзді енгізіңіз', signUp: { @@ -832,6 +836,10 @@ export const kkKZ: LocalizationResource = { title: 'Есептік жазбаны құру', titleCombined: 'Есептік жазбаны құру', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} арқылы жалғастыру', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -930,6 +938,8 @@ export const kkKZ: LocalizationResource = { phone_number_exists: 'Бұл телефон нөмірі тіркелген. Басқасын қолданыңыз.', session_exists: undefined, web3_missing_identifier: 'Web3 Wallet кеңейтуі табылмады. Орнатыңыз.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Құпия сөз әлсіз. Таңбалар санын көбейтіңіз.', goodPassword: 'Құпия сөз талаптарға сай.', @@ -1323,4 +1333,9 @@ export const kkKZ: LocalizationResource = { title: 'Күту тізіміне қосылғаныңыз үшін рақмет!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 56bce5252fc..3ec094af7ab 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -743,6 +743,10 @@ export const koKR: LocalizationResource = { subtitle: '계속하려면 인증 앱에서 생성된 인증 코드를 입력하세요', title: '2단계 인증', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '비밀번호를 입력하세요', signUp: { @@ -833,6 +837,10 @@ export const koKR: LocalizationResource = { title: '계정 만들기', titleCombined: '계정 만들기', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}로 계속하기', socialButtonsBlockButtonManyInView: undefined, @@ -933,6 +941,8 @@ export const koKR: LocalizationResource = { phone_number_exists: '이 전화번호는 이미 사용중입니다. 다른 번호를 시도해 주세요.', session_exists: '이미 로그인 중입니다.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '비밀번호는 작동하지만 더 강력할 수 있습니다. 문자를 더 추가해 보세요.', goodPassword: '수고하셨습니다. 훌륭한 비밀번호입니다.', @@ -1329,4 +1339,9 @@ export const koKR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index f3226c8d8cd..4b5d2eaa854 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -750,6 +750,10 @@ export const mnMN: LocalizationResource = { subtitle: 'Үргэлжлүүлэхийн тулд authenticator апп-аар үүсгэсэн баталгаажуулах кодыг оруулна уу', title: 'Two-step баталгаажуулалт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Нууц үгээ оруулна уу', signUp: { @@ -840,6 +844,10 @@ export const mnMN: LocalizationResource = { title: 'Бүртгэл үүсгэх', titleCombined: 'Бүртгэл үүсгэх', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}-р үргэлжлүүлэх', socialButtonsBlockButtonManyInView: undefined, @@ -941,6 +949,8 @@ export const mnMN: LocalizationResource = { phone_number_exists: 'Энэ утасны дугаарыг авсан. Өөр оролдоно уу.', session_exists: 'Та аль хэдийн нэвтэрсэн байна.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Таны нууц үг ажилладаг, гэхдээ илүү хүчтэй байж болно. Илүү олон тэмдэгт нэмж үзээрэй.', goodPassword: 'Таны нууц үг шаардлагатай бүх шаардлагыг хангаж байна.', @@ -1345,4 +1355,9 @@ export const mnMN: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 76f884c09d2..c500c3301e6 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -754,6 +754,10 @@ export const msMY: LocalizationResource = { subtitle: 'Untuk meneruskan, sila masukkan kod pengesahan yang dijana oleh aplikasi pengesah anda', title: 'Pengesahan dua langkah', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Masukkan kata laluan anda', signUp: { @@ -848,6 +852,10 @@ export const msMY: LocalizationResource = { title: 'Cipta akaun anda', titleCombined: 'Cipta akaun anda', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Teruskan dengan {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -956,6 +964,8 @@ export const msMY: LocalizationResource = { phone_number_exists: 'Nombor telefon ini telah diambil. Sila cuba yang lain.', session_exists: undefined, web3_missing_identifier: 'Sambungan Dompet Web3 tidak dapat dijumpai. Sila pasang satu untuk meneruskan.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Kata laluan anda berfungsi, tetapi boleh lebih kuat. Cuba tambah lebih banyak aksara.', goodPassword: 'Kata laluan anda memenuhi semua keperluan yang diperlukan.', @@ -1363,4 +1373,9 @@ export const msMY: LocalizationResource = { title: 'Terima kasih kerana menyertai senarai menunggu!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 21fd1a962a2..0901ed53c5c 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -749,6 +749,10 @@ export const nbNO: LocalizationResource = { subtitle: undefined, title: 'To-trinns verifisering', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Skriv inn passordet ditt', signUp: { @@ -839,6 +843,10 @@ export const nbNO: LocalizationResource = { title: 'Opprett kontoen din', titleCombined: 'Opprett kontoen din', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Fortsett med {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -940,6 +948,8 @@ export const nbNO: LocalizationResource = { phone_number_exists: 'Dette telefonnummeret er allerede i bruk. Vennligst bruk et annet telefonnummer.', session_exists: 'Du er allerede logget inn.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Passordet ditt fungerer, men det kan være sterkere. Prøv å legge til flere tegn.', goodPassword: 'Godt jobbet. Dette er et utmerket passord.', @@ -1344,4 +1354,9 @@ export const nbNO: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index 5167e3eddda..83b9f5331ec 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -749,6 +749,10 @@ export const nlBE: LocalizationResource = { subtitle: '', title: 'Tweestapsverificatie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Vul je wachtwoord in', signUp: { @@ -840,6 +844,10 @@ export const nlBE: LocalizationResource = { title: 'Maak je account aan', titleCombined: 'Maak je account aan', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}', socialButtonsBlockButtonManyInView: 'Ga verder met {{provider|titleize}}', @@ -940,6 +948,8 @@ export const nlBE: LocalizationResource = { phone_number_exists: 'Dit telefoonnummer is al in gebruik. Probeer een ander nummer.', session_exists: 'Je bent al ingelogd.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.', goodPassword: 'Je wachtwoord voldoet aan alle vereisten.', @@ -1342,4 +1352,9 @@ export const nlBE: LocalizationResource = { title: 'Succes!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index d438ebb6895..8c0eed02f11 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -749,6 +749,10 @@ export const nlNL: LocalizationResource = { subtitle: '', title: 'Tweestapsverificatie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Vul je wachtwoord in', signUp: { @@ -840,6 +844,10 @@ export const nlNL: LocalizationResource = { title: 'Maak je account aan', titleCombined: 'Maak je account aan', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}', socialButtonsBlockButtonManyInView: 'Ga verder met {{provider|titleize}}', @@ -940,6 +948,8 @@ export const nlNL: LocalizationResource = { phone_number_exists: 'Dit telefoonnummer is al in gebruik. Probeer een ander nummer.', session_exists: 'Je bent al ingelogd.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.', goodPassword: 'Je wachtwoord voldoet aan alle vereisten.', @@ -1342,4 +1352,9 @@ export const nlNL: LocalizationResource = { title: 'Succes!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index f481f854808..8bee446184a 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -751,6 +751,10 @@ export const plPL: LocalizationResource = { subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wygenerowany przez aplikację uwierzytelniającą', title: 'Weryfikacja dwustopniowa', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Wprowadź swoje hasło', signUp: { @@ -845,6 +849,10 @@ export const plPL: LocalizationResource = { title: 'Utwórz swoje konto', titleCombined: 'Utwórz swoje konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Kontynuuj z {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -949,6 +957,8 @@ export const plPL: LocalizationResource = { phone_number_exists: 'Numer telefonu jest już zajęty. Proszę spróbować innego.', session_exists: 'Jesteś już zalogowany.', web3_missing_identifier: 'Nie można znaleźć rozszerzenia Web3 Wallet. Zainstaluj je, aby kontynuować.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Twoje hasło jest odpowiednie, ale mogłoby być silniejsze. Spróbuj dodać więcej znaków.', goodPassword: 'Twoje hasło jest wystarczająco silne.', @@ -1354,4 +1364,9 @@ export const plPL: LocalizationResource = { title: 'Dziękujemy za dołączenie do listy oczekujących!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 7a4d328d672..9680da375d1 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -758,6 +758,10 @@ export const ptBR: LocalizationResource = { subtitle: 'Para continuar, insira o código gerado pelo seu aplicativo autenticador.', title: 'Verificação em duas etapas', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Insira sua senha', signUp: { @@ -852,6 +856,10 @@ export const ptBR: LocalizationResource = { title: 'Criar sua conta', titleCombined: 'Criar sua conta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar com {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -957,6 +965,8 @@ export const ptBR: LocalizationResource = { session_exists: 'Você já está conectado.', web3_missing_identifier: 'Uma extensão de carteira Web3 não pode ser encontrada. Por favor, instale uma para continuar.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Sua senha funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.', goodPassword: 'Sua senha atende a todos os requisitos necessários.', @@ -1364,4 +1374,9 @@ export const ptBR: LocalizationResource = { title: 'Obrigado por entrar na lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index c298945fe45..22411c395cb 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -747,6 +747,10 @@ export const ptPT: LocalizationResource = { subtitle: 'Insira o código de verificação enviado para o seu dispositivo.', title: 'Verificação de duas etapas', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Insira a sua palavra-passe', signUp: { @@ -838,6 +842,10 @@ export const ptPT: LocalizationResource = { title: 'Criar a sua conta', titleCombined: 'Criar a sua conta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar com {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -941,6 +949,8 @@ export const ptPT: LocalizationResource = { phone_number_exists: 'Este número de telemóvel já está em uso. Por favor, tente outro.', session_exists: 'Já está conectado.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'A sua palavra-passe funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.', goodPassword: 'A sua palavra-passe atende a todos os requisitos necessários.', @@ -1344,4 +1354,9 @@ export const ptPT: LocalizationResource = { title: 'Inscrição bem-sucedida na lista de espera', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index b489430bf35..52d8dc4ee1e 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -760,6 +760,10 @@ export const roRO: LocalizationResource = { subtitle: 'Pentru a continua, introdu codul generat de aplicația ta de autentificare', title: 'Verificare în doi pași', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Introdu parola', signUp: { @@ -853,6 +857,10 @@ export const roRO: LocalizationResource = { title: 'Creează-ți contul', titleCombined: 'Creează-ți contul', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuă cu {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -958,6 +966,8 @@ export const roRO: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Nu am găsit o extensie pentru portofel Web3. Te rugăm instalează una pentru a continua.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Parola ta funcționează, dar ar putea fi mai puternică. Încearcă să adaugi mai multe caractere.', goodPassword: 'Parola ta îndeplinește toate cerințele necesare.', @@ -1361,4 +1371,9 @@ export const roRO: LocalizationResource = { title: 'Mulțumim pentru înscriere!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index cf3f2ea89e6..145cb75f0bc 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -758,6 +758,10 @@ export const ruRU: LocalizationResource = { subtitle: 'Чтобы продолжить, пожалуйста, введите код проверки, сгенерированный вашим приложением аутентификации.', title: 'Двухфакторная верификация', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Введите Ваш пароль', signUp: { @@ -852,6 +856,10 @@ export const ruRU: LocalizationResource = { title: 'Создайте Вашу учетную запись', titleCombined: 'Создайте Вашу учетную запись', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продолжить с помощью {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -957,6 +965,8 @@ export const ruRU: LocalizationResource = { phone_number_exists: 'Этот номер телефона уже занят. Пожалуйста, попробуйте другой.', session_exists: 'Вы уже вошли в систему.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль подходит, но мог бы быть надежнее. Попробуйте добавить больше символов.', goodPassword: 'Хорошая работа. Это отличный пароль.', @@ -1366,4 +1376,9 @@ export const ruRU: LocalizationResource = { title: 'Спасибо за присоединение к списку ожидания!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 7b946da46ce..99d43462908 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -751,6 +751,10 @@ export const skSK: LocalizationResource = { subtitle: 'Pre pokračovanie zadajte overovací kód z vašej autentifikačnej aplikácie', title: 'Dvojfaktorové overenie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Zadajte svoje heslo', signUp: { @@ -845,6 +849,10 @@ export const skSK: LocalizationResource = { title: 'Vytvorte si účet', titleCombined: 'Vytvorte si účet', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Pokračovať s {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -948,6 +956,8 @@ export const skSK: LocalizationResource = { phone_number_exists: 'Toto telefónne číslo je už obsadené. Skúste prosím iné.', session_exists: 'Jste už přihlášen.', web3_missing_identifier: 'Rozšírenie Web3 Peňaženky nebolo nájdené. Je potrebné ho nainštalovať.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaše heslo funguje, ale mohlo by byť silnejšie. Skúste pridať viac znakov.', goodPassword: 'Dobrá práca. Toto je vynikajúce heslo.', @@ -1351,4 +1361,9 @@ export const skSK: LocalizationResource = { title: 'Ďakujeme, že ste sa pridali na waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index efb367e7ab7..6d3ceb2e37c 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -748,6 +748,10 @@ export const srRS: LocalizationResource = { subtitle: 'Da nastaviš, molimo unesi verifikacioni kod generisan tvojom aplikacijom za autentifikaciju', title: 'Dvostepena verifikacija', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Unesi svoju lozinku', signUp: { @@ -838,6 +842,10 @@ export const srRS: LocalizationResource = { title: 'Kreiraj svoj nalog', titleCombined: 'Kreiraj svoj nalog', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Nastavi sa {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -940,6 +948,8 @@ export const srRS: LocalizationResource = { phone_number_exists: 'Ovaj telefonski broj je zauzet. Molimo pokušaj sa drugim.', session_exists: 'Već ste prijavljeni.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tvoja lozinka funkcioniše, ali može biti jača. Pokušaj dodati više karaktera.', goodPassword: 'Tvoja lozinka ispunjava sve potrebne zahteve.', @@ -1343,4 +1353,9 @@ export const srRS: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index 9f98e702798..0a1d90128b0 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -751,6 +751,10 @@ export const svSE: LocalizationResource = { subtitle: 'För att fortsätta, vänligen ange verifieringskoden som genereras av din autentiseringsapp', title: 'Tvåstegsverifiering', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ange ditt lösenord', signUp: { @@ -843,6 +847,10 @@ export const svSE: LocalizationResource = { title: 'Skapa ditt konto', titleCombined: 'Skapa ditt konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Fortsätt med {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -943,6 +951,8 @@ export const svSE: LocalizationResource = { phone_number_exists: 'Detta telefonnummer är taget. Vänligen prova ett annat.', session_exists: 'Du är redan inloggad.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ditt lösenord fungerar, men kunde vara starkare. Försök lägga till fler tecken.', goodPassword: 'Ditt lösenord uppfyller alla nödvändiga krav.', @@ -1346,4 +1356,9 @@ export const svSE: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index aee6114fa90..637d25d71fe 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -754,6 +754,10 @@ export const taIN: LocalizationResource = { subtitle: 'தொடர, உங்கள் அங்கீகாரி பயன்பாட்டால் உருவாக்கப்பட்ட சரிபார்ப்புக் குறியீட்டை உள்ளிடவும்', title: 'இரண்டு-படி சரிபார்ப்பு', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'உங்கள் கடவுச்சொல்லை உள்ளிடவும்', signUp: { @@ -847,6 +851,10 @@ export const taIN: LocalizationResource = { title: 'உங்கள் கணக்கை உருவாக்கவும்', titleCombined: 'உங்கள் கணக்கை உருவாக்கவும்', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} மூலம் தொடரவும்', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -955,6 +963,8 @@ export const taIN: LocalizationResource = { phone_number_exists: 'இந்த தொலைபேசி எண் எடுக்கப்பட்டுள்ளது. வேறொன்றை முயற்சிக்கவும்.', session_exists: undefined, web3_missing_identifier: 'Web3 வாலட் நீட்டிப்பு காணப்படவில்லை. தொடர ஒன்றை நிறுவவும்.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'உங்கள் கடவுச்சொல் செயல்படுகிறது, ஆனால் மேலும் வலுவாக இருக்கலாம். மேலும் எழுத்துகளைச் சேர்க்க முயற்சிக்கவும்.', @@ -1361,4 +1371,9 @@ export const taIN: LocalizationResource = { title: 'காத்திருப்பில் சேர்ந்ததற்கு நன்றி!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index 4b90e7270ec..bb88625c7bc 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -754,6 +754,10 @@ export const teIN: LocalizationResource = { subtitle: 'కొనసాగించడానికి, దయచేసి మీ ప్రమాణీకరణ యాప్ ద్వారా రూపొందించిన ధృవీకరణ కోడ్‌ను నమోదు చేయండి', title: 'రెండు-దశల ధృవీకరణ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'మీ పాస్‌వర్డ్‌ను నమోదు చేయండి', signUp: { @@ -847,6 +851,10 @@ export const teIN: LocalizationResource = { title: 'మీ ఖాతాను సృష్టించండి', titleCombined: 'మీ ఖాతాను సృష్టించండి', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}తో కొనసాగించండి', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -951,6 +959,8 @@ export const teIN: LocalizationResource = { phone_number_exists: 'ఈ ఫోన్ నంబర్ తీసుకోబడింది. దయచేసి మరొకదాన్ని ప్రయత్నించండి.', session_exists: undefined, web3_missing_identifier: 'Web3 వాలెట్ పొడిగింపు కనుగొనబడలేదు. కొనసాగించడానికి దయచేసి ఒకదాన్ని ఇన్‌స్టాల్ చేయండి.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'మీ పాస్‌వర్డ్ పనిచేస్తుంది, కానీ మరింత బలంగా ఉండవచ్చు. మరిన్ని అక్షరాలను జోడించడానికి ప్రయత్నించండి.', @@ -1357,4 +1367,9 @@ export const teIN: LocalizationResource = { title: 'వెయిట్‌లిస్ట్‌లో చేరినందుకు ధన్యవాదాలు!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 5cdf69204b3..70ef99a6783 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -750,6 +750,10 @@ export const thTH: LocalizationResource = { subtitle: 'เพื่อดำเนินการต่อ โปรดใส่รหัสยืนยันที่สร้างโดยแอป Authenticator ของคุณ', title: 'การยืนยันตัวตนสองขั้นตอน', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'ใส่รหัสผ่านของคุณ', signUp: { @@ -841,6 +845,10 @@ export const thTH: LocalizationResource = { title: 'สร้างบัญชีของคุณ', titleCombined: 'สร้างบัญชีของคุณ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'ดำเนินการต่อด้วย {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -941,6 +949,8 @@ export const thTH: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'ไม่พบส่วนขยาย Web3 Wallet โปรดติดตั้งเพื่อดำเนินการต่อ', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'รหัสผ่านของคุณใช้ได้ แต่อาจแข็งแกร่งกว่านี้ ลองเพิ่มตัวอักษรเพิ่มเติม', goodPassword: 'รหัสผ่านของคุณตรงตามข้อกำหนดที่จำเป็นทั้งหมด', @@ -1339,4 +1349,9 @@ export const thTH: LocalizationResource = { title: 'ขอบคุณที่เข้าร่วม Waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 333b2e3fadf..f5f44384d9b 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -750,6 +750,10 @@ export const trTR: LocalizationResource = { subtitle: 'Devam etmek için lütfen kimlik doğrulayıcı uygulamanız tarafından oluşturulan doğrulama kodunu girin', title: 'İki aşamalı doğrulama', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Şifrenizi girin', signUp: { @@ -841,6 +845,10 @@ export const trTR: LocalizationResource = { title: 'Hesap oluştur', titleCombined: 'Hesap oluştur', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} ile giriş yapın', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -944,6 +952,8 @@ export const trTR: LocalizationResource = { phone_number_exists: 'Bu telefon numarası zaten kullanılıyor. Lütfen başka bir numara deneyin.', session_exists: 'Zaten giriş yapmışsınız.', web3_missing_identifier: 'Web3 için tanımlayıcı eksik.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Şifreniz kriterleri karşılıyor; fakat birkaç karakter daha ekleyerek daha güçlü bir şifre oluşturabilirsiniz.', @@ -1348,4 +1358,9 @@ export const trTR: LocalizationResource = { title: 'Bekleme Listesine Katıldınız', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index 2518da7ce4e..83b57c4d337 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -747,6 +747,10 @@ export const ukUA: LocalizationResource = { subtitle: undefined, title: 'Двоетапна перевірка', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Введіть Ваш пароль', signUp: { @@ -837,6 +841,10 @@ export const ukUA: LocalizationResource = { title: 'Створіть Ваш акаунт', titleCombined: 'Створіть Ваш акаунт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продовжити за допомогою {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -938,6 +946,8 @@ export const ukUA: LocalizationResource = { phone_number_exists: 'Цей номер телефону вже використовується. Спробуйте інший.', session_exists: 'Ви вже увійшли в систему.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль підходить, але міг би бути надійнішим. Спробуйте додати більше символів.', goodPassword: 'Хороша робота. Це відмінний пароль.', @@ -1342,4 +1352,9 @@ export const ukUA: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 3e8d8fc2317..fc5773c2f35 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -756,6 +756,10 @@ export const viVN: LocalizationResource = { subtitle: 'Để tiếp tục, vui lòng nhập mã xác minh được tạo bởi ứng dụng xác thực của bạn', title: 'Xác thực hai bước', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Nhập mật khẩu', signUp: { @@ -848,6 +852,10 @@ export const viVN: LocalizationResource = { title: 'Tạo tài khoản của bạn', titleCombined: 'Tạo tài khoản của bạn', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Tiếp tục với {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const viVN: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Không tìm thấy phần mở rộng Web3 Wallet. Vui lòng cài đặt một phần mở rộng để tiếp tục.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Mật khẩu của bạn hoạt động, nhưng có thể mạnh hơn. Hãy thử thêm nhiều ký tự.', goodPassword: 'Mật khẩu của bạn đáp ứng tất cả các yêu cầu cần thiết.', @@ -1353,4 +1363,9 @@ export const viVN: LocalizationResource = { title: 'Cảm ơn bạn đã tham gia danh sách chờ!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 5f5223af7d1..7089f5fdf76 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -737,6 +737,10 @@ export const zhCN: LocalizationResource = { subtitle: '请继续输入由您的身份验证应用生成的验证码。', title: '两步验证', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '输入您的密码', signUp: { @@ -827,6 +831,10 @@ export const zhCN: LocalizationResource = { title: '创建您的账户', titleCombined: '创建您的账户', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '使用 {{provider|titleize}} 登录', socialButtonsBlockButtonManyInView: undefined, @@ -924,6 +932,8 @@ export const zhCN: LocalizationResource = { phone_number_exists: '该电话号码已被使用,请尝试其他号码。', session_exists: '您已登录。', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '您的密码可以用,但可以更强。试着添加更多字符。', goodPassword: '做得好。这是一个优秀的密码。', @@ -1313,4 +1323,9 @@ export const zhCN: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 4e6fb98a8de..a35b145f296 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -737,6 +737,10 @@ export const zhTW: LocalizationResource = { subtitle: undefined, title: '兩步驟驗證', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '輸入您的密碼', signUp: { @@ -828,6 +832,10 @@ export const zhTW: LocalizationResource = { title: '建立您的帳戶', titleCombined: '建立您的帳戶', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '以 {{provider|titleize}} 帳戶登入', socialButtonsBlockButtonManyInView: undefined, @@ -924,6 +932,8 @@ export const zhTW: LocalizationResource = { phone_number_exists: '此電話號碼已被使用,請嘗試其他號碼。', session_exists: '您已經登錄。', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '您的密碼強度尚可,但可以更安全。請嘗試增加長度或複雜度。', goodPassword: '密碼強度良好。', @@ -1311,4 +1321,9 @@ export const zhTW: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 73806a4883c..961a3acc47b 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -18,6 +18,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk, ClerkAuthenticateWithWeb3Params, @@ -1453,6 +1454,15 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; + authenticateWithSolana = async (params: AuthenticateWithSolanaParams) => { + const callback = () => this.clerkjs?.authenticateWithSolana(params); + if (this.clerkjs && this.loaded) { + return callback() as Promise; + } else { + this.premountMethodCalls.set('authenticateWithSolana', callback); + } + }; + authenticateWithWeb3 = async (params: ClerkAuthenticateWithWeb3Params) => { const callback = () => this.clerkjs?.authenticateWithWeb3(params); if (this.clerkjs && this.loaded) { diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts index 809aae80217..739ecd36fe7 100644 --- a/packages/shared/src/types/appearance.ts +++ b/packages/shared/src/types/appearance.ts @@ -650,6 +650,17 @@ export type ElementsConfig = { enterpriseConnectionsRoot: WithOptions; enterpriseConnectionButton: WithOptions; enterpriseConnectionButtonText: WithOptions; + + web3WalletButtonsRoot: WithOptions; + web3WalletButtons: WithOptions; + web3WalletButtonsIconButton: WithOptions; + web3WalletButtonsBlockButton: WithOptions; + web3WalletButtonsBlockButtonText: WithOptions; + web3WalletButtonsWalletIcon: WithOptions; + web3WalletButtonsWalletInitialIcon: WithOptions; + + walletIcon: WithOptions; + walletInitialIcon: WithOptions; }; export type Elements = { diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 5972230705f..91aac9c86c4 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -903,6 +903,11 @@ export interface Clerk { */ authenticateWithBase: (params?: AuthenticateWithBaseParams) => Promise; + /** + * Authenticates user using their Solana supported Web3 wallet browser extension + */ + authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; + /** * Authenticates user using their Web3 Wallet browser extension */ @@ -2300,6 +2305,7 @@ export interface ClerkAuthenticateWithWeb3Params { strategy: Web3Strategy; legalAccepted?: boolean; secondFactorUrl?: string; + walletName?: string; } export type JoinWaitlistParams = { @@ -2343,6 +2349,15 @@ export interface AuthenticateWithBaseParams { legalAccepted?: boolean; } +export interface AuthenticateWithSolanaParams { + customNavigate?: (to: string) => Promise; + redirectUrl?: string; + signUpContinueUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; + legalAccepted?: boolean; + walletName: string; +} + export interface LoadedClerk extends Clerk { client: ClientResource; } diff --git a/packages/shared/src/types/factors.ts b/packages/shared/src/types/factors.ts index 9dff219ff14..f244a16f34b 100644 --- a/packages/shared/src/types/factors.ts +++ b/packages/shared/src/types/factors.ts @@ -43,6 +43,7 @@ export type Web3SignatureFactor = { strategy: Web3Strategy; web3WalletId: string; primary?: boolean; + walletName?: string; }; export type PasswordFactor = { diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index d8e4a644653..a5d3ab96a6d 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -369,6 +369,11 @@ export type __internal_LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; }; + web3Solana: { + title: LocalizationValue; + subtitle: LocalizationValue; + noAvailableWallets: LocalizationValue; + }; }; signIn: { start: { @@ -547,6 +552,10 @@ export type __internal_LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; }; + web3Solana: { + title: LocalizationValue; + subtitle: LocalizationValue; + }; }; reverification: { password: { @@ -1300,6 +1309,11 @@ export type __internal_LocalizationResource = { }; formButtonPrimary: LocalizationValue; }; + web3WalletButtons: { + connect: LocalizationValue<'walletName'>; + continue: LocalizationValue<'walletName'>; + noneAvailable: LocalizationValue<'solanaWalletsLink'>; + }; }; type WithParamName = T & @@ -1320,6 +1334,8 @@ type UnstableErrors = WithParamName<{ passkey_registration_cancelled: LocalizationValue; passkey_already_exists: LocalizationValue; web3_missing_identifier: LocalizationValue; + web3_solana_signature_generation_failed: LocalizationValue; + web3_signature_request_rejected: LocalizationValue; form_password_pwned: LocalizationValue; form_password_pwned__sign_in: LocalizationValue; form_new_password_matches_current: LocalizationValue; diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index e37018e15c3..031cf9e76eb 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -16,6 +16,7 @@ import type { PrepareFirstFactorParams, PrepareSecondFactorParams, ResetPasswordParams, + SignInAuthenticateWithSolanaParams, SignInCreateParams, SignInFirstFactor, SignInIdentifier, @@ -76,6 +77,8 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; + authenticateWithSolana: (params: SignInAuthenticateWithSolanaParams) => Promise; + authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; createEmailLinkFlow: () => CreateEmailLinkFlowReturn; diff --git a/packages/shared/src/types/signInCommon.ts b/packages/shared/src/types/signInCommon.ts index de07635a6d3..ccc5675915f 100644 --- a/packages/shared/src/types/signInCommon.ts +++ b/packages/shared/src/types/signInCommon.ts @@ -197,3 +197,7 @@ export type SignInStrategy = | OAuthStrategy | SamlStrategy | EnterpriseSSOStrategy; + +export interface SignInAuthenticateWithSolanaParams { + walletName: string; +} diff --git a/packages/shared/src/types/signInFuture.ts b/packages/shared/src/types/signInFuture.ts index 66c52a4a8b3..554b77dc54d 100644 --- a/packages/shared/src/types/signInFuture.ts +++ b/packages/shared/src/types/signInFuture.ts @@ -4,6 +4,7 @@ import type { PhoneCodeChannel } from './phoneCodeChannel'; import type { SignInFirstFactor, SignInSecondFactor, SignInStatus, UserData } from './signInCommon'; import type { OAuthStrategy, PasskeyStrategy, Web3Strategy } from './strategies'; import type { VerificationResource } from './verification'; +import type { Web3Provider } from './web3'; export interface SignInFutureCreateParams { /** @@ -244,6 +245,14 @@ export interface SignInFutureWeb3Params { * The verification strategy to validate the user's sign-in request. */ strategy: Web3Strategy; + /** + * The Web3 wallet provider to use for the sign-in. + */ + provider: Web3Provider; + /** + * The name of the wallet to use for Solana sign-ins. Required when `provider` is set to `'solana'`. + */ + walletName?: string; } export interface SignInFuturePasskeyParams { diff --git a/packages/shared/src/types/signUp.ts b/packages/shared/src/types/signUp.ts index 8cfcc7debce..38da8659e9b 100644 --- a/packages/shared/src/types/signUp.ts +++ b/packages/shared/src/types/signUp.ts @@ -6,6 +6,7 @@ import type { ClerkResource } from './resource'; import type { AttemptVerificationParams, PrepareVerificationParams, + SignUpAuthenticateWithSolanaParams, SignUpAuthenticateWithWeb3Params, SignUpCreateParams, SignUpField, @@ -107,6 +108,7 @@ export interface SignUpResource extends ClerkResource { authenticateWithCoinbaseWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithOKXWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithBase: (params?: SignUpAuthenticateWithWeb3Params) => Promise; + authenticateWithSolana: (params: SignUpAuthenticateWithSolanaParams) => Promise; __internal_toSnapshot: () => SignUpJSONSnapshot; /** diff --git a/packages/shared/src/types/signUpCommon.ts b/packages/shared/src/types/signUpCommon.ts index a40504a0c2a..4aa1b6918c6 100644 --- a/packages/shared/src/types/signUpCommon.ts +++ b/packages/shared/src/types/signUpCommon.ts @@ -115,6 +115,11 @@ export type SignUpAuthenticateWithMetamaskParams = SignUpAuthenticateWithWeb3Par export type SignUpAuthenticateWithWeb3Params = { unsafeMetadata?: SignUpUnsafeMetadata; + legalAccepted?: boolean; +}; + +export type SignUpAuthenticateWithSolanaParams = SignUpAuthenticateWithWeb3Params & { + walletName: string; }; export interface SignUpVerificationsResource { diff --git a/packages/shared/src/types/web3.ts b/packages/shared/src/types/web3.ts index 78e82f3fb76..450c8533946 100644 --- a/packages/shared/src/types/web3.ts +++ b/packages/shared/src/types/web3.ts @@ -10,5 +10,12 @@ export type MetamaskWeb3Provider = 'metamask'; export type CoinbaseWalletWeb3Provider = 'coinbase_wallet'; export type OKXWalletWeb3Provider = 'okx_wallet'; export type BaseWeb3Provider = 'base'; +export type SolanaWeb3Provider = 'solana'; -export type Web3Provider = MetamaskWeb3Provider | BaseWeb3Provider | CoinbaseWalletWeb3Provider | OKXWalletWeb3Provider; +export type Web3Provider = EthereumWeb3Provider | SolanaWeb3Provider; + +export type EthereumWeb3Provider = + | MetamaskWeb3Provider + | BaseWeb3Provider + | CoinbaseWalletWeb3Provider + | OKXWalletWeb3Provider; diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index 62dec1eb68d..0658cd87744 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -31,10 +31,12 @@ export interface AuthenticateWithWeb3Params { identifier: string; generateSignature: GenerateSignature; strategy?: Web3Strategy; + walletName?: string; } export interface GenerateSignatureParams { identifier: string; nonce: string; - provider?: Web3Provider; + provider: Web3Provider; + walletName?: string; } diff --git a/packages/shared/src/web3.ts b/packages/shared/src/web3.ts index 25392eece24..d630edf5f88 100644 --- a/packages/shared/src/web3.ts +++ b/packages/shared/src/web3.ts @@ -21,4 +21,9 @@ export const WEB3_PROVIDERS: Web3ProviderData[] = [ strategy: 'web3_okx_wallet_signature', name: 'OKX Wallet', }, + { + provider: 'solana', + strategy: 'web3_solana_signature', + name: 'Solana', + }, ]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c5c14c87f7..1828d41b6ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,7 +93,7 @@ importers: version: 10.1.0 '@testing-library/jest-dom': specifier: ^6.4.6 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@testing-library/react': specifier: ^16.0.0 version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -120,7 +120,7 @@ importers: version: 4.5.2(vite@7.1.5(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) chalk: specifier: 4.1.2 version: 4.1.2 @@ -219,7 +219,7 @@ importers: version: 0.8.0(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3))) jest-environment-jsdom: specifier: ^29.3.1 - version: 29.7.0 + version: 29.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) json5: specifier: 2.2.3 version: 2.2.3 @@ -297,7 +297,7 @@ importers: version: 6.1.6(typanion@3.14.0) vitest: specifier: 3.2.4 - version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) yalc: specifier: 1.0.0-pre.53 version: 1.0.0-pre.53 @@ -390,7 +390,7 @@ importers: version: 9.0.2 vitest-environment-miniflare: specifier: 2.14.4 - version: 2.14.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) packages/chrome-extension: dependencies: @@ -427,7 +427,7 @@ importers: dependencies: '@base-org/account': specifier: 2.0.1 - version: 2.0.1(@types/react@18.3.26)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76) + version: 2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@clerk/localizations': specifier: workspace:^ version: link:../localizations @@ -452,6 +452,15 @@ importers: '@formkit/auto-animate': specifier: ^0.8.2 version: 0.8.2 + '@solana/wallet-adapter-base': + specifier: 0.9.27 + version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-react': + specifier: 0.15.39 + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-standard': + specifier: 1.1.4 + version: 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) '@stripe/stripe-js': specifier: 5.6.0 version: 5.6.0 @@ -461,6 +470,9 @@ importers: '@tanstack/query-core': specifier: 5.87.4 version: 5.87.4 + '@wallet-standard/core': + specifier: 1.1.1 + version: 1.1.1 '@zxcvbn-ts/core': specifier: 3.0.4 version: 3.0.4 @@ -506,10 +518,10 @@ importers: version: link:../testing '@rsdoctor/rspack-plugin': specifier: ^0.4.13 - version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/cli': specifier: ^1.4.11 - version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/core': specifier: ^1.4.11 version: 1.4.11(@swc/helpers@0.5.17) @@ -533,7 +545,7 @@ importers: version: 0.4.1 jsdom: specifier: 26.1.0 - version: 26.1.0 + version: 26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) minimatch: specifier: ^10.0.3 version: 10.0.3 @@ -603,7 +615,7 @@ importers: devDependencies: '@statelyai/inspect': specifier: ^0.4.0 - version: 0.4.0(ws@8.18.3)(xstate@5.20.2) + version: 0.4.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(xstate@5.20.2) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -636,7 +648,7 @@ importers: version: 18.3.1(react@18.3.1) react-native-url-polyfill: specifier: 2.0.0 - version: 2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + version: 2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) tslib: specifier: catalog:repo version: 2.8.1 @@ -649,25 +661,25 @@ importers: version: 1.0.2 expo-apple-authentication: specifier: ^7.2.4 - version: 7.2.4(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + version: 7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) expo-auth-session: specifier: ^5.4.0 - version: 5.4.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-crypto: specifier: ^15.0.7 - version: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-local-authentication: specifier: ^13.8.0 - version: 13.8.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-secure-store: specifier: ^12.8.1 - version: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-web-browser: specifier: ^12.8.2 - version: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) react-native: specifier: ^0.81.4 - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) packages/expo-passkeys: dependencies: @@ -679,11 +691,11 @@ importers: version: 18.3.1 react-native: specifier: '*' - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) devDependencies: expo: specifier: ~52.0.47 - version: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + version: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) packages/express: dependencies: @@ -801,7 +813,7 @@ importers: devDependencies: nuxt: specifier: ^4.1.2 - version: 4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) + version: 4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(bufferutil@4.0.9)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) typescript: specifier: catalog:repo version: 5.8.3 @@ -1033,10 +1045,10 @@ importers: dependencies: '@inkjs/ui': specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) '@jescalan/ink-markdown': specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) ejs: specifier: 3.1.10 version: 3.1.10 @@ -1054,16 +1066,16 @@ importers: version: 0.1.2 ink: specifier: ^5.0.1 - version: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + version: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) ink-big-text: specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) ink-gradient: specifier: ^3.0.0 - version: 3.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 3.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) ink-link: specifier: ^4.1.0 - version: 4.1.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 4.1.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) jscodeshift: specifier: ^17.0.0 version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)) @@ -4089,6 +4101,11 @@ packages: '@types/react': optional: true + '@react-native-async-storage/async-storage@1.24.0': + resolution: {integrity: sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + '@react-native-community/cli-clean@12.3.7': resolution: {integrity: sha512-BCYW77QqyxfhiMEBOoHyciJRNV6Rhz1RvclReIKnCA9wAwmoJBeu4Mu+AwiECA2bUITX16fvPt3NwDsSd1jwfQ==} @@ -4730,6 +4747,127 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5': + resolution: {integrity: sha512-xfQl6Kee0ZXagUG5mpy+bMhQTNf2LAzF65m5SSgNJp47y/nP9GdXWi9blVH8IPP+QjF/+DnCtURaXS14bk3WJw==} + peerDependencies: + '@solana/web3.js': ^1.58.0 + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5': + resolution: {integrity: sha512-kCI+0/umWm98M9g12ndpS56U6wBzq4XdhobCkDPF8qRDYX/iTU8CD+QMcalh7VgRT7GWEmySQvQdaugM0Chf0g==} + peerDependencies: + react-native: '>0.69' + + '@solana-mobile/wallet-adapter-mobile@2.2.5': + resolution: {integrity: sha512-Zpzfwm3N4FfI63ZMs2qZChQ1j0z+p2prkZbSU51NyTnE+K9l9sDAl8RmRCOWnE29y+/AN10WuQZQoIAccHVOFg==} + peerDependencies: + '@solana/web3.js': ^1.58.0 + + '@solana-mobile/wallet-standard-mobile@0.4.4': + resolution: {integrity: sha512-LMvqkS5/aEH+EiDje9Dk351go6wO3POysgmobM4qm8RsG5s6rDAW3U0zA+5f2coGCTyRx8BKE1I/9nHlwtBuow==} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@4.0.0': + resolution: {integrity: sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@4.0.0': + resolution: {integrity: sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-strings@4.0.0': + resolution: {integrity: sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@4.0.0': + resolution: {integrity: sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/wallet-adapter-base@0.9.27': + resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-react@0.15.39': + resolution: {integrity: sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: 18.3.1 + + '@solana/wallet-standard-chains@1.1.1': + resolution: {integrity: sha512-Us3TgL4eMVoVWhuC4UrePlYnpWN+lwteCBlhZDUhFZBJ5UMGh94mYPXno3Ho7+iHPYRtuCi/ePvPcYBqCGuBOw==} + engines: {node: '>=16'} + + '@solana/wallet-standard-core@1.1.2': + resolution: {integrity: sha512-FaSmnVsIHkHhYlH8XX0Y4TYS+ebM+scW7ZeDkdXo3GiKge61Z34MfBPinZSUMV08hCtzxxqH2ydeU9+q/KDrLA==} + engines: {node: '>=16'} + + '@solana/wallet-standard-features@1.3.0': + resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} + engines: {node: '>=16'} + + '@solana/wallet-standard-util@1.1.2': + resolution: {integrity: sha512-rUXFNP4OY81Ddq7qOjQV4Kmkozx4wjYAxljvyrqPx8Ycz0FYChG/hQVWqvgpK3sPsEaO/7ABG1NOACsyAKWNOA==} + engines: {node: '>=16'} + + '@solana/wallet-standard-wallet-adapter-base@1.1.4': + resolution: {integrity: sha512-Q2Rie9YaidyFA4UxcUIxUsvynW+/gE2noj/Wmk+IOwDwlVrJUAXCvFaCNsPDSyKoiYEKxkSnlG13OA1v08G4iw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + bs58: ^6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.4': + resolution: {integrity: sha512-xa4KVmPgB7bTiWo4U7lg0N6dVUtt2I2WhEnKlIv0jdihNvtyhOjCKMjucWet6KAVhir6I/mSWrJk1U9SvVvhCg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/wallet-adapter-base': '*' + react: 18.3.1 + + '@solana/wallet-standard-wallet-adapter@1.1.4': + resolution: {integrity: sha512-YSBrxwov4irg2hx9gcmM4VTew3ofNnkqsXQ42JwcS6ykF1P1ecVY8JCbrv75Nwe6UodnqeoZRbN7n/p3awtjNQ==} + engines: {node: '>=16'} + + '@solana/wallet-standard@1.1.4': + resolution: {integrity: sha512-NF+MI5tOxyvfTU4A+O5idh/gJFmjm52bMwsPpFGRSL79GECSN0XLmpVOO/jqTKJgac2uIeYDpQw/eMaQuWuUXw==} + engines: {node: '>=16'} + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} @@ -5368,12 +5506,18 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + '@types/webextension-polyfill@0.12.3': resolution: {integrity: sha512-F58aDVSeN/MjUGazXo/cPsmR76EvqQhQ1v4x23hFjUX0cfAJYE+JBWwiOGW36/VJGGxoH74sVlRIF3z7SJCKyg==} '@types/webpack-env@1.18.8': resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -5839,6 +5983,31 @@ packages: '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@wallet-standard/app@1.1.0': + resolution: {integrity: sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.1.0': + resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.1.1': + resolution: {integrity: sha512-5Xmjc6+Oe0hcPfVc5n8F77NVLwx1JVAoCVgQpLyv/43/bhtIif+Gx3WUrDlaSDoM8i2kA2xd6YoFbHCxs+e0zA==} + engines: {node: '>=16'} + + '@wallet-standard/errors@0.1.1': + resolution: {integrity: sha512-V8Ju1Wvol8i/VDyQOHhjhxmMVwmKiwyxUZBnHhtiPZJTWY0U/Shb2iEWyGngYEbAkp2sGTmEeNX1tVyGR7PqNw==} + engines: {node: '>=16'} + hasBin: true + + '@wallet-standard/features@1.1.0': + resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.1.0': + resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} + engines: {node: '>=16'} + '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} @@ -6015,6 +6184,10 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -6471,6 +6644,15 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6532,6 +6714,9 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -6546,6 +6731,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} @@ -6592,6 +6780,15 @@ packages: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -6623,6 +6820,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} @@ -7016,6 +7217,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.1: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} @@ -7628,6 +7833,10 @@ packages: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -7721,6 +7930,9 @@ packages: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -8002,6 +8214,12 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + esbuild-plugin-file-path-extensions@2.1.4: resolution: {integrity: sha512-lNjylaAsJMprYg28zjUyBivP3y0ms9b7RJZ5tdhDUFLa3sCbqZw4wDnbFUSmnyZYWhCYDPxxp7KkXM2TXGw3PQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -8538,6 +8756,10 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -8576,6 +8798,9 @@ packages: fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fast-uri@2.4.0: resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} @@ -8590,6 +8815,9 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -9330,6 +9558,9 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -9698,6 +9929,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -9841,6 +10076,11 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -9898,6 +10138,11 @@ packages: engines: {node: '>=10'} hasBin: true + jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + engines: {node: '>=8'} + hasBin: true + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10062,6 +10307,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-beautify@1.15.1: resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} engines: {node: '>=14'} @@ -10831,6 +11079,10 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -11987,6 +12239,10 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -12420,6 +12676,11 @@ packages: peerDependencies: react: 18.3.1 + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -12903,6 +13164,9 @@ packages: resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} engines: {node: '>= 18'} + rpc-websockets@9.3.1: + resolution: {integrity: sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ==} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -13399,6 +13663,12 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -13596,6 +13866,10 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} @@ -13740,6 +14014,9 @@ packages: text-decoder@1.1.0: resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -14509,6 +14786,10 @@ packages: peerDependencies: react: 18.3.1 + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -16407,7 +16688,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@2.0.1(@types/react@18.3.26)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76)': + '@base-org/account@2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -16415,7 +16696,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.33.3(typescript@5.8.3)(zod@3.25.76) + viem: 2.33.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -17087,7 +17368,7 @@ snapshots: dependencies: uuid: 8.3.2 - '@expo/cli@0.22.26(graphql@16.11.0)': + '@expo/cli@0.22.26(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.11.0) '@babel/runtime': 7.27.6 @@ -17107,7 +17388,7 @@ snapshots: '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.3.2 - '@react-native/dev-middleware': 0.76.9 + '@react-native/dev-middleware': 0.76.9(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@urql/core': 5.1.1(graphql@16.11.0) '@urql/exchange-retry': 1.3.1(@urql/core@5.1.1(graphql@16.11.0)) accepts: 1.3.8 @@ -17160,7 +17441,7 @@ snapshots: undici: 6.21.2 unique-string: 2.0.0 wrap-ansi: 7.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -17168,7 +17449,7 @@ snapshots: - supports-color - utf-8-validate - '@expo/cli@54.0.11(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))': + '@expo/cli@54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.11.0) '@expo/code-signing-certificates': 0.0.5 @@ -17178,18 +17459,18 @@ snapshots: '@expo/env': 2.0.7 '@expo/image-utils': 0.8.7 '@expo/json-file': 10.0.7 - '@expo/mcp-tunnel': 0.0.8 - '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + '@expo/mcp-tunnel': 0.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/osascript': 2.3.7 '@expo/package-manager': 1.9.8 '@expo/plist': 0.4.7 - '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) '@expo/schema-utils': 0.1.7 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.3.2 - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@urql/core': 5.1.1(graphql@16.11.0) '@urql/exchange-retry': 1.3.1(@urql/core@5.1.1(graphql@16.11.0)) accepts: 1.3.8 @@ -17203,7 +17484,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3(supports-color@8.1.1) env-editor: 0.4.2 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server: 1.0.1 freeport-async: 2.0.0 getenv: 2.0.0 @@ -17234,9 +17515,9 @@ snapshots: terminal-link: 2.1.1 undici: 6.21.2 wrap-ansi: 7.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -17384,12 +17665,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: chalk: 4.1.2 optionalDependencies: react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/env@0.4.2': dependencies: @@ -17497,9 +17778,9 @@ snapshots: json5: 2.2.3 write-file-atomic: 2.4.3 - '@expo/mcp-tunnel@0.0.8': + '@expo/mcp-tunnel@0.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: @@ -17529,7 +17810,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-config@54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))': + '@expo/metro-config@54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -17537,7 +17818,7 @@ snapshots: '@expo/config': 12.0.10 '@expo/env': 2.0.7 '@expo/json-file': 10.0.7 - '@expo/metro': 54.0.0 + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@expo/spawn-async': 1.7.2 browserslist: 4.26.0 chalk: 4.1.2 @@ -17553,26 +17834,26 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/metro@54.0.0': + '@expo/metro@54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1 + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 metro-runtime: 0.83.1 metro-source-map: 0.83.1 metro-transform-plugins: 0.83.1 - metro-transform-worker: 0.83.1 + metro-transform-worker: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -17610,7 +17891,7 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))': + '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 @@ -17619,7 +17900,7 @@ snapshots: '@expo/json-file': 10.0.7 '@react-native/normalize-colors': 0.81.4 debug: 4.4.3(supports-color@8.1.1) - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -17666,11 +17947,11 @@ snapshots: dependencies: prop-types: 15.8.1 - '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/ws-tunnel@1.0.6': {} @@ -17860,13 +18141,13 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true - '@inkjs/ui@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))': + '@inkjs/ui@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: chalk: 5.6.2 cli-spinners: 3.2.0 deepmerge: 4.3.1 figures: 6.1.0 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) '@inquirer/confirm@5.1.13(@types/node@22.18.12)': dependencies: @@ -17954,9 +18235,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jescalan/ink-markdown@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1)': + '@jescalan/ink-markdown@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) marked: 11.2.0 marked-terminal: https://codeload.github.com/jescalan/marked-terminal/tar.gz/44f5ab42076e16937f56d645d3d7264675558ea1(marked@11.2.0) react: 18.3.1 @@ -18299,7 +18580,7 @@ snapshots: dependencies: '@miniflare/shared': 2.14.4 - '@miniflare/shared-test-environment@2.14.4': + '@miniflare/shared-test-environment@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@cloudflare/workers-types': 4.20241022.0 '@miniflare/cache': 2.14.4 @@ -18313,7 +18594,7 @@ snapshots: '@miniflare/shared': 2.14.4 '@miniflare/sites': 2.14.4 '@miniflare/storage-memory': 2.14.4 - '@miniflare/web-sockets': 2.14.4 + '@miniflare/web-sockets': 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -18344,12 +18625,12 @@ snapshots: dependencies: '@miniflare/shared': 2.14.4 - '@miniflare/web-sockets@2.14.4': + '@miniflare/web-sockets@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@miniflare/core': 2.14.4 '@miniflare/shared': 2.14.4 undici: 5.28.4 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -18559,7 +18840,7 @@ snapshots: prompts: 2.4.2 semver: 7.7.3 - '@nuxt/devtools@2.6.3(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3))': + '@nuxt/devtools@2.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3))': dependencies: '@nuxt/devtools-kit': 2.6.3(magicast@0.3.5)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@nuxt/devtools-wizard': 2.6.3 @@ -18593,7 +18874,7 @@ snapshots: vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) vite-plugin-vue-tracer: 1.0.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) which: 5.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19176,6 +19457,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 + '@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))': + dependencies: + merge-options: 3.0.4 + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + optional: true + '@react-native-community/cli-clean@12.3.7': dependencies: '@react-native-community/cli-tools': 12.3.7 @@ -19263,7 +19550,7 @@ snapshots: '@react-native-community/cli-plugin-metro@12.3.7': optional: true - '@react-native-community/cli-server-api@12.3.7': + '@react-native-community/cli-server-api@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-debugger-ui': 12.3.7 '@react-native-community/cli-tools': 12.3.7 @@ -19273,7 +19560,7 @@ snapshots: nocache: 3.0.4 pretty-format: 26.6.2 serve-static: 1.16.2 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -19302,7 +19589,7 @@ snapshots: joi: 17.13.3 optional: true - '@react-native-community/cli@12.3.7': + '@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-clean': 12.3.7 '@react-native-community/cli-config': 12.3.7 @@ -19310,7 +19597,7 @@ snapshots: '@react-native-community/cli-doctor': 12.3.7 '@react-native-community/cli-hermes': 12.3.7 '@react-native-community/cli-plugin-metro': 12.3.7 - '@react-native-community/cli-server-api': 12.3.7 + '@react-native-community/cli-server-api': 12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@react-native-community/cli-tools': 12.3.7 '@react-native-community/cli-types': 12.3.7 chalk: 4.1.2 @@ -19471,17 +19758,17 @@ snapshots: nullthrows: 1.1.1 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.81.4(@react-native-community/cli@12.3.7)': + '@react-native/community-cli-plugin@0.81.4(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.83.1 - metro-config: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 semver: 7.7.3 optionalDependencies: - '@react-native-community/cli': 12.3.7 + '@react-native-community/cli': 12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19491,7 +19778,7 @@ snapshots: '@react-native/debugger-frontend@0.81.4': {} - '@react-native/dev-middleware@0.76.9': + '@react-native/dev-middleware@0.76.9(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.76.9 @@ -19504,13 +19791,13 @@ snapshots: open: 7.4.2 selfsigned: 2.4.1 serve-static: 1.16.2 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/dev-middleware@0.81.4': + '@react-native/dev-middleware@0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.81.4 @@ -19522,7 +19809,7 @@ snapshots: nullthrows: 1.1.1 open: 7.4.2 serve-static: 1.16.2 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19538,12 +19825,12 @@ snapshots: '@react-native/normalize-colors@0.81.4': {} - '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 18.3.26 @@ -19756,10 +20043,10 @@ snapshots: '@rsdoctor/client@0.4.13': {} - '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) axios: 1.7.9 @@ -19770,7 +20057,7 @@ snapshots: path-browserify: 1.0.1 semver: 7.7.3 source-map: 0.7.6 - webpack-bundle-analyzer: 4.10.2 + webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -19779,12 +20066,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) lodash.unionby: 4.8.0 - socket.io: 4.8.1 + socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) source-map: 0.7.6 transitivePeerDependencies: - '@rspack/core' @@ -19793,11 +20080,11 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/core': 1.4.11(@swc/helpers@0.5.17) @@ -19809,10 +20096,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@rsdoctor/client': 0.4.13 - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@types/fs-extra': 11.0.4 @@ -19824,7 +20111,7 @@ snapshots: lodash: 4.17.21 open: 8.4.2 serve-static: 1.16.2 - socket.io: 4.8.1 + socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) source-map: 0.7.6 tapable: 2.2.1 transitivePeerDependencies: @@ -19913,16 +20200,16 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.4.11 '@rspack/binding-win32-x64-msvc': 1.4.11 - '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@discoveryjs/json-ext': 0.5.7 '@rspack/core': 1.4.11(@swc/helpers@0.5.17) - '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) colorette: 2.0.20 exit-hook: 4.0.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack-bundle-analyzer: 4.10.2 + webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@types/express' @@ -19941,14 +20228,14 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 - '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) chokidar: 3.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.23) p-retry: 6.2.0 - webpack-dev-server: 5.2.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - ws: 8.18.3 + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/express' - bufferutil @@ -20052,16 +20339,278 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + bs58: 5.0.0 + js-base64: 3.7.8 + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + '@solana/wallet-standard-util': 1.1.2 + '@wallet-standard/core': 1.1.1 + js-base64: 3.7.8 + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - fastestsmallesttextencoderdecoder + - react + - typescript + + '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-features': 1.3.0 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + js-base64: 3.7.8 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + bs58: 5.0.0 + js-base64: 3.7.8 + qrcode: 1.5.4 + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-core@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-numbers@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.8.3) + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-numbers@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-strings@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.8.3 + + '@solana/errors@2.3.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.8.3 + + '@solana/errors@4.0.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.8.3 + + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/wallet-standard-features': 1.3.0 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + eventemitter3: 5.0.1 + + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + react: 18.3.1 + transitivePeerDependencies: + - bs58 + - fastestsmallesttextencoderdecoder + - react-native + - typescript + + '@solana/wallet-standard-chains@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@solana/wallet-standard-core@1.1.2': + dependencies: + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + + '@solana/wallet-standard-features@1.3.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + + '@solana/wallet-standard-util@1.1.2': + dependencies: + '@noble/curves': 1.9.7 + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + bs58: 5.0.0 + + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + bs58: 6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + react: 18.3.1 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + react: 18.3.1 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-core': 1.1.2 + '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-core': 1.1.2 + '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.27.6 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.8.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.3.1 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + '@speed-highlight/core@1.2.7': {} '@stablelib/base64@1.0.1': {} '@standard-schema/spec@1.0.0': {} - '@statelyai/inspect@0.4.0(ws@8.18.3)(xstate@5.20.2)': + '@statelyai/inspect@0.4.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(xstate@5.20.2)': dependencies: fast-safe-stringify: 2.1.1 - isomorphic-ws: 5.0.0(ws@8.18.3) + isomorphic-ws: 5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) partysocket: 0.0.25 safe-stable-stringify: 2.4.3 superjson: 1.13.3 @@ -20467,7 +21016,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.27.6 @@ -20481,7 +21030,7 @@ snapshots: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 jest: 29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)) - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) '@testing-library/react@16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -20815,10 +21364,16 @@ snapshots: '@types/uuid@10.0.0': {} + '@types/uuid@8.3.4': {} + '@types/webextension-polyfill@0.12.3': {} '@types/webpack-env@1.18.8': {} + '@types/ws@7.4.7': + dependencies: + '@types/node': 22.18.12 + '@types/ws@8.5.12': dependencies: '@types/node': 22.18.12 @@ -21203,7 +21758,7 @@ snapshots: vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) vue: 3.5.21(typescript@5.8.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -21218,7 +21773,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21504,6 +22059,33 @@ snapshots: js-beautify: 1.15.1 vue-component-type-helpers: 2.1.10 + '@wallet-standard/app@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/base@1.1.0': {} + + '@wallet-standard/core@1.1.1': + dependencies: + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + + '@wallet-standard/errors@0.1.1': + dependencies: + chalk: 5.6.2 + commander: 13.1.0 + + '@wallet-standard/features@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/wallet@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@web3-storage/multipart-parser@1.0.0': {} '@webassemblyjs/ast@1.14.1': @@ -21702,6 +22284,10 @@ snapshots: agent-base@7.1.3: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -22286,7 +22872,7 @@ snapshots: - '@babel/preset-env' - supports-color - babel-preset-expo@54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-refresh@0.14.2): + babel-preset-expo@54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2): dependencies: '@babel/helper-module-imports': 7.27.1 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.4) @@ -22313,7 +22899,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.27.6 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - supports-color @@ -22333,6 +22919,14 @@ snapshots: base-64@1.0.0: {} + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@4.0.1: {} + + base-x@5.0.1: {} + base64-js@1.5.1: {} base64id@2.0.0: {} @@ -22387,6 +22981,8 @@ snapshots: bluebird@3.7.2: {} + bn.js@5.2.2: {} + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -22425,6 +23021,12 @@ snapshots: boolbase@1.0.0: {} + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + boxen@8.0.1: dependencies: ansi-align: 3.0.1 @@ -22489,6 +23091,18 @@ snapshots: dependencies: fast-json-stable-stringify: 2.1.0 + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@5.0.0: + dependencies: + base-x: 4.0.1 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -22520,6 +23134,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + optional: true + builtins@5.1.0: dependencies: semver: 7.7.3 @@ -22859,7 +23478,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - optional: true cliui@7.0.4: dependencies: @@ -22935,6 +23553,8 @@ snapshots: commander@12.1.0: {} + commander@13.1.0: {} + commander@14.0.1: {} commander@2.20.3: {} @@ -23597,6 +24217,8 @@ snapshots: rimraf: 3.0.2 slash: 3.0.0 + delay@5.0.0: {} + delayed-stream@1.0.0: {} denque@2.1.0: {} @@ -23655,6 +24277,8 @@ snapshots: diff@8.0.2: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -23807,7 +24431,7 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.3: + engine.io@6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/cors': 2.8.17 '@types/node': 22.18.12 @@ -23817,7 +24441,7 @@ snapshots: cors: 2.8.5 debug: 4.3.7 engine.io-parser: 5.2.3 - ws: 8.17.1 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -23993,6 +24617,12 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + esbuild-plugin-file-path-extensions@2.1.4: {} esbuild@0.23.1: @@ -24464,129 +25094,129 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 md5-file: 3.2.3 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.8.7 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 8.5.6 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 10.0.11 '@expo/env': 0.4.2 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 12.0.10 '@expo/env': 2.0.7 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 - expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) invariant: 2.2.4 expo-modules-autolinking@2.0.8: @@ -24613,44 +25243,44 @@ snapshots: dependencies: invariant: 2.2.4 - expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: invariant: 2.2.4 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server@1.0.1: {} - expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: compare-urls: 2.0.0 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) url: 0.11.3 - expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 - '@expo/cli': 0.22.26(graphql@16.11.0) + '@expo/cli': 0.22.26(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10) '@expo/config': 10.0.11 '@expo/config-plugins': 9.0.17 '@expo/fingerprint': 0.11.11 '@expo/metro-config': 0.19.12 '@expo/vector-icons': 14.0.4 babel-preset-expo: 12.0.11(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4)) - expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) - expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) + expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 2.0.8 expo-modules-core: 2.2.3 fbemitter: 3.0.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -24664,29 +25294,29 @@ snapshots: - supports-color - utf-8-validate - expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 - '@expo/cli': 54.0.11(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + '@expo/cli': 54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 - '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@expo/fingerprint': 0.15.1 - '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-refresh@0.14.2) - expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) + babel-preset-expo: 54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2) + expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 3.0.15 - expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) pretty-format: 29.7.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -24807,6 +25437,8 @@ snapshots: extsprintf@1.3.0: {} + eyes@0.1.8: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -24847,6 +25479,8 @@ snapshots: fast-sha256@1.3.0: {} + fast-stable-stringify@1.0.0: {} + fast-uri@2.4.0: {} fast-uri@3.0.3: {} @@ -24858,6 +25492,8 @@ snapshots: fastest-levenshtein@1.0.16: {} + fastestsmallesttextencoderdecoder@1.0.22: {} + fastify-plugin@5.0.1: {} fastify@5.6.1: @@ -25765,6 +26401,10 @@ snapshots: human-signals@8.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + husky@8.0.3: {} hyperdyperid@1.2.0: {} @@ -25847,28 +26487,28 @@ snapshots: ini@4.1.1: {} - ink-big-text@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1): + ink-big-text@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: cfonts: 3.3.0 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 react: 18.3.1 - ink-gradient@3.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)): + ink-gradient@3.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@types/gradient-string': 1.1.6 gradient-string: 2.0.2 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 strip-ansi: 7.1.2 - ink-link@4.1.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)): + ink-link@4.1.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 terminal-link: 3.0.0 - ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1): + ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 ansi-escapes: 7.0.0 @@ -25893,11 +26533,11 @@ snapshots: type-fest: 4.41.0 widest-line: 5.0.0 wrap-ansi: 9.0.2 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yoga-wasm-web: 0.3.3 optionalDependencies: '@types/react': 18.3.26 - react-devtools-core: 4.28.5 + react-devtools-core: 4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -26107,6 +26747,9 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@2.1.0: + optional: true + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -26221,13 +26864,17 @@ snapshots: isobject@3.0.1: {} - isomorphic-ws@5.0.0(ws@8.18.3): + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.3 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2): + isomorphic-ws@5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -26306,6 +26953,24 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -26412,7 +27077,7 @@ snapshots: jest-util: 29.7.0 pretty-format: 29.7.0 - jest-environment-jsdom@29.7.0: + jest-environment-jsdom@29.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -26421,7 +27086,7 @@ snapshots: '@types/node': 22.18.12 jest-mock: 29.7.0 jest-util: 29.7.0 - jsdom: 20.0.3 + jsdom: 20.0.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -26658,6 +27323,8 @@ snapshots: joycon@3.1.1: {} + js-base64@3.7.8: {} + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 @@ -26741,7 +27408,7 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsdom@20.0.3: + jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: abab: 2.0.6 acorn: 8.15.0 @@ -26767,14 +27434,14 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jsdom@26.1.0: + jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 @@ -26794,14 +27461,14 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jsdom@27.0.0(postcss@8.5.6): + jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10): dependencies: '@asamuzakjp/dom-selector': 6.6.2 cssstyle: 5.3.1(postcss@8.5.6) @@ -26821,7 +27488,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -27573,6 +28240,11 @@ snapshots: merge-descriptors@2.0.0: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + optional: true + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -27601,13 +28273,13 @@ snapshots: transitivePeerDependencies: - supports-color - metro-config@0.83.1: + metro-config@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-cache: 0.83.1 metro-core: 0.83.1 metro-runtime: 0.83.1 @@ -27687,14 +28359,14 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.1: + metro-transform-worker@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 '@babel/types': 7.28.4 flow-enums-runtime: 0.0.6 - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 @@ -27707,7 +28379,7 @@ snapshots: - supports-color - utf-8-validate - metro@0.83.1: + metro@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -27733,7 +28405,7 @@ snapshots: metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1 + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 @@ -27741,13 +28413,13 @@ snapshots: metro-source-map: 0.83.1 metro-symbolicate: 0.83.1 metro-transform-plugins: 0.83.1 - metro-transform-worker: 0.83.1 + metro-transform-worker: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 source-map: 0.5.7 throat: 5.0.0 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -28476,11 +29148,11 @@ snapshots: nullthrows@1.1.1: {} - nuxt@4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): + nuxt@4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(bufferutil@4.0.9)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.3(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) + '@nuxt/devtools': 2.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) '@nuxt/kit': 4.1.2(magicast@0.3.5) '@nuxt/schema': 4.1.2 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) @@ -29210,6 +29882,8 @@ snapshots: pngjs@3.4.0: {} + pngjs@5.0.0: {} + portfinder@1.0.32: dependencies: async: 2.6.4 @@ -29555,6 +30229,12 @@ snapshots: dependencies: react: 18.3.1 + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -29619,19 +30299,19 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@4.28.5: + react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate optional: true - react-devtools-core@6.1.5: + react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -29648,21 +30328,21 @@ snapshots: react-is@18.3.1: {} - react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) whatwg-url-without-unicode: 8.0.0-3 - react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1): + react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.4 '@react-native/codegen': 0.81.4(@babel/core@7.28.4) - '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@12.3.7) + '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.81.4 '@react-native/js-polyfills': 0.81.4 '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -29681,14 +30361,14 @@ snapshots: pretty-format: 29.7.0 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 6.1.5 + react-devtools-core: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.26.0 semver: 7.7.3 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 optionalDependencies: '@types/react': 18.3.26 @@ -30001,8 +30681,7 @@ snapshots: require-from-string@2.0.2: {} - require-main-filename@2.0.0: - optional: true + require-main-filename@2.0.0: {} requireg@0.2.2: dependencies: @@ -30202,6 +30881,19 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 8.2.0 + rpc-websockets@9.3.1: + dependencies: + '@swc/helpers': 0.5.17 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.12 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + rrweb-cssom@0.8.0: {} rslog@1.2.3: {} @@ -30398,8 +31090,7 @@ snapshots: server-only@0.0.1: {} - set-blocking@2.0.0: - optional: true + set-blocking@2.0.0: {} set-cookie-parser@2.6.0: {} @@ -30607,10 +31298,10 @@ snapshots: map-obj: 5.0.2 type-fest: 4.41.0 - socket.io-adapter@2.5.5: + socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: debug: 4.3.7 - ws: 8.17.1 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -30623,14 +31314,14 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.8.1: + socket.io@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7 - engine.io: 6.6.3 - socket.io-adapter: 2.5.5 + engine.io: 6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -30806,6 +31497,12 @@ snapshots: stream-buffers@2.2.0: {} + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + stream-shift@1.0.3: {} streamsearch@1.1.0: {} @@ -31034,6 +31731,8 @@ snapshots: dependencies: copy-anything: 3.0.5 + superstruct@2.0.2: {} + supertest@6.3.4: dependencies: methods: 1.1.2 @@ -31195,6 +31894,8 @@ snapshots: dependencies: b4a: 1.6.6 + text-encoding-utf-8@1.0.2: {} + text-extensions@2.4.0: {} thenify-all@1.6.0: @@ -31965,6 +32666,11 @@ snapshots: dependencies: react: 18.3.1 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + optional: true + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -32087,16 +32793,16 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.33.3(typescript@5.8.3)(zod@3.25.76): + viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.7(ws@8.18.2) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.8.6(typescript@5.8.3)(zod@3.25.76) - ws: 8.18.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32260,19 +32966,19 @@ snapshots: optionalDependencies: vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) - vitest-environment-miniflare@2.14.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)): + vitest-environment-miniflare@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)): dependencies: '@miniflare/queues': 2.14.4 '@miniflare/runner-vm': 2.14.4 '@miniflare/shared': 2.14.4 - '@miniflare/shared-test-environment': 2.14.4 + '@miniflare/shared-test-environment': 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) undici: 5.28.4 - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - bufferutil - utf-8-validate - vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): + vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -32301,7 +33007,7 @@ snapshots: '@edge-runtime/vm': 5.0.0 '@types/debug': 4.1.12 '@types/node': 22.18.12 - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti - less @@ -32316,7 +33022,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): + vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -32345,7 +33051,7 @@ snapshots: '@edge-runtime/vm': 5.0.0 '@types/debug': 4.1.12 '@types/node': 24.7.2 - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti - less @@ -32440,7 +33146,7 @@ snapshots: webidl-conversions@8.0.0: optional: true - webpack-bundle-analyzer@4.10.2: + webpack-bundle-analyzer@4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.15.0 @@ -32453,7 +33159,7 @@ snapshots: opener: 1.5.2 picocolors: 1.1.1 sirv: 2.0.4 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -32469,7 +33175,7 @@ snapshots: optionalDependencies: webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) - webpack-dev-server@5.2.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -32498,7 +33204,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) transitivePeerDependencies: @@ -32633,8 +33339,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 - which-module@2.0.1: - optional: true + which-module@2.0.1: {} which-pm-runs@1.1.0: {} @@ -32730,17 +33435,32 @@ snapshots: signal-exit: 4.1.0 optional: true - ws@6.2.3: + ws@6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@7.5.10: {} + ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.17.1: {} + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.2: {} + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.3: {} + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 wsl-utils@0.1.0: dependencies: @@ -32781,8 +33501,7 @@ snapshots: xxhash-wasm@1.1.0: {} - y18n@4.0.3: - optional: true + y18n@4.0.3: {} y18n@5.0.8: {} @@ -32819,7 +33538,6 @@ snapshots: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - optional: true yargs-parser@20.2.9: {} @@ -32838,7 +33556,6 @@ snapshots: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - optional: true yargs@16.2.0: dependencies: From f49e8aad8512c310709c54a548f24e47fd7ec7af Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Wed, 10 Dec 2025 13:01:05 -0600 Subject: [PATCH 009/123] docs(repo): Change typedoc workflow for core 2 (#7426) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ae9d68fce0a..cced56cad16 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,7 +98,7 @@ jobs: github.rest.actions.createWorkflowDispatch({ owner: 'clerk', repo: 'clerk-docs', - workflow_id: 'typedoc.yml', + workflow_id: 'typedoc-core-2.yml', ref: 'main', }) } else{ From 43d3c3eaff767054ef74fd3655e632caffeaaf33 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Wed, 10 Dec 2025 12:51:56 -0800 Subject: [PATCH 010/123] chore(backend): Fix ClerkRequest helper instance check (#7431) Co-authored-by: chris-kreidl --- .changeset/five-numbers-scream.md | 5 +++ .../tanstack-react-start/package.json | 1 - .../src/tokens/__tests__/clerkRequest.test.ts | 35 +++++++++++++++++++ packages/backend/src/tokens/clerkRequest.ts | 7 +++- 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 .changeset/five-numbers-scream.md diff --git a/.changeset/five-numbers-scream.md b/.changeset/five-numbers-scream.md new file mode 100644 index 00000000000..9f17f73733f --- /dev/null +++ b/.changeset/five-numbers-scream.md @@ -0,0 +1,5 @@ +--- +"@clerk/backend": patch +--- + +Fixed an issue where TanStack React Start middleware fails to properly handle requests. diff --git a/integration/templates/tanstack-react-start/package.json b/integration/templates/tanstack-react-start/package.json index 7e86c3cb0ab..bf45f3efb8d 100644 --- a/integration/templates/tanstack-react-start/package.json +++ b/integration/templates/tanstack-react-start/package.json @@ -13,7 +13,6 @@ "@tanstack/react-start": "1.132.51", "react": "18.3.1", "react-dom": "18.3.1", - "srvx": "0.8.15", "tailwind-merge": "^2.5.4" }, "devDependencies": { diff --git a/packages/backend/src/tokens/__tests__/clerkRequest.test.ts b/packages/backend/src/tokens/__tests__/clerkRequest.test.ts index 9582d70a1fb..27e25d20a95 100644 --- a/packages/backend/src/tokens/__tests__/clerkRequest.test.ts +++ b/packages/backend/src/tokens/__tests__/clerkRequest.test.ts @@ -171,4 +171,39 @@ describe('createClerkRequest', () => { expect(json.cookies).toBe('{}'); }); }); + + describe('duck typing detection (instanceof workaround)', () => { + it('should create a new ClerkRequest from a regular Request', () => { + const regularRequest = new Request('http://localhost:3000'); + const clerkRequest = createClerkRequest(regularRequest); + + expect(clerkRequest).not.toBe(regularRequest); + expect(clerkRequest.clerkUrl).toBeDefined(); + expect(clerkRequest.cookies).toBeDefined(); + }); + + it('should return an existing ClerkRequest instance unchanged', () => { + const firstClerkRequest = createClerkRequest(new Request('http://localhost:3000')); + const secondClerkRequest = createClerkRequest(firstClerkRequest); + + expect(secondClerkRequest).toBe(firstClerkRequest); + }); + + it('should work correctly with bundler-scoped Request classes', () => { + // Simulate bundler creating a scoped Request class (like Request$1) + class RequestScoped extends Request { + constructor(input: RequestInfo | URL, init?: RequestInit) { + super(input, init); + } + } + + const scopedRequest = new RequestScoped('http://localhost:3000'); + const clerkRequest = createClerkRequest(scopedRequest); + + // Should create a new ClerkRequest even though scopedRequest is a different Request class + expect(clerkRequest).not.toBe(scopedRequest); + expect(clerkRequest.clerkUrl).toBeDefined(); + expect(clerkRequest.cookies).toBeDefined(); + }); + }); }); diff --git a/packages/backend/src/tokens/clerkRequest.ts b/packages/backend/src/tokens/clerkRequest.ts index 9eef0a6c117..f99c9671873 100644 --- a/packages/backend/src/tokens/clerkRequest.ts +++ b/packages/backend/src/tokens/clerkRequest.ts @@ -77,7 +77,12 @@ class ClerkRequest extends Request { } export const createClerkRequest = (...args: ConstructorParameters): ClerkRequest => { - return args[0] instanceof ClerkRequest ? args[0] : new ClerkRequest(...args); + // Use duck typing instead of instanceof to avoid issues with polyfilled Request classes + // (e.g., in TanStack Start or other environments with multiple Request class instances) + // ClerkRequest has unique properties 'clerkUrl' and 'cookies' that distinguish it from Request + const isClerkRequest = args[0] && typeof args[0] === 'object' && 'clerkUrl' in args[0] && 'cookies' in args[0]; + + return isClerkRequest ? (args[0] as ClerkRequest) : new ClerkRequest(...args); }; export type { ClerkRequest }; From 14342d2b34fe0882f7676195aefaaa17f034af70 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Wed, 10 Dec 2025 22:15:50 -0800 Subject: [PATCH 011/123] feat(localizations,shared): Add missing password or identifier localization key (#7437) --- .changeset/unlucky-beans-check.md | 6 ++++++ packages/localizations/src/ar-SA.ts | 2 ++ packages/localizations/src/be-BY.ts | 2 ++ packages/localizations/src/bg-BG.ts | 2 ++ packages/localizations/src/bn-IN.ts | 2 ++ packages/localizations/src/ca-ES.ts | 2 ++ packages/localizations/src/cs-CZ.ts | 2 ++ packages/localizations/src/da-DK.ts | 2 ++ packages/localizations/src/de-DE.ts | 2 ++ packages/localizations/src/el-GR.ts | 2 ++ packages/localizations/src/en-GB.ts | 1 + packages/localizations/src/en-US.ts | 1 + packages/localizations/src/es-CR.ts | 2 ++ packages/localizations/src/es-ES.ts | 2 ++ packages/localizations/src/es-MX.ts | 2 ++ packages/localizations/src/es-UY.ts | 2 ++ packages/localizations/src/fa-IR.ts | 2 ++ packages/localizations/src/fi-FI.ts | 2 ++ packages/localizations/src/fr-FR.ts | 2 ++ packages/localizations/src/he-IL.ts | 1 + packages/localizations/src/hi-IN.ts | 2 ++ packages/localizations/src/hr-HR.ts | 2 ++ packages/localizations/src/hu-HU.ts | 2 ++ packages/localizations/src/id-ID.ts | 1 + packages/localizations/src/is-IS.ts | 1 + packages/localizations/src/it-IT.ts | 1 + packages/localizations/src/ja-JP.ts | 2 ++ packages/localizations/src/kk-KZ.ts | 2 ++ packages/localizations/src/ko-KR.ts | 2 ++ packages/localizations/src/mn-MN.ts | 2 ++ packages/localizations/src/ms-MY.ts | 2 ++ packages/localizations/src/nb-NO.ts | 2 ++ packages/localizations/src/nl-BE.ts | 2 ++ packages/localizations/src/nl-NL.ts | 2 ++ packages/localizations/src/pl-PL.ts | 4 +++- packages/localizations/src/pt-BR.ts | 2 ++ packages/localizations/src/pt-PT.ts | 2 ++ packages/localizations/src/ro-RO.ts | 2 ++ packages/localizations/src/ru-RU.ts | 2 ++ packages/localizations/src/sk-SK.ts | 2 ++ packages/localizations/src/sr-RS.ts | 2 ++ packages/localizations/src/sv-SE.ts | 2 ++ packages/localizations/src/ta-IN.ts | 2 ++ packages/localizations/src/te-IN.ts | 2 ++ packages/localizations/src/th-TH.ts | 1 + packages/localizations/src/tr-TR.ts | 2 ++ packages/localizations/src/uk-UA.ts | 2 ++ packages/localizations/src/vi-VN.ts | 2 ++ packages/localizations/src/zh-CN.ts | 1 + packages/localizations/src/zh-TW.ts | 1 + packages/shared/src/types/localization.ts | 1 + 51 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 .changeset/unlucky-beans-check.md diff --git a/.changeset/unlucky-beans-check.md b/.changeset/unlucky-beans-check.md new file mode 100644 index 00000000000..ad0c6bcc65d --- /dev/null +++ b/.changeset/unlucky-beans-check.md @@ -0,0 +1,6 @@ +--- +"@clerk/localizations": patch +"@clerk/shared": patch +--- + +Added missing password or identifier incorrect error localization. diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 716eb160e89..df7ac8e0171 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -907,6 +907,8 @@ export const arSA: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'كلمة المرور أو عنوان البريد الإلكتروني غير صحيح. حاول مرة أخرى أو استخدم طريقة أخرى.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'كلمة المرور ليست قوية', form_password_pwned: 'لا يمكن أستعمال كلمة السر هذه لانها غير أمنة, الرجاء اختيار كلمة مرور أخرى', diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index f90b0172dc2..5333bbcd84d 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -917,6 +917,8 @@ export const beBY: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Невядомы або недапушчальны значэнне.', form_password_incorrect: 'Невірны пароль.', + form_password_or_identifier_incorrect: + 'Пароль або адрас электроннай пошты няправільны. Паспрабуйце яшчэ раз або выкарыстоўвайце іншы метад.', form_password_length_too_short: 'Пароль занадта кароткі.', form_password_not_strong_enough: 'Ваш пароль недастаткова надзейны.', form_password_pwned: 'Гэты пароль быў узламаны і не можа быць выкарыстаны, паспрабуйце іншы пароль.', diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index b666678c4fa..cf84bc85f31 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -910,6 +910,8 @@ export const bgBG: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'Невалидна парола. Моля, опитайте отново.', + form_password_or_identifier_incorrect: + 'Паролата или имейл адресът е невалиден. Моля, опитайте отново или използвайте друг метод.', form_password_length_too_short: 'Паролата е твърде кратка. Моля, въведете поне 8 символа.', form_password_not_strong_enough: 'Паролата трябва да съдържа поне една главна буква, една цифра и един специален символ.', diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index c67cdb07c5f..cd3f794faea 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -916,6 +916,8 @@ export const bnIN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'লেখা মানটি অবৈধ। দয়া করে এটি সংশোধন করুন।', form_password_incorrect: 'আপনি যে পাসওয়ার্ড লিখেছেন তা ভুল। দয়া করে আবার চেষ্টা করুন।', + form_password_or_identifier_incorrect: + 'পাসওয়ার্ড বা ইমেইল ঠিকানা ভুল। আবার চেষ্টা করুন বা অন্য পদ্ধতি ব্যবহার করুন।', form_password_length_too_short: 'আপনার পাসওয়ার্ড খুব ছোট। এটি কমপক্ষে ৮ অক্ষর দীর্ঘ হতে হবে।', form_password_not_strong_enough: 'আপনার পাসওয়ার্ড যথেষ্ট শক্তিশালী নয়।', form_password_pwned: diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 7a35168bfa9..14eb86f9166 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -911,6 +911,8 @@ export const caES: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'La contrasenya introduïda és incorrecta.', + form_password_or_identifier_incorrect: + "La contrasenya o l'adreça de correu electrònic és incorrecta. Torna-ho a intentar o utilitza un altre mètode.", form_password_length_too_short: 'La teva contrasenya ha de tenir almenys 8 caràcters.', form_password_not_strong_enough: 'La teva contrasenya no és prou forta.', form_password_pwned: diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index b8b569c95ca..e8e2627bf3f 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -922,6 +922,8 @@ export const csCZ: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Tento parametr má neplatnou hodnotu.', form_password_incorrect: 'Heslo je nesprávné.', + form_password_or_identifier_incorrect: + 'Heslo nebo e-mailová adresa je nesprávná. Zkuste to znovu nebo použijte jinou metodu.', form_password_length_too_short: 'Heslo je příliš krátké.', form_password_not_strong_enough: 'Vaše heslo není dostatečně silné.', form_password_pwned: 'Toto heslo bylo nalezeno jako součást prolomení a nelze ho použít, zkuste prosím jiné heslo.', diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 8a60c8f062c..812b7abff9e 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -908,6 +908,8 @@ export const daDK: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'Adgangskoden er forkert.', + form_password_or_identifier_incorrect: + 'Adgangskoden eller e-mailadressen er forkert. Prøv igen eller brug en anden metode.', form_password_length_too_short: 'Adgangskoden er for kort.', form_password_not_strong_enough: 'Adgangskoden er ikke stærk nok.', form_password_pwned: 'Adgangskoden er blevet kompromitteret.', diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 17679603d2e..0e0ccffed1a 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -927,6 +927,8 @@ export const deDE: LocalizationResource = { form_param_type_invalid__phone_number: 'Bitte geben Sie eine gültige Telefonnummer ein.', form_param_value_invalid: 'Der eingegebene Wert ist ungültig.', form_password_incorrect: 'Das eingegebene Passwort ist falsch.', + form_password_or_identifier_incorrect: + 'Passwort oder E-Mail-Adresse ist falsch. Versuchen Sie es erneut oder verwenden Sie eine andere Methode.', form_password_length_too_short: 'Das Passwort ist zu kurz. Es muss mindestens 8 Zeichen lang sein.', form_password_not_strong_enough: 'Passwort nicht stark genug.', form_password_pwned: diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index ddb4276807e..5e861d86ae4 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -913,6 +913,8 @@ export const elGR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Ο κωδικός πρόσβασης ή η διεύθυνση email είναι λανθασμένη. Δοκιμάστε ξανά ή χρησιμοποιήστε άλλη μέθοδο.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Ο κωδικός πρόσβασής σας δεν είναι αρκετά ισχυρός.', form_password_pwned: diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index 166c4df9ff7..c340998cd8f 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -912,6 +912,7 @@ export const enGB: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'The value entered is invalid. Please correct it.', form_password_incorrect: 'The password you entered is incorrect. Please try again.', + form_password_or_identifier_incorrect: 'Password or email address is incorrect. Try again, or use another method.', form_password_length_too_short: 'Your password is too short. It must be at least 8 characters long.', form_password_not_strong_enough: 'Your password is not strong enough.', form_password_pwned: diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index f1107e8617d..a6507d49410 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -908,6 +908,7 @@ export const enUS: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: undefined, form_password_length_too_short: 'Your password is too short. It must be at least 8 characters long.', form_password_not_strong_enough: 'Your password is not strong enough.', form_password_pwned: diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 2a70709d379..82623ca0434 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -918,6 +918,8 @@ export const esCR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Valor inválido', form_password_incorrect: 'Contraseña incorrecta.', + form_password_or_identifier_incorrect: + 'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.', form_password_length_too_short: 'La contraseña es muy corta.', form_password_not_strong_enough: 'La contraseña no es suficientemente segura.', form_password_pwned: diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index a5101b19e86..d68dfb5dd53 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -913,6 +913,8 @@ export const esES: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Valor inválido.', form_password_incorrect: 'Contraseña incorrecta.', + form_password_or_identifier_incorrect: + 'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.', form_password_length_too_short: 'La contraseña es demasiado corta.', form_password_not_strong_enough: 'Tu contraseña no es lo suficientemente fuerte.', form_password_pwned: 'Tu contraseña ha sido comprometida en una violación de seguridad.', diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 74368afe63b..7e637f8efab 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -919,6 +919,8 @@ export const esMX: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Valor inválido', form_password_incorrect: 'Contraseña incorrecta.', + form_password_or_identifier_incorrect: + 'La contraseña o la dirección de correo electrónico es incorrecta. Inténtalo de nuevo o usa otro método.', form_password_length_too_short: 'La contraseña es muy corta.', form_password_not_strong_enough: 'La contraseña no es suficientemente segura.', form_password_pwned: diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index a800464fb03..fa91ed641d6 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -918,6 +918,8 @@ export const esUY: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'El valor ingresado es inválido. Por favor, corregilo.', form_password_incorrect: 'La contraseña ingresada es incorrecta. Por favor, intentá de nuevo.', + form_password_or_identifier_incorrect: + 'La contraseña o la dirección de correo electrónico es incorrecta. Intentá de nuevo o usá otro método.', form_password_length_too_short: 'Tu contraseña es demasiado corta. Debe tener al menos 8 caracteres.', form_password_not_strong_enough: 'Tu contraseña no es lo suficientemente fuerte.', form_password_pwned: diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index d02d5a149dc..12a87c181a4 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -920,6 +920,8 @@ export const faIR: LocalizationResource = { form_param_type_invalid__phone_number: 'شماره تلفن باید یک رشته معتبر باشد.', form_param_value_invalid: 'مقدار پارامتر نامعتبر است.', form_password_incorrect: 'رمز عبور نادرست است.', + form_password_or_identifier_incorrect: + 'رمز عبور یا آدرس ایمیل نادرست است. دوباره تلاش کنید یا از روش دیگری استفاده کنید.', form_password_length_too_short: 'رمز عبور شما خیلی کوتاه است. باید حداقل ۸ کاراکتر داشته باشد.', form_password_not_strong_enough: 'رمز عبور شما به اندازه کافی قوی نیست.', form_password_pwned: diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index 02123dab25e..c7b5fe21aef 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -911,6 +911,8 @@ export const fiFI: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Salasana tai sähköpostiosoite on väärä. Yritä uudelleen tai käytä toista menetelmää.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Salasana ei ole riittävän vahva.', form_password_pwned: 'Salasana on ollut osallisena tietovuodossa. Valitse toinen salasana.', diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index a19d796c46b..888fcdba6f6 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -928,6 +928,8 @@ export const frFR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'La valeur fournie est invalide.', form_password_incorrect: 'Mot de passe incorrect', + form_password_or_identifier_incorrect: + "Le mot de passe ou l'adresse e-mail est incorrect. Réessayez ou utilisez une autre méthode.", form_password_length_too_short: 'Votre mot de passe est trop court.', form_password_not_strong_enough: "Votre mot de passe n'est pas assez fort.", form_password_pwned: diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index fd5cc00e23d..f6d172b5a8d 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -899,6 +899,7 @@ export const heIL: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: 'הסיסמה או כתובת האימייל שגויים. נסה שוב או השתמש בשיטה אחרת.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'הסיסמה שלך אינה מספיק חזקה.', form_password_pwned: 'הסיסמה הזו נמצאה כחלק מהפרטים שנחשפו בהפרת נתונים ולא ניתן להשתמש בה, נסה סיסמה אחרת במקום.', diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 6d9fa386d9e..fc03ec70436 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -915,6 +915,8 @@ export const hiIN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'दर्ज किया गया मान अमान्य है। कृपया इसे सही करें।', form_password_incorrect: 'आपके द्वारा दर्ज किया गया पासवर्ड गलत है। कृपया पुनः प्रयास करें।', + form_password_or_identifier_incorrect: + 'पासवर्ड या ईमेल पता गलत है। कृपया पुनः प्रयास करें या किसी अन्य विधि का उपयोग करें।', form_password_length_too_short: 'आपका पासवर्ड बहुत छोटा है। इसमें कम से कम 8 अक्षर होने चाहिए।', form_password_not_strong_enough: 'आपका पासवर्ड पर्याप्त मजबूत नहीं है।', form_password_pwned: diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 379f95a1b2a..0efcf86e557 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -913,6 +913,8 @@ export const hrHR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Lozinka ili e-mail adresa je netočna. Pokušajte ponovno ili koristite drugu metodu.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Vaša lozinka nije dovoljno jaka.', form_password_pwned: diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 1111a42c293..e23a873ef2a 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -909,6 +909,8 @@ export const huHU: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'A jelszó vagy az e-mail cím helytelen. Próbáld újra vagy használj másik módszert.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'A jelszó nem elég erős', form_password_pwned: diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index a26544203db..bea8ab4d855 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -916,6 +916,7 @@ export const idID: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: 'Kata sandi atau alamat email salah. Coba lagi atau gunakan metode lain.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Kata sandi Anda tidak cukup kuat.', form_password_pwned: diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index 7b40b3afd33..3eeebeddf04 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -912,6 +912,7 @@ export const isIS: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: 'Lykilorðið eða netfangið er rangt. Reyndu aftur eða notaðu aðra aðferð.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Lykilorðið þitt er ekki nógu sterkt.', form_password_pwned: diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 496afb2fa24..23ced4fcb76 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -918,6 +918,7 @@ export const itIT: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Valore non valido.', form_password_incorrect: 'Password errata.', + form_password_or_identifier_incorrect: "La password o l'indirizzo email è errato. Riprova o usa un altro metodo.", form_password_length_too_short: 'La password deve avere almeno 8 caratteri.', form_password_not_strong_enough: 'La tua password non è abbastanza forte.', form_password_pwned: 'Questa password è stata trovata in una violazione dei dati. Scegli una password diversa.', diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index 4456bf56493..a2541ddb36e 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -922,6 +922,8 @@ export const jaJP: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'パスワードまたはメールアドレスが正しくありません。もう一度お試しいただくか、別の方法をご利用ください。', form_password_length_too_short: 'パスワードが短すぎます。8文字以上である必要があります。', form_password_not_strong_enough: 'パスワードの強度が不十分です。', form_password_pwned: diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index dfe8e8ea0cf..836e2449cfc 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -900,6 +900,8 @@ export const kkKZ: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Енгізілген мән жарамсыз.', form_password_incorrect: 'Құпия сөз қате.', + form_password_or_identifier_incorrect: + 'Құпия сөз немесе электрондық пошта мекенжайы дұрыс емес. Қайталап көріңіз немесе басқа әдісті пайдаланыңыз.', form_password_length_too_short: 'Құпия сөз тым қысқа. Кемінде 8 таңба болуы керек.', form_password_not_strong_enough: 'Құпия сөз әлсіз.', form_password_pwned: 'Бұл құпия сөз қауіпсіздік бұзылуынан табылды. Басқа құпия сөзді қолданыңыз.', diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 3ec094af7ab..5e5b5942478 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -903,6 +903,8 @@ export const koKR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + '비밀번호 또는 이메일 주소가 올바르지 않습니다. 다시 시도하거나 다른 방법을 사용하세요.', form_password_length_too_short: undefined, form_password_not_strong_enough: '비밀번호가 충분히 안전하지 않습니다.', form_password_pwned: '이 비밀번호는 유출사항이 발견되어 사용할 수 없으므로 대신 다른 비밀번호를 사용해 보세요.', diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 4b5d2eaa854..c6a49696b58 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -910,6 +910,8 @@ export const mnMN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'Нууц үг буруу байна.', + form_password_or_identifier_incorrect: + 'Нууц үг эсвэл имэйл хаяг буруу байна. Дахин оролдох эсвэл өөр арга ашиглана уу.', form_password_length_too_short: 'Нууц үгийн урт хэт богино байна.', form_password_not_strong_enough: 'Таны нууц үг хангалттай хүчтэй биш байна.', form_password_pwned: diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index c500c3301e6..97bd7493816 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -919,6 +919,8 @@ export const msMY: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Nilai yang dimasukkan tidak sah. Sila betulkannya.', form_password_incorrect: 'Kata laluan yang anda masukkan tidak betul. Sila cuba lagi.', + form_password_or_identifier_incorrect: + 'Kata laluan atau alamat e-mel tidak betul. Cuba lagi atau gunakan kaedah lain.', form_password_length_too_short: 'Kata laluan anda terlalu pendek. Ia mesti sekurang-kurangnya 8 aksara panjang.', form_password_not_strong_enough: 'Kata laluan anda tidak cukup kuat.', form_password_pwned: diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 0901ed53c5c..97541b6bba0 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -909,6 +909,8 @@ export const nbNO: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Passordet eller e-postadressen er feil. Prøv igjen eller bruk en annen metode.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Passordet ditt er ikke sterkt nok.', form_password_pwned: diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index 83b9f5331ec..1526efe85fd 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -910,6 +910,8 @@ export const nlBE: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'De waarde die je hebt ingevoerd is ongeldig.', form_password_incorrect: 'Het wachtwoord is incorrect.', + form_password_or_identifier_incorrect: + 'Het wachtwoord of het e-mailadres is onjuist. Probeer het opnieuw of gebruik een andere methode.', form_password_length_too_short: 'Het wachtwoord is te kort.', form_password_not_strong_enough: 'Je wachtwoord is niet sterk genoeg.', form_password_pwned: 'Dit wachtwoord is in een datalek gevonden.', diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index 8c0eed02f11..79f4b28e8d3 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -910,6 +910,8 @@ export const nlNL: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'De waarde die je hebt ingevoerd is ongeldig.', form_password_incorrect: 'Het wachtwoord is incorrect.', + form_password_or_identifier_incorrect: + 'Het wachtwoord of het e-mailadres is onjuist. Probeer het opnieuw of gebruik een andere methode.', form_password_length_too_short: 'Het wachtwoord is te kort.', form_password_not_strong_enough: 'Je wachtwoord is niet sterk genoeg.', form_password_pwned: 'Dit wachtwoord is in een datalek gevonden.', diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 8bee446184a..3f4a1dfb289 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -886,8 +886,8 @@ export const plPL: LocalizationResource = { actionLink: 'Wyloguj', actionText: 'Zalogowano jako {{identifier}}', }, - title: 'Zresetuj hasło', subtitle: undefined, + title: 'Zresetuj hasło', }, unstable__errors: { already_a_member_in_organization: '{{email}} jest już członkiem organizacji.', @@ -915,6 +915,8 @@ export const plPL: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Wprowadzona wartość jest nieprawidłowa. Popraw ją.', form_password_incorrect: 'Wprowadzone hasło jest nieprawidłowe. Spróbuj ponownie.', + form_password_or_identifier_incorrect: + 'Hasło lub adres e-mail jest nieprawidłowy. Spróbuj ponownie lub użyj innej metody.', form_password_length_too_short: 'Twoje hasło jest zbyt krótkie. Musi mieć co najmniej 8 znaków.', form_password_not_strong_enough: 'Twoje hasło nie jest wystarczająco silne', form_password_pwned: diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 9680da375d1..303b4314b5b 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -923,6 +923,8 @@ export const ptBR: LocalizationResource = { form_param_type_invalid__phone_number: 'Número de telefone inválido.', form_param_value_invalid: 'Valor inválido.', form_password_incorrect: 'Senha incorreta.', + form_password_or_identifier_incorrect: + 'A senha ou o endereço de e-mail está incorreto. Tente novamente ou use outro método.', form_password_length_too_short: 'Sua senha é muito curta. Por favor, tente novamente.', form_password_not_strong_enough: 'Sua senha não é forte o suficiente.', form_password_pwned: 'Esta senha foi comprometida e não pode ser usada, por favor, tente outra senha.', diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 22411c395cb..79d227d727a 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -909,6 +909,8 @@ export const ptPT: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Valor de parâmetro inválido.', form_password_incorrect: 'Palavra-passe incorreta.', + form_password_or_identifier_incorrect: + 'A palavra-passe ou o endereço de e-mail está incorreto. Tente novamente ou use outro método.', form_password_length_too_short: 'A palavra-passe é muito curta.', form_password_not_strong_enough: 'A sua palavra-passe não é forte o suficiente.', form_password_pwned: diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 52d8dc4ee1e..5d0d991f23e 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -924,6 +924,8 @@ export const roRO: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Parola sau adresa de e-mail este incorectă. Încearcă din nou sau folosește o altă metodă.', form_password_length_too_short: 'Parola este prea scurtă. Trebuie să aibă cel puțin 8 caractere.', form_password_not_strong_enough: 'Parola ta nu este suficient de puternică.', form_password_pwned: diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 145cb75f0bc..b687513c062 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -924,6 +924,8 @@ export const ruRU: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Пароль или адрес электронной почты неверен. Попробуйте снова или используйте другой метод.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Ваш пароль недостаточно надежный.', form_password_pwned: 'Этот пароль был взломан и не может быть использован, попробуйте другой пароль.', diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 99d43462908..45e19ffb883 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -916,6 +916,8 @@ export const skSK: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Hodnota je neplatná. Skontrolujte a opravte.', form_password_incorrect: 'Heslo je nesprávne. Skontrolujte a skúste to znova.', + form_password_or_identifier_incorrect: + 'Heslo alebo e-mailová adresa je nesprávna. Skúste to znova alebo použite inú metódu.', form_password_length_too_short: 'Heslo musí mať aspoň 8 znakov.', form_password_not_strong_enough: 'Vaše heslo nie je dostatočne silné.', form_password_pwned: 'Toto heslo bolo nájdené v rámci úniku dát a nemôže byť použité, prosím zvoľte iné heslo.', diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index 6d3ceb2e37c..9bfba7e317f 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -908,6 +908,8 @@ export const srRS: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'Lozinka je netačna.', + form_password_or_identifier_incorrect: + 'Лозинка или адреса е-поште је нетачна. Покушај поново или користи други метод.', form_password_length_too_short: 'Lozinka je prekratka.', form_password_not_strong_enough: 'Tvoja lozinka nije dovoljno jaka.', form_password_pwned: diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index 0a1d90128b0..e80e5f4b907 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -913,6 +913,8 @@ export const svSE: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: 'Lösenordet är felaktigt.', + form_password_or_identifier_incorrect: + 'Lösenordet eller e-postadressen är felaktig. Försök igen eller använd en annan metod.', form_password_length_too_short: 'Lösenordet är för kort.', form_password_not_strong_enough: 'Ditt lösenord är inte tillräckligt starkt.', form_password_pwned: 'Lösenordet har läckt i tidigare dataintrång.', diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index 637d25d71fe..5b2108e0434 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -917,6 +917,8 @@ export const taIN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'உள்ளிடப்பட்ட மதிப்பு தவறானது. அதை திருத்தவும்.', form_password_incorrect: 'நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறானது. மீண்டும் முயற்சிக்கவும்.', + form_password_or_identifier_incorrect: + 'கடவுச்சொல் அல்லது மின்னஞ்சல் முகவரி தவறானது. மீண்டும் முயற்சிக்கவும் அல்லது வேறு முறையைப் பயன்படுத்தவும்.', form_password_length_too_short: 'உங்கள் கடவுச்சொல் மிகவும் குறுகியது. இது குறைந்தது 8 எழுத்துகள் நீளமாக இருக்க வேண்டும்.', form_password_not_strong_enough: 'உங்கள் கடவுச்சொல் போதுமான வலிமை இல்லை.', diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index bb88625c7bc..1b9fa063325 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -917,6 +917,8 @@ export const teIN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'నమోదు చేసిన విలువ చెల్లనిది. దయచేసి దిద్దుబాటు చేయండి.', form_password_incorrect: 'మీరు నమోదు చేసిన పాస్‌వర్డ్ తప్పు. దయచేసి మళ్ళీ ప్రయత్నించండి.', + form_password_or_identifier_incorrect: + 'పాస్‌వర్డ్ లేదా ఇమెయిల్ చిరునామా తప్పు. దయచేసి మళ్ళీ ప్రయత్నించండి లేదా మరొక పద్ధతిని ఉపయోగించండి.', form_password_length_too_short: 'మీ పాస్‌వర్డ్ చాలా చిన్నది. ఇది కనీసం 8 అక్షరాల పొడవు ఉండాలి.', form_password_not_strong_enough: 'మీ పాస్‌వర్డ్ సరిపడా బలంగా లేదు.', form_password_pwned: diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 70ef99a6783..2772fdd3e90 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -910,6 +910,7 @@ export const thTH: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: 'รหัสผ่านหรือที่อยู่อีเมลไม่ถูกต้อง ลองอีกครั้งหรือใช้วิธีอื่น', form_password_length_too_short: 'รหัสผ่านของคุณสั้นเกินไป ต้องมีความยาวอย่างน้อย 8 ตัวอักษร', form_password_not_strong_enough: 'รหัสผ่านของคุณไม่แข็งแกร่งพอ', form_password_pwned: diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index f5f44384d9b..5c09e50bcef 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -912,6 +912,8 @@ export const trTR: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: 'Parametre değeri geçersiz.', form_password_incorrect: 'Şifre yanlış.', + form_password_or_identifier_incorrect: + 'Şifre veya e-posta adresi yanlış. Tekrar deneyin veya başka bir yöntem kullanın.', form_password_length_too_short: 'Şifre çok kısa.', form_password_not_strong_enough: 'Şifreniz yeterince güçlü değil.', form_password_pwned: 'Bu şifre bir veri ihlalinde tespit edildi ve kullanılamaz. Lütfen başka bir şifre deneyin.', diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index 83b57c4d337..6c84a513afd 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -908,6 +908,8 @@ export const ukUA: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Пароль або адреса електронної пошти невірні. Спробуйте ще раз або використайте інший метод.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Ваш пароль недостатньо надійний.', form_password_pwned: 'Цей пароль було зламано і його не можна використовувати, спробуйте інший пароль.', diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index fc5773c2f35..f1c453c2fe0 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -917,6 +917,8 @@ export const viVN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: + 'Mật khẩu hoặc địa chỉ email không đúng. Vui lòng thử lại hoặc sử dụng phương thức khác.', form_password_length_too_short: 'Mật khẩu của bạn quá ngắn. Nó phải có ít nhất 8 ký tự.', form_password_not_strong_enough: 'Mật khẩu của bạn không đủ mạnh.', form_password_pwned: diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 7089f5fdf76..6bbea890431 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -895,6 +895,7 @@ export const zhCN: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: '密码或电子邮件地址不正确。请重试,或使用其他方法。', form_password_length_too_short: undefined, form_password_not_strong_enough: '您的密码强度不够。', form_password_pwned: '这个密码在数据泄露中被发现,不能使用,请换一个密码试试。', diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index a35b145f296..01f956f75f0 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -896,6 +896,7 @@ export const zhTW: LocalizationResource = { form_param_type_invalid__phone_number: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, + form_password_or_identifier_incorrect: '密碼或電子郵件地址不正確。請重試,或使用其他方法。', form_password_length_too_short: undefined, form_password_not_strong_enough: '您的密碼強度不足。', form_password_pwned: '此密碼已在已知的資料外洩事件中出現,請改用其他密碼。', diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index a5d3ab96a6d..286f64b2bbf 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1354,6 +1354,7 @@ type UnstableErrors = WithParamName<{ form_param_nil: LocalizationValue; form_code_incorrect: LocalizationValue; form_password_incorrect: LocalizationValue; + form_password_or_identifier_incorrect: LocalizationValue; form_password_validation_failed: LocalizationValue; not_allowed_access: LocalizationValue; form_identifier_exists: LocalizationValue; From 175883b05228138c9ff55d0871cc1041bd68d7fe Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Wed, 10 Dec 2025 23:43:50 -0800 Subject: [PATCH 012/123] feat(localizations,shared): Add temporary email error localization key (#7436) --- .changeset/blue-walls-promise.md | 6 ++++++ packages/localizations/src/ar-SA.ts | 2 ++ packages/localizations/src/be-BY.ts | 2 ++ packages/localizations/src/bg-BG.ts | 2 ++ packages/localizations/src/bn-IN.ts | 2 ++ packages/localizations/src/ca-ES.ts | 2 ++ packages/localizations/src/cs-CZ.ts | 2 ++ packages/localizations/src/da-DK.ts | 2 ++ packages/localizations/src/de-DE.ts | 2 ++ packages/localizations/src/el-GR.ts | 2 ++ packages/localizations/src/en-GB.ts | 2 ++ packages/localizations/src/en-US.ts | 1 + packages/localizations/src/es-CR.ts | 2 ++ packages/localizations/src/es-ES.ts | 2 ++ packages/localizations/src/es-MX.ts | 2 ++ packages/localizations/src/es-UY.ts | 2 ++ packages/localizations/src/fa-IR.ts | 2 ++ packages/localizations/src/fi-FI.ts | 2 ++ packages/localizations/src/fr-FR.ts | 2 ++ packages/localizations/src/he-IL.ts | 2 ++ packages/localizations/src/hi-IN.ts | 2 ++ packages/localizations/src/hr-HR.ts | 2 ++ packages/localizations/src/hu-HU.ts | 2 ++ packages/localizations/src/id-ID.ts | 2 ++ packages/localizations/src/is-IS.ts | 2 ++ packages/localizations/src/it-IT.ts | 2 ++ packages/localizations/src/ja-JP.ts | 2 ++ packages/localizations/src/kk-KZ.ts | 2 ++ packages/localizations/src/ko-KR.ts | 2 ++ packages/localizations/src/mn-MN.ts | 2 ++ packages/localizations/src/ms-MY.ts | 2 ++ packages/localizations/src/nb-NO.ts | 2 ++ packages/localizations/src/nl-BE.ts | 2 ++ packages/localizations/src/nl-NL.ts | 2 ++ packages/localizations/src/pl-PL.ts | 2 ++ packages/localizations/src/pt-BR.ts | 2 ++ packages/localizations/src/pt-PT.ts | 2 ++ packages/localizations/src/ro-RO.ts | 2 ++ packages/localizations/src/ru-RU.ts | 2 ++ packages/localizations/src/sk-SK.ts | 2 ++ packages/localizations/src/sr-RS.ts | 2 ++ packages/localizations/src/sv-SE.ts | 2 ++ packages/localizations/src/ta-IN.ts | 2 ++ packages/localizations/src/te-IN.ts | 2 ++ packages/localizations/src/th-TH.ts | 1 + packages/localizations/src/tr-TR.ts | 2 ++ packages/localizations/src/uk-UA.ts | 2 ++ packages/localizations/src/vi-VN.ts | 2 ++ packages/localizations/src/zh-CN.ts | 1 + packages/localizations/src/zh-TW.ts | 1 + packages/shared/src/types/localization.ts | 1 + 51 files changed, 101 insertions(+) create mode 100644 .changeset/blue-walls-promise.md diff --git a/.changeset/blue-walls-promise.md b/.changeset/blue-walls-promise.md new file mode 100644 index 00000000000..3309217fb25 --- /dev/null +++ b/.changeset/blue-walls-promise.md @@ -0,0 +1,6 @@ +--- +"@clerk/localizations": patch +"@clerk/shared": patch +--- + +Added temporary email services support error localization key. diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index df7ac8e0171..ffc17b22900 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -890,6 +890,8 @@ export const arSA: LocalizationResource = { captcha_unavailable: 'التسجيل غير ناجح بسبب فشل التحقق من صحة الروبوت. يُرجى تحديث الصفحة للمحاولة مرة أخرى أو التواصل مع فريق الدعم للحصول على مزيد من المساعدة', form_code_incorrect: undefined, + form_email_address_blocked: + 'خدمات البريد الإلكتروني المؤقتة غير مدعومة. يرجى استخدام عنوان بريدك الإلكتروني العادي لإنشاء حساب.', form_identifier_exists__email_address: 'تم إستخدام البريد الإلكتروني هذا. يرجى المحاولة مرة أخرى', form_identifier_exists__phone_number: 'تم إستخدام رقم الهاتف هذا. يرجى المحاولة مرة أخرى', form_identifier_exists__username: 'تم إستخدام اسم المستخدمد هذا. يرجى المحاولة مرة أخرى', diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index 5333bbcd84d..734af8b1fc8 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -899,6 +899,8 @@ export const beBY: LocalizationResource = { captcha_unavailable: 'Рэгістрацыя не ўдалася з-за памылак праверкі ботаў. Калі ласка, абнавіце старонку, каб паспрабаваць яшчэ раз або звяжыцеся са службай падтрымкі для атрымання дапамогі.', form_code_incorrect: 'Невядомы код. Пераканайцеся, што вы ўвялі правільны код.', + form_email_address_blocked: + 'Часовая пошта не падтрымліваецца. Калі ласка, выкарыстоўвайце свой звычайны адрас электроннай пошты для стварэння акаўнта.', form_identifier_exists__email_address: 'Гэты адрас электроннай пошты ўжо выкарыстоўваецца.', form_identifier_exists__phone_number: 'Гэты нумар тэлефона ўжо выкарыстоўваецца.', form_identifier_exists__username: 'Гэта імя ўжо занята.', diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index cf84bc85f31..17e5e80b117 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -893,6 +893,8 @@ export const bgBG: LocalizationResource = { captcha_invalid: undefined, captcha_unavailable: undefined, form_code_incorrect: 'Невалиден код. Моля, опитайте отново.', + form_email_address_blocked: + 'Временните имейл услуги не се поддържат. Моля, използвайте вашия обикновен имейл адрес, за да създадете акаунт.', form_identifier_exists__email_address: 'Този имейл адрес вече е регистриран.', form_identifier_exists__phone_number: 'Този телефонен номер вече е използван.', form_identifier_exists__username: 'Това потребителско име вече съществува.', diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index cd3f794faea..46af11fcc37 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -898,6 +898,8 @@ export const bnIN: LocalizationResource = { captcha_unavailable: 'বট যাচাইকরণ ব্যর্থ হওয়ার কারণে সাইন আপ ব্যর্থ হয়েছে। আবার চেষ্টা করতে দয়া করে পৃষ্ঠাটি রিফ্রেশ করুন বা আরও সাহায্যের জন্য সাপোর্টের সাথে যোগাযোগ করুন।', form_code_incorrect: undefined, + form_email_address_blocked: + 'অস্থায়ী ইমেইল পরিষেবাগুলি সমর্থিত নয়। অনুগ্রহ করে অ্যাকাউন্ট তৈরি করতে আপনার নিয়মিত ইমেইল ঠিকানা ব্যবহার করুন।', form_identifier_exists__email_address: 'এই ইমেইল ঠিকানা ব্যবহৃত হয়েছে। দয়া করে অন্য একটি ব্যবহার করুন।', form_identifier_exists__phone_number: 'এই ফোন নম্বর ব্যবহৃত হয়েছে। দয়া করে অন্য একটি ব্যবহার করুন।', form_identifier_exists__username: 'এই ব্যবহারকারীর নাম ব্যবহৃত হয়েছে। দয়া করে অন্য একটি ব্যবহার করুন।', diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 14eb86f9166..e828a51065c 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -894,6 +894,8 @@ export const caES: LocalizationResource = { captcha_unavailable: "El registre no ha estat exitós a causa de la validació fallida de bot. Si us plau, actualitza la pàgina per tornar-ho a intentar o posa't en contacte amb el suport per obtenir més assistència.", form_code_incorrect: 'El codi introduït no és vàlid. Si us plau, comprova el codi i torna-ho a intentar.', + form_email_address_blocked: + 'Els serveis de correu electrònic temporal no estan suportats. Si us plau, utilitzeu la vostra adreça de correu electrònic habitual per crear un compte.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index e8e2627bf3f..055b9aadc0c 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -905,6 +905,8 @@ export const csCZ: LocalizationResource = { captcha_unavailable: 'Registrace nebyla úspěšná kvůli neúspěšné validaci bota. Prosím obnovte stránku a zkuste to znovu, nebo se obraťte na podporu pro další pomoc.', form_code_incorrect: 'Kód je nesprávný.', + form_email_address_blocked: + 'Dočasné e-mailové služby nejsou podporovány. Pro vytvoření účtu použijte prosím svou běžnou e-mailovou adresu.', form_identifier_exists__email_address: 'Tato emailová adresa již byla použita.', form_identifier_exists__phone_number: 'Toto telefonní číslo již bylo použito.', form_identifier_exists__username: 'Toto uživatelské jméno již bylo použito.', diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 812b7abff9e..fb7bd5fa591 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -891,6 +891,8 @@ export const daDK: LocalizationResource = { captcha_unavailable: 'Tilmelding mislykkedes på grund af fejlet botvalidering. Opdater siden for at prøve igen, eller kontakt support for yderligere assistance.', form_code_incorrect: 'Koden er forkert.', + form_email_address_blocked: + 'Midlertidige e-mailtjenester understøttes ikke. Brug venligst din almindelige e-mailadresse til at oprette en konto.', form_identifier_exists__email_address: 'E-mailadressen er allerede i brug.', form_identifier_exists__phone_number: 'Telefonnummeret er allerede i brug.', form_identifier_exists__username: 'Brugernavnet er allerede i brug.', diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 0e0ccffed1a..031959e4316 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -910,6 +910,8 @@ export const deDE: LocalizationResource = { captcha_unavailable: 'Die Anmeldung ist aufgrund einer fehlgeschlagenen Bot-Validierung fehlgeschlagen. Bitte aktualisieren Sie die Seite, um es erneut zu versuchen, oder wenden Sie sich an den Support, um weitere Unterstützung zu erhalten.', form_code_incorrect: 'Der eingegebene Code ist falsch. Bitte überprüfen Sie ihn und versuchen Sie es erneut.', + form_email_address_blocked: + 'Temporäre E-Mail-Dienste werden nicht unterstützt. Bitte verwenden Sie Ihre reguläre E-Mail-Adresse, um ein Konto zu erstellen.', form_identifier_exists__email_address: 'Diese E-Mail-Adresse ist bereits vergeben. Bitte wählen Sie eine andere.', form_identifier_exists__phone_number: 'Diese Telefonnummer ist bereits vergeben. Bitte wählen Sie eine andere.', form_identifier_exists__username: 'Dieser Benutzername ist bereits vergeben. Bitte wählen Sie einen anderen.', diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 5e861d86ae4..681ffd69b16 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -896,6 +896,8 @@ export const elGR: LocalizationResource = { captcha_unavailable: 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Οι προσωρινές υπηρεσίες email δεν υποστηρίζονται. Παρακαλώ χρησιμοποιήστε τη συνηθισμένη διεύθυνση email σας για να δημιουργήσετε λογαριασμό.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index c340998cd8f..6e817a811f0 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -895,6 +895,8 @@ export const enGB: LocalizationResource = { captcha_unavailable: 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Temporary email services are not supported. Please use your regular email address to create an account.', form_identifier_exists__email_address: 'This email address is taken. Please try another.', form_identifier_exists__phone_number: 'This phone number is taken. Please try another.', form_identifier_exists__username: 'This username is taken. Please try another.', diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index a6507d49410..069a26ca67a 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -891,6 +891,7 @@ export const enUS: LocalizationResource = { captcha_unavailable: 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', form_code_incorrect: undefined, + form_email_address_blocked: undefined, form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 82623ca0434..bdc5826cbf9 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -901,6 +901,8 @@ export const esCR: LocalizationResource = { captcha_unavailable: 'El registro falló debido a fallos en la validación de robot. Por favor, recarga la página o contáctanos para obtener más asistencia.', form_code_incorrect: 'Código incorrecto.', + form_email_address_blocked: + 'Los servicios de correo electrónico temporal no están soportados. Por favor, use su dirección de correo electrónico regular para crear una cuenta.', form_identifier_exists__email_address: 'El correo electrónico ya existe', form_identifier_exists__phone_number: 'El número telefónico ya existe.', form_identifier_exists__username: 'El nombre de usuario ya existe.', diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index d68dfb5dd53..81cc2daebe8 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -895,6 +895,8 @@ export const esES: LocalizationResource = { captcha_unavailable: 'Registro fallido debido a una validación de bot fallida. Por favor, actualice la página para intentarlo de nuevo o comuníquese con el soporte para más asistencia.', form_code_incorrect: 'El código ingresado es incorrecto.', + form_email_address_blocked: + 'Los servicios de correo electrónico temporal no están soportados. Por favor, use su dirección de correo electrónico regular para crear una cuenta.', form_identifier_exists__email_address: 'Ya existe una cuenta con esta dirección de correo electrónico.', form_identifier_exists__phone_number: 'Ya existe una cuenta con este número de teléfono.', form_identifier_exists__username: 'Ya existe una cuenta con este nombre de usuario.', diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index 7e637f8efab..29e6fe807c4 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -902,6 +902,8 @@ export const esMX: LocalizationResource = { captcha_unavailable: 'El registro falló debido a fallos en la validación de robot. Por favor, recarga la página o contáctanos para obtener más asistencia.', form_code_incorrect: 'Código incorrecto.', + form_email_address_blocked: + 'Los servicios de correo electrónico temporal no están soportados. Por favor, use su dirección de correo electrónico regular para crear una cuenta.', form_identifier_exists__email_address: 'El correo electrónico ya existe', form_identifier_exists__phone_number: 'El número telefónico ya existe.', form_identifier_exists__username: 'El nombre de usuario ya existe.', diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index fa91ed641d6..afc8d3f8bf1 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -901,6 +901,8 @@ export const esUY: LocalizationResource = { captcha_unavailable: 'El registro no se pudo completar debido a la validación fallida contra bots. Por favor, actualizá la página para intentarlo de nuevo o contactá al soporte para más asistencia.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Los servicios de correo electrónico temporal no están soportados. Por favor, use su dirección de correo electrónico regular para crear una cuenta.', form_identifier_exists__email_address: 'Este correo electrónico ya está en uso. Por favor, probá con otro.', form_identifier_exists__phone_number: 'Este número de teléfono ya está en uso. Por favor, probá con otro.', form_identifier_exists__username: 'Este nombre de usuario ya está en uso. Por favor, probá con otro.', diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 12a87c181a4..cdc7b5f7f53 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -903,6 +903,8 @@ export const faIR: LocalizationResource = { captcha_unavailable: 'به دلیل عدم موفقیت در اعتبارسنجی ربات، ثبت نام ناموفق بود. لطفاً برای امتحان مجدد، صفحه را رفرش کنید یا برای راهنمایی بیشتر با پشتیبانی تماس بگیرید.', form_code_incorrect: 'کد وارد شده نادرست است.', + form_email_address_blocked: + 'سرویس‌های ایمیل موقت پشتیبانی نمی‌شوند. لطفاً از آدرس ایمیل معمولی خود برای ایجاد حساب استفاده کنید.', form_identifier_exists__email_address: 'این آدرس ایمیل قبلاً استفاده شده است.', form_identifier_exists__phone_number: 'این شماره تلفن قبلاً استفاده شده است.', form_identifier_exists__username: 'این نام کاربری قبلاً گرفته شده است.', diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index c7b5fe21aef..5120484776b 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -894,6 +894,8 @@ export const fiFI: LocalizationResource = { captcha_unavailable: 'Rekisteröityminen epäonnistui, koska botin vahvistus epäonnistui. Päivitä sivu ja yritä uudelleen tai ota yhteyttä tukeen.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Väliaikaiset sähköpostipalvelut eivät ole tuettuja. Käytä tavallista sähköpostiosoitetta tilin luomiseen.', form_identifier_exists__email_address: 'Tämä sähköpostiosoite on jo käytössä. Kokeile toista.', form_identifier_exists__phone_number: 'Tämä puhelinnumero on jo käytössä. Kokeile toista.', form_identifier_exists__username: 'Tämä käyttäjänimi on jo käytössä. Kokeile toista.', diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 888fcdba6f6..d9a0354f8ca 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -911,6 +911,8 @@ export const frFR: LocalizationResource = { captcha_unavailable: "Inscription échouée en raison d'une validation de captcha non réussie. Veuillez actualiser la page pour réessayer ou contacter le support pour obtenir de l'aide.", form_code_incorrect: 'Code incorrect', + form_email_address_blocked: + 'Les services de messagerie temporaire ne sont pas pris en charge. Veuillez utiliser votre adresse e-mail habituelle pour créer un compte.', form_identifier_exists__email_address: 'Cette adresse e-mail existe déjà.', form_identifier_exists__phone_number: 'Ce numéro de téléphone existe déjà.', form_identifier_exists__username: "Ce nom d'utilisateur existe déjà.", diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index f6d172b5a8d..bdedef60375 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -882,6 +882,8 @@ export const heIL: LocalizationResource = { captcha_invalid: 'ההרשמה נכשלה עקב כשל באימות האבטחה. אנא רענן את הדף ונסה שוב, או פנה לתמיכה לעזרה נוספת.', captcha_unavailable: 'ההרשמה נכשלה עקב כשל באימות נגד בוטים. אנא רענן את הדף ונסה שוב, או פנה לתמיכה לעזרה נוספת.', form_code_incorrect: undefined, + form_email_address_blocked: + 'שירותי אימייל זמניים אינם נתמכים. אנא השתמש בכתובת האימייל הרגילה שלך כדי ליצור חשבון.', form_identifier_exists__email_address: 'כתובת המייל הזאת כבר תפוסה. אנא נסה אחרת.', form_identifier_exists__phone_number: 'מספר הטלפון הזה כבר תפוס. אנא נסה מספר אחר.', form_identifier_exists__username: 'שם המשתמש הזה כבר תפוס. אנא נסה שם משתמש אחר', diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index fc03ec70436..8306e00511a 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -898,6 +898,8 @@ export const hiIN: LocalizationResource = { captcha_unavailable: 'असफल बॉट सत्यापन के कारण साइन अप असफल रहा। पुनः प्रयास करने के लिए कृपया पृष्ठ को रिफ्रेश करें या अधिक सहायता के लिए सपोर्ट से संपर्क करें।', form_code_incorrect: undefined, + form_email_address_blocked: + 'अस्थायी ईमेल सेवाएं समर्थित नहीं हैं। कृपया खाता बनाने के लिए अपना नियमित ईमेल पता उपयोग करें।', form_identifier_exists__email_address: 'यह ईमेल पता पहले से लिया गया है। कृपया दूसरा प्रयास करें।', form_identifier_exists__phone_number: 'यह फोन नंबर पहले से लिया गया है। कृपया दूसरा प्रयास करें।', form_identifier_exists__username: 'यह उपयोगकर्ता नाम पहले से लिया गया है। कृपया दूसरा प्रयास करें।', diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 0efcf86e557..8456a871826 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -896,6 +896,8 @@ export const hrHR: LocalizationResource = { captcha_unavailable: 'Registracija neuspješna zbog neuspjele provjere bota. Molimo osvježite stranicu i pokušajte ponovno ili se obratite podršci za dodatnu pomoć.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Privremene e-mail usluge nisu podržane. Molimo koristite svoju redovitu e-mail adresu za kreiranje računa.', form_identifier_exists__email_address: 'Ova e-mail adresa je zauzeta. Molimo pokušajte s drugom.', form_identifier_exists__phone_number: 'Ovaj telefonski broj je zauzet. Molimo pokušajte s drugim.', form_identifier_exists__username: 'Ovo korisničko ime je zauzeto. Molimo pokušajte s drugim.', diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index e23a873ef2a..d436b117311 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -892,6 +892,8 @@ export const huHU: LocalizationResource = { captcha_unavailable: 'Bot érvényesítése miatt, a regisztráció sikertelen volt. Kérlek frissítsd az oldalt, hogy újra próbálhasd, vagy kérj támogatást.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Az ideiglenes e-mail szolgáltatások nem támogatottak. Kérlek, használd a szokásos e-mail címedet a fiók létrehozásához.', form_identifier_exists__email_address: 'Ez az email cím már foglalt. Kérlek próbálj egy másikat.', form_identifier_exists__phone_number: 'Ez a telefonszám már foglalt. Kérlek próbálj egy másikat.', form_identifier_exists__username: 'Ez a felhasználónév már foglalt. Kérlek próbálj egy másikat.', diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index bea8ab4d855..eac152700a3 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -899,6 +899,8 @@ export const idID: LocalizationResource = { captcha_unavailable: 'Pendaftaran gagal karena validasi bot gagal. Silakan muat ulang halaman untuk mencoba lagi atau hubungi dukungan untuk bantuan lebih lanjut.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Layanan email sementara tidak didukung. Silakan gunakan alamat email reguler Anda untuk membuat akun.', form_identifier_exists__email_address: 'Alamat email ini sudah digunakan. Silakan coba yang lain.', form_identifier_exists__phone_number: 'Nomor telepon ini sudah digunakan. Silakan coba yang lain.', form_identifier_exists__username: 'Nama pengguna ini sudah digunakan. Silakan coba yang lain.', diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index 3eeebeddf04..7c09ea1da76 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -895,6 +895,8 @@ export const isIS: LocalizationResource = { captcha_unavailable: 'Skráning mistókst vegna misheppnaðrar vélmenna staðfestingar. Vinsamlegast endurhlaðið síðuna til að reyna aftur eða hafið samband við stuðning til að fá frekari aðstoð.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Tímabundin tölvupóstþjónusta er ekki studd. Vinsamlegast notaðu venjulega netfangið þitt til að búa til reikning.', form_identifier_exists__email_address: 'Þetta netfang er þegar í notkun. Vinsamlegast reyndu annað.', form_identifier_exists__phone_number: 'Þetta símanúmer er þegar í notkun. Vinsamlegast reyndu annað.', form_identifier_exists__username: 'Þetta notendanafn er þegar í notkun. Vinsamlegast reyndu annað.', diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 23ced4fcb76..2accdf761a6 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -901,6 +901,8 @@ export const itIT: LocalizationResource = { captcha_unavailable: 'Registrazione non riuscita a causa della convalida del bot non riuscita. Per favore, ricarica la pagina e riprova o contatta il supporto per ulteriore assistenza.', form_code_incorrect: 'Il codice inserito non è corretto. Riprova.', + form_email_address_blocked: + 'I servizi di posta elettronica temporanea non sono supportati. Si prega di utilizzare il proprio indirizzo email normale per creare un account.', form_identifier_exists__email_address: 'Questa email è già registrata.', form_identifier_exists__phone_number: 'Questo numero di telefono è già registrato.', form_identifier_exists__username: 'Questo username è già in uso.', diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index a2541ddb36e..ad78d071164 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -905,6 +905,8 @@ export const jaJP: LocalizationResource = { captcha_unavailable: 'ボット検証に失敗したため、サインアップに失敗しました。ページを更新して再試行するか、サポートに連絡してさらに支援を受けてください。', form_code_incorrect: undefined, + form_email_address_blocked: + '一時的なメールサービスはサポートされていません。アカウントを作成するには、通常のメールアドレスを使用してください。', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index 836e2449cfc..f0cf044c371 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -883,6 +883,8 @@ export const kkKZ: LocalizationResource = { captcha_invalid: 'Қауіпсіздік тексерілуі сәтсіз аяқталды. Браузерді өзгерту немесе кеңейтулерді өшіруге тырысыңыз.', captcha_unavailable: 'Бот тексерілуі сәтсіз аяқталды. Бетті жаңартып немесе қолдау қызметіне хабарласыңыз.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Уақытша электрондық пошта қызметтері қолдау көрсетілмейді. Есептік жазбаны жасау үшін кәдімгі электрондық пошта мекенжайыңызды пайдаланыңыз.', form_identifier_exists__email_address: 'Бұл электрондық пошта тіркелген. Басқасын қолданыңыз.', form_identifier_exists__phone_number: 'Бұл телефон нөмірі тіркелген. Басқасын қолданыңыз.', form_identifier_exists__username: 'Бұл пайдаланушы аты тіркелген. Басқасын қолданыңыз.', diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 5e5b5942478..9ded1c68f28 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -886,6 +886,8 @@ export const koKR: LocalizationResource = { captcha_unavailable: 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', form_code_incorrect: undefined, + form_email_address_blocked: + '임시 이메일 서비스는 지원되지 않습니다. 계정을 만들려면 일반 이메일 주소를 사용해 주세요.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index c6a49696b58..f1dc6826445 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -893,6 +893,8 @@ export const mnMN: LocalizationResource = { captcha_unavailable: 'Ботын баталгаажуулалт амжилтгүй болсны улмаас бүртгүүлж чадсангүй. Дахин оролдохын тулд хуудсыг сэргээнэ үү эсвэл нэмэлт тусламж авахын тулд тусламж авахаар холбогдоно уу.', form_code_incorrect: 'Маягтын код буруу байна', + form_email_address_blocked: + 'Түр зуурын имэйл үйлчилгээг дэмжихгүй. Данс үүсгэхийн тулд ердийн имэйл хаягаа ашиглана уу.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 97bd7493816..13e3c18ad20 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -901,6 +901,8 @@ export const msMY: LocalizationResource = { captcha_unavailable: 'Pendaftaran tidak berjaya kerana pengesahan bot gagal. Sila muat semula halaman untuk mencuba lagi atau hubungi sokongan untuk bantuan lebih lanjut.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Perkhidmatan e-mel sementara tidak disokong. Sila gunakan alamat e-mel biasa anda untuk membuat akaun.', form_identifier_exists__email_address: 'Alamat e-mel ini telah diambil. Sila cuba yang lain.', form_identifier_exists__phone_number: 'Nombor telefon ini telah diambil. Sila cuba yang lain.', form_identifier_exists__username: 'Nama pengguna ini telah diambil. Sila cuba yang lain.', diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 97541b6bba0..41c239013ac 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -892,6 +892,8 @@ export const nbNO: LocalizationResource = { captcha_unavailable: 'Registreringen mislyktes på grunn av mislykkede bot-valideringer. Vennligst oppdater siden og prøv igjen, eller ta kontakt med brukerstøtte for mer hjelp.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Midlertidige e-posttjenester støttes ikke. Vennligst bruk din vanlige e-postadresse for å opprette en konto.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index 1526efe85fd..0e24ba0af9a 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -893,6 +893,8 @@ export const nlBE: LocalizationResource = { captcha_unavailable: 'Aanmelding mislukt vanwege mislukte botvalidatie. Vernieuw de pagina om het opnieuw te proberen of neem contact op met de ondersteuning voor verdere hulp.', form_code_incorrect: 'De ingevoerde code is incorrect.', + form_email_address_blocked: + 'Tijdelijke e-maildiensten worden niet ondersteund. Gebruik uw normale e-mailadres om een account aan te maken.', form_identifier_exists__email_address: 'Dit e-mailadres is al in gebruik.', form_identifier_exists__phone_number: 'Dit telefoonnummer is al in gebruik.', form_identifier_exists__username: 'Deze gebruikersnaam is al in gebruik.', diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index 79f4b28e8d3..273cb71cd1a 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -893,6 +893,8 @@ export const nlNL: LocalizationResource = { captcha_unavailable: 'Aanmelding mislukt vanwege mislukte botvalidatie. Vernieuw de pagina om het opnieuw te proberen of neem contact op met de ondersteuning voor verdere hulp.', form_code_incorrect: 'De ingevoerde code is incorrect.', + form_email_address_blocked: + 'Tijdelijke e-maildiensten worden niet ondersteund. Gebruik uw normale e-mailadres om een account aan te maken.', form_identifier_exists__email_address: 'Dit e-mailadres is al in gebruik.', form_identifier_exists__phone_number: 'Dit telefoonnummer is al in gebruik.', form_identifier_exists__username: 'Deze gebruikersnaam is al in gebruik.', diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 3f4a1dfb289..76a7bafda05 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -898,6 +898,8 @@ export const plPL: LocalizationResource = { captcha_unavailable: 'Rejestracja nie powiodła się z powodu niedostępności weryfikacji botów. Odśwież stronę, aby spróbować ponownie lub skontaktuj się z pomocą, aby uzyskać wsparcie.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Tymczasowe usługi e-mail nie są obsługiwane. Proszę użyć zwykłego adresu e-mail, aby utworzyć konto.', form_identifier_exists__email_address: 'Adres e-mail jest już zajęty. Proszę spróbować innego.', form_identifier_exists__phone_number: 'Ten numer telefonu jest zajęty. Spróbuj użyć innego.', form_identifier_exists__username: 'Ta nazwa użytkownika jest zajęta. Spróbuj użyć innej.', diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 303b4314b5b..9a43513dbc7 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -906,6 +906,8 @@ export const ptBR: LocalizationResource = { captcha_unavailable: 'Não foi possível se inscrever devido à indisponibilidade do captcha. Por favor atualize a página para tentar novamente ou entre em contato com o suporte para obter mais ajuda.', form_code_incorrect: 'Código incorreto.', + form_email_address_blocked: + 'Serviços de e-mail temporários não são suportados. Por favor, use seu endereço de e-mail regular para criar uma conta.', form_identifier_exists__email_address: 'E-mail já está em uso. Por favor, tente outro.', form_identifier_exists__phone_number: 'Telefone já está em uso. Por favor, tente outro.', form_identifier_exists__username: 'Nome de usuário já está em uso. Por favor, tente outro.', diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 79d227d727a..766cde5466d 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -892,6 +892,8 @@ export const ptPT: LocalizationResource = { captcha_unavailable: 'Inscrição mal-sucedida devido a falha na validação de bot. Por favor, atualize a página para tentar novamente ou entre em contato com o suporte para obter mais ajuda.', form_code_incorrect: 'Código incorreto.', + form_email_address_blocked: + 'Serviços de e-mail temporários não são suportados. Por favor, use o seu endereço de e-mail regular para criar uma conta.', form_identifier_exists__email_address: 'O endereço de e-mail já está em uso.', form_identifier_exists__phone_number: 'O número de telemóvel já está em uso.', form_identifier_exists__username: 'O nome de utilizador já está em uso.', diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 5d0d991f23e..0cc29a124c7 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -907,6 +907,8 @@ export const roRO: LocalizationResource = { captcha_unavailable: 'Înregistrarea a eșuat din cauza validării anti-bot. Reîmprospătează pagina sau contactează suportul.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Serviciile de e-mail temporare nu sunt acceptate. Vă rugăm să folosiți adresa dvs. de e-mail obișnuită pentru a crea un cont.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index b687513c062..a968facb8e7 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -907,6 +907,8 @@ export const ruRU: LocalizationResource = { captcha_unavailable: 'Регистрация не удалась из-за неудачной проверки бота. Пожалуйста, обновите страницу, чтобы попробовать снова, или обратитесь в службу поддержки для получения дополнительной помощи.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Временные почтовые службы не поддерживаются. Пожалуйста, используйте свой обычный адрес электронной почты для создания аккаунта.', form_identifier_exists__email_address: 'Этот адрес электронной почты уже занят. Пожалуйста, попробуйте другой.', form_identifier_exists__phone_number: 'Этот номер телефона уже занят. Пожалуйста, попробуйте другой.', form_identifier_exists__username: 'Это имя пользователя уже занято. Пожалуйста, попробуйте другое.', diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 45e19ffb883..7df1c60ce41 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -899,6 +899,8 @@ export const skSK: LocalizationResource = { captcha_unavailable: 'Registrácia zlyhala z dôvodu neúspešného overenia proti botom. Obnovte stránku a skúste to znova alebo kontaktujte podporu pre ďalšiu pomoc.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Dočasné e-mailové služby nie sú podporované. Prosím, použite svoju bežnú e-mailovú adresu na vytvorenie účtu.', form_identifier_exists__email_address: 'Táto emailová adresa je už obsadená. Skúste prosím inú.', form_identifier_exists__phone_number: 'Toto telefónne číslo je už obsadené. Skúste prosím iné.', form_identifier_exists__username: 'Táto použivateľské meno je už obsadené. Skúste prosím iné.', diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index 9bfba7e317f..45a20964aa2 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -891,6 +891,8 @@ export const srRS: LocalizationResource = { captcha_unavailable: 'Registracija neuspešna zbog neuspelog proveravanja bota. Osveži stranicu da pokušaš ponovo ili se obrati podršci za više pomoći.', form_code_incorrect: 'Uneti kod je netačan.', + form_email_address_blocked: + 'Привремене е-поште услуге нису подржане. Молимо користите своју редовну адресу е-поште за креирање налога.', form_identifier_exists__email_address: 'Ova e-mail adresa je zauzeta. Molimo pokušaj sa drugom.', form_identifier_exists__phone_number: 'Ovaj telefonski broj je zauzet. Molimo pokušaj sa drugim.', form_identifier_exists__username: 'Ovo korisničko ime je zauzeto. Molimo pokušaj sa drugim.', diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index e80e5f4b907..0a033b03a1f 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -896,6 +896,8 @@ export const svSE: LocalizationResource = { captcha_unavailable: 'Registrering misslyckades på grund av misslyckad bot-validering. Vänligen uppdatera sidan och försök igen eller kontakta supporten för mer hjälp.', form_code_incorrect: 'Koden är felaktig', + form_email_address_blocked: + 'Tillfälliga e-posttjänster stöds inte. Använd din vanliga e-postadress för att skapa ett konto.', form_identifier_exists__email_address: 'Denna e-postadress är taget. Vänligen prova ett annat.', form_identifier_exists__phone_number: 'Detta telefonnummer är taget. Vänligen prova ett annat.', form_identifier_exists__username: 'Detta användarnamn är taget. Vänligen prova ett annat.', diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index 5b2108e0434..1875a367553 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -900,6 +900,8 @@ export const taIN: LocalizationResource = { captcha_unavailable: 'போட் சரிபார்ப்பு தோல்வியடைந்ததால் பதிவு செய்ய முடியவில்லை. மீண்டும் முயற்சிக்க பக்கத்தை புதுப்பிக்கவும் அல்லது மேலும் உதவிக்கு ஆதரவை தொடர்பு கொள்ளவும்.', form_code_incorrect: undefined, + form_email_address_blocked: + 'தற்காலிக மின்னஞ்சல் சேவைகள் ஆதரிக்கப்படவில்லை. கணக்கை உருவாக்க உங்கள் வழக்கமான மின்னஞ்சல் முகவரியைப் பயன்படுத்தவும்.', form_identifier_exists__email_address: 'இந்த மின்னஞ்சல் முகவரி எடுக்கப்பட்டுள்ளது. வேறொன்றை முயற்சிக்கவும்.', form_identifier_exists__phone_number: 'இந்த தொலைபேசி எண் எடுக்கப்பட்டுள்ளது. வேறொன்றை முயற்சிக்கவும்.', form_identifier_exists__username: 'இந்த பயனர்பெயர் எடுக்கப்பட்டுள்ளது. வேறொன்றை முயற்சிக்கவும்.', diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index 1b9fa063325..82710f7f1c0 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -900,6 +900,8 @@ export const teIN: LocalizationResource = { captcha_unavailable: 'బాట్ ధృవీకరణ విఫలమైనందున సైన్ అప్ విజయవంతం కాలేదు. మళ్ళీ ప్రయత్నించడానికి దయచేసి పేజీని రిఫ్రెష్ చేయండి లేదా మరింత సహాయం కోసం మద్దతును సంప్రదించండి.', form_code_incorrect: undefined, + form_email_address_blocked: + 'తాత్కాలిక ఇమెయిల్ సేవలు మద్దతు లేవు. దయచేసి ఖాతాను సృష్టించడానికి మీ సాధారణ ఇమెయిల్ చిరునామాను ఉపయోగించండి.', form_identifier_exists__email_address: 'ఈ ఇమెయిల్ చిరునామా తీసుకోబడింది. దయచేసి మరొకదాన్ని ప్రయత్నించండి.', form_identifier_exists__phone_number: 'ఈ ఫోన్ నంబర్ తీసుకోబడింది. దయచేసి మరొకదాన్ని ప్రయత్నించండి.', form_identifier_exists__username: 'ఈ వినియోగదారు పేరు తీసుకోబడింది. దయచేసి మరొకదాన్ని ప్రయత్నించండి.', diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 2772fdd3e90..b3d5de3ea16 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -893,6 +893,7 @@ export const thTH: LocalizationResource = { captcha_unavailable: 'การสมัครสมาชิกไม่สำเร็จเนื่องจากการตรวจสอบความปลอดถัยล้มเหลว โปรดรีเฟรชหน้าเพื่อลองใหม่หรือติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือเพิ่มเติม', form_code_incorrect: undefined, + form_email_address_blocked: 'บริการอีเมลชั่วคราวไม่ได้รับการสนับสนุน กรุณาใช้อีเมลปกติของคุณเพื่อสร้างบัญชี', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 5c09e50bcef..5c20b0c5993 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -895,6 +895,8 @@ export const trTR: LocalizationResource = { captcha_unavailable: 'Bot doğrulaması başarısız olduğu için kayıt yapılamadı. Lütfen tekrar denemek için sayfayı yenileyin veya daha fazla yardım için destek ekibi ile iletişime geçin.', form_code_incorrect: 'Hatalı kod.', + form_email_address_blocked: + 'Geçici e-posta hizmetleri desteklenmemektedir. Lütfen hesap oluşturmak için normal e-posta adresinizi kullanın.', form_identifier_exists__email_address: 'Bu e-posta adresi zaten kullanılıyor.', form_identifier_exists__phone_number: 'Bu telefon numarası zaten kullanılıyor.', form_identifier_exists__username: 'Bu kullanıcı adı zaten kullanılıyor.', diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index 6c84a513afd..77c697a527a 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -891,6 +891,8 @@ export const ukUA: LocalizationResource = { captcha_unavailable: 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Тимчасові поштові служби не підтримуються. Будь ласка, використовуйте свою звичайну адресу електронної пошти для створення облікового запису.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index f1c453c2fe0..b0da0a9dc37 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -900,6 +900,8 @@ export const viVN: LocalizationResource = { captcha_unavailable: 'Đăng ký không thành công do lỗi bot. Vui lòng tải lại trang để thử lại hoặc liên hệ hỗ trợ để được hỗ trợ.', form_code_incorrect: undefined, + form_email_address_blocked: + 'Các dịch vụ email tạm thời không được hỗ trợ. Vui lòng sử dụng địa chỉ email thông thường của bạn để tạo tài khoản.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 6bbea890431..84c3abf358e 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -878,6 +878,7 @@ export const zhCN: LocalizationResource = { captcha_invalid: '由于安全验证失败,注册未成功。请刷新页面重试或联系支持获取更多帮助。', captcha_unavailable: '注册失败,原因是未通过机器人验证。请刷新页面重试或联系支持团队以获取更多帮助。', form_code_incorrect: undefined, + form_email_address_blocked: '不支持临时电子邮件服务。请使用您的常规电子邮件地址创建账户。', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 01f956f75f0..96328ff3d36 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -879,6 +879,7 @@ export const zhTW: LocalizationResource = { captcha_invalid: '由於安全驗證失敗,註冊未成功。請重新整理頁面再試一次,或聯絡支援以取得協助。', captcha_unavailable: '由於機器人驗證失敗導致註冊未成功。請重新整理頁面再試一次,或聯絡支援以取得協助。', form_code_incorrect: undefined, + form_email_address_blocked: '不支援臨時電子郵件服務。請使用您的常規電子郵件地址建立帳戶。', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 286f64b2bbf..3e8cefd8959 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1350,6 +1350,7 @@ type UnstableErrors = WithParamName<{ form_param_type_invalid: LocalizationValue; form_param_type_invalid__phone_number: LocalizationValue; form_param_type_invalid__email_address: LocalizationValue; + form_email_address_blocked: LocalizationValue; form_password_length_too_short: LocalizationValue; form_param_nil: LocalizationValue; form_code_incorrect: LocalizationValue; From 375a32d0f44933605ffb513ff28f522ac5e851d6 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Thu, 11 Dec 2025 19:06:41 -0500 Subject: [PATCH 013/123] =?UTF-8?q?feat(clerk-js,localizations,types):=20A?= =?UTF-8?q?dd=20ability=20for=20users=20to=20connect=20a=20Solana=20enable?= =?UTF-8?q?d=20wallet=20via=C2=A0``=20(#7435)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kenton Duprey --- .changeset/afraid-apes-cough.md | 7 ++ packages/clerk-js/bundlewatch.config.json | 2 +- .../src/ui/common/WalletInitialIcon.tsx | 4 +- .../SignInFactorOneSolanaWalletsCard.tsx | 4 +- .../SignUp/SignUpStartSolanaWalletsCard.tsx | 26 +++- .../ui/components/UserProfile/Web3Form.tsx | 112 +++++++++++------- .../ui/components/UserProfile/Web3Section.tsx | 2 +- .../Web3SelectSolanaWalletScreen.tsx | 79 ++++++++++++ .../ui/customizables/elementDescriptors.ts | 14 +-- .../ui/elements/Web3SolanaWalletButtons.tsx | 12 +- packages/localizations/src/ar-SA.ts | 25 ++-- packages/localizations/src/be-BY.ts | 26 ++-- packages/localizations/src/bg-BG.ts | 26 ++-- packages/localizations/src/bn-IN.ts | 27 +++-- packages/localizations/src/ca-ES.ts | 26 ++-- packages/localizations/src/cs-CZ.ts | 26 ++-- packages/localizations/src/da-DK.ts | 26 ++-- packages/localizations/src/de-DE.ts | 27 +++-- packages/localizations/src/el-GR.ts | 26 ++-- packages/localizations/src/en-GB.ts | 26 ++-- packages/localizations/src/en-US.ts | 6 +- packages/localizations/src/es-CR.ts | 26 ++-- packages/localizations/src/es-ES.ts | 26 ++-- packages/localizations/src/es-MX.ts | 26 ++-- packages/localizations/src/es-UY.ts | 26 ++-- packages/localizations/src/fa-IR.ts | 25 ++-- packages/localizations/src/fi-FI.ts | 25 ++-- packages/localizations/src/fr-FR.ts | 26 ++-- packages/localizations/src/he-IL.ts | 25 ++-- packages/localizations/src/hi-IN.ts | 27 +++-- packages/localizations/src/hr-HR.ts | 26 ++-- packages/localizations/src/hu-HU.ts | 26 ++-- packages/localizations/src/id-ID.ts | 26 ++-- packages/localizations/src/is-IS.ts | 26 ++-- packages/localizations/src/it-IT.ts | 26 ++-- packages/localizations/src/ja-JP.ts | 25 ++-- packages/localizations/src/kk-KZ.ts | 26 ++-- packages/localizations/src/ko-KR.ts | 25 ++-- packages/localizations/src/mn-MN.ts | 27 +++-- packages/localizations/src/ms-MY.ts | 26 ++-- packages/localizations/src/nb-NO.ts | 26 ++-- packages/localizations/src/nl-BE.ts | 27 +++-- packages/localizations/src/nl-NL.ts | 27 +++-- packages/localizations/src/pl-PL.ts | 26 ++-- packages/localizations/src/pt-BR.ts | 25 ++-- packages/localizations/src/pt-PT.ts | 25 ++-- packages/localizations/src/ro-RO.ts | 26 ++-- packages/localizations/src/ru-RU.ts | 27 +++-- packages/localizations/src/sk-SK.ts | 26 ++-- packages/localizations/src/sr-RS.ts | 25 ++-- packages/localizations/src/sv-SE.ts | 26 ++-- packages/localizations/src/ta-IN.ts | 26 ++-- packages/localizations/src/te-IN.ts | 26 ++-- packages/localizations/src/th-TH.ts | 25 ++-- packages/localizations/src/tr-TR.ts | 26 ++-- packages/localizations/src/uk-UA.ts | 26 ++-- packages/localizations/src/vi-VN.ts | 25 ++-- packages/localizations/src/zh-CN.ts | 25 ++-- packages/localizations/src/zh-TW.ts | 25 ++-- packages/shared/src/types/appearance.ts | 14 +-- packages/shared/src/types/elementIds.ts | 3 +- packages/shared/src/types/localization.ts | 6 +- 62 files changed, 974 insertions(+), 559 deletions(-) create mode 100644 .changeset/afraid-apes-cough.md create mode 100644 packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx diff --git a/.changeset/afraid-apes-cough.md b/.changeset/afraid-apes-cough.md new file mode 100644 index 00000000000..d56bab12231 --- /dev/null +++ b/.changeset/afraid-apes-cough.md @@ -0,0 +1,7 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/shared': minor +--- + +Add Web3 Solana support to `` diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index f1ff076fd5b..562644e636a 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,6 +1,6 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "922.1KB" }, + { "path": "./dist/clerk.js", "maxSize": "922.6KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, diff --git a/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx index 362a9f64312..3272f295480 100644 --- a/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx +++ b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx @@ -16,8 +16,8 @@ export const WalletInitialIcon = (props: WalletInitialIconProps) => { return ( ({ ...common.centeredFlex('inline-flex'), width: t.space.$4, diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index 321ac4ee56d..aa4674a24e7 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -9,7 +9,7 @@ import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; import { Header } from '@/ui/elements/Header'; import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; -const Web3WalletButtons = lazy(() => +const Web3SolanaWalletButtons = lazy(() => import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ default: m.Web3SolanaWalletButtons, })), @@ -60,7 +60,7 @@ const SignInFactorOneSolanaWalletsCardInner = () => { } > - { return clerk .authenticateWithWeb3({ diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx index 6968e59052a..ed00e6e3e69 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -2,14 +2,14 @@ import { useClerk } from '@clerk/shared/react'; import { lazy, Suspense } from 'react'; import { withRedirectToAfterSignUp, withRedirectToSignUpTask } from '@/ui/common/withRedirect'; -import { descriptors, Flex, Flow, localizationKeys } from '@/ui/customizables'; +import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables'; import { BackLink } from '@/ui/elements/BackLink'; import { Card } from '@/ui/elements/Card'; import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; import { Header } from '@/ui/elements/Header'; import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; -const Web3WalletButtons = lazy(() => +const Web3SolanaWalletButtons = lazy(() => import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ default: m.Web3SolanaWalletButtons, })), @@ -41,8 +41,26 @@ const SignUpStartSolanaWalletsCardInner = () => { direction='col' gap={4} > - - ({ + height: '100%', + minHeight: t.sizes.$32, + })} + > + + + } + > + { return clerk .authenticateWithWeb3({ diff --git a/packages/clerk-js/src/ui/components/UserProfile/Web3Form.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3Form.tsx index 8ebea04501d..c80ce1eb8c0 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/Web3Form.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/Web3Form.tsx @@ -1,7 +1,10 @@ import { useReverification, useUser } from '@clerk/shared/react'; import type { Web3Provider, Web3Strategy } from '@clerk/shared/types'; -import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Web3SelectSolanaWalletScreen } from '@/ui/components/UserProfile/Web3SelectSolanaWalletScreen'; +import { Action } from '@/ui/elements/Action'; +import { useActionContext } from '@/ui/elements/Action/ActionRoot'; +import { useCardState } from '@/ui/elements/contexts'; import { ProfileSection } from '@/ui/elements/Section'; import { getFieldError, handleError } from '@/ui/utils/errorHandler'; @@ -9,27 +12,41 @@ import { generateWeb3Signature, getWeb3Identifier } from '../../../utils/web3'; import { descriptors, Image, localizationKeys, Text } from '../../customizables'; import { useEnabledThirdPartyProviders } from '../../hooks'; -export const AddWeb3WalletActionMenu = withCardStateProvider(({ onClick }: { onClick?: () => void }) => { +export const AddWeb3WalletActionMenu = () => { const card = useCardState(); + const { open } = useActionContext(); const { user } = useUser(); const { strategies, strategyToDisplayData } = useEnabledThirdPartyProviders(); - const enabledStrategies = strategies.filter(s => s.startsWith('web3')) as Web3Strategy[]; - const connectedStrategies = user?.verifiedWeb3Wallets.map(w => w.verification.strategy) as Web3Strategy[]; + const connectedStrategies = user?.verifiedWeb3Wallets?.map(w => w.verification.strategy) ?? ([] as Web3Strategy[]); const unconnectedStrategies = enabledStrategies.filter(strategy => { - return !connectedStrategies.includes(strategy); + return !connectedStrategies.includes(strategy) && strategyToDisplayData[strategy]; }); + + if (unconnectedStrategies.length === 0) { + return null; + } + const createWeb3Wallet = useReverification((identifier: string) => user?.createWeb3Wallet({ web3Wallet: identifier }), ); - const connect = async (strategy: Web3Strategy) => { + // If the user selects `web3_solana_signature` as their strategy, + // we need to obtain the wallet name to use when connecting and signing the message during the auth flow + // + // Otherwise, our current Web3 providers are all based on the wallet provider name, + // which is sufficient for our current use case when connecting to a wallet. + const connect = async ({ strategy, walletName }: { strategy: Web3Strategy; walletName?: string }) => { + if (strategy === 'web3_solana_signature' && !walletName) { + open('web3Wallets'); + return; + } const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; card.setError(undefined); try { card.setLoading(strategy); - const identifier = await getWeb3Identifier({ provider }); + const identifier = await getWeb3Identifier({ provider, walletName }); if (!user) { throw new Error('user is not defined'); @@ -38,7 +55,7 @@ export const AddWeb3WalletActionMenu = withCardStateProvider(({ onClick }: { onC let web3Wallet = await createWeb3Wallet(identifier); web3Wallet = await web3Wallet?.prepareVerification({ strategy }); const message = web3Wallet?.verification.message as string; - const signature = await generateWeb3Signature({ identifier, nonce: message, provider }); + const signature = await generateWeb3Signature({ identifier, nonce: message, provider, walletName }); await web3Wallet?.attemptVerification({ signature }); card.setIdle(); } catch (err) { @@ -52,45 +69,48 @@ export const AddWeb3WalletActionMenu = withCardStateProvider(({ onClick }: { onC } }; - if (unconnectedStrategies.length === 0) { - return null; - } - return ( <> - - {unconnectedStrategies.map(strategy => ( - connect(strategy)} - isLoading={card.loadingMetadata === strategy} - isDisabled={card.isLoading} - localizationKey={localizationKeys('userProfile.web3WalletPage.web3WalletButtonsBlockButton', { - provider: strategyToDisplayData[strategy].name, - })} - sx={t => ({ - justifyContent: 'start', - gap: t.space.$2, - })} - leftIcon={ - {`Connect ({ width: theme.sizes.$5 })} - /> - } - /> - ))} - + + + {unconnectedStrategies.map(strategy => ( + connect({ strategy })} + isLoading={card.loadingMetadata === strategy} + isDisabled={card.isLoading} + localizationKey={localizationKeys('userProfile.web3WalletPage.web3WalletButtonsBlockButton', { + provider: strategyToDisplayData[strategy].name, + })} + sx={t => ({ + justifyContent: 'start', + gap: t.space.$2, + })} + leftIcon={ + {`Connect ({ width: theme.sizes.$5 })} + /> + } + /> + ))} + + + + + + + + {card.error && ( ); -}); +}; diff --git a/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx index 1902f819f19..cbdd0934091 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx @@ -108,7 +108,7 @@ export const Web3Section = withCardStateProvider( ); })} - {shouldAllowCreation && setActionValue(null)} />} + {shouldAllowCreation && } ); diff --git a/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx new file mode 100644 index 00000000000..707b591f056 --- /dev/null +++ b/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx @@ -0,0 +1,79 @@ +import type { Web3Strategy } from '@clerk/shared/types'; +import { lazy, Suspense } from 'react'; + +import { useActionContext } from '@/ui/elements/Action/ActionRoot'; +import { useCardState } from '@/ui/elements/contexts'; +import { Form } from '@/ui/elements/Form'; +import { FormButtonContainer } from '@/ui/elements/FormButtons'; +import { FormContainer } from '@/ui/elements/FormContainer'; + +import { Button, descriptors, Flex, localizationKeys, Spinner } from '../../customizables'; + +const Web3SolanaWalletButtons = lazy(() => + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ + default: m.Web3SolanaWalletButtons, + })), +); + +export type Web3SelectWalletProps = { + onConnect: (params: { strategy: Web3Strategy; walletName: string }) => Promise; +}; + +export const Web3SelectSolanaWalletScreen = ({ onConnect }: Web3SelectWalletProps) => { + const card = useCardState(); + const { close } = useActionContext(); + + const onClick = async ({ walletName }: { walletName: string }) => { + card.setLoading(walletName); + try { + await onConnect({ strategy: 'web3_solana_signature', walletName }); + card.setIdle(); + } catch (err) { + card.setIdle(); + console.error(err); + } finally { + close(); + } + }; + + return ( + + + ({ + height: '100%', + minHeight: t.sizes.$32, + })} + > + + + } + > + + + + + , + ); + + const button = container.querySelector('button'); + expect(button?.hasAttribute('appearance')).toBe(false); + }); }); diff --git a/packages/react/src/components/__tests__/SignUpButton.test.tsx b/packages/react/src/components/__tests__/SignUpButton.test.tsx index f3156c19bb9..89f0d63e153 100644 --- a/packages/react/src/components/__tests__/SignUpButton.test.tsx +++ b/packages/react/src/components/__tests__/SignUpButton.test.tsx @@ -109,4 +109,29 @@ describe('', () => { ); }).toThrow(); }); + + it('does not pass unsafeMetadata prop to child element', () => { + const { container } = render( + + + , + ); + + const button = container.querySelector('button'); + expect(button?.hasAttribute('unsafeMetadata')).toBe(false); + }); + + it('does not pass appearance prop to child element', () => { + const { container } = render( + + + , + ); + + const button = container.querySelector('button'); + expect(button?.hasAttribute('appearance')).toBe(false); + }); }); From c3ff1f899098e235ff8651f9e31e2055fc43ba8e Mon Sep 17 00:00:00 2001 From: Jacob Foshee Date: Wed, 14 Jan 2026 12:33:33 -0600 Subject: [PATCH 051/123] feat(backend): Add OauthAccessToken idToken member (#7599) Co-authored-by: Cursor Agent --- .changeset/oauth-idtoken-member.md | 5 +++++ packages/backend/src/api/resources/JSON.ts | 2 ++ packages/backend/src/api/resources/OauthAccessToken.ts | 6 ++++++ 3 files changed, 13 insertions(+) create mode 100644 .changeset/oauth-idtoken-member.md diff --git a/.changeset/oauth-idtoken-member.md b/.changeset/oauth-idtoken-member.md new file mode 100644 index 00000000000..f13ed6141fc --- /dev/null +++ b/.changeset/oauth-idtoken-member.md @@ -0,0 +1,5 @@ +--- +"@clerk/backend": patch +--- + +Add optional `idToken` member to `OauthAccessToken` returned by `getUserOauthAccessToken`. The ID token is retrieved from OIDC providers and is only present for OIDC-compliant OAuth 2.0 providers when available. diff --git a/packages/backend/src/api/resources/JSON.ts b/packages/backend/src/api/resources/JSON.ts index 4aee90821ea..88e3d0c001e 100644 --- a/packages/backend/src/api/resources/JSON.ts +++ b/packages/backend/src/api/resources/JSON.ts @@ -316,6 +316,8 @@ export interface OauthAccessTokenJSON { // Only set in OAuth 1.0 tokens token_secret?: string; expires_at?: number; + // Only present for OIDC-compliant OAuth 2.0 providers when available + id_token?: string; } export interface OAuthApplicationJSON extends ClerkResourceJSON { diff --git a/packages/backend/src/api/resources/OauthAccessToken.ts b/packages/backend/src/api/resources/OauthAccessToken.ts index ce08f22fcc6..e83c8f4089c 100644 --- a/packages/backend/src/api/resources/OauthAccessToken.ts +++ b/packages/backend/src/api/resources/OauthAccessToken.ts @@ -10,6 +10,11 @@ export class OauthAccessToken { readonly scopes?: string[], readonly tokenSecret?: string, readonly expiresAt?: number, + /** + * The ID token retrieved from the OIDC provider. + * Only present for OIDC-compliant OAuth 2.0 providers when available. + */ + readonly idToken?: string, ) {} static fromJSON(data: OauthAccessTokenJSON) { @@ -22,6 +27,7 @@ export class OauthAccessToken { data.scopes, data.token_secret, data.expires_at, + data.id_token, ); } } From 271ddeb0b47357f7da316eef389ae46b180c36da Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:53:41 -0300 Subject: [PATCH 052/123] feat(clerk-js,shared,localizations): Surface organization creation defaults (#7603) --- .changeset/three-impalas-push.md | 7 ++ packages/clerk-js/bundlewatch.config.json | 4 +- .../resources/OrganizationCreationDefaults.ts | 80 +++++++++++++++++ .../core/resources/OrganizationSettings.ts | 12 +++ packages/clerk-js/src/core/resources/User.ts | 3 + packages/clerk-js/src/test/fixture-helpers.ts | 4 + packages/clerk-js/src/test/fixtures.ts | 3 + .../OrganizationProfileAvatarUploader.tsx | 9 +- .../CreateOrganizationScreen.tsx | 68 +++++++++++++- .../OrganizationCreationDefaultsAlert.tsx | 41 +++++++++ .../__tests__/TaskChooseOrganization.test.tsx | 90 ++++++++++++++++++- .../tasks/TaskChooseOrganization/index.tsx | 22 ++++- packages/clerk-js/src/ui/elements/Avatar.tsx | 86 +++++++++++++++++- .../src/ui/elements/AvatarUploader.tsx | 3 +- .../src/ui/elements/OrganizationAvatar.tsx | 8 +- packages/localizations/src/ar-SA.ts | 4 + packages/localizations/src/be-BY.ts | 4 + packages/localizations/src/bg-BG.ts | 4 + packages/localizations/src/bn-IN.ts | 4 + packages/localizations/src/ca-ES.ts | 4 + packages/localizations/src/cs-CZ.ts | 4 + packages/localizations/src/da-DK.ts | 4 + packages/localizations/src/de-DE.ts | 4 + packages/localizations/src/el-GR.ts | 4 + packages/localizations/src/en-GB.ts | 4 + packages/localizations/src/en-US.ts | 4 + packages/localizations/src/es-CR.ts | 4 + packages/localizations/src/es-ES.ts | 4 + packages/localizations/src/es-MX.ts | 4 + packages/localizations/src/es-UY.ts | 4 + packages/localizations/src/fa-IR.ts | 4 + packages/localizations/src/fi-FI.ts | 4 + packages/localizations/src/fr-FR.ts | 4 + packages/localizations/src/he-IL.ts | 4 + packages/localizations/src/hi-IN.ts | 4 + packages/localizations/src/hr-HR.ts | 4 + packages/localizations/src/hu-HU.ts | 4 + packages/localizations/src/id-ID.ts | 4 + packages/localizations/src/is-IS.ts | 4 + packages/localizations/src/it-IT.ts | 4 + packages/localizations/src/ja-JP.ts | 4 + packages/localizations/src/kk-KZ.ts | 4 + packages/localizations/src/ko-KR.ts | 4 + packages/localizations/src/mn-MN.ts | 4 + packages/localizations/src/ms-MY.ts | 4 + packages/localizations/src/nb-NO.ts | 4 + packages/localizations/src/nl-BE.ts | 4 + packages/localizations/src/nl-NL.ts | 4 + packages/localizations/src/pl-PL.ts | 4 + packages/localizations/src/pt-BR.ts | 4 + packages/localizations/src/pt-PT.ts | 4 + packages/localizations/src/ro-RO.ts | 4 + packages/localizations/src/ru-RU.ts | 4 + packages/localizations/src/sk-SK.ts | 4 + packages/localizations/src/sr-RS.ts | 4 + packages/localizations/src/sv-SE.ts | 4 + packages/localizations/src/ta-IN.ts | 4 + packages/localizations/src/te-IN.ts | 4 + packages/localizations/src/th-TH.ts | 4 + packages/localizations/src/tr-TR.ts | 4 + packages/localizations/src/uk-UA.ts | 4 + packages/localizations/src/vi-VN.ts | 4 + packages/localizations/src/zh-CN.ts | 4 + packages/localizations/src/zh-TW.ts | 4 + packages/shared/src/types/index.ts | 1 + packages/shared/src/types/localization.ts | 3 + .../src/types/organizationCreationDefaults.ts | 34 +++++++ .../shared/src/types/organizationSettings.ts | 6 ++ packages/shared/src/types/snapshots.ts | 3 + packages/shared/src/types/user.ts | 2 + 70 files changed, 668 insertions(+), 17 deletions(-) create mode 100644 .changeset/three-impalas-push.md create mode 100644 packages/clerk-js/src/core/resources/OrganizationCreationDefaults.ts create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/OrganizationCreationDefaultsAlert.tsx create mode 100644 packages/shared/src/types/organizationCreationDefaults.ts diff --git a/.changeset/three-impalas-push.md b/.changeset/three-impalas-push.md new file mode 100644 index 00000000000..749388dd5fc --- /dev/null +++ b/.changeset/three-impalas-push.md @@ -0,0 +1,7 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/shared': minor +--- + +Surface organization creation defaults with prefilled form fields and advisory warnings diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 584bbf4d296..a055cc6954f 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,11 +1,11 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "924KB" }, + { "path": "./dist/clerk.js", "maxSize": "928KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, { "path": "./dist/ui-common*.js", "maxSize": "123KB" }, - { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "123KB" }, + { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "126KB" }, { "path": "./dist/vendors*.js", "maxSize": "50KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" }, { "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" }, diff --git a/packages/clerk-js/src/core/resources/OrganizationCreationDefaults.ts b/packages/clerk-js/src/core/resources/OrganizationCreationDefaults.ts new file mode 100644 index 00000000000..94274a7a3ca --- /dev/null +++ b/packages/clerk-js/src/core/resources/OrganizationCreationDefaults.ts @@ -0,0 +1,80 @@ +import type { + OrganizationCreationAdvisorySeverity, + OrganizationCreationAdvisoryType, + OrganizationCreationDefaultsJSON, + OrganizationCreationDefaultsJSONSnapshot, + OrganizationCreationDefaultsResource, +} from '@clerk/shared/types'; + +import { BaseResource } from './internal'; + +export class OrganizationCreationDefaults extends BaseResource implements OrganizationCreationDefaultsResource { + advisory: { + code: OrganizationCreationAdvisoryType; + severity: OrganizationCreationAdvisorySeverity; + meta: Record; + } | null = null; + form: { + name: string; + slug: string; + logo: string | null; + blurHash: string | null; + } = { + name: '', + slug: '', + logo: null, + blurHash: null, + }; + + public constructor(data: OrganizationCreationDefaultsJSON | OrganizationCreationDefaultsJSONSnapshot | null = null) { + super(); + this.fromJSON(data); + } + + protected fromJSON(data: OrganizationCreationDefaultsJSON | OrganizationCreationDefaultsJSONSnapshot | null): this { + if (!data) { + return this; + } + + if (data.advisory) { + this.advisory = this.withDefault(data.advisory, this.advisory ?? null); + } + + if (data.form) { + this.form.name = this.withDefault(data.form.name, this.form.name); + this.form.slug = this.withDefault(data.form.slug, this.form.slug); + this.form.logo = this.withDefault(data.form.logo, this.form.logo); + this.form.blurHash = this.withDefault(data.form.blur_hash, this.form.blurHash); + } + + return this; + } + + static async retrieve(): Promise { + return await BaseResource._fetch({ + path: '/me/organization_creation_defaults', + method: 'GET', + }).then(res => { + const data = res?.response as unknown as OrganizationCreationDefaultsJSON; + return new OrganizationCreationDefaults(data); + }); + } + + public __internal_toSnapshot(): OrganizationCreationDefaultsJSONSnapshot { + return { + advisory: this.advisory + ? { + code: this.advisory.code, + meta: this.advisory.meta, + severity: this.advisory.severity, + } + : null, + form: { + name: this.form.name, + slug: this.form.slug, + logo: this.form.logo, + blur_hash: this.form.blurHash, + }, + } as unknown as OrganizationCreationDefaultsJSONSnapshot; + } +} diff --git a/packages/clerk-js/src/core/resources/OrganizationSettings.ts b/packages/clerk-js/src/core/resources/OrganizationSettings.ts index 8960b347d62..a9fa5873d49 100644 --- a/packages/clerk-js/src/core/resources/OrganizationSettings.ts +++ b/packages/clerk-js/src/core/resources/OrganizationSettings.ts @@ -23,6 +23,11 @@ export class OrganizationSettings extends BaseResource implements OrganizationSe } = { disabled: false, }; + organizationCreationDefaults: { + enabled: boolean; + } = { + enabled: false, + }; enabled: boolean = false; maxAllowedMemberships: number = 1; forceOrganizationSelection!: boolean; @@ -51,6 +56,13 @@ export class OrganizationSettings extends BaseResource implements OrganizationSe this.slug.disabled = this.withDefault(data.slug.disabled, this.slug.disabled); } + if (data.organization_creation_defaults) { + this.organizationCreationDefaults.enabled = this.withDefault( + data.organization_creation_defaults.enabled, + this.organizationCreationDefaults.enabled, + ); + } + this.enabled = this.withDefault(data.enabled, this.enabled); this.maxAllowedMemberships = this.withDefault(data.max_allowed_memberships, this.maxAllowedMemberships); this.forceOrganizationSelection = this.withDefault( diff --git a/packages/clerk-js/src/core/resources/User.ts b/packages/clerk-js/src/core/resources/User.ts index 8f61851b1c5..92f51de6681 100644 --- a/packages/clerk-js/src/core/resources/User.ts +++ b/packages/clerk-js/src/core/resources/User.ts @@ -55,6 +55,7 @@ import { UserOrganizationInvitation, Web3Wallet, } from './internal'; +import { OrganizationCreationDefaults } from './OrganizationCreationDefaults'; export class User extends BaseResource implements UserResource { pathRoot = '/me'; @@ -280,6 +281,8 @@ export class User extends BaseResource implements UserResource { getOrganizationMemberships: GetOrganizationMemberships = retrieveMembership => OrganizationMembership.retrieve(retrieveMembership); + getOrganizationCreationDefaults = () => OrganizationCreationDefaults.retrieve(); + leaveOrganization = async (organizationId: string): Promise => { const json = ( await BaseResource._fetch({ diff --git a/packages/clerk-js/src/test/fixture-helpers.ts b/packages/clerk-js/src/test/fixture-helpers.ts index 1a3655d754c..dfd935b3fd8 100644 --- a/packages/clerk-js/src/test/fixture-helpers.ts +++ b/packages/clerk-js/src/test/fixture-helpers.ts @@ -346,6 +346,9 @@ const createOrganizationSettingsFixtureHelpers = (environment: EnvironmentJSON) const withOrganizationSlug = (enabled = false) => { os.slug.disabled = !enabled; }; + const withOrganizationCreationDefaults = (enabled = false) => { + os.organization_creation_defaults.enabled = enabled; + }; const withOrganizationDomains = (modes?: OrganizationEnrollmentMode[], defaultRole?: string) => { os.domains.enabled = true; @@ -358,6 +361,7 @@ const createOrganizationSettingsFixtureHelpers = (environment: EnvironmentJSON) withOrganizationDomains, withForceOrganizationSelection, withOrganizationSlug, + withOrganizationCreationDefaults, }; }; diff --git a/packages/clerk-js/src/test/fixtures.ts b/packages/clerk-js/src/test/fixtures.ts index 9b3403f0b57..ada0f9775cd 100644 --- a/packages/clerk-js/src/test/fixtures.ts +++ b/packages/clerk-js/src/test/fixtures.ts @@ -92,6 +92,9 @@ const createBaseOrganizationSettings = (): OrganizationSettingsJSON => { slug: { disabled: true, }, + organization_creation_defaults: { + enabled: false, + }, } as unknown as OrganizationSettingsJSON; }; diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader.tsx index 6c146a20312..fa2c5133528 100644 --- a/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader.tsx @@ -8,9 +8,13 @@ import { Col, descriptors, Text } from '../../customizables'; import { localizationKeys } from '../../localization'; export const OrganizationProfileAvatarUploader = ( - props: Omit & { organization: Partial }, + props: Omit & { + organization: Partial; + /** Shows a loading spinner while the image is loading */ + showLoadingSpinner?: boolean; + }, ) => { - const { organization, ...rest } = props; + const { organization, showLoadingSpinner, ...rest } = props; return ( @@ -28,6 +32,7 @@ export const OrganizationProfileAvatarUploader = ( avatarPreview={ theme.sizes.$16} + showLoadingSpinner={showLoadingSpinner} {...organization} /> } diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx index 97b9241e5f6..0b8ab83cc94 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx @@ -1,22 +1,28 @@ import { useOrganizationList } from '@clerk/shared/react'; -import type { CreateOrganizationParams } from '@clerk/shared/types'; +import type { CreateOrganizationParams, OrganizationCreationDefaultsResource } from '@clerk/shared/types'; +import { useState } from 'react'; +import { OrganizationProfileAvatarUploader } from '@/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader'; import { useEnvironment } from '@/ui/contexts'; import { useSessionTasksContext, useTaskChooseOrganizationContext } from '@/ui/contexts/components/SessionTasks'; -import { localizationKeys } from '@/ui/customizables'; +import { Icon, localizationKeys } from '@/ui/customizables'; import { useCardState } from '@/ui/elements/contexts'; import { Form } from '@/ui/elements/Form'; import { FormButtonContainer } from '@/ui/elements/FormButtons'; import { FormContainer } from '@/ui/elements/FormContainer'; import { Header } from '@/ui/elements/Header'; +import { IconButton } from '@/ui/elements/IconButton'; +import { Upload } from '@/ui/icons'; import { createSlug } from '@/ui/utils/createSlug'; import { handleError } from '@/ui/utils/errorHandler'; import { useFormControl } from '@/ui/utils/useFormControl'; import { organizationListParams } from '../../../OrganizationSwitcher/utils'; +import { OrganizationCreationDefaultsAlert } from './OrganizationCreationDefaultsAlert'; type CreateOrganizationScreenProps = { onCancel?: () => void; + organizationCreationDefaults?: OrganizationCreationDefaultsResource | null; }; export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) => { @@ -27,13 +33,14 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = userMemberships: organizationListParams.userMemberships, }); const { organizationSettings } = useEnvironment(); + const [file, setFile] = useState(); - const nameField = useFormControl('name', '', { + const nameField = useFormControl('name', props.organizationCreationDefaults?.form?.name ?? '', { type: 'text', label: localizationKeys('taskChooseOrganization.createOrganization.formFieldLabel__name'), placeholder: localizationKeys('taskChooseOrganization.createOrganization.formFieldInputPlaceholder__name'), }); - const slugField = useFormControl('slug', '', { + const slugField = useFormControl('slug', props.organizationCreationDefaults?.form?.slug ?? '', { type: 'text', label: localizationKeys('taskChooseOrganization.createOrganization.formFieldLabel__slug'), placeholder: localizationKeys('taskChooseOrganization.createOrganization.formFieldInputPlaceholder__slug'), @@ -57,6 +64,15 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = const organization = await createOrganization(createOrgParams); + if (file) { + await organization.setLogo({ file }); + } else if (defaultLogoUrl) { + const response = await fetch(defaultLogoUrl); + const blob = await response.blob(); + const logoFile = new File([blob], 'logo', { type: blob.type }); + await organization.setLogo({ file: logoFile }); + } + await setActive({ organization, navigate: async ({ session }) => { @@ -77,7 +93,13 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = slugField.setValue(val); }; + const onAvatarRemove = () => { + card.setIdle(); + return setFile(null); + }; + const isSubmitButtonDisabled = !nameField.value || !isLoaded; + const defaultLogoUrl = file === undefined ? props.organizationCreationDefaults?.form?.logo : undefined; return ( <> @@ -90,6 +112,44 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = ({ padding: `${t.space.$none} ${t.space.$10} ${t.space.$8}` })}> + + await setFile(file)} + onAvatarRemove={file || defaultLogoUrl ? onAvatarRemove : null} + showLoadingSpinner={!!defaultLogoUrl} + avatarPreviewPlaceholder={ + ({ + color: t.colors.$colorMutedForeground, + transitionDuration: t.transitionDuration.$controls, + })} + /> + } + sx={t => ({ + width: t.sizes.$16, + height: t.sizes.$16, + borderRadius: t.radii.$md, + borderWidth: t.borderWidths.$normal, + borderStyle: t.borderStyles.$dashed, + borderColor: t.colors.$borderAlpha200, + backgroundColor: t.colors.$neutralAlpha50, + ':hover': { + backgroundColor: t.colors.$neutralAlpha50, + svg: { + transform: 'scale(1.2)', + }, + }, + })} + /> + } + /> + + + ); +} + +const advisoryToLocalizationKey = (advisory?: OrganizationCreationDefaultsResource['advisory']) => { + if (!advisory) { + return null; + } + + switch (advisory.code) { + case 'organization_already_exists': + return localizationKeys('taskChooseOrganization.alerts.organizationAlreadyExists', { + organizationDomain: advisory.meta.organization_domain, + organizationName: advisory.meta.organization_name, + }); + default: + return null; + } +}; diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx index f6daf9e1dcd..14ce04a7364 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx @@ -1,5 +1,5 @@ import userEvent from '@testing-library/user-event'; -import { describe, expect, it } from 'vitest'; +import { beforeEach, describe, expect, it } from 'vitest'; import { bindCreateFixtures } from '@/test/create-fixtures'; import { render } from '@/test/utils'; @@ -7,12 +7,17 @@ import { createFakeUserOrganizationMembership, createFakeUserOrganizationSuggestion, } from '@/ui/components/OrganizationSwitcher/__tests__/test-utils'; +import { clearFetchCache } from '@/ui/hooks'; import { TaskChooseOrganization } from '..'; const { createFixtures } = bindCreateFixtures('TaskChooseOrganization'); describe('TaskChooseOrganization', () => { + beforeEach(() => { + clearFetchCache(); + }); + it('does not render component without existing session task', async () => { const { wrapper } = await createFixtures(f => { f.withOrganizations(); @@ -314,4 +319,87 @@ describe('TaskChooseOrganization', () => { expect(await findByText('Existing Org')).toBeInTheDocument(); }); }); + + describe('with organization creation defaults', () => { + describe('when enabled on environment', () => { + it('displays warning when organization already exists for user email domain', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withOrganizations(); + f.withForceOrganizationSelection(); + f.withOrganizationCreationDefaults(true); + f.withUser({ + email_addresses: ['test@clerk.com'], + create_organization_enabled: true, + tasks: [{ key: 'choose-organization' }], + }); + }); + + fixtures.clerk.user?.getOrganizationCreationDefaults.mockReturnValueOnce( + Promise.resolve({ + advisory: { + code: 'organization_already_exists', + severity: 'warning', + meta: { organization_domain: 'test@clerk.com', organization_name: 'Clerk' }, + }, + }), + ); + + const { findByText } = render(, { wrapper }); + + expect( + await findByText( + /an organization already exists for the detected company name \(Clerk\) and test@clerk\.com/i, + ), + ).toBeInTheDocument(); + }); + + it('prefills create organization form with defaults', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withOrganizations(); + f.withOrganizationSlug(true); + f.withForceOrganizationSelection(); + f.withOrganizationCreationDefaults(true); + f.withUser({ + email_addresses: ['test@clerk.com'], + create_organization_enabled: true, + tasks: [{ key: 'choose-organization' }], + }); + }); + + fixtures.clerk.user?.getOrganizationCreationDefaults.mockReturnValueOnce( + Promise.resolve({ + form: { + name: 'Test Org', + slug: 'test-org', + logo: null, + }, + }), + ); + + const { findByRole } = render(, { wrapper }); + + expect(await findByRole('textbox', { name: /name/i })).toHaveValue('Test Org'); + expect(await findByRole('textbox', { name: /slug/i })).toHaveValue('test-org'); + }); + }); + + describe('when disabled on environment', () => { + it('does not fetch for creation defaults', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withOrganizations(); + f.withForceOrganizationSelection(); + f.withOrganizationCreationDefaults(false); + f.withUser({ + email_addresses: ['test@clerk.com'], + create_organization_enabled: true, + tasks: [{ key: 'choose-organization' }], + }); + }); + + render(, { wrapper }); + + expect(fixtures.clerk.user?.getOrganizationCreationDefaults).not.toHaveBeenCalled(); + }); + }); + }); }); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx index dc3375e0d0b..170167214f6 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx @@ -1,11 +1,13 @@ import { useClerk, useSession, useUser } from '@clerk/shared/react'; +import type { OrganizationCreationDefaultsResource } from '@clerk/shared/types'; import { useState } from 'react'; -import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts'; +import { useEnvironment, useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts'; import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables'; import { Card } from '@/ui/elements/Card'; import { withCardStateProvider } from '@/ui/elements/contexts'; import { Header } from '@/ui/elements/Header'; +import { useFetch } from '@/ui/hooks'; import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions'; import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView'; @@ -16,8 +18,17 @@ import { CreateOrganizationScreen } from './CreateOrganizationScreen'; const TaskChooseOrganizationInternal = () => { const { user } = useUser(); const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView(); + const { organizationSettings } = useEnvironment(); + const organizationCreationDefaults = useFetch( + organizationSettings.organizationCreationDefaults?.enabled ? user?.getOrganizationCreationDefaults : undefined, + 'organization-creation-defaults', + ); - const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading; + const isLoading = + userMemberships?.isLoading || + userInvitations?.isLoading || + userSuggestions?.isLoading || + organizationCreationDefaults?.isLoading; const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count); const isOrganizationCreationDisabled = !isLoading && !user?.createOrganizationEnabled && !hasExistingResources; @@ -47,7 +58,10 @@ const TaskChooseOrganizationInternal = () => { /> ) : ( - + )} @@ -103,6 +117,7 @@ const TaskChooseOrganizationCardFooter = () => { type TaskChooseOrganizationFlowsProps = { initialFlow: 'create' | 'choose'; + organizationCreationDefaults?: OrganizationCreationDefaultsResource | null; }; const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrganizationFlowsProps) => { @@ -112,6 +127,7 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga return ( setCurrentFlow('choose') : undefined} + organizationCreationDefaults={props.organizationCreationDefaults} /> ); } diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx index 7f691fa032e..958df6b1eb2 100644 --- a/packages/clerk-js/src/ui/elements/Avatar.tsx +++ b/packages/clerk-js/src/ui/elements/Avatar.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Box, descriptors, Flex, Image, Text } from '../customizables'; +import { Box, descriptors, Flex, Image, Spinner, Text } from '../customizables'; import type { ElementDescriptor } from '../customizables/elementDescriptors'; import type { InternalTheme } from '../foundations'; import type { PropsOfComponent } from '../styledSystem'; @@ -15,8 +15,13 @@ type AvatarProps = PropsOfComponent & { rounded?: boolean; boxElementDescriptor?: ElementDescriptor; imageElementDescriptor?: ElementDescriptor; + /** Shows a loading spinner while the image is loading */ + showLoadingSpinner?: boolean; }; +const SPINNER_DELAY_MS = 150; +const SPINNER_MIN_DURATION_MS = 400; + export const Avatar = (props: AvatarProps) => { const { size = () => 26, @@ -28,8 +33,60 @@ export const Avatar = (props: AvatarProps) => { sx, boxElementDescriptor, imageElementDescriptor, + showLoadingSpinner = false, } = props; const [error, setError] = React.useState(false); + const [loaded, setLoaded] = React.useState(false); + const [spinnerVisible, setSpinnerVisible] = React.useState(false); + const spinnerShownAtRef = React.useRef(null); + const loadTimerRef = React.useRef | null>(null); + + React.useEffect(() => { + setLoaded(false); + setError(false); + setSpinnerVisible(false); + spinnerShownAtRef.current = null; + + return () => { + if (loadTimerRef.current) { + clearTimeout(loadTimerRef.current); + loadTimerRef.current = null; + } + }; + }, [imageUrl]); + + React.useEffect(() => { + if (!showLoadingSpinner || !imageUrl || loaded || error) { + return; + } + + const timer = setTimeout(() => { + setSpinnerVisible(true); + spinnerShownAtRef.current = Date.now(); + }, SPINNER_DELAY_MS); + + return () => clearTimeout(timer); + }, [showLoadingSpinner, imageUrl, loaded, error]); + + /** + * Prevents the loading spinner from appearing and disappearing too quickly + */ + const handleImageLoad = React.useCallback(() => { + if (spinnerShownAtRef.current) { + const elapsed = Date.now() - spinnerShownAtRef.current; + const remaining = SPINNER_MIN_DURATION_MS - elapsed; + if (remaining > 0) { + loadTimerRef.current = setTimeout(() => { + loadTimerRef.current = null; + setLoaded(true); + }, remaining); + return; + } + } + setLoaded(true); + }, []); + + const isLoading = showLoadingSpinner && spinnerVisible && imageUrl && !loaded && !error; const ImgOrFallback = initials && (!imageUrl || error) ? ( @@ -40,8 +97,15 @@ export const Avatar = (props: AvatarProps) => { title={title} alt={`${title}'s logo`} src={imageUrl || ''} - sx={{ objectFit: 'cover', width: '100%', height: '100%' }} + sx={{ + objectFit: 'cover', + width: '100%', + height: '100%', + opacity: showLoadingSpinner ? (loaded ? 1 : 0) : 1, + transition: 'opacity 0.2s ease-in-out', + }} onError={() => setError(true)} + onLoad={handleImageLoad} size={imageFetchSize} /> ); @@ -67,6 +131,24 @@ export const Avatar = (props: AvatarProps) => { > {ImgOrFallback} + {isLoading && ( + ({ + position: 'absolute', + inset: 0, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: t.colors.$avatarBackground, + })} + > + + + )} + {/* /** * This Box is the "shimmer" effect for the avatar. * The ":after" selector is responsible for the border shimmer animation. diff --git a/packages/clerk-js/src/ui/elements/AvatarUploader.tsx b/packages/clerk-js/src/ui/elements/AvatarUploader.tsx index f1ae367f2c2..8a7f99b7a0d 100644 --- a/packages/clerk-js/src/ui/elements/AvatarUploader.tsx +++ b/packages/clerk-js/src/ui/elements/AvatarUploader.tsx @@ -90,9 +90,10 @@ export const AvatarUploader = (props: AvatarUploaderProps) => { await handleFileDrop(f); }; + const hasExistingImage = !!(avatarPreview.props as { imageUrl?: string })?.imageUrl; const previewElement = objectUrl ? React.cloneElement(avatarPreview, { imageUrl: objectUrl }) - : avatarPreviewPlaceholder + : avatarPreviewPlaceholder && !hasExistingImage ? React.cloneElement(avatarPreviewPlaceholder, { onClick: openDialog }) : avatarPreview; diff --git a/packages/clerk-js/src/ui/elements/OrganizationAvatar.tsx b/packages/clerk-js/src/ui/elements/OrganizationAvatar.tsx index 7f449455955..ad7a078f664 100644 --- a/packages/clerk-js/src/ui/elements/OrganizationAvatar.tsx +++ b/packages/clerk-js/src/ui/elements/OrganizationAvatar.tsx @@ -4,15 +4,19 @@ import type { PropsOfComponent } from '../styledSystem'; import { Avatar } from './Avatar'; type OrganizationAvatarProps = PropsOfComponent & - Partial>; + Partial> & { + /** Shows a loading spinner while the image is loading */ + showLoadingSpinner?: boolean; + }; export const OrganizationAvatar = (props: OrganizationAvatarProps) => { - const { name = '', imageUrl, ...rest } = props; + const { name = '', imageUrl, showLoadingSpinner, ...rest } = props; return ( diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index b48cf825e52..395bff3261d 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -882,6 +882,10 @@ export const arSA: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'توجد منظمة بالفعل لاسم الشركة المكتشف ({{organizationName}}) و {{organizationDomain}}. انضم عن طريق الدعوة.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index fd12de02b13..d04fb225140 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -890,6 +890,10 @@ export const beBY: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Арганізацыя ўжо існуе для выяўленай назвы кампаніі ({{organizationName}}) і {{organizationDomain}}. Далучайцеся па запрашэнні.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index fdcdf32b73d..7180713e37d 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -886,6 +886,10 @@ export const bgBG: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Организация вече съществува за откритото име на компанията ({{organizationName}}) и {{organizationDomain}}. Присъединете се чрез покана.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index 9c36731c219..7e41d2b8ea2 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -890,6 +890,10 @@ export const bnIN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'শনাক্ত করা কোম্পানির নাম ({{organizationName}}) এবং {{organizationDomain}}-এর জন্য একটি সংস্থা ইতিমধ্যেই বিদ্যমান। আমন্ত্রণের মাধ্যমে যোগ দিন।', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 3cd5d10eeda..7633ccf17dc 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -885,6 +885,10 @@ export const caES: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + "Ja existeix una organització per al nom d'empresa detectat ({{organizationName}}) i {{organizationDomain}}. Uneix-te per invitació.", + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index b1cd9e1550e..6599a2c94f7 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -896,6 +896,10 @@ export const csCZ: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organizace již existuje pro detekovaný název společnosti ({{organizationName}}) a {{organizationDomain}}. Připojte se prostřednictvím pozvánky.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index f768668bd98..2f9578a42cb 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -883,6 +883,10 @@ export const daDK: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Der findes allerede en organisation for det registrerede firmanavn ({{organizationName}}) og {{organizationDomain}}. Tilmeld dig via invitation.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 678b136ed1a..feba5a780dc 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -901,6 +901,10 @@ export const deDE: LocalizationResource = { actionLink: 'Abmelden', actionText: 'Angemeldet als {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'Für den erkannten Firmennamen ({{organizationName}}) und {{organizationDomain}} existiert bereits eine Organisation. Treten Sie per Einladung bei.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index df35837d8b4..06dde939d34 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -888,6 +888,10 @@ export const elGR: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Υπάρχει ήδη οργανισμός για το ανιχνευμένο όνομα εταιρείας ({{organizationName}}) και {{organizationDomain}}. Εγγραφείτε μέσω πρόσκλησης.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index 0dba831bcf7..97fa9a8c58e 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -887,6 +887,10 @@ export const enGB: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'An organisation already exists for the detected company name ({{organizationName}}) and {{organizationDomain}}. Join by invitation.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 8e9c64c7b33..5e5cceb5199 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -884,6 +884,10 @@ export const enUS: LocalizationResource = { actionLink: 'Sign out', actionText: 'Signed in as {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'An organization already exists for the detected company name ({{organizationName}}) and {{organizationDomain}}. Join by invitation.', + }, }, taskResetPassword: { formButtonPrimary: 'Reset Password', diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 0a131be4671..2577231488a 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -893,6 +893,10 @@ export const esCR: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Ya existe una organización para el nombre de empresa detectado ({{organizationName}}) y {{organizationDomain}}. Únete por invitación.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index a5c8a3f4c8c..17b5e0eed16 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -887,6 +887,10 @@ export const esES: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Ya existe una organización para el nombre de empresa detectado ({{organizationName}}) y {{organizationDomain}}. Únete por invitación.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index db594fd6118..4ea8c2267a9 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -894,6 +894,10 @@ export const esMX: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Ya existe una organización para el nombre de empresa detectado ({{organizationName}}) y {{organizationDomain}}. Únete por invitación.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index a4e2c8da910..df5c9fa2a6a 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -893,6 +893,10 @@ export const esUY: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Ya existe una organización para el nombre de empresa detectado ({{organizationName}}) y {{organizationDomain}}. Únete por invitación.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 1e0e781849c..3f504c3cbde 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -897,6 +897,10 @@ export const faIR: LocalizationResource = { actionLink: 'خروج از همه حساب‌ها', actionText: 'می‌خواهید خارج شوید؟', }, + alerts: { + organizationAlreadyExists: + 'سازمانی برای نام شرکت شناسایی شده ({{organizationName}}) و {{organizationDomain}} از قبل وجود دارد. از طریق دعوتنامه بپیوندید.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index eaa48cf81c7..fac1ce9415f 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -886,6 +886,10 @@ export const fiFI: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organisaatio on jo olemassa havaitulle yrityksen nimelle ({{organizationName}}) ja {{organizationDomain}}. Liity kutsulla.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 9771cfc711e..7de337bf3b6 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -902,6 +902,10 @@ export const frFR: LocalizationResource = { actionLink: 'Se déconnecter', actionText: 'Connecté en tant que {{identifier}}', }, + alerts: { + organizationAlreadyExists: + "Une organisation existe déjà pour le nom d'entreprise détecté ({{organizationName}}) et {{organizationDomain}}. Rejoignez par invitation.", + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index b26d094b50e..9238e00bd41 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -876,6 +876,10 @@ export const heIL: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'ארגון כבר קיים עבור שם החברה שזוהה ({{organizationName}}) ו-{{organizationDomain}}. הצטרף באמצעות הזמנה.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 64af22f24ca..e26ecb480f3 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -891,6 +891,10 @@ export const hiIN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'पता लगाई गई कंपनी के नाम ({{organizationName}}) और {{organizationDomain}} के लिए एक संगठन पहले से मौजूद है। आमंत्रण द्वारा शामिल हों।', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 89041a9c035..60d2f0b95c0 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -887,6 +887,10 @@ export const hrHR: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organizacija već postoji za otkriveni naziv tvrtke ({{organizationName}}) i {{organizationDomain}}. Pridružite se putem pozivnice.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 1766a367259..057a4c838e0 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -884,6 +884,10 @@ export const huHU: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Már létezik szervezet az észlelt cégnévhez ({{organizationName}}) és {{organizationDomain}}. Csatlakozz meghívással.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index 314e4df62a4..5b7522f0ed8 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -892,6 +892,10 @@ export const idID: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organisasi sudah ada untuk nama perusahaan yang terdeteksi ({{organizationName}}) dan {{organizationDomain}}. Bergabung melalui undangan.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index e87e68da5ac..c665221f705 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -887,6 +887,10 @@ export const isIS: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Fyrirtæki er þegar til fyrir uppgötvaða fyrirtækjanafnið ({{organizationName}}) og {{organizationDomain}}. Skráðu þig með boði.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index bca7f3064c1..a636e1da40b 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -894,6 +894,10 @@ export const itIT: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + "Un'organizzazione esiste già per il nome dell'azienda rilevato ({{organizationName}}) e {{organizationDomain}}. Unisciti tramite invito.", + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index e686f7d8d3a..c8b28c65b62 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -897,6 +897,10 @@ export const jaJP: LocalizationResource = { actionLink: 'サインアウト', actionText: '{{identifier}} としてサインイン中', }, + alerts: { + organizationAlreadyExists: + '検出された会社名 ({{organizationName}}) と {{organizationDomain}} の組織がすでに存在します。招待を通じて参加してください。', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index 212ec89d50f..1021a6f5785 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -877,6 +877,10 @@ export const kkKZ: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Анықталған компания атауы ({{organizationName}}) және {{organizationDomain}} үшін ұйым бұрыннан бар. Шақыру арқылы қосылыңыз.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index f1a1a71ba3f..1a5525983fa 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -878,6 +878,10 @@ export const koKR: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + '감지된 회사 이름 ({{organizationName}}) 및 {{organizationDomain}}에 대한 조직이 이미 존재합니다. 초대를 통해 가입하세요.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 47d7f2f3520..ba3fe405ef4 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -886,6 +886,10 @@ export const mnMN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Илрүүлсэн компанийн нэр ({{organizationName}}) болон {{organizationDomain}}-д байгууллага аль хэдийн байна. Урилгаар нэгдэнэ үү.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 8c9fc2fe6f5..6d65a259b88 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -894,6 +894,10 @@ export const msMY: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organisasi sudah wujud untuk nama syarikat yang dikesan ({{organizationName}}) dan {{organizationDomain}}. Sertai melalui jemputan.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index eca0b97f88d..a2a7106c9d4 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -884,6 +884,10 @@ export const nbNO: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'En organisasjon eksisterer allerede for det oppdagede firmanavnet ({{organizationName}}) og {{organizationDomain}}. Bli med via invitasjon.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index f0bb7d32200..a02597ea6af 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -886,6 +886,10 @@ export const nlBE: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Er bestaat al een organisatie voor de gedetecteerde bedrijfsnaam ({{organizationName}}) en {{organizationDomain}}. Word lid via uitnodiging.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index 451d77b41e0..654cb28f80c 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -886,6 +886,10 @@ export const nlNL: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Er bestaat al een organisatie voor de gedetecteerde bedrijfsnaam ({{organizationName}}) en {{organizationDomain}}. Word lid via uitnodiging.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index d037d7f4bb4..2d433ee2181 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -890,6 +890,10 @@ export const plPL: LocalizationResource = { actionLink: 'Wyloguj', actionText: 'Zalogowano jako {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'Organizacja już istnieje dla wykrytej nazwy firmy ({{organizationName}}) i {{organizationDomain}}. Dołącz przez zaproszenie.', + }, }, taskResetPassword: { formButtonPrimary: 'Zresetuj hasło', diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 16fd4e32653..75e143c13ac 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -898,6 +898,10 @@ export const ptBR: LocalizationResource = { actionLink: 'Sair', actionText: 'Conectado como {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'Uma organização já existe para o nome da empresa detectado ({{organizationName}}) e {{organizationDomain}}. Entre por convite.', + }, }, taskResetPassword: { formButtonPrimary: 'Resetar Senha', diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 3c0a9730ec9..a4bd14a7677 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -884,6 +884,10 @@ export const ptPT: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Já existe uma organização para o nome da empresa detetado ({{organizationName}}) e {{organizationDomain}}. Adira por convite.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 22d78472e27..b03ffb3ff73 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -899,6 +899,10 @@ export const roRO: LocalizationResource = { actionLink: 'Deconectează-te', actionText: 'Autentificat ca {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'Există deja o organizație pentru numele companiei detectate ({{organizationName}}) și {{organizationDomain}}. Alătură-te prin invitație.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 293a20d6783..e0a3dfcceac 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -897,6 +897,10 @@ export const ruRU: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Организация уже существует для обнаруженного названия компании ({{organizationName}}) и {{organizationDomain}}. Присоединяйтесь по приглашению.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 1dd5d44d1b5..ddcdf77c989 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -890,6 +890,10 @@ export const skSK: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organizácia už existuje pre zistený názov spoločnosti ({{organizationName}}) a {{organizationDomain}}. Pripojte sa prostredníctvom pozvánky.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index f81de48bb74..8655a6279ed 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -883,6 +883,10 @@ export const srRS: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Organizacija već postoji za otkriveno ime kompanije ({{organizationName}}) i {{organizationDomain}}. Pridružite se putem pozivnice.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index 7cc04f52249..705f9be4829 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -888,6 +888,10 @@ export const svSE: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'En organisation finns redan för det upptäckta företagsnamnet ({{organizationName}}) och {{organizationDomain}}. Gå med via inbjudan.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index 58a2bf94342..a8603e5b97f 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -893,6 +893,10 @@ export const taIN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'கண்டறியப்பட்ட நிறுவன பெயர் ({{organizationName}}) மற்றும் {{organizationDomain}} க்கு ஒரு அமைப்பு ஏற்கனவே உள்ளது. அழைப்பின் மூலம் சேரவும்.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index 311d8825f61..b53230a6616 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -893,6 +893,10 @@ export const teIN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'గుర్తించిన కంపెనీ పేరు ({{organizationName}}) మరియు {{organizationDomain}} కోసం ఒక సంస్థ ఇప్పటికే ఉంది. ఆహ్వానం ద్వారా చేరండి.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index a67cb5afa2b..211bf49e87f 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -886,6 +886,10 @@ export const thTH: LocalizationResource = { actionLink: 'ออกจากระบบ', actionText: 'เข้าสู่ระบบในนาม {{identifier}}', }, + alerts: { + organizationAlreadyExists: + 'องค์กรสำหรับชื่อบริษัทที่ตรวจพบ ({{organizationName}}) และ {{organizationDomain}} มีอยู่แล้ว เข้าร่วมโดยการเชิญ', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 573dee4d251..8136b8ce022 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -886,6 +886,10 @@ export const trTR: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Tespit edilen şirket adı ({{organizationName}}) ve {{organizationDomain}} için bir organizasyon zaten mevcut. Davetiye ile katılın.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index eb1192aa8f8..387a1071f01 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -882,6 +882,10 @@ export const ukUA: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Організація вже існує для виявленої назви компанії ({{organizationName}}) та {{organizationDomain}}. Приєднуйтесь за запрошенням.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index b60f5ce80dd..693e2d816ae 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -893,6 +893,10 @@ export const viVN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + 'Một tổ chức đã tồn tại cho tên công ty được phát hiện ({{organizationName}}) và {{organizationDomain}}. Tham gia bằng lời mời.', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 50f6369d08c..35a1ee2b977 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -872,6 +872,10 @@ export const zhCN: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + '检测到的公司名称 ({{organizationName}}) 和 {{organizationDomain}} 已存在一个组织。请通过邀请加入。', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 07c95b8ef1e..b04b313b28e 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -873,6 +873,10 @@ export const zhTW: LocalizationResource = { actionLink: undefined, actionText: undefined, }, + alerts: { + organizationAlreadyExists: + '偵測到的公司名稱 ({{organizationName}}) 和 {{organizationDomain}} 已存在一個組織。請透過邀請加入。', + }, }, taskResetPassword: { formButtonPrimary: undefined, diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts index 57123038f78..8f2525c4aaa 100644 --- a/packages/shared/src/types/index.ts +++ b/packages/shared/src/types/index.ts @@ -34,6 +34,7 @@ export type * from './localization'; export type * from './multiDomain'; export type * from './oauth'; export type * from './organization'; +export type * from './organizationCreationDefaults'; export type * from './organizationDomain'; export type * from './organizationInvitation'; export type * from './organizationMembership'; diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 806826143d8..7c3b5ae0fc0 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1314,6 +1314,9 @@ export type __internal_LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; }; + alerts: { + organizationAlreadyExists: LocalizationValue<'organizationDomain' | 'organizationName'>; + }; }; taskResetPassword: { title: LocalizationValue; diff --git a/packages/shared/src/types/organizationCreationDefaults.ts b/packages/shared/src/types/organizationCreationDefaults.ts new file mode 100644 index 00000000000..95d3211110a --- /dev/null +++ b/packages/shared/src/types/organizationCreationDefaults.ts @@ -0,0 +1,34 @@ +import type { ClerkResourceJSON } from './json'; +import type { ClerkResource } from './resource'; + +export type OrganizationCreationAdvisoryType = 'organization_already_exists'; + +export type OrganizationCreationAdvisorySeverity = 'warning'; + +export interface OrganizationCreationDefaultsJSON extends ClerkResourceJSON { + advisory: { + code: OrganizationCreationAdvisoryType; + severity: OrganizationCreationAdvisorySeverity; + meta: Record; + } | null; + form: { + name: string; + slug: string; + logo: string | null; + blur_hash: string | null; + }; +} + +export interface OrganizationCreationDefaultsResource extends ClerkResource { + advisory: { + code: OrganizationCreationAdvisoryType; + severity: OrganizationCreationAdvisorySeverity; + meta: Record; + } | null; + form: { + name: string; + slug: string; + logo: string | null; + blurHash: string | null; + }; +} diff --git a/packages/shared/src/types/organizationSettings.ts b/packages/shared/src/types/organizationSettings.ts index ab9e0704e1e..e9a24b8e0f0 100644 --- a/packages/shared/src/types/organizationSettings.ts +++ b/packages/shared/src/types/organizationSettings.ts @@ -20,6 +20,9 @@ export interface OrganizationSettingsJSON extends ClerkResourceJSON { slug: { disabled: boolean; }; + organization_creation_defaults: { + enabled: boolean; + }; } export interface OrganizationSettingsResource extends ClerkResource { @@ -37,5 +40,8 @@ export interface OrganizationSettingsResource extends ClerkResource { slug: { disabled: boolean; }; + organizationCreationDefaults: { + enabled: boolean; + }; __internal_toSnapshot: () => OrganizationSettingsJSONSnapshot; } diff --git a/packages/shared/src/types/snapshots.ts b/packages/shared/src/types/snapshots.ts index 5f36eab401c..b39309b57f9 100644 --- a/packages/shared/src/types/snapshots.ts +++ b/packages/shared/src/types/snapshots.ts @@ -30,6 +30,7 @@ import type { VerificationJSON, Web3WalletJSON, } from './json'; +import type { OrganizationCreationDefaultsJSON } from './organizationCreationDefaults'; import type { OrganizationSettingsJSON } from './organizationSettings'; import type { ProtectConfigJSON } from './protectConfig'; import type { SignInJSON } from './signIn'; @@ -146,6 +147,8 @@ export type OrganizationMembershipJSONSnapshot = OrganizationMembershipJSON; export type OrganizationSettingsJSONSnapshot = OrganizationSettingsJSON; +export type OrganizationCreationDefaultsJSONSnapshot = OrganizationCreationDefaultsJSON; + export type PasskeyJSONSnapshot = Override; export type PhoneNumberJSONSnapshot = Override< diff --git a/packages/shared/src/types/user.ts b/packages/shared/src/types/user.ts index 87057004105..aa844b6bd25 100644 --- a/packages/shared/src/types/user.ts +++ b/packages/shared/src/types/user.ts @@ -7,6 +7,7 @@ import type { ExternalAccountResource } from './externalAccount'; import type { ImageResource } from './image'; import type { UserJSON } from './json'; import type { OAuthScope } from './oauth'; +import type { OrganizationCreationDefaultsResource } from './organizationCreationDefaults'; import type { OrganizationInvitationStatus } from './organizationInvitation'; import type { OrganizationMembershipResource } from './organizationMembership'; import type { OrganizationSuggestionResource, OrganizationSuggestionStatus } from './organizationSuggestion'; @@ -125,6 +126,7 @@ export interface UserResource extends ClerkResource, BillingPayerMethods { getOrganizationSuggestions: ( params?: GetUserOrganizationSuggestionsParams, ) => Promise>; + getOrganizationCreationDefaults: () => Promise; leaveOrganization: (organizationId: string) => Promise; createTOTP: () => Promise; verifyTOTP: (params: VerifyTOTPParams) => Promise; From 2bc5aa78996843f875edfe8b20d9e6233d16b21d Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:13:32 -0300 Subject: [PATCH 053/123] chore(nextjs): Add image CDNs to `connect-src` (#7611) --- .changeset/curly-dodos-mix.md | 5 +++++ .../server/__tests__/content-security-policy.test.ts | 12 ++++++------ .../nextjs/src/server/content-security-policy.ts | 2 ++ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 .changeset/curly-dodos-mix.md diff --git a/.changeset/curly-dodos-mix.md b/.changeset/curly-dodos-mix.md new file mode 100644 index 00000000000..bea763df694 --- /dev/null +++ b/.changeset/curly-dodos-mix.md @@ -0,0 +1,5 @@ +--- +'@clerk/nextjs': patch +--- + +Add image CDNs to the `connect-src` Content Security Policy directive diff --git a/packages/nextjs/src/server/__tests__/content-security-policy.test.ts b/packages/nextjs/src/server/__tests__/content-security-policy.test.ts index 296ea936a32..b17f34708b8 100644 --- a/packages/nextjs/src/server/__tests__/content-security-policy.test.ts +++ b/packages/nextjs/src/server/__tests__/content-security-policy.test.ts @@ -31,7 +31,7 @@ describe('CSP Header Utils', () => { expect(directives).toContainEqual("default-src 'self'"); expect(directives).toContainEqual( - "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com", + "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com", ); expect(directives).toContainEqual("form-action 'self'"); expect(directives).toContainEqual( @@ -88,7 +88,7 @@ describe('CSP Header Utils', () => { const directives = headerValue.split('; '); expect(directives).toContainEqual("default-src 'self'"); expect(directives).toContainEqual( - "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com", + "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com", ); expect(directives).toContainEqual("form-action 'self'"); expect(directives).toContainEqual( @@ -237,7 +237,7 @@ describe('CSP Header Utils', () => { const directives = result.headers[0][1].split('; '); expect(directives).toContainEqual( - `connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com https://api.example.com`, + `connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com https://api.example.com`, ); const imgSrcDirective = directives.find(d => d.startsWith('img-src')) || ''; @@ -257,7 +257,7 @@ describe('CSP Header Utils', () => { const directives = result.headers[0][1].split('; '); expect(directives).toContainEqual( - "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com", + "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com", ); expect(directives).toContainEqual("default-src 'self'"); expect(directives).toContainEqual("form-action 'self'"); @@ -303,7 +303,7 @@ describe('CSP Header Utils', () => { const directives = result.headers[0][1].split('; '); expect(directives).toContainEqual( - `connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com`, + `connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com`, ); expect(directives).toContainEqual(`img-src 'self' https://img.clerk.com`); expect(directives).toContainEqual( @@ -369,7 +369,7 @@ describe('CSP Header Utils', () => { const directives = result.headers[0][1].split('; '); expect(directives).toContainEqual( - "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com clerk.example.com", + "connect-src 'self' https://clerk-telemetry.com https://*.clerk-telemetry.com https://api.stripe.com https://maps.googleapis.com https://img.clerk.com https://images.clerkstage.dev clerk.example.com", ); expect(directives).toContainEqual("default-src 'self'"); expect(directives).toContainEqual("form-action 'self'"); diff --git a/packages/nextjs/src/server/content-security-policy.ts b/packages/nextjs/src/server/content-security-policy.ts index 7ae4ad30478..e9c87468c15 100644 --- a/packages/nextjs/src/server/content-security-policy.ts +++ b/packages/nextjs/src/server/content-security-policy.ts @@ -101,6 +101,8 @@ class ContentSecurityPolicyDirectiveManager { 'https://*.clerk-telemetry.com', 'https://api.stripe.com', 'https://maps.googleapis.com', + 'https://img.clerk.com', + 'https://images.clerkstage.dev', ], 'default-src': ['self'], 'form-action': ['self'], From 473120c549ad67020435df3cf29811e187249893 Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Fri, 16 Jan 2026 16:11:44 -0600 Subject: [PATCH 054/123] fix(clerk-js): Add clerk dependency to redirect effect hooks (#7614) fix(ui): add clerk dependency to redirect effect hooks [core-2 backport] Backport of #7529 to release/core-2. Fixes redirect conflicts when SignIn and SignUp components are used together on the same page by adding proper dependency arrays to useEffect hooks. Co-authored-by: Ayush Amawate <97389618+Ayush2k02@users.noreply.github.com> --- .changeset/fix-signin-signup-redirect-conflict.md | 5 +++++ packages/clerk-js/src/ui/components/SignIn/index.tsx | 2 +- packages/clerk-js/src/ui/components/SignUp/index.tsx | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-signin-signup-redirect-conflict.md diff --git a/.changeset/fix-signin-signup-redirect-conflict.md b/.changeset/fix-signin-signup-redirect-conflict.md new file mode 100644 index 00000000000..905de27f1f9 --- /dev/null +++ b/.changeset/fix-signin-signup-redirect-conflict.md @@ -0,0 +1,5 @@ +--- +"@clerk/clerk-js": patch +--- + +Fix redirect conflicts when SignIn and SignUp components are used together on the same page. Added missing dependency arrays to useEffect hooks in redirect functions to prevent unwanted redirects during other component flows. \ No newline at end of file diff --git a/packages/clerk-js/src/ui/components/SignIn/index.tsx b/packages/clerk-js/src/ui/components/SignIn/index.tsx index 62c3abe2d13..fd133325b78 100644 --- a/packages/clerk-js/src/ui/components/SignIn/index.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/index.tsx @@ -39,7 +39,7 @@ function RedirectToSignIn() { const clerk = useClerk(); React.useEffect(() => { void clerk.redirectToSignIn(); - }, []); + }, [clerk]); return null; } diff --git a/packages/clerk-js/src/ui/components/SignUp/index.tsx b/packages/clerk-js/src/ui/components/SignUp/index.tsx index eae05b32e1c..76a8a49f427 100644 --- a/packages/clerk-js/src/ui/components/SignUp/index.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/index.tsx @@ -21,7 +21,7 @@ function RedirectToSignUp() { const clerk = useClerk(); React.useEffect(() => { void clerk.redirectToSignUp(); - }, []); + }, [clerk]); return null; } From 833439e22f56ab1e44bb08c6d4c6d1b2c1e3913c Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:24:31 -0600 Subject: [PATCH 055/123] ci(repo): Version packages (Core 2) (#7577) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/curly-dodos-mix.md | 5 ----- .../fix-signin-signup-redirect-conflict.md | 5 ----- .changeset/friendly-expo-peer-deps.md | 5 ----- .changeset/oauth-idtoken-member.md | 5 ----- .changeset/open-doors-flash.md | 5 ----- .changeset/small-pumas-joke.md | 5 ----- .changeset/three-impalas-push.md | 7 ------- .changeset/true-pans-marry.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 9 +++++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 10 ++++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 18 ++++++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 12 ++++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 11 +++++++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 12 ++++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 10 ++++++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 9 +++++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 ++++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 52 files changed, 232 insertions(+), 64 deletions(-) delete mode 100644 .changeset/curly-dodos-mix.md delete mode 100644 .changeset/fix-signin-signup-redirect-conflict.md delete mode 100644 .changeset/friendly-expo-peer-deps.md delete mode 100644 .changeset/oauth-idtoken-member.md delete mode 100644 .changeset/open-doors-flash.md delete mode 100644 .changeset/small-pumas-joke.md delete mode 100644 .changeset/three-impalas-push.md delete mode 100644 .changeset/true-pans-marry.md diff --git a/.changeset/curly-dodos-mix.md b/.changeset/curly-dodos-mix.md deleted file mode 100644 index bea763df694..00000000000 --- a/.changeset/curly-dodos-mix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/nextjs': patch ---- - -Add image CDNs to the `connect-src` Content Security Policy directive diff --git a/.changeset/fix-signin-signup-redirect-conflict.md b/.changeset/fix-signin-signup-redirect-conflict.md deleted file mode 100644 index 905de27f1f9..00000000000 --- a/.changeset/fix-signin-signup-redirect-conflict.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/clerk-js": patch ---- - -Fix redirect conflicts when SignIn and SignUp components are used together on the same page. Added missing dependency arrays to useEffect hooks in redirect functions to prevent unwanted redirects during other component flows. \ No newline at end of file diff --git a/.changeset/friendly-expo-peer-deps.md b/.changeset/friendly-expo-peer-deps.md deleted file mode 100644 index 83438f7f08b..00000000000 --- a/.changeset/friendly-expo-peer-deps.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-expo': patch ---- - -Broaden React peer dependency to `^18.0.0 || ^19.0.0` to resolve peer dependency conflicts for Expo 54 users diff --git a/.changeset/oauth-idtoken-member.md b/.changeset/oauth-idtoken-member.md deleted file mode 100644 index f13ed6141fc..00000000000 --- a/.changeset/oauth-idtoken-member.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/backend": patch ---- - -Add optional `idToken` member to `OauthAccessToken` returned by `getUserOauthAccessToken`. The ID token is retrieved from OIDC providers and is only present for OIDC-compliant OAuth 2.0 providers when available. diff --git a/.changeset/open-doors-flash.md b/.changeset/open-doors-flash.md deleted file mode 100644 index 1d4003f8973..00000000000 --- a/.changeset/open-doors-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Remove opacity from `Select` placeholder diff --git a/.changeset/small-pumas-joke.md b/.changeset/small-pumas-joke.md deleted file mode 100644 index 843f9577091..00000000000 --- a/.changeset/small-pumas-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Display actual organization membership name in in-app enable organization prompt success message diff --git a/.changeset/three-impalas-push.md b/.changeset/three-impalas-push.md deleted file mode 100644 index 749388dd5fc..00000000000 --- a/.changeset/three-impalas-push.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@clerk/localizations': minor -'@clerk/clerk-js': minor -'@clerk/shared': minor ---- - -Surface organization creation defaults with prefilled form fields and advisory warnings diff --git a/.changeset/true-pans-marry.md b/.changeset/true-pans-marry.md deleted file mode 100644 index cad0ca5174d..00000000000 --- a/.changeset/true-pans-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-react': patch ---- - -Prevent props from leaking to child elements in SignUpButton & SignInButton diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 08d0185b71e..ff2d838b1f9 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.15 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 0.2.14 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index f1066342530..ed10967f0b1 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.14", + "version": "0.2.15", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 6db5d368ef2..647c96dd51f 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 2.16.13 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 2.16.12 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 1bd5557b617..625d7cef181 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.12", + "version": "2.16.13", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index abd0273a828..ea9378da82a 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.29.3 + +### Patch Changes + +- Add optional `idToken` member to `OauthAccessToken` returned by `getUserOauthAccessToken`. The ID token is retrieved from OIDC providers and is only present for OIDC-compliant OAuth 2.0 providers when available. ([#7599](https://github.com/clerk/javascript/pull/7599)) by [@jfoshee](https://github.com/jfoshee) + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 2.29.2 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index b99f17899ee..654faba54d5 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.29.2", + "version": "2.29.3", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 1b8ee2b351f..13d076e8d37 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.8.18 + +### Patch Changes + +- Updated dependencies [[`473120c`](https://github.com/clerk/javascript/commit/473120c549ad67020435df3cf29811e187249893), [`4ac7188`](https://github.com/clerk/javascript/commit/4ac7188a797dc1c92ba876a8eee9e54915edd3cd), [`4dad721`](https://github.com/clerk/javascript/commit/4dad7217674e17a12d336906623476b92b81d840), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/clerk-js@5.120.0 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + ## 2.8.17 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 2b6ae449f80..12f0bc59d58 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.8.17", + "version": "2.8.18", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index e48e842d2d0..c204ab0333c 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,23 @@ # Change Log +## 5.120.0 + +### Minor Changes + +- Surface organization creation defaults with prefilled form fields and advisory warnings ([#7603](https://github.com/clerk/javascript/pull/7603)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Fix redirect conflicts when SignIn and SignUp components are used together on the same page. Added missing dependency arrays to useEffect hooks in redirect functions to prevent unwanted redirects during other component flows. ([#7614](https://github.com/clerk/javascript/pull/7614)) by [@jacekradko](https://github.com/jacekradko) + +- Remove opacity from `Select` placeholder ([#7575](https://github.com/clerk/javascript/pull/7575)) by [@LauraBeatris](https://github.com/LauraBeatris) + +- Display actual organization membership name in in-app enable organization prompt success message ([#7582](https://github.com/clerk/javascript/pull/7582)) by [@LauraBeatris](https://github.com/LauraBeatris) + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/localizations@3.35.0 + - @clerk/shared@3.43.0 + ## 5.119.1 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 4afa01043cf..6a0ca9efded 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.119.1", + "version": "5.120.0", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 4801cf03979..c5deb4b016f 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.4 + +### Patch Changes + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 0.24.3 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 8f0074744bf..71f9da4c8a8 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.3", + "version": "0.24.4", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 6f7d4d6ec62..3f0d9cd4e7c 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.30 + +### Patch Changes + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + ## 0.4.29 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index a117d7a3756..2b38cbfb041 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.29", + "version": "0.4.30", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 268eb83dba3..5addd34b03a 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## 2.19.18 + +### Patch Changes + +- Broaden React peer dependency to `^18.0.0 || ^19.0.0` to resolve peer dependency conflicts for Expo 54 users ([#7591](https://github.com/clerk/javascript/pull/7591)) by [@chriscanin](https://github.com/chriscanin) + +- Updated dependencies [[`473120c`](https://github.com/clerk/javascript/commit/473120c549ad67020435df3cf29811e187249893), [`4ac7188`](https://github.com/clerk/javascript/commit/4ac7188a797dc1c92ba876a8eee9e54915edd3cd), [`4dad721`](https://github.com/clerk/javascript/commit/4dad7217674e17a12d336906623476b92b81d840), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/clerk-js@5.120.0 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 2.19.17 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 706d19b8b03..57d7f354a81 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.17", + "version": "2.19.18", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 2c72d00d652..41a6d9f92f7 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.63 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 1.7.62 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index ee62d5f6c8f..e0e5f2d4c0d 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.62", + "version": "1.7.63", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 85086c66e5d..944a7c29933 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.15 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 2.6.14 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index dede8ebdfb3..2e69a4bd0b0 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.14", + "version": "2.6.15", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 30c3560a041..5a47a8cec4e 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## 3.35.0 + +### Minor Changes + +- Surface organization creation defaults with prefilled form fields and advisory warnings ([#7603](https://github.com/clerk/javascript/pull/7603)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies []: + - @clerk/types@4.101.11 + ## 3.34.0 ### Minor Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index ea935b02c44..f0cf8561d28 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.34.0", + "version": "3.35.0", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index dc7e7ed82b8..30d02b601f0 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## 6.36.8 + +### Patch Changes + +- Add image CDNs to the `connect-src` Content Security Policy directive ([#7611](https://github.com/clerk/javascript/pull/7611)) by [@LauraBeatris](https://github.com/LauraBeatris) + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 6.36.7 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 41cc947aa18..bab4198a037 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.36.7", + "version": "6.36.8", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 72f014367c9..106105179a8 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.13 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + - @clerk/vue@1.17.8 + ## 1.13.12 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 02f515070fc..7c482f62630 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.12", + "version": "1.13.13", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index aa3d8ad7f81..62f5fe727a6 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.3.10 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 2.3.9 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index d2d53aead7b..19b87ef534c 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.3.9", + "version": "2.3.10", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 6a873f370c9..4df813d3e4d 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.59.4 + +### Patch Changes + +- Prevent props from leaking to child elements in SignUpButton & SignInButton ([#7589](https://github.com/clerk/javascript/pull/7589)) by [@tmilewski](https://github.com/tmilewski) + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + ## 5.59.3 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index a3dd622e09a..dac0c1ba005 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.59.3", + "version": "5.59.4", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index d691d62500c..46ff5021a9d 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.30 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 4.13.29 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 8329fc04118..f507d933853 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.29", + "version": "4.13.30", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 0e9520675c9..21be5b9c158 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.43.0 + +### Minor Changes + +- Surface organization creation defaults with prefilled form fields and advisory warnings ([#7603](https://github.com/clerk/javascript/pull/7603)) by [@LauraBeatris](https://github.com/LauraBeatris) + ## 3.42.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index a566d852757..5c5d8356f68 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.42.0", + "version": "3.43.0", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index e3eda4d9700..2bba67ef168 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-react-start +## 0.27.15 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da), [`57ff2fb`](https://github.com/clerk/javascript/commit/57ff2fb2ae53f757e48b4dcc5669f62369f90bfc)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/clerk-react@5.59.4 + - @clerk/types@4.101.11 + ## 0.27.14 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index b7af01c0d8d..38264ab7b70 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.27.14", + "version": "0.27.15", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 08308ab1659..065821c7622 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.29 + +### Patch Changes + +- Updated dependencies [[`c3ff1f8`](https://github.com/clerk/javascript/commit/c3ff1f899098e235ff8651f9e31e2055fc43ba8e), [`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/backend@2.29.3 + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 1.13.28 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index b5965f456ff..4cd9e56fa7c 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.28", + "version": "1.13.29", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 5091a383dd8..199a3d5aa30 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.48 + +### Patch Changes + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + ## 2.4.47 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index b4bb35ada2e..29e6987ac5e 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.47", + "version": "2.4.48", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index f7b5cdbfac6..5b2047df797 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.11 + +### Patch Changes + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + ## 4.101.10 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 249c1375f19..74757dbdeb0 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.10", + "version": "4.101.11", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index de5e2a64993..96b20b9eb2c 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.8 + +### Patch Changes + +- Updated dependencies [[`271ddeb`](https://github.com/clerk/javascript/commit/271ddeb0b47357f7da316eef389ae46b180c36da)]: + - @clerk/shared@3.43.0 + - @clerk/types@4.101.11 + ## 1.17.7 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 5cc3b627e27..5c35f5de339 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.7", + "version": "1.17.8", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From c650a04e624e7da5b81f2bdc12af0b6940c20f82 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 20 Jan 2026 08:33:48 -0800 Subject: [PATCH 056/123] chore(localizations): Improved french, korean and greek translations (#7619) --- .changeset/afraid-plums-sing.md | 5 + packages/localizations/src/el-GR.ts | 949 ++++++++++---------- packages/localizations/src/fr-FR.ts | 56 +- packages/localizations/src/ko-KR.ts | 1293 ++++++++++++++------------- 4 files changed, 1161 insertions(+), 1142 deletions(-) create mode 100644 .changeset/afraid-plums-sing.md diff --git a/.changeset/afraid-plums-sing.md b/.changeset/afraid-plums-sing.md new file mode 100644 index 00000000000..0e57ebbac4c --- /dev/null +++ b/.changeset/afraid-plums-sing.md @@ -0,0 +1,5 @@ +--- +"@clerk/localizations": patch +--- + +Improved Greek (el-GR), French (fr-FR), and Korean (ko-KR) translations. diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 06dde939d34..8c8e28818c0 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -10,173 +10,173 @@ * ===================================================================================== */ -import type { LocalizationResource } from '@clerk/types'; +import type { LocalizationResource } from '@clerk/shared/types'; export const elGR: LocalizationResource = { locale: 'el-GR', apiKeys: { - action__add: undefined, - action__search: undefined, + action__add: 'Προσθήκη', + action__search: 'Αναζήτηση', copySecret: { formButtonPrimary__copyAndClose: 'Αντιγραφή και κλείσιμο', formHint: 'Για λόγους ασφαλείας, δεν θα σας επιτρέψουμε να το δείτε ξανά αργότερα.', formTitle: 'Αντιγράψτε το κλειδί API "{{name}}" σας τώρα', }, - createdAndExpirationStatus__expiresOn: undefined, - createdAndExpirationStatus__never: undefined, - detailsTitle__emptyRow: undefined, - formButtonPrimary__add: undefined, - formFieldCaption__expiration__expiresOn: undefined, - formFieldCaption__expiration__never: undefined, - formFieldOption__expiration__180d: undefined, - formFieldOption__expiration__1d: undefined, - formFieldOption__expiration__1y: undefined, - formFieldOption__expiration__30d: undefined, - formFieldOption__expiration__60d: undefined, - formFieldOption__expiration__7d: undefined, - formFieldOption__expiration__90d: undefined, - formFieldOption__expiration__never: undefined, - formHint: undefined, - formTitle: undefined, - lastUsed__days: undefined, - lastUsed__hours: undefined, - lastUsed__minutes: undefined, - lastUsed__months: undefined, - lastUsed__seconds: undefined, - lastUsed__years: undefined, - menuAction__revoke: undefined, + createdAndExpirationStatus__expiresOn: 'Λήγει στις {{expiresDate}}', + createdAndExpirationStatus__never: 'Δεν λήγει ποτέ', + detailsTitle__emptyRow: 'Δεν υπάρχουν κλειδιά API προς εμφάνιση', + formButtonPrimary__add: 'Προσθήκη κλειδιού', + formFieldCaption__expiration__expiresOn: 'Λήγει στις', + formFieldCaption__expiration__never: 'Δεν λήγει ποτέ', + formFieldOption__expiration__180d: '180 ημέρες', + formFieldOption__expiration__1d: '1 ημέρα', + formFieldOption__expiration__1y: '1 έτος', + formFieldOption__expiration__30d: '30 ημέρες', + formFieldOption__expiration__60d: '60 ημέρες', + formFieldOption__expiration__7d: '7 ημέρες', + formFieldOption__expiration__90d: '90 ημέρες', + formFieldOption__expiration__never: 'Ποτέ', + formHint: 'Δημιουργήστε ένα κλειδί API για την ενσωμάτωση με εξωτερικές υπηρεσίες.', + formTitle: 'Δημιουργία κλειδιού API', + lastUsed__days: 'Τελευταία χρήση πριν {{count}} ημέρες', + lastUsed__hours: 'Τελευταία χρήση πριν {{count}} ώρες', + lastUsed__minutes: 'Τελευταία χρήση πριν {{count}} λεπτά', + lastUsed__months: 'Τελευταία χρήση πριν {{count}} μήνες', + lastUsed__seconds: 'Τελευταία χρήση πριν {{count}} δευτερόλεπτα', + lastUsed__years: 'Τελευταία χρήση πριν {{count}} έτη', + menuAction__revoke: 'Ανάκληση', revokeConfirmation: { - confirmationText: undefined, - formButtonPrimary__revoke: undefined, - formHint: undefined, - formTitle: undefined, + confirmationText: 'Πληκτρολογήστε "{{secretName}}" για να επιβεβαιώσετε', + formButtonPrimary__revoke: 'Ανάκληση κλειδιού', + formHint: 'Αυτή η ενέργεια είναι μόνιμη και μη αναστρέψιμη.', + formTitle: 'Ανάκληση κλειδιού API', }, }, backButton: 'Πίσω', - badge__activePlan: undefined, - badge__canceledEndsAt: undefined, - badge__currentPlan: undefined, + badge__activePlan: 'Ενεργό πλάνο', + badge__canceledEndsAt: 'Ακυρώθηκε, λήγει {{date | timeString("el-GR")}}', + badge__currentPlan: 'Τρέχον πλάνο', badge__default: 'Προεπιλογή', - badge__endsAt: undefined, - badge__expired: undefined, - badge__freeTrial: undefined, + badge__endsAt: 'Λήγει {{date | timeString("el-GR")}}', + badge__expired: 'Έληξε', + badge__freeTrial: 'Δωρεάν δοκιμή', badge__otherImpersonatorDevice: 'Άλλη συσκευή υποδυόμενου', - badge__pastDueAt: undefined, - badge__pastDuePlan: undefined, + badge__pastDueAt: 'Ληξιπρόθεσμο {{date | timeString("el-GR")}}', + badge__pastDuePlan: 'Ληξιπρόθεσμο πλάνο', badge__primary: 'Κύριο', - badge__renewsAt: undefined, + badge__renewsAt: 'Ανανεώνεται {{date | timeString("el-GR")}}', badge__requiresAction: 'Απαιτεί ενέργεια', - badge__startsAt: undefined, + badge__startsAt: 'Ξεκινά {{date | timeString("el-GR")}}', badge__thisDevice: 'Αυτή η συσκευή', - badge__trialEndsAt: undefined, + badge__trialEndsAt: 'Η δοκιμή λήγει {{date | timeString("el-GR")}}', badge__unverified: 'Μη επαληθευμένο', - badge__upcomingPlan: undefined, + badge__upcomingPlan: 'Επερχόμενο πλάνο', badge__userDevice: 'Συσκευή χρήστη', badge__you: 'Εσείς', billing: { - addPaymentMethod__label: undefined, - alwaysFree: undefined, - annually: undefined, - availableFeatures: undefined, - billedAnnually: undefined, - billedMonthlyOnly: undefined, - cancelFreeTrial: undefined, - cancelFreeTrialAccessUntil: undefined, - cancelFreeTrialTitle: undefined, - cancelSubscription: undefined, - cancelSubscriptionAccessUntil: undefined, - cancelSubscriptionNoCharge: undefined, - cancelSubscriptionPastDue: undefined, - cancelSubscriptionTitle: undefined, - cannotSubscribeMonthly: undefined, - cannotSubscribeUnrecoverable: undefined, + addPaymentMethod__label: 'Προσθήκη μεθόδου πληρωμής', + alwaysFree: 'Πάντα δωρεάν', + annually: 'Ετήσια', + availableFeatures: 'Διαθέσιμα χαρακτηριστικά', + billedAnnually: 'Χρέωση ετησίως', + billedMonthlyOnly: 'Χρέωση μόνο μηνιαίως', + cancelFreeTrial: 'Ακύρωση δωρεάν δοκιμής', + cancelFreeTrialAccessUntil: 'Θα έχετε πρόσβαση μέχρι τις {{date | timeString("el-GR")}}', + cancelFreeTrialTitle: 'Ακύρωση δωρεάν δοκιμής;', + cancelSubscription: 'Ακύρωση συνδρομής', + cancelSubscriptionAccessUntil: 'Θα έχετε πρόσβαση μέχρι τις {{date | timeString("el-GR")}}', + cancelSubscriptionNoCharge: 'Δεν θα χρεωθείτε ξανά', + cancelSubscriptionPastDue: 'Η συνδρομή σας είναι ληξιπρόθεσμη. Η ακύρωση θα διαγράψει όλα τα μη καταβληθέντα ποσά.', + cancelSubscriptionTitle: 'Ακύρωση συνδρομής;', + cannotSubscribeMonthly: 'Δεν μπορείτε να εγγραφείτε μηνιαίως σε αυτό το πλάνο', + cannotSubscribeUnrecoverable: 'Δεν μπορείτε να εγγραφείτε σε αυτό το πλάνο αυτήν τη στιγμή', checkout: { - description__paymentSuccessful: undefined, - description__subscriptionSuccessful: undefined, - downgradeNotice: undefined, + description__paymentSuccessful: 'Η πληρωμή σας ολοκληρώθηκε επιτυχώς', + description__subscriptionSuccessful: 'Η συνδρομή σας ξεκίνησε επιτυχώς', + downgradeNotice: 'Θα υποβαθμιστείτε στο τέλος της τρέχουσας περιόδου χρέωσης', emailForm: { - subtitle: undefined, - title: undefined, + subtitle: 'Εισάγετε τη διεύθυνση email σας για να συνεχίσετε', + title: 'Στοιχεία πληρωμής', }, lineItems: { - title__freeTrialEndsAt: undefined, - title__paymentMethod: undefined, - title__statementId: undefined, - title__subscriptionBegins: undefined, - title__totalPaid: undefined, - }, - pastDueNotice: undefined, - perMonth: undefined, - title: undefined, - title__paymentSuccessful: undefined, - title__subscriptionSuccessful: undefined, - title__trialSuccess: undefined, - totalDueAfterTrial: undefined, - }, - credit: undefined, - creditRemainder: undefined, - defaultFreePlanActive: undefined, - free: undefined, - getStarted: undefined, - keepFreeTrial: undefined, - keepSubscription: undefined, - manage: undefined, - manageSubscription: undefined, - month: undefined, - monthly: undefined, - pastDue: undefined, - pay: undefined, + title__freeTrialEndsAt: 'Η δοκιμή λήγει', + title__paymentMethod: 'Μέθοδος πληρωμής', + title__statementId: 'ID κατάστασης', + title__subscriptionBegins: 'Η συνδρομή ξεκινά', + title__totalPaid: 'Σύνολο που καταβλήθηκε', + }, + pastDueNotice: 'Η συνδρομή σας είναι ληξιπρόθεσμη. Παρακαλώ ενημερώστε τη μέθοδο πληρωμής σας.', + perMonth: 'ανά μήνα', + title: 'Ολοκλήρωση πληρωμής', + title__paymentSuccessful: 'Επιτυχής πληρωμή', + title__subscriptionSuccessful: 'Επιτυχής συνδρομή', + title__trialSuccess: 'Επιτυχής δωρεάν δοκιμή', + totalDueAfterTrial: 'Σύνολο οφειλής μετά τη δοκιμή', + }, + credit: 'Πίστωση', + creditRemainder: 'Υπόλοιπο πίστωσης', + defaultFreePlanActive: 'Το προεπιλεγμένο δωρεάν πλάνο είναι ενεργό', + free: 'Δωρεάν', + getStarted: 'Ξεκινήστε', + keepFreeTrial: 'Διατήρηση δωρεάν δοκιμής', + keepSubscription: 'Διατήρηση συνδρομής', + manage: 'Διαχείριση', + manageSubscription: 'Διαχείριση συνδρομής', + month: 'μήνας', + monthly: 'Μηνιαία', + pastDue: 'Ληξιπρόθεσμο', + pay: 'Πληρωμή', paymentMethod: { applePayDescription: { - annual: undefined, - monthly: undefined, + annual: '{{price}} ετησίως', + monthly: '{{price}} μηνιαίως', }, dev: { - anyNumbers: undefined, - cardNumber: undefined, - cvcZip: undefined, - developmentMode: undefined, - expirationDate: undefined, - testCardInfo: undefined, + anyNumbers: 'Οποιοιδήποτε αριθμοί', + cardNumber: 'Αριθμός κάρτας', + cvcZip: 'CVC/Ταχ. Κωδ.', + developmentMode: 'Λειτουργία ανάπτυξης', + expirationDate: 'Ημερομηνία λήξης', + testCardInfo: 'Χρησιμοποιήστε τα παρακάτω στοιχεία δοκιμαστικής κάρτας', }, }, - paymentMethods__label: undefined, - popular: undefined, + paymentMethods__label: 'Μέθοδοι πληρωμής', + popular: 'Δημοφιλές', pricingTable: { - billingCycle: undefined, - included: undefined, - }, - reSubscribe: undefined, - seeAllFeatures: undefined, - startFreeTrial: undefined, - startFreeTrial__days: undefined, - subscribe: undefined, + billingCycle: 'Κύκλος χρέωσης', + included: 'Περιλαμβάνεται', + }, + reSubscribe: 'Επανεγγραφή', + seeAllFeatures: 'Δείτε όλα τα χαρακτηριστικά', + startFreeTrial: 'Έναρξη δωρεάν δοκιμής', + startFreeTrial__days: 'Έναρξη δωρεάν δοκιμής {{days}} ημερών', + subscribe: 'Εγγραφή', subscriptionDetails: { - beginsOn: undefined, - currentBillingCycle: undefined, - endsOn: undefined, - firstPaymentAmount: undefined, - firstPaymentOn: undefined, - nextPaymentAmount: undefined, - nextPaymentOn: undefined, - pastDueAt: undefined, - renewsAt: undefined, - subscribedOn: undefined, - title: undefined, - trialEndsOn: undefined, - trialStartedOn: undefined, - }, - subtotal: undefined, - switchPlan: undefined, - switchToAnnual: undefined, - switchToAnnualWithAnnualPrice: undefined, - switchToMonthly: undefined, - switchToMonthlyWithPrice: undefined, - totalDue: undefined, - totalDueToday: undefined, - viewFeatures: undefined, - viewPayment: undefined, - year: undefined, + beginsOn: 'Ξεκινά στις', + currentBillingCycle: 'Τρέχων κύκλος χρέωσης', + endsOn: 'Λήγει στις', + firstPaymentAmount: 'Ποσό πρώτης πληρωμής', + firstPaymentOn: 'Πρώτη πληρωμή στις', + nextPaymentAmount: 'Ποσό επόμενης πληρωμής', + nextPaymentOn: 'Επόμενη πληρωμή στις', + pastDueAt: 'Ληξιπρόθεσμο στις', + renewsAt: 'Ανανεώνεται στις', + subscribedOn: 'Εγγραφή στις', + title: 'Λεπτομέρειες συνδρομής', + trialEndsOn: 'Η δοκιμή λήγει στις', + trialStartedOn: 'Η δοκιμή ξεκίνησε στις', + }, + subtotal: 'Υποσύνολο', + switchPlan: 'Αλλαγή πλάνου', + switchToAnnual: 'Αλλαγή σε ετήσια χρέωση', + switchToAnnualWithAnnualPrice: 'Αλλαγή σε ετήσια χρέωση για {{price}}/έτος', + switchToMonthly: 'Αλλαγή σε μηνιαία χρέωση', + switchToMonthlyWithPrice: 'Αλλαγή σε μηνιαία χρέωση για {{price}}/μήνα', + totalDue: 'Συνολική οφειλή', + totalDueToday: 'Συνολική οφειλή σήμερα', + viewFeatures: 'Προβολή χαρακτηριστικών', + viewPayment: 'Προβολή πληρωμής', + year: 'έτος', }, createOrganization: { formButtonSubmit: 'Δημιουργία οργανισμού', @@ -194,23 +194,24 @@ export const elGR: LocalizationResource = { sameDay: "Σήμερα στις {{ date | timeString('el') }}", }, dividerText: 'ή', - footerActionLink__alternativePhoneCodeProvider: undefined, + footerActionLink__alternativePhoneCodeProvider: 'Λάβετε κωδικό με άλλο τρόπο', footerActionLink__useAnotherMethod: 'Χρησιμοποιήστε άλλη μέθοδο', footerPageLink__help: 'Βοήθεια', footerPageLink__privacy: 'Προστασία προσωπικών δεδομένων', footerPageLink__terms: 'Όροι', formButtonPrimary: 'Συνέχεια', - formButtonPrimary__verify: 'Verify', + formButtonPrimary__verify: 'Επαλήθευση', formFieldAction__forgotPassword: 'Ξεχάσατε τον κωδικό;', formFieldError__matchingPasswords: 'Οι κωδικοί ταιριάζουν.', formFieldError__notMatchingPasswords: 'Οι κωδικοί δεν ταιριάζουν.', - formFieldError__verificationLinkExpired: 'The verification link expired. Please request a new link.', + formFieldError__verificationLinkExpired: 'Ο σύνδεσμος επαλήθευσης έληξε. Παρακαλώ ζητήστε νέο σύνδεσμο.', formFieldHintText__optional: 'Προαιρετικό', - formFieldHintText__slug: 'A slug is a human-readable ID that must be unique. It’s often used in URLs.', - formFieldInputPlaceholder__apiKeyDescription: undefined, - formFieldInputPlaceholder__apiKeyExpirationDate: undefined, - formFieldInputPlaceholder__apiKeyName: undefined, - formFieldInputPlaceholder__backupCode: undefined, + formFieldHintText__slug: + 'Ένα slug είναι ένα αναγνωριστικό αναγνώσιμο από ανθρώπους που πρέπει να είναι μοναδικό. Χρησιμοποιείται συχνά σε URLs.', + formFieldInputPlaceholder__apiKeyDescription: 'Προσθέστε μια περιγραφή (προαιρετικό)', + formFieldInputPlaceholder__apiKeyExpirationDate: 'Επιλέξτε ημερομηνία λήξης', + formFieldInputPlaceholder__apiKeyName: 'Εισάγετε όνομα κλειδιού', + formFieldInputPlaceholder__backupCode: 'Εφεδρικός κωδικός', formFieldInputPlaceholder__confirmDeletionUserAccount: 'Delete account', formFieldInputPlaceholder__emailAddress: 'Εισάγετε τη διεύθυνση email σας', formFieldInputPlaceholder__emailAddress_username: 'Εισάγετε email ή όνομα χρήστη', @@ -224,8 +225,8 @@ export const elGR: LocalizationResource = { formFieldInputPlaceholder__organizationSlug: 'my-org', formFieldInputPlaceholder__password: 'Εισάγετε τον κωδικό σας', formFieldInputPlaceholder__phoneNumber: 'Εισάγετε τον αριθμό τηλεφώνου σας', - formFieldInputPlaceholder__username: undefined, - formFieldInput__emailAddress_format: undefined, + formFieldInputPlaceholder__username: 'Εισάγετε όνομα χρήστη', + formFieldInput__emailAddress_format: 'Διεύθυνση email', formFieldLabel__apiKey: 'Κλειδί API', formFieldLabel__apiKeyDescription: 'Περιγραφή', formFieldLabel__apiKeyExpiration: 'Λήξη', @@ -248,7 +249,7 @@ export const elGR: LocalizationResource = { 'Εισάγετε μια διεύθυνση email σε αυτόν τον τομέα για να λάβετε κωδικό και να επαληθεύσετε τον τομέα.', formFieldLabel__organizationName: 'Όνομα οργανισμού', formFieldLabel__organizationSlug: 'Συντόμευση URL', - formFieldLabel__passkeyName: undefined, + formFieldLabel__passkeyName: 'Όνομα Passkey', formFieldLabel__password: 'Κωδικός πρόσβασης', formFieldLabel__phoneNumber: 'Αριθμός τηλεφώνου', formFieldLabel__role: 'Ρόλος', @@ -259,7 +260,8 @@ export const elGR: LocalizationResource = { title: 'Είστε συνδεδεμένος ως {{identifier}}', }, lastAuthenticationStrategy: 'Τελευταία χρήση', - maintenanceMode: undefined, + maintenanceMode: + 'Βρισκόμαστε αυτήν τη στιγμή σε λειτουργία συντήρησης, αλλά μην ανησυχείτε, δεν θα διαρκέσει πάνω από λίγα λεπτά.', membershipRole__admin: 'Διαχειριστής', membershipRole__basicMember: 'Μέλος', membershipRole__guestMember: 'Επισκέπτης', @@ -276,7 +278,7 @@ export const elGR: LocalizationResource = { }, organizationProfile: { apiKeysPage: { - title: undefined, + title: 'Κλειδιά API', }, badge__automaticInvitation: 'Αυτόματες προσκλήσεις', badge__automaticSuggestion: 'Αυτόματες προτάσεις', @@ -284,62 +286,62 @@ export const elGR: LocalizationResource = { badge__unverified: 'Μη επαληθευμένο', billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'Δεν υπάρχει ιστορικό πληρωμών', + notFound: 'Δεν βρέθηκαν πληρωμές', + tableHeader__amount: 'Ποσό', + tableHeader__date: 'Ημερομηνία', + tableHeader__status: 'Κατάσταση', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Ορισμός ως προεπιλογή', + actionLabel__remove: 'Αφαίρεση', + add: 'Προσθήκη μεθόδου πληρωμής', + addSubtitle: 'Προσθέστε μια νέα μέθοδο πληρωμής στον λογαριασμό σας', + cancelButton: 'Ακύρωση', + formButtonPrimary__add: 'Προσθήκη', + formButtonPrimary__pay: 'Πληρωμή', + payWithTestCardButton: 'Πληρωμή με δοκιμαστική κάρτα', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: 'Η μέθοδος πληρωμής {{identifier}} θα αφαιρεθεί από τον λογαριασμό σας', + messageLine2: 'Δεν θα μπορείτε πλέον να χρησιμοποιήσετε αυτή τη μέθοδο πληρωμής', + successMessage: 'Η μέθοδος πληρωμής αφαιρέθηκε επιτυχώς', + title: 'Αφαίρεση μεθόδου πληρωμής', }, - title: undefined, + title: 'Μέθοδοι πληρωμής', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Πληρωμές', + headerTitle__plans: 'Πλάνα', + headerTitle__statements: 'Καταστάσεις', + headerTitle__subscriptions: 'Συνδρομές', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'Δεν υπάρχουν καταστάσεις', + itemCaption__paidForPlan: 'Πληρώθηκε για {{planName}}', + itemCaption__proratedCredit: 'Πίστωση αναλογικής κατανομής', + itemCaption__subscribedAndPaidForPlan: 'Εγγραφή και πληρωμή για {{planName}}', + notFound: 'Δεν βρέθηκαν καταστάσεις', + tableHeader__amount: 'Ποσό', + tableHeader__date: 'Ημερομηνία', + title: 'Καταστάσεις', + totalPaid: 'Συνολικό καταβληθέν ποσό', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Διαχείριση συνδρομής', + actionLabel__newSubscription: 'Νέα συνδρομή', + actionLabel__switchPlan: 'Αλλαγή πλάνου', + tableHeader__edit: 'Επεξεργασία', + tableHeader__plan: 'Πλάνο', + tableHeader__startDate: 'Ημερομηνία έναρξης', + title: 'Συνδρομές', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Προεπιλογή', }, switchPlansSection: { - title: undefined, + title: 'Αλλαγή πλάνου', }, - title: undefined, + title: 'Χρεώσεις', }, createDomainPage: { subtitle: @@ -357,7 +359,7 @@ export const elGR: LocalizationResource = { }, membersPage: { action__invite: 'Πρόσκληση', - action__search: undefined, + action__search: 'Αναζήτηση', activeMembersTab: { menuAction__remove: 'Αφαίρεση μέλους', tableHeader__actions: 'Ενέργειες', @@ -369,11 +371,11 @@ export const elGR: LocalizationResource = { invitationsTab: { autoInvitations: { headerSubtitle: - 'Invite users by connecting an email domain with your organization. Anyone who signs up with a matching email domain will be able to join the organization anytime.', - headerTitle: 'Automatic invitations', - primaryButton: 'Manage verified domains', + 'Προσκαλέστε χρήστες συνδέοντας έναν τομέα email με τον οργανισμό σας. Οποιοσδήποτε εγγραφεί με έναν αντίστοιχο τομέα email θα μπορεί να συμμετάσχει στον οργανισμό ανά πάσα στιγμή.', + headerTitle: 'Αυτόματες προσκλήσεις', + primaryButton: 'Διαχείριση επαληθευμένων τομέων', }, - table__emptyRow: 'No invitations to display', + table__emptyRow: 'Δεν υπάρχουν προσκλήσεις προς εμφάνιση', }, invitedMembersTab: { menuAction__revoke: 'Ανάκληση πρόσκλησης', @@ -382,19 +384,19 @@ export const elGR: LocalizationResource = { requestsTab: { autoSuggestions: { headerSubtitle: - 'Users who sign up with a matching email domain, will be able to see a suggestion to request to join your organization.', - headerTitle: 'Automatic suggestions', - primaryButton: 'Manage verified domains', + 'Οι χρήστες που εγγράφονται με αντίστοιχο τομέα email, θα μπορούν να δουν μια πρόταση να ζητήσουν συμμετοχή στον οργανισμό σας.', + headerTitle: 'Αυτόματες προτάσεις', + primaryButton: 'Διαχείριση επαληθευμένων τομέων', }, - menuAction__approve: 'Approve', - menuAction__reject: 'Reject', - tableHeader__requested: 'Requested access', - table__emptyRow: 'No requests to display', + menuAction__approve: 'Έγκριση', + menuAction__reject: 'Απόρριψη', + tableHeader__requested: 'Ζητήθηκε πρόσβαση', + table__emptyRow: 'Δεν υπάρχουν αιτήματα προς εμφάνιση', }, start: { - headerTitle__invitations: 'Invitations', - headerTitle__members: 'Members', - headerTitle__requests: 'Requests', + headerTitle__invitations: 'Προσκλήσεις', + headerTitle__members: 'Μέλη', + headerTitle__requests: 'Αιτήματα', }, alerts: { roleSetMigrationInProgress: { @@ -405,18 +407,18 @@ export const elGR: LocalizationResource = { }, }, navbar: { - apiKeys: undefined, - billing: undefined, - description: 'Manage your organization.', - general: 'General', - members: 'Members', - title: 'Organization', + apiKeys: 'Κλειδιά API', + billing: 'Χρεώσεις', + description: 'Διαχείριση του οργανισμού σας.', + general: 'Γενικά', + members: 'Μέλη', + title: 'Οργανισμός', }, plansPage: { alerts: { - noPermissionsToManageBilling: undefined, + noPermissionsToManageBilling: 'Δεν έχετε δικαιώματα για διαχείριση χρεώσεων', }, - title: undefined, + title: 'Πλάνα', }, profilePage: { dangerSection: { @@ -438,79 +440,80 @@ export const elGR: LocalizationResource = { title: 'Κίνδυνος', }, domainSection: { - menuAction__manage: 'Manage', - menuAction__remove: 'Delete', - menuAction__verify: 'Verify', - primaryButton: 'Add domain', + menuAction__manage: 'Διαχείριση', + menuAction__remove: 'Διαγραφή', + menuAction__verify: 'Επαλήθευση', + primaryButton: 'Προσθήκη τομέα', subtitle: - 'Allow users to join the organization automatically or request to join based on a verified email domain.', - title: 'Verified domains', + 'Επιτρέψτε στους χρήστες να συμμετάσχουν στον οργανισμό αυτόματα ή να ζητήσουν συμμετοχή με βάση έναν επαληθευμένο τομέα email.', + title: 'Επαληθευμένοι τομείς', }, successMessage: 'Ο οργανισμός έχει ενημερωθεί.', title: 'Προφίλ Οργανισμού', }, removeDomainPage: { - messageLine1: 'The email domain {{domain}} will be removed.', - messageLine2: 'Users won’t be able to join the organization automatically after this.', - successMessage: '{{domain}} has been removed.', - title: 'Remove domain', + messageLine1: 'Ο τομέας email {{domain}} θα αφαιρεθεί.', + messageLine2: 'Οι χρήστες δεν θα μπορούν να συμμετάσχουν στον οργανισμό αυτόματα μετά από αυτό.', + successMessage: 'Ο τομέας {{domain}} αφαιρέθηκε.', + title: 'Αφαίρεση τομέα', }, start: { - headerTitle__general: 'General', + headerTitle__general: 'Γενικά', headerTitle__members: 'Μέλη', profileSection: { primaryButton: 'Ενημέρωση προφίλ', - title: 'Organization Profile', - uploadAction__title: 'Logo', + title: 'Προφίλ οργανισμού', + uploadAction__title: 'Λογότυπο', }, }, verifiedDomainPage: { dangerTab: { - calloutInfoLabel: 'Removing this domain will affect invited users.', - removeDomainActionLabel__remove: 'Remove domain', - removeDomainSubtitle: 'Remove this domain from your verified domains', - removeDomainTitle: 'Remove domain', + calloutInfoLabel: 'Η αφαίρεση αυτού του τομέα θα επηρεάσει τους προσκεκλημένους χρήστες.', + removeDomainActionLabel__remove: 'Αφαίρεση τομέα', + removeDomainSubtitle: 'Αφαίρεση αυτού του τομέα από τους επαληθευμένους τομείς σας', + removeDomainTitle: 'Αφαίρεση τομέα', }, enrollmentTab: { automaticInvitationOption__description: - 'Users are automatically invited to join the organization when they sign-up and can join anytime.', - automaticInvitationOption__label: 'Automatic invitations', + 'Οι χρήστες προσκαλούνται αυτόματα να συμμετάσχουν στον οργανισμό όταν εγγραφούν και μπορούν να συμμετάσχουν ανά πάσα στιγμή.', + automaticInvitationOption__label: 'Αυτόματες προσκλήσεις', automaticSuggestionOption__description: - 'Users receive a suggestion to request to join, but must be approved by an admin before they are able to join the organization.', - automaticSuggestionOption__label: 'Automatic suggestions', - calloutInfoLabel: 'Changing the enrollment mode will only affect new users.', - calloutInvitationCountLabel: 'Pending invitations sent to users: {{count}}', - calloutSuggestionCountLabel: 'Pending suggestions sent to users: {{count}}', - manualInvitationOption__description: 'Users can only be invited manually to the organization.', - manualInvitationOption__label: 'No automatic enrollment', - subtitle: 'Choose how users from this domain can join the organization.', + 'Οι χρήστες λαμβάνουν μια πρόταση να ζητήσουν συμμετοχή, αλλά πρέπει να εγκριθούν από έναν διαχειριστή πριν μπορέσουν να συμμετάσχουν στον οργανισμό.', + automaticSuggestionOption__label: 'Αυτόματες προτάσεις', + calloutInfoLabel: 'Η αλλαγή του τρόπου εγγραφής θα επηρεάσει μόνο νέους χρήστες.', + calloutInvitationCountLabel: 'Εκκρεμείς προσκλήσεις που στάλθηκαν σε χρήστες: {{count}}', + calloutSuggestionCountLabel: 'Εκκρεμείς προτάσεις που στάλθηκαν σε χρήστες: {{count}}', + manualInvitationOption__description: 'Οι χρήστες μπορούν να προσκληθούν μόνο χειροκίνητα στον οργανισμό.', + manualInvitationOption__label: 'Χωρίς αυτόματη εγγραφή', + subtitle: 'Επιλέξτε πώς οι χρήστες από αυτόν τον τομέα μπορούν να συμμετάσχουν στον οργανισμό.', }, start: { - headerTitle__danger: 'Danger', - headerTitle__enrollment: 'Enrollment options', + headerTitle__danger: 'Επικίνδυνη ζώνη', + headerTitle__enrollment: 'Επιλογές εγγραφής', }, - subtitle: 'The domain {{domain}} is now verified. Continue by selecting enrollment mode.', - title: 'Update {{domain}}', + subtitle: 'Ο τομέας {{domain}} είναι πλέον επαληθευμένος. Συνεχίστε επιλέγοντας τον τρόπο εγγραφής.', + title: 'Ενημέρωση {{domain}}', }, verifyDomainPage: { - formSubtitle: 'Enter the verification code sent to your email address', - formTitle: 'Verification code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'The domain {{domainName}} needs to be verified via email.', - subtitleVerificationCodeScreen: 'A verification code was sent to {{emailAddress}}. Enter the code to continue.', - title: 'Verify domain', + formSubtitle: 'Εισάγετε τον κωδικό επαλήθευσης που στάλθηκε στη διεύθυνση email σας', + formTitle: 'Κωδικός επαλήθευσης', + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'Ο τομέας {{domainName}} πρέπει να επαληθευτεί μέσω email.', + subtitleVerificationCodeScreen: + 'Ένας κωδικός επαλήθευσης στάλθηκε στο {{emailAddress}}. Εισάγετε τον κωδικό για να συνεχίσετε.', + title: 'Επαλήθευση τομέα', }, }, organizationSwitcher: { - action__closeOrganizationSwitcher: undefined, - action__createOrganization: 'Δημιουργία Οργανισμού', - action__invitationAccept: 'Join', - action__manageOrganization: 'Διαχείριση Οργανισμού', - action__openOrganizationSwitcher: undefined, - action__suggestionsAccept: 'Request to join', - notSelected: 'Δεν έχει επιλεγεί οργανισμός', - personalWorkspace: 'Προσωπικός Χώρος Εργασίας', - suggestionsAcceptedLabel: 'Pending approval', + action__closeOrganizationSwitcher: 'Κλείσιμο επιλογέα οργανισμού', + action__createOrganization: 'Δημιουργία οργανισμού', + action__invitationAccept: 'Συμμετοχή', + action__manageOrganization: 'Διαχείριση οργανισμού', + action__openOrganizationSwitcher: 'Άνοιγμα επιλογέα οργανισμού', + action__suggestionsAccept: 'Αίτηση συμμετοχής', + notSelected: 'Δεν επιλέχθηκε οργανισμός', + personalWorkspace: 'Προσωπικός χώρος εργασίας', + suggestionsAcceptedLabel: 'Εκκρεμεί έγκριση', }, paginationButton__next: 'Επόμενο', paginationButton__previous: 'Προηγούμενο', @@ -518,71 +521,74 @@ export const elGR: LocalizationResource = { paginationRowText__of: 'από', reverification: { alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__passkey: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, + actionLink: 'Λάβετε βοήθεια', + actionText: 'Δεν έχετε κάποιο από αυτά;', + blockButton__backupCode: 'Χρησιμοποιήστε εφεδρικό κωδικό', + blockButton__emailCode: 'Αποστολή κωδικού στο {{identifier}}', + blockButton__passkey: 'Χρησιμοποιήστε το passkey σας', + blockButton__password: 'Σύνδεση με τον κωδικό πρόσβασής σας', + blockButton__phoneCode: 'Αποστολή κωδικού μέσω SMS στο {{identifier}}', + blockButton__totp: 'Χρησιμοποιήστε την εφαρμογή επαλήθευσης', getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, + blockButton__emailSupport: 'Επικοινωνία με υποστήριξη email', + content: + 'Εάν αντιμετωπίζετε δυσκολίες στην επιβεβαίωση της ταυτότητάς σας, στείλτε μας email και θα συνεργαστούμε μαζί σας για να αποκαταστήσουμε την πρόσβαση το συντομότερο δυνατόν.', + title: 'Λάβετε βοήθεια', }, - subtitle: undefined, - title: undefined, + subtitle: + 'Αντιμετωπίζετε προβλήματα; Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από αυτές τις μεθόδους για επιβεβαίωση.', + title: 'Χρησιμοποιήστε άλλη μέθοδο', }, backupCodeMfa: { - subtitle: undefined, - title: undefined, + subtitle: 'για να συνεχίσετε', + title: 'Εισάγετε εφεδρικό κωδικό', }, emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Κωδικός επαλήθευσης', + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'για να συνεχίσετε', + title: 'Ελέγξτε το email σας', }, noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, + message: 'Δεν είναι δυνατή η συνέχεια. Δεν υπάρχει διαθέσιμος παράγοντας επαλήθευσης.', + subtitle: 'Παρουσιάστηκε σφάλμα', + title: 'Δεν είναι δυνατή η συνέχεια', }, passkey: { - blockButton__passkey: undefined, - subtitle: undefined, - title: undefined, + blockButton__passkey: 'Χρησιμοποιήστε το passkey σας', + subtitle: + 'Η χρήση του passkey σας επαληθεύει ότι είστε εσείς. Η συσκευή σας μπορεί να ζητήσει το δακτυλικό σας αποτύπωμα, την αναγνώριση προσώπου ή το PIN οθόνης.', + title: 'Χρησιμοποιήστε το passkey σας', }, password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Χρησιμοποιήστε άλλη μέθοδο', + subtitle: 'για να συνεχίσετε', + title: 'Εισάγετε τον κωδικό πρόσβασής σας', }, phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Κωδικός επαλήθευσης', + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'για να συνεχίσετε', + title: 'Ελέγξτε το τηλέφωνό σας', }, phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Κωδικός επαλήθευσης', + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'για να συνεχίσετε', + title: 'Ελέγξτε το τηλέφωνό σας', }, totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Κωδικός επαλήθευσης', + subtitle: 'για να συνεχίσετε', + title: 'Επαλήθευση δύο παραγόντων', }, }, signIn: { accountSwitcher: { - action__addAccount: 'Add account', - action__signOutAll: 'Sign out of all accounts', - subtitle: 'Select the account with which you wish to continue.', - title: 'Choose an account', + action__addAccount: 'Προσθήκη λογαριασμού', + action__signOutAll: 'Αποσύνδεση από όλους τους λογαριασμούς', + subtitle: 'Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να συνεχίσετε.', + title: 'Επιλέξτε λογαριασμό', }, alternativeMethods: { actionLink: 'Λήψη βοήθειας', @@ -590,7 +596,7 @@ export const elGR: LocalizationResource = { blockButton__backupCode: 'Χρήση ενός εφεδρικού κωδικού', blockButton__emailCode: 'Αποστολή κωδικού με email στο {{identifier}}', blockButton__emailLink: 'Αποστολή συνδέσμου στο {{identifier}}', - blockButton__passkey: undefined, + blockButton__passkey: 'Σύνδεση με passkey', blockButton__password: 'Σύνδεση με τον κωδικό πρόσβασής σας', blockButton__phoneCode: 'Αποστολή κωδικού SMS στο {{identifier}}', blockButton__totp: 'Χρήση της εφαρμογής αυθεντικοποίησης', @@ -605,10 +611,10 @@ export const elGR: LocalizationResource = { title: 'Χρήση μιας άλλης μεθόδου', }, alternativePhoneCodeProvider: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Κωδικός επαλήθευσης', + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'Λάβετε έναν κωδικό μέσω {{provider}}', + title: 'Λάβετε κωδικό με άλλο τρόπο', }, backupCodeMfa: { subtitle: 'για να συνεχίσετε στο {{applicationName}}', @@ -628,8 +634,9 @@ export const elGR: LocalizationResource = { }, emailLink: { clientMismatch: { - subtitle: undefined, - title: undefined, + subtitle: + 'Για να συνεχίσετε, ανοίξτε το σύνδεσμο επαλήθευσης στην ίδια συσκευή και φυλλομετρητή που τον ζητήσατε.', + title: 'Δεν βρέθηκε έγκυρος σύνδεσμος επαλήθευσης', }, expired: { subtitle: 'Επιστροφή στην αρχική καρτέλα για να συνεχίσετε.', @@ -668,8 +675,8 @@ export const elGR: LocalizationResource = { title: 'Ελέγξτε το email σας', }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Συνδεθείτε με SSO επιχείρησης', + title: 'Σύνδεση επιχείρησης', }, forgotPassword: { formTitle: 'Επαναφορά κωδικού πρόσβασης', @@ -702,13 +709,13 @@ export const elGR: LocalizationResource = { title: 'Εισαγωγή κωδικού πρόσβασης', }, passwordCompromised: { - title: undefined, + title: 'Ο κωδικός πρόσβασης έχει παραβιαστεί', }, passwordPwned: { title: 'Παραβιασμένος κωδικός', }, passwordUntrusted: { - title: undefined, + title: 'Μη αξιόπιστος κωδικός πρόσβασης', }, phoneCode: { formTitle: 'Κωδικός επαλήθευσης', @@ -719,7 +726,7 @@ export const elGR: LocalizationResource = { phoneCodeMfa: { formTitle: 'Κωδικός επαλήθευσης', resendButton: 'Δεν λάβατε κωδικό; Αποστολή ξανά', - subtitle: undefined, + subtitle: 'για να συνεχίσετε στο {{applicationName}}', title: 'Ελέγξτε το τηλέφωνό σας', }, resetPassword: { @@ -743,19 +750,19 @@ export const elGR: LocalizationResource = { actionText: 'Δεν έχετε λογαριασμό;', actionText__join_waitlist: 'Θέλετε πρώιμη πρόσβαση;', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Χρησιμοποιήστε άλλη μέθοδο', + label: 'Δεν λάβατε κωδικό;', + subtitle: 'Εάν αντιμετωπίζετε προβλήματα, μπορείτε να λάβετε κωδικό με άλλο τρόπο.', + title: 'Λάβετε κωδικό με άλλο τρόπο', }, subtitle: 'για να συνεχίσετε στο {{applicationName}}', - subtitleCombined: undefined, + subtitleCombined: 'Συνεχίστε στο {{applicationName}}', title: 'Σύνδεση', titleCombined: 'Συνέχεια στο {{applicationName}}', }, totpMfa: { formTitle: 'Κωδικός επαλήθευσης', - subtitle: undefined, + subtitle: 'για να συνεχίσετε στο {{applicationName}}', title: 'Aυθεντικοποίηση δύο βημάτων', }, web3Solana: { @@ -766,9 +773,9 @@ export const elGR: LocalizationResource = { signInEnterPasswordTitle: 'Εισαγωγή κωδικού πρόσβασης', signUp: { alternativePhoneCodeProvider: { - resendButton: undefined, - subtitle: undefined, - title: undefined, + resendButton: 'Δεν λάβατε κωδικό; Επαναποστολή', + subtitle: 'Λάβετε έναν κωδικό μέσω {{provider}}', + title: 'Λάβετε κωδικό με άλλο τρόπο', }, continue: { actionLink: 'Σύνδεση', @@ -785,8 +792,9 @@ export const elGR: LocalizationResource = { }, emailLink: { clientMismatch: { - subtitle: undefined, - title: undefined, + subtitle: + 'Για να συνεχίσετε, ανοίξτε το σύνδεσμο επαλήθευσης στην ίδια συσκευή και φυλλομετρητή που τον ζητήσατε.', + title: 'Δεν βρέθηκε έγκυρος σύνδεσμος επαλήθευσης', }, formSubtitle: 'Χρησιμοποιήστε τον σύνδεσμο επαλήθευσης που απεστάλη στη διεύθυνση email σας', formTitle: 'Σύνδεσμος επαλήθευσης', @@ -806,8 +814,8 @@ export const elGR: LocalizationResource = { }, }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Εγγραφείτε με SSO επιχείρησης', + title: 'Εγγραφή επιχείρησης', }, legalConsent: { checkbox: { @@ -829,24 +837,24 @@ export const elGR: LocalizationResource = { title: 'Επαληθεύστε το τηλέφωνό σας', }, restrictedAccess: { - actionLink: undefined, - actionText: undefined, - blockButton__emailSupport: undefined, - blockButton__joinWaitlist: undefined, - subtitle: undefined, - subtitleWaitlist: undefined, - title: undefined, + actionLink: 'Σύνδεση', + actionText: 'Έχετε ήδη πρόσβαση;', + blockButton__emailSupport: 'Επικοινωνία με υποστήριξη', + blockButton__joinWaitlist: 'Εγγραφή στη λίστα αναμονής', + subtitle: 'Αυτή η εφαρμογή είναι αυτήν τη στιγμή μόνο για προσκεκλημένους.', + subtitleWaitlist: 'Εγγραφείτε στη λίστα αναμονής για πρώιμη πρόσβαση.', + title: 'Περιορισμένη πρόσβαση', }, start: { actionLink: 'Σύνδεση', - actionLink__use_email: undefined, - actionLink__use_phone: undefined, + actionLink__use_email: 'Χρήση email', + actionLink__use_phone: 'Χρήση τηλεφώνου', actionText: 'Έχετε ήδη λογαριασμό;', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Χρησιμοποιήστε άλλη μέθοδο', + label: 'Δεν λάβατε κωδικό;', + subtitle: 'Εάν αντιμετωπίζετε προβλήματα, μπορείτε να λάβετε κωδικό με άλλο τρόπο.', + title: 'Λάβετε κωδικό με άλλο τρόπο', }, subtitle: 'για να συνεχίσετε στο {{applicationName}}', subtitleCombined: 'για να συνεχίσετε στο {{applicationName}}', @@ -859,34 +867,34 @@ export const elGR: LocalizationResource = { }, }, socialButtonsBlockButton: 'Συνέχεια με {{provider|titleize}}', - socialButtonsBlockButtonManyInView: undefined, + socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { chooseOrganization: { - action__createOrganization: undefined, - action__invitationAccept: undefined, - action__suggestionsAccept: undefined, - subtitle: undefined, - subtitle__createOrganizationDisabled: undefined, - suggestionsAcceptedLabel: undefined, - title: undefined, + action__createOrganization: 'Δημιουργία νέου οργανισμού', + action__invitationAccept: 'Συμμετοχή', + action__suggestionsAccept: 'Αίτημα συμμετοχής', + subtitle: 'Συμμετάσχετε σε έναν υπάρχοντα οργανισμό ή δημιουργήστε νέο', + subtitle__createOrganizationDisabled: 'Συμμετάσχετε σε έναν υπάρχοντα οργανισμό', + suggestionsAcceptedLabel: 'Σε αναμονή έγκρισης', + title: 'Επιλέξτε οργανισμό', }, createOrganization: { - formButtonReset: undefined, - formButtonSubmit: undefined, - formFieldInputPlaceholder__name: undefined, - formFieldInputPlaceholder__slug: undefined, - formFieldLabel__name: undefined, - formFieldLabel__slug: undefined, - subtitle: undefined, - title: undefined, + formButtonReset: 'Ακύρωση', + formButtonSubmit: 'Συνέχεια', + formFieldInputPlaceholder__name: 'Ο οργανισμός μου', + formFieldInputPlaceholder__slug: 'o-organismos-mou', + formFieldLabel__name: 'Όνομα', + formFieldLabel__slug: 'Slug', + subtitle: 'Εισάγετε τα στοιχεία του οργανισμού σας για να συνεχίσετε', + title: 'Ρυθμίστε τον οργανισμό σας', }, organizationCreationDisabled: { title: 'Πρέπει να ανήκετε σε έναν οργανισμό', subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.', }, signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Αποσύνδεση', + actionText: 'Συνδεδεμένος ως {{identifier}}', }, alerts: { organizationAlreadyExists: @@ -894,72 +902,81 @@ export const elGR: LocalizationResource = { }, }, taskResetPassword: { - formButtonPrimary: undefined, + formButtonPrimary: 'Επαναφορά κωδικού πρόσβασης', signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Αποσύνδεση', + actionText: 'Συνδεδεμένος ως {{identifier}}', }, - subtitle: undefined, - title: undefined, + subtitle: 'Για λόγους ασφαλείας, παρακαλώ επαναφέρετε τον κωδικό πρόσβασής σας', + title: 'Επαναφορά κωδικού πρόσβασης', }, unstable__errors: { - already_a_member_in_organization: undefined, + already_a_member_in_organization: 'Είστε ήδη μέλος σε αυτόν τον οργανισμό', avatar_file_size_exceeded: 'Το μέγεθος του αρχείου υπερβαίνει το μέγιστο όριο των 10 MB. Επιλέξτε ένα μικρότερο αρχείο.', avatar_file_type_invalid: 'Ο τύπος αρχείου δεν υποστηρίζεται. Ανεβάστε μια εικόνα JPG, PNG, GIF ή WEBP.', captcha_invalid: 'Η εγγραφή απέτυχε λόγω αποτυχημένων ελέγχων ασφαλείας. Ανανεώστε τη σελίδα για να δοκιμάσετε ξανά ή επικοινωνήστε με το κέντρο υποστήριξης για περισσότερη βοήθεια.', captcha_unavailable: - 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', - form_code_incorrect: undefined, + 'Η εγγραφή απέτυχε λόγω αποτυχημένης επαλήθευσης bot. Παρακαλώ ανανεώστε τη σελίδα για να δοκιμάσετε ξανά ή επικοινωνήστε με την υποστήριξη για περισσότερη βοήθεια.', + form_code_incorrect: 'Ο κωδικός δεν είναι σωστός.', form_email_address_blocked: 'Οι προσωρινές υπηρεσίες email δεν υποστηρίζονται. Παρακαλώ χρησιμοποιήστε τη συνηθισμένη διεύθυνση email σας για να δημιουργήσετε λογαριασμό.', - form_identifier_exists__email_address: undefined, - form_identifier_exists__phone_number: undefined, - form_identifier_exists__username: undefined, + form_identifier_exists__email_address: 'Αυτή η διεύθυνση email χρησιμοποιείται ήδη. Παρακαλώ δοκιμάστε άλλη.', + form_identifier_exists__phone_number: 'Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη. Παρακαλώ δοκιμάστε άλλον.', + form_identifier_exists__username: 'Αυτό το όνομα χρήστη χρησιμοποιείται ήδη. Παρακαλώ δοκιμάστε άλλο.', form_identifier_not_found: 'Δεν βρέθηκε λογαριασμός με αυτές τις λεπτομέρειες.', - form_new_password_matches_current: undefined, - form_param_format_invalid: undefined, + form_new_password_matches_current: + 'Ο νέος κωδικός πρόσβασης δεν μπορεί να είναι ίδιος με τον τρέχοντα κωδικό πρόσβασης.', + form_param_format_invalid: '{{paramName}} έχει μη έγκυρη μορφή.', form_param_format_invalid__email_address: 'Η διεύθυνση email πρέπει να είναι μια έγκυρη διεύθυνση email.', - form_param_format_invalid__phone_number: 'Phone number must be in a valid international format', - form_param_max_length_exceeded__first_name: 'First name should not exceed 256 characters.', - form_param_max_length_exceeded__last_name: 'Last name should not exceed 256 characters.', - form_param_max_length_exceeded__name: 'Name should not exceed 256 characters.', - form_param_nil: undefined, - form_param_type_invalid: undefined, - form_param_type_invalid__email_address: undefined, - form_param_type_invalid__phone_number: undefined, - form_param_value_invalid: undefined, - form_password_incorrect: undefined, + form_param_format_invalid__phone_number: 'Ο αριθμός τηλεφώνου πρέπει να είναι σε έγκυρη διεθνή μορφή', + form_param_max_length_exceeded__first_name: 'Το όνομα δεν πρέπει να υπερβαίνει τους 256 χαρακτήρες.', + form_param_max_length_exceeded__last_name: 'Το επώνυμο δεν πρέπει να υπερβαίνει τους 256 χαρακτήρες.', + form_param_max_length_exceeded__name: 'Το όνομα δεν πρέπει να υπερβαίνει τους 256 χαρακτήρες.', + form_param_nil: 'Απαιτείται {{paramName}}.', + form_param_type_invalid: '{{paramName}} έχει μη έγκυρο τύπο.', + form_param_type_invalid__email_address: 'Η διεύθυνση email δεν είναι έγκυρη.', + form_param_type_invalid__phone_number: 'Ο αριθμός τηλεφώνου δεν είναι έγκυρος.', + form_param_value_invalid: '{{paramName}} δεν είναι έγκυρο.', + form_password_incorrect: 'Ο κωδικός πρόσβασης δεν είναι σωστός.', form_password_or_identifier_incorrect: 'Ο κωδικός πρόσβασης ή η διεύθυνση email είναι λανθασμένη. Δοκιμάστε ξανά ή χρησιμοποιήστε άλλη μέθοδο.', - form_password_length_too_short: undefined, + form_password_length_too_short: + 'Ο κωδικός πρόσβασής σας πρέπει να αποτελείται από τουλάχιστον {{length}} χαρακτήρες.', form_password_not_strong_enough: 'Ο κωδικός πρόσβασής σας δεν είναι αρκετά ισχυρός.', form_password_pwned: 'Αυτός ο κωδικός πρόσβασης έχει διαρρεύσει online στο παρελθόν και δεν μπορεί να χρησιμοποιηθεί. Δοκιμάστε έναν άλλο κωδικό πρόσβασης αντί για αυτόν.', - form_password_pwned__sign_in: undefined, + form_password_pwned__sign_in: + 'Αυτός ο κωδικός πρόσβασης εντοπίστηκε σε παραβίαση δεδομένων και πρέπει να επαναφερθεί. Παρακαλώ δοκιμάστε έναν άλλο κωδικό πρόσβασης ή χρησιμοποιήστε τον σύνδεσμο "Ξεχάσατε τον κωδικό πρόσβασης;" για να τον επαναφέρετε.', form_password_size_in_bytes_exceeded: 'Ο κωδικός πρόσβασής σας έχει υπερβεί το μέγιστο αριθμό bytes που επιτρέπεται. Παρακαλούμε, συντομεύστε τον ή αφαιρέστε μερικούς ειδικούς χαρακτήρες.', - form_password_untrusted__sign_in: undefined, + form_password_compromised__sign_in: + 'Ο κωδικός πρόσβασής σας ενδέχεται να έχει παραβιαστεί. Για την προστασία του λογαριασμού σας, παρακαλώ συνεχίστε με εναλλακτική μέθοδο σύνδεσης. Θα σας ζητηθεί να επαναφέρετε τον κωδικό πρόσβασής σας μετά τη σύνδεση.', + form_password_untrusted__sign_in: + 'Για λόγους ασφαλείας, απαιτείται επαναφορά κωδικού πρόσβασης. Παρακαλώ χρησιμοποιήστε τον σύνδεσμο "Ξεχάσατε τον κωδικό πρόσβασης;" για να τον επαναφέρετε.', form_password_validation_failed: 'Λανθασμένος κωδικός', - form_username_invalid_character: undefined, - form_username_invalid_length: undefined, + form_username_invalid_character: + 'Το όνομα χρήστη μπορεί να περιέχει μόνο αλφαριθμητικούς χαρακτήρες και κάτω παύλες.', + form_username_invalid_length: 'Το όνομα χρήστη πρέπει να αποτελείται από 4 έως 64 χαρακτήρες.', form_username_needs_non_number_char: 'Το όνομα χρήστη πρέπει να περιέχει τουλάχιστον έναν μη αριθμητικό χαρακτήρα.', identification_deletion_failed: 'Δεν μπορείτε να διαγράψετε το τελευταίο στοιχείο ταυτοποιησής σας.', not_allowed_access: "Η διεύθυνση email ή το τηλέφωνο δεν επιτρέπεται για την εγγραφή. Αυτό μπορεί να οφείλεται στη χρήση '+', '=', '#' ή '.' στην διεύθυνση email σας, χρήση πεδίου που συνδέεται με υπηρεσία email, ή εμφανής αποκλεισμός. Αν πιστεύετε ότι αυτό είναι ένα σφάλμα, παρακαλούμε επικοινωνήστε με την υποστήριξη.", - organization_domain_blocked: undefined, - organization_domain_common: undefined, - organization_domain_exists_for_enterprise_connection: undefined, - organization_membership_quota_exceeded: undefined, - organization_minimum_permissions_needed: undefined, - organization_not_found_or_unauthorized: undefined, - organization_not_found_or_unauthorized_with_create_organization_disabled: undefined, - passkey_already_exists: undefined, - passkey_not_supported: undefined, - passkey_pa_not_supported: undefined, - passkey_registration_cancelled: undefined, - passkey_retrieval_cancelled: undefined, + organization_domain_blocked: 'Ο τομέας {{domain}} δεν μπορεί να επαληθευτεί.', + organization_domain_common: 'Ο τομέας {{domain}} δεν μπορεί να επαληθευτεί επειδή είναι κοινός τομέας email.', + organization_domain_exists_for_enterprise_connection: + 'Ο τομέας {{domain}} έχει ήδη επαληθευτεί για σύνδεση επιχείρησης.', + organization_membership_quota_exceeded: 'Έχετε φτάσει το μέγιστο αριθμό μελών για αυτόν τον οργανισμό.', + organization_minimum_permissions_needed: 'Δεν έχετε τα απαραίτητα δικαιώματα για να εκτελέσετε αυτή την ενέργεια.', + organization_not_found_or_unauthorized: 'Ο οργανισμός δεν βρέθηκε ή δεν έχετε δικαίωμα πρόσβασης.', + organization_not_found_or_unauthorized_with_create_organization_disabled: + 'Δεν έχετε πρόσβαση σε κανέναν οργανισμό. Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.', + passkey_already_exists: 'Ένα passkey έχει ήδη καταχωρηθεί σε αυτή τη συσκευή.', + passkey_not_supported: 'Τα passkeys δεν υποστηρίζονται σε αυτή τη συσκευή.', + passkey_pa_not_supported: 'Η εγγραφή απαιτεί έναν επαληθευτή πλατφόρμας, αλλά η συσκευή δεν υποστηρίζει έναν.', + passkey_registration_cancelled: 'Η εγγραφή passkey ακυρώθηκε ή έληξε.', + passkey_retrieval_cancelled: 'Η επαλήθευση passkey ακυρώθηκε ή έληξε.', passwordComplexity: { maximumLength: 'λιγότερους από {{length}} χαρακτήρες', minimumLength: '{{length}} ή περισσότερους χαρακτήρες', @@ -971,7 +988,7 @@ export const elGR: LocalizationResource = { }, phone_number_exists: 'Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη. Δοκιμάστε έναν άλλο.', session_exists: 'Έχετε ήδη συνδεθεί.', - web3_missing_identifier: undefined, + web3_missing_identifier: 'Δεν εντοπίστηκε αναγνωριστικό Web3. Παρακαλώ δοκιμάστε ξανά.', web3_signature_request_rejected: 'Απορρίψατε το αίτημα υπογραφής. Δοκιμάστε ξανά για να συνεχίσετε.', web3_solana_signature_generation_failed: 'Παρουσιάστηκε σφάλμα κατά τη δημιουργία της υπογραφής. Δοκιμάστε ξανά για να συνεχίσετε.', @@ -1020,15 +1037,15 @@ export const elGR: LocalizationResource = { }, userButton: { action__addAccount: 'Προσθήκη λογαριασμού', - action__closeUserMenu: undefined, + action__closeUserMenu: 'Κλείσιμο μενού χρήστη', action__manageAccount: 'Διαχείριση λογαριασμού', - action__openUserMenu: undefined, + action__openUserMenu: 'Άνοιγμα μενού χρήστη', action__signOut: 'Αποσύνδεση', action__signOutAll: 'Αποσύνδεση από όλους τους λογαριασμούς', }, userProfile: { apiKeysPage: { - title: undefined, + title: 'Κλειδιά API', }, backupCodePage: { actionLabel__copied: 'Αντιγράφηκαν!', @@ -1048,62 +1065,62 @@ export const elGR: LocalizationResource = { }, billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'Δεν υπάρχει ιστορικό πληρωμών', + notFound: 'Δεν βρέθηκαν πληρωμές', + tableHeader__amount: 'Ποσό', + tableHeader__date: 'Ημερομηνία', + tableHeader__status: 'Κατάσταση', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Ορισμός ως προεπιλογή', + actionLabel__remove: 'Αφαίρεση', + add: 'Προσθήκη μεθόδου πληρωμής', + addSubtitle: 'Προσθέστε μια νέα μέθοδο πληρωμής στον λογαριασμό σας', + cancelButton: 'Ακύρωση', + formButtonPrimary__add: 'Προσθήκη', + formButtonPrimary__pay: 'Πληρωμή', + payWithTestCardButton: 'Πληρωμή με δοκιμαστική κάρτα', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: 'Η μέθοδος πληρωμής {{identifier}} θα αφαιρεθεί από τον λογαριασμό σας', + messageLine2: 'Δεν θα μπορείτε πλέον να χρησιμοποιήσετε αυτή τη μέθοδο πληρωμής', + successMessage: 'Η μέθοδος πληρωμής αφαιρέθηκε επιτυχώς', + title: 'Αφαίρεση μεθόδου πληρωμής', }, - title: undefined, + title: 'Μέθοδοι πληρωμής', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Πληρωμές', + headerTitle__plans: 'Πλάνα', + headerTitle__statements: 'Καταστάσεις', + headerTitle__subscriptions: 'Συνδρομές', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'Δεν υπάρχουν καταστάσεις', + itemCaption__paidForPlan: 'Πληρώθηκε για {{planName}}', + itemCaption__proratedCredit: 'Πίστωση αναλογικής κατανομής', + itemCaption__subscribedAndPaidForPlan: 'Εγγραφή και πληρωμή για {{planName}}', + notFound: 'Δεν βρέθηκαν καταστάσεις', + tableHeader__amount: 'Ποσό', + tableHeader__date: 'Ημερομηνία', + title: 'Καταστάσεις', + totalPaid: 'Συνολικό καταβληθέν ποσό', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Διαχείριση συνδρομής', + actionLabel__newSubscription: 'Νέα συνδρομή', + actionLabel__switchPlan: 'Αλλαγή πλάνου', + tableHeader__edit: 'Επεξεργασία', + tableHeader__plan: 'Πλάνο', + tableHeader__startDate: 'Ημερομηνία έναρξης', + title: 'Συνδρομές', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Προεπιλογή', }, switchPlansSection: { - title: undefined, + title: 'Αλλαγή πλάνου', }, - title: undefined, + title: 'Χρεώσεις', }, connectedAccountPage: { formHint: 'Επιλέξτε έναν πάροχο για να συνδέσετε τον λογαριασμό σας.', @@ -1143,10 +1160,10 @@ export const elGR: LocalizationResource = { successMessage: 'Το email {{identifier}} έχει προστεθεί στον λογαριασμό σας.', }, enterpriseSSOLink: { - formButton: undefined, - formSubtitle: undefined, + formButton: 'Επαλήθευση', + formSubtitle: 'Θα σταλεί ένα σύνδεσμος επαλήθευσης μέσω της σύνδεσης SSO επιχείρησης σας', }, - formHint: undefined, + formHint: 'Εισάγετε μια νέα διεύθυνση email για να την προσθέσετε στον λογαριασμό σας', removeResource: { messageLine1: 'Η διεύθυνση {{identifier}} θα αφαιρεθεί από αυτόν τον λογαριασμό.', messageLine2: 'Δεν θα μπορείτε πλέον να συνδεθείτε χρησιμοποιώντας αυτήν τη διεύθυνση email.', @@ -1154,7 +1171,7 @@ export const elGR: LocalizationResource = { title: 'Αφαίρεση διεύθυνσης email', }, title: 'Προσθήκη διεύθυνσης email', - verifyTitle: 'Verify email address', + verifyTitle: 'Επαλήθευση διεύθυνσης email', }, formButtonPrimary__add: 'Προσθήκη', formButtonPrimary__continue: 'Συνέχεια', @@ -1167,7 +1184,7 @@ export const elGR: LocalizationResource = { title: 'Προσθήκη διπλής επαλήθευσης', }, mfaPhoneCodePage: { - backButton: 'Use existing number', + backButton: 'Χρήση υπάρχοντος αριθμού', primaryButton__addPhoneNumber: 'Προσθήκη αριθμού τηλεφώνου', removeResource: { messageLine1: 'Ο {{identifier}} δεν θα λαμβάνει πλέον κωδικούς επαλήθευσης κατά τη σύνδεση.', @@ -1180,10 +1197,10 @@ export const elGR: LocalizationResource = { subtitle__unavailablePhoneNumbers: 'Δεν υπάρχουν διαθέσιμοι αριθμοί τηλεφώνου για εγγραφή στην διπλή επαλήθευση με κωδικούς SMS.', successMessage1: - 'When signing in, you will need to enter a verification code sent to this phone number as an additional step.', + 'Κατά τη σύνδεση, θα χρειαστεί να εισάγετε έναν κωδικό επαλήθευσης που στάλθηκε σε αυτόν τον αριθμό τηλεφώνου ως επιπλέον βήμα.', successMessage2: - 'Save these backup codes and store them somewhere safe. If you lose access to your authentication device, you can use backup codes to sign in.', - successTitle: 'SMS code verification enabled', + 'Αποθηκεύστε αυτούς τους εφεδρικούς κωδικούς και φυλάξτε τους με ασφάλεια. Εάν χάσετε την πρόσβαση στη συσκευή επαλήθευσής σας, μπορείτε να χρησιμοποιήσετε εφεδρικούς κωδικούς για σύνδεση.', + successTitle: 'Επαλήθευση κωδικού SMS ενεργοποιήθηκε', title: 'Προσθήκη επαλήθευσης κωδικού SMS', }, mfaTOTPPage: { @@ -1215,23 +1232,23 @@ export const elGR: LocalizationResource = { mobileButton__menu: 'Μενού', navbar: { account: 'Προφίλ', - apiKeys: undefined, - billing: undefined, + apiKeys: 'Κλειδιά API', + billing: 'Χρεώσεις', description: 'Διαχειριστείτε τις πληροφορίες του λογαριασμού σας.', security: 'Ασφάλεια', title: 'Λογαριασμός', }, passkeyScreen: { removeResource: { - messageLine1: undefined, - title: undefined, + messageLine1: 'Το {{name}} θα αφαιρεθεί από αυτόν τον λογαριασμό.', + title: 'Αφαίρεση passkey', }, - subtitle__rename: undefined, - title__rename: undefined, + subtitle__rename: 'Μπορείτε να μετονομάσετε το passkey για να το βρείτε ευκολότερα.', + title__rename: 'Μετονομασία passkey', }, passwordPage: { checkboxInfoText__signOutOfOtherSessions: - 'It is recommended to sign out of all other devices which may have used your old password.', + 'Συνιστάται η αποσύνδεση από όλες τις άλλες συσκευές που μπορεί να έχουν χρησιμοποιήσει τον παλιό σας κωδικό πρόσβασης.', readonly: 'Ο κωδικός πρόσβασής σας δεν μπορεί να επεξεργαστεί αυτήν τη στιγμή επειδή μπορείτε να συνδεθείτε μόνο μέσω της σύνδεσης με την επιχείρηση.', successMessage__set: 'Ο κωδικός πρόσβασής σας έχει οριστεί.', @@ -1250,11 +1267,11 @@ export const elGR: LocalizationResource = { }, successMessage: 'Ο αριθμός τηλεφώνου {{identifier}} έχει προστεθεί στον λογαριασμό σας.', title: 'Προσθήκη αριθμού τηλεφώνου', - verifySubtitle: 'Enter the verification code sent to {{identifier}}', - verifyTitle: 'Verify phone number', + verifySubtitle: 'Εισάγετε τον κωδικό επαλήθευσης που στάλθηκε στο {{identifier}}', + verifyTitle: 'Επαλήθευση αριθμού τηλεφώνου', }, plansPage: { - title: undefined, + title: 'Πλάνα', }, profilePage: { fileDropAreaHint: 'Ανεβάστε μια εικόνα σε μορφή JPG, PNG, GIF ή WEBP μικρότερη των 10 MB', @@ -1276,9 +1293,9 @@ export const elGR: LocalizationResource = { actionLabel__reauthorize: 'Εξουσιοδοτήστε τώρα', destructiveActionTitle: 'Αφαίρεση', primaryButton: 'Σύνδεση λογαριασμού', - subtitle__disconnected: undefined, + subtitle__disconnected: 'Αυτός ο λογαριασμός έχει αποσυνδεθεί.', subtitle__reauthorize: - 'The required scopes have been updated, and you may be experiencing limited functionality. Please re-authorize this application to avoid any issues', + 'Τα απαιτούμενα δικαιώματα έχουν ενημερωθεί και ενδέχεται να αντιμετωπίζετε περιορισμένη λειτουργικότητα. Παρακαλώ επανεξουσιοδοτήστε αυτήν την εφαρμογή για να αποφύγετε προβλήματα', title: 'Συνδεδεμένοι λογαριασμοί', }, dangerSection: { @@ -1318,10 +1335,10 @@ export const elGR: LocalizationResource = { }, }, passkeysSection: { - menuAction__destructive: undefined, - menuAction__rename: undefined, - primaryButton: undefined, - title: undefined, + menuAction__destructive: 'Αφαίρεση', + menuAction__rename: 'Μετονομασία', + primaryButton: 'Προσθήκη passkey', + title: 'Passkeys', }, passwordSection: { primaryButton__setPassword: 'Ορισμός κωδικού πρόσβασης', @@ -1347,7 +1364,7 @@ export const elGR: LocalizationResource = { }, web3WalletsSection: { destructiveAction: 'Αφαίρεση πορτοφολιού', - detailsAction__nonPrimary: undefined, + detailsAction__nonPrimary: 'Ορισμός ως κύριο', primaryButton: 'Πορτοφόλια Web3', title: 'Πορτοφόλια Web3', web3SelectSolanaWalletScreen: { @@ -1372,7 +1389,7 @@ export const elGR: LocalizationResource = { subtitle__unavailableWallets: 'Δεν υπάρχουν διαθέσιμα web3 πορτοφόλια.', successMessage: 'Το πορτοφόλι έχει προστεθεί στον λογαριασμό σας.', title: 'Προσθήκη web3 πορτοφολιού', - web3WalletButtonsBlockButton: undefined, + web3WalletButtonsBlockButton: 'Συνέχεια με {{provider|titleize}}', }, }, waitlist: { diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 7de337bf3b6..d31f55ded25 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -10,7 +10,7 @@ * ===================================================================================== */ -import type { LocalizationResource } from '@clerk/types'; +import type { LocalizationResource } from '@clerk/shared/types'; export const frFR: LocalizationResource = { locale: 'fr-FR', @@ -19,7 +19,7 @@ export const frFR: LocalizationResource = { action__search: 'Rechercher des clés', copySecret: { formButtonPrimary__copyAndClose: 'Copier et fermer', - formHint: 'Pour des raisons de sécurité, nous ne vous permettrons pas de le consulter à nouveau plus tard.', + formHint: 'Pour des raisons de sécurité, nous ne vous permettrons pas de la consulter à nouveau plus tard.', formTitle: 'Copiez votre clé API "{{name}}" maintenant', }, createdAndExpirationStatus__expiresOn: @@ -225,7 +225,7 @@ export const frFR: LocalizationResource = { formFieldInputPlaceholder__emailAddress_username: "Nom d'utilisateur ou adresse e-mail", formFieldInputPlaceholder__emailAddresses: 'exemple@email.com, exemple2@email.com', formFieldInputPlaceholder__firstName: 'Prénom', - formFieldInputPlaceholder__lastName: 'Nom de famille', + formFieldInputPlaceholder__lastName: 'Nom', formFieldInputPlaceholder__organizationDomain: "Domaine de l'organisation", formFieldInputPlaceholder__organizationDomainEmailAddress: "Adresse e-mail de l'organisation", formFieldInputPlaceholder__organizationName: "Nom de l'organisation", @@ -238,7 +238,7 @@ export const frFR: LocalizationResource = { formFieldLabel__apiKeyDescription: 'Description', formFieldLabel__apiKeyExpiration: 'Expiration', formFieldLabel__apiKeyName: 'Nom de la clé secrète', - formFieldLabel__automaticInvitations: 'Autoriser les invitations automatiques pour ce domaine', + formFieldLabel__automaticInvitations: 'Activer les invitations automatiques pour ce domaine', formFieldLabel__backupCode: 'Code de récupération', formFieldLabel__confirmDeletion: 'Confirmation', formFieldLabel__confirmPassword: 'Confirmer le mot de passe', @@ -247,7 +247,7 @@ export const frFR: LocalizationResource = { formFieldLabel__emailAddress_username: "Adresse e-mail ou nom d'utilisateur", formFieldLabel__emailAddresses: 'Adresses e-mail', formFieldLabel__firstName: 'Prénom', - formFieldLabel__lastName: 'Nom de famille', + formFieldLabel__lastName: 'Nom', formFieldLabel__newPassword: 'Nouveau mot de passe', formFieldLabel__organizationDomain: 'Domaine', formFieldLabel__organizationDomainDeletePending: 'Supprimer les invitations et suggestions en attente', @@ -266,7 +266,7 @@ export const frFR: LocalizationResource = { action__signOut: 'Déconnexion', title: 'Connecté en tant que {{identifier}}', }, - lastAuthenticationStrategy: 'Dernière utilisation', + lastAuthenticationStrategy: 'Utilisé la dernière fois', maintenanceMode: 'Nous effectuons des travaux de maintenance, mais ne vous en inquiétez pas, cela ne devrait pas prendre plus de quelques minutes.', membershipRole__admin: 'Administrateur', @@ -353,7 +353,7 @@ export const frFR: LocalizationResource = { }, createDomainPage: { subtitle: - "Ajoutez le domaine pour le vérifier. Les utilisateurs possédant une adresses e-mail sur ce domaine peuvent rejoindre l'organisation automatiquement ou faire une demande pour y adhérer.", + "Ajoutez le domaine pour le vérifier. Les utilisateurs possédant une adresse e-mail sur ce domaine peuvent rejoindre l'organisation automatiquement ou demander à y adhérer.", title: 'Ajouter un domaine', }, invitePage: { @@ -371,7 +371,7 @@ export const frFR: LocalizationResource = { activeMembersTab: { menuAction__remove: 'Supprimer', tableHeader__actions: 'Actions', - tableHeader__joined: 'Rejoint', + tableHeader__joined: 'Rejoint le', tableHeader__role: 'Rôle', tableHeader__user: 'Utilisateur', }, @@ -379,7 +379,7 @@ export const frFR: LocalizationResource = { invitationsTab: { autoInvitations: { headerSubtitle: - "Invitez des utilisateurs en connectant un domaine de messagerie à votre organisation. Toute personne s'inscrivant avec une adresses e-mail sur ce domaine pourra rejoindre l'organisation.", + "Invitez des utilisateurs en connectant un domaine de messagerie à votre organisation. Toute personne s'inscrivant avec une adresse e-mail de ce domaine pourra rejoindre l'organisation.", headerTitle: 'Invitations automatiques', primaryButton: 'Gérer les domaines validés', }, @@ -525,7 +525,7 @@ export const frFR: LocalizationResource = { personalWorkspace: 'Espace de travail personnel', suggestionsAcceptedLabel: "En attente d'acceptation", }, - paginationButton__next: 'Prochain', + paginationButton__next: 'Suivant', paginationButton__previous: 'Précédent', paginationRowText__displaying: 'Affichage', paginationRowText__of: 'de', @@ -601,7 +601,7 @@ export const frFR: LocalizationResource = { }, alternativeMethods: { actionLink: "Obtenir de l'aide", - actionText: "Aucune de ces méthode d'authentification ?", + actionText: 'Aucune de ces méthodes ne fonctionne ?', blockButton__backupCode: 'Utiliser un code de récupération', blockButton__emailCode: 'Envoyer le code à {{identifier}}', blockButton__emailLink: 'Envoyer le lien à {{identifier}}', @@ -657,7 +657,7 @@ export const frFR: LocalizationResource = { formTitle: 'lien de vérification', loading: { subtitle: 'Vous allez bientôt être redirigé', - title: 'Signing in...', + title: 'Connexion en cours...', }, resendButton: 'Renvoyer le lien', subtitle: 'pour continuer vers {{applicationName}}', @@ -712,7 +712,7 @@ export const frFR: LocalizationResource = { password: { actionLink: 'Utiliser une autre méthode', subtitle: 'pour continuer vers {{applicationName}}', - title: 'Tapez votre mot de passe', + title: 'Entrez votre mot de passe', }, passwordCompromised: { title: undefined, @@ -763,7 +763,7 @@ export const frFR: LocalizationResource = { }, subtitle: 'pour continuer vers {{applicationName}}', subtitleCombined: undefined, - title: "S'identifier", + title: 'Se connecter', titleCombined: 'Continuer vers {{applicationName}}', }, totpMfa: { @@ -776,7 +776,7 @@ export const frFR: LocalizationResource = { title: 'Se connecter avec Solana', }, }, - signInEnterPasswordTitle: 'Tapez votre mot de passe', + signInEnterPasswordTitle: 'Entrez votre mot de passe', signUp: { alternativePhoneCodeProvider: { resendButton: 'Vous n’avez pas reçu de code ? Renvoyer', @@ -784,7 +784,7 @@ export const frFR: LocalizationResource = { title: 'Vérifiez votre {{provider}}', }, continue: { - actionLink: "S'identifier", + actionLink: 'Se connecter', actionText: 'Vous avez déjà un compte ?', subtitle: 'pour continuer vers {{applicationName}}', title: 'Remplir les champs manquants', @@ -816,7 +816,7 @@ export const frFR: LocalizationResource = { verifiedSwitchTab: { subtitle: "Revenez à l'onglet nouvellement ouvert pour continuer", subtitleNewTab: "Revenir à l'onglet précédent pour continuer", - title: 'Courriel vérifié avec succès', + title: 'E-mail vérifié avec succès', }, }, enterpriseConnections: { @@ -852,7 +852,7 @@ export const frFR: LocalizationResource = { title: 'Accès restreint', }, start: { - actionLink: "S'identifier", + actionLink: 'Se connecter', actionLink__use_email: 'Utiliser votre adresse e-mail', actionLink__use_phone: 'Utiliser votre téléphone', actionText: 'Vous avez déjà un compte ?', @@ -880,7 +880,7 @@ export const frFR: LocalizationResource = { action__invitationAccept: 'Rejoindre', action__suggestionsAccept: 'Demander à rejoindre', subtitle: 'Rejoignez une organisation existante ou créez-en une nouvelle', - subtitle__createOrganizationDisabled: undefined, + subtitle__createOrganizationDisabled: 'Rejoignez une organisation existante', suggestionsAcceptedLabel: 'En attente d’approbation', title: 'Choisir une organisation', }, @@ -902,10 +902,6 @@ export const frFR: LocalizationResource = { actionLink: 'Se déconnecter', actionText: 'Connecté en tant que {{identifier}}', }, - alerts: { - organizationAlreadyExists: - "Une organisation existe déjà pour le nom d'entreprise détecté ({{organizationName}}) et {{organizationDomain}}. Rejoignez par invitation.", - }, }, taskResetPassword: { formButtonPrimary: undefined, @@ -979,7 +975,7 @@ export const frFR: LocalizationResource = { passkey_retrieval_cancelled: 'Récupération de la clé de sécurité annulée.', passwordComplexity: { maximumLength: 'moins de {{length}} caractères', - minimumLength: '{{length}} caractères ou plus', + minimumLength: 'au moins {{length}} caractères', requireLowercase: 'une lettre minuscule', requireNumbers: 'un chiffre', requireSpecialCharacter: 'un caractère spécial', @@ -1036,7 +1032,7 @@ export const frFR: LocalizationResource = { userButton: { action__addAccount: 'Ajouter un compte', action__closeUserMenu: 'Fermer le menu utilisateur', - action__manageAccount: 'Gérer son compte', + action__manageAccount: 'Gérer mon compte', action__openUserMenu: 'Ouvrir le menu utilisateur', action__signOut: 'Déconnexion', action__signOutAll: 'Se déconnecter de tous les comptes', @@ -1131,7 +1127,7 @@ export const frFR: LocalizationResource = { successMessage: '{{connectedAccount}} a été supprimé de votre compte.', title: 'Supprimer le compte connecté', }, - socialButtonsBlockButton: 'Connecter {{provider|titleize}} compte', + socialButtonsBlockButton: 'Connecter un compte {{provider|titleize}}', successMessage: 'Le fournisseur a été ajouté à votre compte', title: 'Ajouter un compte connecté', }, @@ -1170,11 +1166,11 @@ export const frFR: LocalizationResource = { title: "Supprimer l'adresse e-mail", }, title: 'Ajouter une adresse e-mail', - verifyTitle: 'Verifier un e-mail', + verifyTitle: 'Vérifier un e-mail', }, formButtonPrimary__add: 'Ajouter', formButtonPrimary__continue: 'Continuer', - formButtonPrimary__finish: 'Retour', + formButtonPrimary__finish: 'Terminer', formButtonPrimary__remove: 'Supprimer', formButtonPrimary__save: 'Sauvegarder', formButtonReset: 'Annuler', @@ -1278,7 +1274,7 @@ export const frFR: LocalizationResource = { imageFormTitle: 'Photo de profil', readonly: "Les informations de votre profil ont été fournies par la connexion d'entreprise et ne peuvent pas être modifiées.", - successMessage: 'Votre profil a été mis a jour.', + successMessage: 'Votre profil a été mis à jour.', title: 'Mettre à jour le profil', }, start: { @@ -1290,7 +1286,7 @@ export const frFR: LocalizationResource = { actionLabel__connectionFailed: 'Réessayer', actionLabel__reauthorize: 'Autoriser maintenant', destructiveActionTitle: 'Retirer', - primaryButton: 'Connecter le compte', + primaryButton: 'Connecter un compte', subtitle__disconnected: 'Compte déconnecté. Connectez-vous à nouveau pour accéder aux fonctionnalités.', subtitle__reauthorize: 'Les autorisations requises ont été mises à jour, ce qui peut entraîner des fonctionnalités limitées. Veuillez ré-autoriser cette application pour éviter tout problème.', diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 1a5525983fa..eeca6e25e2f 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -10,24 +10,25 @@ * ===================================================================================== */ -import type { LocalizationResource } from '@clerk/types'; +import type { LocalizationResource } from '@clerk/shared/types'; export const koKR: LocalizationResource = { locale: 'ko-KR', apiKeys: { - action__add: undefined, - action__search: undefined, + action__add: '새 키 만들기', + action__search: '키 검색', copySecret: { formButtonPrimary__copyAndClose: '복사하고 닫기', - formHint: '보안상의 이유로 나중에 다시 볼 수 없습니다.', - formTitle: '지금 "{{name}}" API 키를 복사하세요', - }, - createdAndExpirationStatus__expiresOn: undefined, - createdAndExpirationStatus__never: undefined, - detailsTitle__emptyRow: undefined, - formButtonPrimary__add: undefined, - formFieldCaption__expiration__expiresOn: '{{ date }}에 만료', - formFieldCaption__expiration__never: undefined, + formHint: '보안상 나중에 다시 볼 수 없어요.', + formTitle: '지금 "{{name}}" API 키를 복사해 주세요', + }, + createdAndExpirationStatus__expiresOn: + "생성 {{ createdDate | shortDate('ko-KR') }} • 만료 {{ expiresDate | longDate('ko-KR') }}", + createdAndExpirationStatus__never: "생성 {{ createdDate | shortDate('ko-KR') }} • 만료 없음", + detailsTitle__emptyRow: 'API 키가 없어요', + formButtonPrimary__add: '키 만들기', + formFieldCaption__expiration__expiresOn: '{{ date }}에 만료돼요', + formFieldCaption__expiration__never: '이 키는 만료되지 않아요', formFieldOption__expiration__180d: '180일', formFieldOption__expiration__1d: '1일', formFieldOption__expiration__1y: '1년', @@ -35,148 +36,151 @@ export const koKR: LocalizationResource = { formFieldOption__expiration__60d: '60일', formFieldOption__expiration__7d: '7일', formFieldOption__expiration__90d: '90일', - formFieldOption__expiration__never: undefined, - formHint: undefined, - formTitle: undefined, - lastUsed__days: undefined, - lastUsed__hours: undefined, - lastUsed__minutes: undefined, - lastUsed__months: undefined, - lastUsed__seconds: undefined, - lastUsed__years: undefined, - menuAction__revoke: undefined, + formFieldOption__expiration__never: '만료 없음', + formHint: '이름을 입력해 새 키를 만들어요. 필요하면 언제든지 폐기할 수 있어요.', + formTitle: '새 API 키 추가', + lastUsed__days: '{{days}}일 전', + lastUsed__hours: '{{hours}}시간 전', + lastUsed__minutes: '{{minutes}}분 전', + lastUsed__months: '{{months}}개월 전', + lastUsed__seconds: '{{seconds}}초 전', + lastUsed__years: '{{years}}년 전', + menuAction__revoke: '키 폐기', revokeConfirmation: { - confirmationText: undefined, - formButtonPrimary__revoke: undefined, - formHint: undefined, - formTitle: undefined, + confirmationText: '폐기', + formButtonPrimary__revoke: '키 폐기', + formHint: '이 시크릿 키를 삭제할까요?', + formTitle: '"{{apiKeyName}}" 시크릿 키를 폐기할까요?', }, }, backButton: '돌아가기', - badge__activePlan: undefined, - badge__canceledEndsAt: undefined, - badge__currentPlan: undefined, + badge__activePlan: '활성', + badge__canceledEndsAt: "취소됨 • {{ date | shortDate('ko-KR') }}에 종료", + badge__currentPlan: '현재 플랜', badge__default: '기본값', - badge__endsAt: undefined, - badge__expired: undefined, - badge__freeTrial: undefined, + badge__endsAt: "{{ date | shortDate('ko-KR') }}에 종료", + badge__expired: '만료됨', + badge__freeTrial: '무료 체험', badge__otherImpersonatorDevice: '기타 사칭 장치', - badge__pastDueAt: undefined, - badge__pastDuePlan: undefined, + badge__pastDueAt: "{{ date | shortDate('ko-KR') }}에 연체", + badge__pastDuePlan: '연체됨', badge__primary: '기본', - badge__renewsAt: undefined, + badge__renewsAt: "{{ date | shortDate('ko-KR') }}에 갱신", badge__requiresAction: '조치 필요', - badge__startsAt: undefined, + badge__startsAt: "{{ date | shortDate('ko-KR') }}에 시작", badge__thisDevice: '이 장치', - badge__trialEndsAt: undefined, + badge__trialEndsAt: "{{ date | shortDate('ko-KR') }}에 체험 종료", badge__unverified: '미확인', - badge__upcomingPlan: undefined, + badge__upcomingPlan: '예정된 플랜', badge__userDevice: '사용자 장치', - badge__you: '당신', + badge__you: '나', billing: { - addPaymentMethod__label: undefined, - alwaysFree: undefined, - annually: undefined, - availableFeatures: undefined, - billedAnnually: undefined, - billedMonthlyOnly: undefined, - cancelFreeTrial: undefined, - cancelFreeTrialAccessUntil: undefined, - cancelFreeTrialTitle: undefined, - cancelSubscription: undefined, - cancelSubscriptionAccessUntil: undefined, - cancelSubscriptionNoCharge: undefined, - cancelSubscriptionPastDue: undefined, - cancelSubscriptionTitle: undefined, - cannotSubscribeMonthly: undefined, - cannotSubscribeUnrecoverable: undefined, + addPaymentMethod__label: '결제 수단 추가', + alwaysFree: '항상 무료', + annually: '연간', + availableFeatures: '사용 가능한 기능', + billedAnnually: '연간 결제', + billedMonthlyOnly: '월간 결제만 가능', + cancelFreeTrial: '무료 체험 취소', + cancelFreeTrialAccessUntil: + "무료 체험은 {{ date | longDate('ko-KR') }}까지 유지돼요. 이후에는 체험 기능을 사용할 수 없어요. 요금은 청구되지 않아요.", + cancelFreeTrialTitle: '{{plan}} 플랜 무료 체험을 취소할까요?', + cancelSubscription: '구독 취소', + cancelSubscriptionAccessUntil: + "{{ date | longDate('ko-KR') }}까지 '{{plan}}' 기능을 사용할 수 있어요. 이후에는 이용할 수 없어요.", + cancelSubscriptionNoCharge: '이 구독에는 요금이 청구되지 않아요.', + cancelSubscriptionPastDue: + '구독이 즉시 종료되고 모든 플랜 기능을 사용할 수 없어요. 다음 결제 시 연체 금액을 결제하셔야 해요.', + cancelSubscriptionTitle: '{{plan}} 구독을 취소할까요?', + cannotSubscribeMonthly: '이 플랜은 월간 결제가 불가해요. 연간 결제를 선택해 주세요.', + cannotSubscribeUnrecoverable: '이 플랜으로 구독할 수 없어요. 현재 구독이 더 높은 요금제예요.', checkout: { - description__paymentSuccessful: undefined, - description__subscriptionSuccessful: undefined, - downgradeNotice: undefined, + description__paymentSuccessful: '결제가 완료됐어요.', + description__subscriptionSuccessful: '새 구독이 준비됐어요.', + downgradeNotice: '현재 구독은 결제 주기 종료까지 유지되고, 이후 이 구독으로 전환돼요.', emailForm: { - subtitle: undefined, - title: undefined, + subtitle: '결제를 완료하려면 영수증을 받을 이메일 주소를 추가해야 해요.', + title: '이메일 주소 추가', }, lineItems: { - title__freeTrialEndsAt: undefined, - title__paymentMethod: undefined, - title__statementId: undefined, - title__subscriptionBegins: undefined, - title__totalPaid: undefined, - }, - pastDueNotice: undefined, - perMonth: undefined, - title: undefined, - title__paymentSuccessful: undefined, - title__subscriptionSuccessful: undefined, - title__trialSuccess: undefined, - totalDueAfterTrial: undefined, - }, - credit: undefined, - creditRemainder: undefined, - defaultFreePlanActive: undefined, - free: undefined, - getStarted: undefined, - keepFreeTrial: undefined, - keepSubscription: undefined, - manage: undefined, - manageSubscription: undefined, - month: undefined, - monthly: undefined, - pastDue: undefined, - pay: undefined, + title__freeTrialEndsAt: '무료 체험 종료일', + title__paymentMethod: '결제 수단', + title__statementId: '명세서 ID', + title__subscriptionBegins: '구독 시작', + title__totalPaid: '총 결제', + }, + pastDueNotice: '이전 구독이 연체되어 결제가 되지 않았어요.', + perMonth: '월', + title: '결제', + title__paymentSuccessful: '결제가 완료됐어요!', + title__subscriptionSuccessful: '성공!', + title__trialSuccess: '무료 체험이 시작됐어요!', + totalDueAfterTrial: '{{days}}일 후 무료 체험이 끝나면 결제할 금액', + }, + credit: '크레딧', + creditRemainder: '현재 구독 남은 기간에 대한 크레딧', + defaultFreePlanActive: '현재 무료 플랜을 사용 중이에요', + free: '무료', + getStarted: '시작하기', + keepFreeTrial: '무료 체험 유지', + keepSubscription: '구독 유지', + manage: '관리', + manageSubscription: '구독 관리', + month: '월', + monthly: '월간', + pastDue: '연체', + pay: '{{amount}} 결제', paymentMethod: { applePayDescription: { - annual: undefined, - monthly: undefined, + annual: '연간 결제', + monthly: '월간 결제', }, dev: { - anyNumbers: undefined, - cardNumber: undefined, - cvcZip: undefined, - developmentMode: undefined, - expirationDate: undefined, - testCardInfo: undefined, + anyNumbers: '아무 숫자나', + cardNumber: '카드 번호', + cvcZip: 'CVC, 우편번호', + developmentMode: '개발 모드', + expirationDate: '만료일', + testCardInfo: '테스트 카드 정보', }, }, - paymentMethods__label: undefined, - popular: undefined, + paymentMethods__label: '결제 수단', + popular: '인기', pricingTable: { - billingCycle: undefined, - included: undefined, - }, - reSubscribe: undefined, - seeAllFeatures: undefined, - startFreeTrial: undefined, - startFreeTrial__days: undefined, - subscribe: undefined, + billingCycle: '결제 주기', + included: '포함', + }, + reSubscribe: '다시 구독', + seeAllFeatures: '전체 기능 보기', + startFreeTrial: '무료 체험 시작', + startFreeTrial__days: '{{days}}일 무료 체험 시작', + subscribe: '구독하기', subscriptionDetails: { - beginsOn: undefined, - currentBillingCycle: undefined, - endsOn: undefined, - firstPaymentAmount: undefined, - firstPaymentOn: undefined, - nextPaymentAmount: undefined, - nextPaymentOn: undefined, - pastDueAt: undefined, - renewsAt: undefined, - subscribedOn: undefined, - title: undefined, - trialEndsOn: undefined, - trialStartedOn: undefined, - }, - subtotal: undefined, - switchPlan: undefined, - switchToAnnual: undefined, - switchToAnnualWithAnnualPrice: undefined, - switchToMonthly: undefined, - switchToMonthlyWithPrice: undefined, - totalDue: undefined, - totalDueToday: undefined, - viewFeatures: undefined, - viewPayment: undefined, - year: undefined, + beginsOn: '시작일', + currentBillingCycle: '현재 결제 주기', + endsOn: '종료일', + firstPaymentAmount: '첫 결제 금액', + firstPaymentOn: '첫 결제일', + nextPaymentAmount: '다음 결제 금액', + nextPaymentOn: '다음 결제일', + pastDueAt: '연체일', + renewsAt: '갱신일', + subscribedOn: '구독 시작일', + title: '구독', + trialEndsOn: '체험 종료일', + trialStartedOn: '체험 시작일', + }, + subtotal: '소계', + switchPlan: '이 플랜으로 전환', + switchToAnnual: '연간 결제로 변경', + switchToAnnualWithAnnualPrice: '연간 {{currency}}{{price}} / 년으로 변경', + switchToMonthly: '월간 결제로 변경', + switchToMonthlyWithPrice: '월간 {{currency}}{{price}} / 월로 변경', + totalDue: '총 결제 금액', + totalDueToday: '오늘 결제 금액', + viewFeatures: '기능 보기', + viewPayment: '결제 보기', + year: '년', }, createOrganization: { formButtonSubmit: '조직 만들기', @@ -194,172 +198,172 @@ export const koKR: LocalizationResource = { sameDay: "오늘 {{ date | timeString('ko-KR') }}", }, dividerText: '또는', - footerActionLink__alternativePhoneCodeProvider: undefined, + footerActionLink__alternativePhoneCodeProvider: '대신 SMS로 코드 받기', footerActionLink__useAnotherMethod: '다른 방법 사용하기', footerPageLink__help: '도움', footerPageLink__privacy: '개인정보처리방침', footerPageLink__terms: '약관', formButtonPrimary: '계속', - formButtonPrimary__verify: 'Verify', + formButtonPrimary__verify: '확인하기', formFieldAction__forgotPassword: '비밀번호를 잊으셨나요?', - formFieldError__matchingPasswords: '비밀번호가 일치합니다.', - formFieldError__notMatchingPasswords: '비밀번호가 일치하지 않습니다.', - formFieldError__verificationLinkExpired: 'The verification link expired. Please request a new link.', + formFieldError__matchingPasswords: '비밀번호가 일치해요.', + formFieldError__notMatchingPasswords: '비밀번호가 일치하지 않아요.', + formFieldError__verificationLinkExpired: '인증 링크가 만료됐어요. 새 링크를 요청해 주세요.', formFieldHintText__optional: '선택사항', - formFieldHintText__slug: 'A slug is a human-readable ID that must be unique. It’s often used in URLs.', - formFieldInputPlaceholder__apiKeyDescription: undefined, - formFieldInputPlaceholder__apiKeyExpirationDate: undefined, - formFieldInputPlaceholder__apiKeyName: undefined, - formFieldInputPlaceholder__backupCode: undefined, + formFieldHintText__slug: '슬러그는 사람이 읽기 쉬운 고유 ID예요. 보통 URL에 사용돼요.', + formFieldInputPlaceholder__apiKeyDescription: '이 키를 만드는 이유를 적어주세요', + formFieldInputPlaceholder__apiKeyExpirationDate: '날짜를 선택하세요', + formFieldInputPlaceholder__apiKeyName: '시크릿 키 이름을 입력하세요', + formFieldInputPlaceholder__backupCode: '백업 코드를 입력하세요', formFieldInputPlaceholder__confirmDeletionUserAccount: '계정 삭제', formFieldInputPlaceholder__emailAddress: '이메일 주소를 입력하세요', - formFieldInputPlaceholder__emailAddress_username: '이메일 주소 또는 사용자명을 입력하세요', - formFieldInputPlaceholder__emailAddresses: - '하나 이상의 이메일 주소를 공백 또는 쉼표로 구분하여 입력하거나 붙여넣습니다', + formFieldInputPlaceholder__emailAddress_username: '이메일 주소 또는 아이디를 입력하세요', + formFieldInputPlaceholder__emailAddresses: '이메일 주소를 공백이나 쉼표로 구분해 입력하거나 붙여넣어 주세요', formFieldInputPlaceholder__firstName: '이름', formFieldInputPlaceholder__lastName: '성', - formFieldInputPlaceholder__organizationDomain: undefined, - formFieldInputPlaceholder__organizationDomainEmailAddress: undefined, - formFieldInputPlaceholder__organizationName: undefined, - formFieldInputPlaceholder__organizationSlug: undefined, - formFieldInputPlaceholder__password: undefined, - formFieldInputPlaceholder__phoneNumber: undefined, + formFieldInputPlaceholder__organizationDomain: 'example.com', + formFieldInputPlaceholder__organizationDomainEmailAddress: 'you@example.com', + formFieldInputPlaceholder__organizationName: '조직 이름', + formFieldInputPlaceholder__organizationSlug: 'my-org', + formFieldInputPlaceholder__password: '비밀번호를 입력하세요', + formFieldInputPlaceholder__phoneNumber: '휴대폰 번호를 입력하세요', formFieldInputPlaceholder__username: undefined, - formFieldInput__emailAddress_format: undefined, + formFieldInput__emailAddress_format: '예시: name@example.com', formFieldLabel__apiKey: 'API 키', formFieldLabel__apiKeyDescription: '설명', formFieldLabel__apiKeyExpiration: '만료', formFieldLabel__apiKeyName: '시크릿 키 이름', - formFieldLabel__automaticInvitations: 'Enable automatic invitations for this domain', + formFieldLabel__automaticInvitations: '이 도메인에 자동 초대 사용', formFieldLabel__backupCode: '백업 코드', formFieldLabel__confirmDeletion: '확인', formFieldLabel__confirmPassword: '비밀번호 확인', formFieldLabel__currentPassword: '현재 비밀번호', formFieldLabel__emailAddress: '이메일 주소', - formFieldLabel__emailAddress_username: '이메일 주소 혹은 사용자 이름', + formFieldLabel__emailAddress_username: '이메일 주소 혹은 아이디', formFieldLabel__emailAddresses: '이메일 주소', formFieldLabel__firstName: '이름', formFieldLabel__lastName: '성', formFieldLabel__newPassword: '새 비밀번호', formFieldLabel__organizationDomain: '도메인', - formFieldLabel__organizationDomainDeletePending: 'Delete pending invitations and suggestions', - formFieldLabel__organizationDomainEmailAddress: 'Verification email address', + formFieldLabel__organizationDomainDeletePending: '대기 중인 초대와 제안 삭제', + formFieldLabel__organizationDomainEmailAddress: '인증 이메일 주소', formFieldLabel__organizationDomainEmailAddressDescription: - 'Enter an email address under this domain to receive a code and verify this domain.', + '이 도메인의 이메일 주소를 입력하면 코드를 받아 도메인을 인증할 수 있어요.', formFieldLabel__organizationName: '이름', formFieldLabel__organizationSlug: '슬러그', - formFieldLabel__passkeyName: undefined, + formFieldLabel__passkeyName: '패스키 이름', formFieldLabel__password: '비밀번호', formFieldLabel__phoneNumber: '휴대폰 번호', formFieldLabel__role: '역할', formFieldLabel__signOutOfOtherSessions: '다른 모든 기기에서 로그아웃', - formFieldLabel__username: '사용자 이름', + formFieldLabel__username: '아이디', impersonationFab: { action__signOut: '로그아웃', - title: '{{identifier}}로 로그인했습니다', + title: '{{identifier}}로 로그인했어요', }, lastAuthenticationStrategy: '최근 사용', - maintenanceMode: undefined, + maintenanceMode: '지금 점검 중이에요. 걱정 마세요, 몇 분이면 끝날 거예요.', membershipRole__admin: '관리자', membershipRole__basicMember: '멤버', membershipRole__guestMember: '게스트', organizationList: { - action__createOrganization: 'Create organization', - action__invitationAccept: 'Join', - action__suggestionsAccept: 'Request to join', - createOrganization: 'Create Organization', - invitationAcceptedLabel: 'Joined', - subtitle: 'to continue to {{applicationName}}', - suggestionsAcceptedLabel: 'Pending approval', - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', + action__createOrganization: '조직 만들기', + action__invitationAccept: '참여', + action__suggestionsAccept: '참여 요청', + createOrganization: '조직 만들기', + invitationAcceptedLabel: '참여함', + subtitle: '{{applicationName}}로 계속하려면', + suggestionsAcceptedLabel: '승인 대기', + title: '계정 선택', + titleWithoutPersonal: '조직 선택', }, organizationProfile: { apiKeysPage: { - title: undefined, + title: 'API 키', }, - badge__automaticInvitation: 'Automatic invitations', - badge__automaticSuggestion: 'Automatic suggestions', - badge__manualInvitation: 'No automatic enrollment', - badge__unverified: 'Unverified', + badge__automaticInvitation: '자동 초대', + badge__automaticSuggestion: '자동 제안', + badge__manualInvitation: '자동 등록 없음', + badge__unverified: '미인증', billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: '결제 내역이 없어요', + notFound: '결제 시도를 찾을 수 없어요', + tableHeader__amount: '금액', + tableHeader__date: '날짜', + tableHeader__status: '상태', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: '기본으로 설정', + actionLabel__remove: '삭제', + add: '새 결제 수단 추가', + addSubtitle: '계정에 새 결제 수단을 추가하세요.', + cancelButton: '취소', + formButtonPrimary__add: '결제 수단 추가', + formButtonPrimary__pay: '{{amount}} 결제', + payWithTestCardButton: '테스트 카드로 결제', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}}가 이 계정에서 삭제돼요.', + messageLine2: '이 결제 수단은 더 이상 사용할 수 없고, 연결된 구독도 작동하지 않아요.', + successMessage: '{{paymentMethod}}이(가) 계정에서 삭제됐어요.', + title: '결제 수단 삭제', }, - title: undefined, + title: '결제 수단', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: '결제', + headerTitle__plans: '플랜', + headerTitle__statements: '명세서', + headerTitle__subscriptions: '구독', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: '표시할 명세서가 없어요', + itemCaption__paidForPlan: '{{plan}} {{period}} 플랜 결제', + itemCaption__proratedCredit: '이전 구독 일부 사용에 대한 비례 크레딧', + itemCaption__subscribedAndPaidForPlan: '{{plan}} {{period}} 플랜을 구독하고 결제했어요', + notFound: '명세서를 찾을 수 없어요', + tableHeader__amount: '금액', + tableHeader__date: '날짜', + title: '명세서', + totalPaid: '총 결제', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: '관리', + actionLabel__newSubscription: '플랜 구독하기', + actionLabel__switchPlan: '플랜 변경', + tableHeader__edit: '편집', + tableHeader__plan: '플랜', + tableHeader__startDate: '시작일', + title: '구독', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: '관리', }, switchPlansSection: { - title: undefined, + title: '플랜 변경', }, - title: undefined, + title: '결제', }, createDomainPage: { subtitle: - 'Add the domain to verify. Users with email addresses at this domain can join the organization automatically or request to join.', - title: 'Add domain', + '도메인을 추가해 인증하세요. 이 도메인의 이메일을 가진 사용자는 조직에 자동으로 참여하거나 참여 요청을 할 수 있어요.', + title: '도메인 추가', }, invitePage: { - detailsTitle__inviteFailed: '초대를 보낼 수 없습니다. 다음을 수정하고 다시 시도하세요:', + detailsTitle__inviteFailed: + '초대를 보낼 수 없어요. 다음 이메일 주소에는 이미 대기 중인 초대가 있어요: {{email_addresses}}.', formButtonPrimary__continue: '초대 보내기', - selectDropdown__role: 'Select role', - subtitle: '이 조직에 새 멤버 초대', - successMessage: '초대가 성공적으로 전송되었습니다', - title: '회원 초대', + selectDropdown__role: '역할 선택', + subtitle: '공백이나 쉼표로 구분해 이메일 주소를 입력하거나 붙여넣어 주세요.', + successMessage: '초대가 성공적으로 전송됐어요', + title: '새 멤버 초대', }, membersPage: { action__invite: '초대', - action__search: undefined, + action__search: '검색', activeMembersTab: { menuAction__remove: '회원 제거', - tableHeader__actions: undefined, + tableHeader__actions: '작업', tableHeader__joined: '가입됨', tableHeader__role: '역할', tableHeader__user: '사용자', @@ -368,11 +372,11 @@ export const koKR: LocalizationResource = { invitationsTab: { autoInvitations: { headerSubtitle: - 'Invite users by connecting an email domain with your organization. Anyone who signs up with a matching email domain will be able to join the organization anytime.', - headerTitle: 'Automatic invitations', - primaryButton: 'Manage verified domains', + '이메일 도메인을 조직과 연결해 사용자를 초대하세요. 해당 도메인으로 가입한 사용자는 언제든 조직에 참여할 수 있어요.', + headerTitle: '자동 초대', + primaryButton: '인증된 도메인 관리', }, - table__emptyRow: 'No invitations to display', + table__emptyRow: '표시할 초대가 없어요', }, invitedMembersTab: { menuAction__revoke: '초대 취소', @@ -380,133 +384,131 @@ export const koKR: LocalizationResource = { }, requestsTab: { autoSuggestions: { - headerSubtitle: - 'Users who sign up with a matching email domain, will be able to see a suggestion to request to join your organization.', - headerTitle: 'Automatic suggestions', - primaryButton: 'Manage verified domains', + headerSubtitle: '해당 도메인으로 가입한 사용자는 조직 참여 요청을 제안받을 수 있어요.', + headerTitle: '자동 제안', + primaryButton: '인증된 도메인 관리', }, - menuAction__approve: 'Approve', - menuAction__reject: 'Reject', - tableHeader__requested: 'Requested access', - table__emptyRow: 'No requests to display', + menuAction__approve: '승인', + menuAction__reject: '거절', + tableHeader__requested: '요청됨', + table__emptyRow: '요청이 없어요', }, start: { - headerTitle__invitations: 'Invitations', - headerTitle__members: 'Members', - headerTitle__requests: 'Requests', + headerTitle__invitations: '초대', + headerTitle__members: '멤버', + headerTitle__requests: '요청', }, alerts: { roleSetMigrationInProgress: { - title: '역할이 일시적으로 잠겨 있습니다', - subtitle: '사용 가능한 역할을 업데이트하고 있습니다. 완료되면 다시 역할을 업데이트할 수 있습니다.', + title: '역할이 잠시 잠겼어요', + subtitle: '사용 가능한 역할을 업데이트하고 있어요. 끝나면 다시 역할을 바꿀 수 있어요.', }, }, }, navbar: { - apiKeys: undefined, - billing: undefined, - description: 'Manage your organization.', - general: 'General', - members: 'Members', - title: 'Organization', + apiKeys: 'API 키', + billing: '결제', + description: '조직을 관리하세요.', + general: '일반', + members: '멤버', + title: '조직', }, plansPage: { alerts: { - noPermissionsToManageBilling: undefined, + noPermissionsToManageBilling: '이 조직의 결제를 관리할 권한이 없어요.', }, - title: undefined, + title: '플랜', }, profilePage: { dangerSection: { deleteOrganization: { actionDescription: '계속하려면 아래에 {{organizationName}}을(를) 입력하세요.', - messageLine1: '이 조직을 삭제하시겠습니까?', - messageLine2: '이 작업은 영구적이며 되돌릴 수 없습니다.', - successMessage: '조직을 삭제했습니다.', + messageLine1: '이 조직을 삭제할까요?', + messageLine2: '이 작업은 되돌릴 수 없어요.', + successMessage: '조직을 삭제했어요.', title: '조직 삭제', }, leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - messageLine1: '이 조직을 탈퇴하시겠습니까? 이 조직 및 해당 애플리케이션에 대한 액세스 권한을 잃게됩니다.', - messageLine2: '이 작업은 영구적이며 되돌릴 수 없습니다', - successMessage: '조직을 탈퇴했습니다.', + actionDescription: '계속하려면 아래에 "{{organizationName}}"을(를) 입력하세요.', + messageLine1: '이 조직을 탈퇴할까요? 조직과 관련 앱에 대한 접근 권한을 잃게 돼요.', + messageLine2: '이 작업은 되돌릴 수 없어요.', + successMessage: '조직을 탈퇴했어요.', title: '조직 떠나기', }, title: '위험', }, domainSection: { - menuAction__manage: 'Manage', - menuAction__remove: 'Delete', - menuAction__verify: 'Verify', + menuAction__manage: '관리', + menuAction__remove: '삭제', + menuAction__verify: '인증', primaryButton: '도메인 추가', - subtitle: '인증된 이메일 도메인을 기반으로 사용자가 조직에 자동으로 가입하거나 가입 요청을 할 수 있게 합니다.', + subtitle: '인증된 이메일 도메인을 기준으로 사용자가 자동 참여하거나 참여 요청을 할 수 있게 해요.', title: '인증된 도메인', }, - successMessage: '조직이 업데이트되었습니다.', - title: '조직 프로필', + successMessage: '조직이 업데이트됐어요.', + title: '프로필 업데이트', }, removeDomainPage: { - messageLine1: 'The email domain {{domain}} will be removed.', - messageLine2: 'Users won’t be able to join the organization automatically after this.', - successMessage: '{{domain}} has been removed.', - title: 'Remove domain', + messageLine1: '이메일 도메인 {{domain}}이(가) 삭제돼요.', + messageLine2: '이후에는 사용자가 조직에 자동으로 참여할 수 없어요.', + successMessage: '{{domain}}이(가) 삭제됐어요.', + title: '도메인 삭제', }, start: { - headerTitle__general: 'General', + headerTitle__general: '일반', headerTitle__members: '멤버', profileSection: { - primaryButton: undefined, - title: 'Organization Profile', - uploadAction__title: 'Logo', + primaryButton: '프로필 업데이트', + title: '조직 프로필', + uploadAction__title: '로고', }, }, verifiedDomainPage: { dangerTab: { - calloutInfoLabel: 'Removing this domain will affect invited users.', - removeDomainActionLabel__remove: 'Remove domain', - removeDomainSubtitle: 'Remove this domain from your verified domains', - removeDomainTitle: 'Remove domain', + calloutInfoLabel: '이 도메인을 삭제하면 초대된 사용자에게 영향이 있어요.', + removeDomainActionLabel__remove: '도메인 삭제', + removeDomainSubtitle: '이 도메인을 인증된 도메인 목록에서 삭제', + removeDomainTitle: '도메인 삭제', }, enrollmentTab: { - automaticInvitationOption__description: - 'Users are automatically invited to join the organization when they sign-up and can join anytime.', - automaticInvitationOption__label: 'Automatic invitations', + automaticInvitationOption__description: '사용자가 가입하면 자동으로 초대되고 언제든지 조직에 참여할 수 있어요.', + automaticInvitationOption__label: '자동 초대', automaticSuggestionOption__description: - 'Users receive a suggestion to request to join, but must be approved by an admin before they are able to join the organization.', - automaticSuggestionOption__label: 'Automatic suggestions', - calloutInfoLabel: 'Changing the enrollment mode will only affect new users.', - calloutInvitationCountLabel: 'Pending invitations sent to users: {{count}}', - calloutSuggestionCountLabel: 'Pending suggestions sent to users: {{count}}', - manualInvitationOption__description: 'Users can only be invited manually to the organization.', - manualInvitationOption__label: 'No automatic enrollment', - subtitle: 'Choose how users from this domain can join the organization.', + '사용자는 참여 요청 제안을 받지만, 관리자가 승인해야 조직에 참여할 수 있어요.', + automaticSuggestionOption__label: '자동 제안', + calloutInfoLabel: '등록 방식 변경은 새 사용자에게만 적용돼요.', + calloutInvitationCountLabel: '대기 중인 초대: {{count}}', + calloutSuggestionCountLabel: '대기 중인 제안: {{count}}', + manualInvitationOption__description: '사용자는 수동으로만 조직에 초대할 수 있어요.', + manualInvitationOption__label: '자동 등록 없음', + subtitle: '이 도메인 사용자가 조직에 참여하는 방법을 선택하세요.', }, start: { - headerTitle__danger: 'Danger', - headerTitle__enrollment: 'Enrollment options', + headerTitle__danger: '위험', + headerTitle__enrollment: '등록 옵션', }, - subtitle: 'The domain {{domain}} is now verified. Continue by selecting enrollment mode.', - title: 'Update {{domain}}', + subtitle: '도메인 {{domain}}이(가) 인증됐어요. 등록 방식을 선택해 주세요.', + title: '{{domain}} 업데이트', }, verifyDomainPage: { - formSubtitle: 'Enter the verification code sent to your email address', - formTitle: 'Verification code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'The domain {{domainName}} needs to be verified via email.', - subtitleVerificationCodeScreen: 'A verification code was sent to {{emailAddress}}. Enter the code to continue.', - title: 'Verify domain', + formSubtitle: '이메일로 전송된 인증 코드를 입력하세요', + formTitle: '인증 코드', + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '도메인 {{domainName}}은 이메일로 인증이 필요해요.', + subtitleVerificationCodeScreen: '{{emailAddress}}로 인증 코드가 전송됐어요. 코드를 입력해 주세요.', + title: '도메인 인증', }, }, organizationSwitcher: { - action__closeOrganizationSwitcher: undefined, + action__closeOrganizationSwitcher: '조직 전환기 닫기', action__createOrganization: '조직 만들기', - action__invitationAccept: 'Join', + action__invitationAccept: '참여', action__manageOrganization: '조직 관리', - action__openOrganizationSwitcher: undefined, - action__suggestionsAccept: 'Request to join', + action__openOrganizationSwitcher: '조직 전환기 열기', + action__suggestionsAccept: '참여 요청', notSelected: '선택한 조직 없음', personalWorkspace: '개인 워크스페이스', - suggestionsAcceptedLabel: 'Pending approval', + suggestionsAcceptedLabel: '승인 대기', }, paginationButton__next: '다음', paginationButton__previous: '이전', @@ -514,98 +516,98 @@ export const koKR: LocalizationResource = { paginationRowText__of: '의', reverification: { alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__passkey: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, + actionLink: '도움 요청하기', + actionText: '이 방법이 없나요?', + blockButton__backupCode: '백업 코드 사용', + blockButton__emailCode: '{{identifier}}로 이메일 코드 보내기', + blockButton__passkey: '패스키 사용하기', + blockButton__password: '비밀번호로 계속', + blockButton__phoneCode: '{{identifier}}로 SMS 코드 보내기', + blockButton__totp: '인증 앱 사용하기', getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, + blockButton__emailSupport: '이메일 지원', + content: '계정 인증에 문제가 있다면 이메일로 문의해 주세요. 최대한 빠르게 도와드릴게요.', + title: '도움 요청하기', }, - subtitle: undefined, - title: undefined, + subtitle: '문제가 있나요? 다른 방법으로 인증할 수 있어요.', + title: '다른 방법 사용하기', }, backupCodeMfa: { - subtitle: undefined, - title: undefined, + subtitle: '2단계 인증 설정 때 받은 백업 코드를 입력하세요', + title: '백업 코드 입력', }, emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: '인증 코드', + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '이메일로 전송된 코드를 입력해 주세요', + title: '인증이 필요해요', }, noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, + message: '인증을 진행할 수 없어요. 설정된 인증 수단이 없어요.', + subtitle: '오류가 발생했어요', + title: '계정을 확인할 수 없어요', }, passkey: { - blockButton__passkey: undefined, - subtitle: undefined, - title: undefined, + blockButton__passkey: '패스키 사용하기', + subtitle: '패스키로 신원을 확인해요. 기기에서 지문, 얼굴 또는 화면 잠금을 요청할 수 있어요.', + title: '패스키 사용', }, password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, + actionLink: '다른 방법 사용하기', + subtitle: '계속하려면 현재 비밀번호를 입력하세요', + title: '인증이 필요해요', }, phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: '인증 코드', + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '휴대폰으로 전송된 코드를 입력해 주세요', + title: '인증이 필요해요', }, phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: '인증 코드', + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '휴대폰으로 전송된 코드를 입력해 주세요', + title: '인증이 필요해요', }, totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, + formTitle: '인증 코드', + subtitle: '인증 앱에서 생성된 코드를 입력해 주세요', + title: '인증이 필요해요', }, }, signIn: { accountSwitcher: { - action__addAccount: 'Add account', - action__signOutAll: 'Sign out of all accounts', - subtitle: 'Select the account with which you wish to continue.', - title: 'Choose an account', + action__addAccount: '계정 추가', + action__signOutAll: '모든 계정 로그아웃', + subtitle: '계속할 계정을 선택해 주세요.', + title: '계정 선택', }, alternativeMethods: { actionLink: '도움 요청하기', - actionText: 'Don’t have any of these?', + actionText: '이 방법이 없나요?', blockButton__backupCode: '백업 코드 사용하기', blockButton__emailCode: '{{identifier}}로 이메일 코드 보내기', blockButton__emailLink: '{{identifier}}로 이메일 링크 보내기', - blockButton__passkey: undefined, + blockButton__passkey: '패스키로 로그인', blockButton__password: '비밀번호로 로그인', blockButton__phoneCode: '{{identifier}}로 SMS 코드 보내기', blockButton__totp: '인증 앱 사용하기', getHelp: { blockButton__emailSupport: '이메일 지원', - content: '계정에 로그인하는 데 문제가 있는 경우 이메일을 보내주시면 최대한 빨리 액세스를 복구해 드리겠습니다.', + content: '계정 로그인에 문제가 있다면 이메일로 알려 주세요. 최대한 빠르게 접근을 복구해 드릴게요.', title: '도움 요청하기', }, - subtitle: '문제가 있나요? 다른 방법으로 로그인할 수 있습니다.', + subtitle: '문제가 있나요? 다른 방법으로 로그인할 수 있어요.', title: '다른 방법 사용하기', }, alternativePhoneCodeProvider: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: '인증 코드', + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '{{applicationName}}로 계속하려면', + title: '{{provider}} 확인', }, backupCodeMfa: { - subtitle: '백업코드는 2단계 인증을 설정할 때 얻은 코드입니다', + subtitle: '백업 코드는 2단계 인증을 설정할 때 받은 코드예요', title: '백업 코드 입력', }, emailCode: { @@ -622,32 +624,32 @@ export const koKR: LocalizationResource = { }, emailLink: { clientMismatch: { - subtitle: undefined, - title: undefined, + subtitle: '계속하려면 로그인 시작한 기기와 브라우저에서 링크를 열어 주세요.', + title: '이 기기에서는 인증 링크를 사용할 수 없어요', }, expired: { subtitle: '계속하려면 원래 탭으로 돌아가세요.', - title: '이 인증 링크는 만료되었습니다', + title: '이 인증 링크는 만료됐어요', }, failed: { subtitle: '계속하려면 원래 탭으로 돌아가세요.', - title: '이 인증 링크는 유효하지 않습니다', + title: '이 인증 링크는 유효하지 않아요', }, formSubtitle: '이메일로 전송된 인증 링크를 사용하세요', formTitle: '인증 링크', loading: { - subtitle: '곧 리다이렉션 됩니다', + subtitle: '곧 이동돼요', title: '로그인 중...', }, resendButton: '링크 재전송', subtitle: '{{applicationName}}로 계속하려면', title: '이메일을 확인하세요', unusedTab: { - title: '이 탭을 닫으셔도 됩니다', + title: '이 탭은 닫아도 돼요', }, verified: { - subtitle: '곧 리다이렉션 될 예정입니다', - title: '로그인에 성공했습니다', + subtitle: '곧 이동돼요', + title: '로그인이 완료됐어요', }, verifiedSwitchTab: { subtitle: '계속하려면 원래 탭으로 돌아가세요', @@ -662,13 +664,13 @@ export const koKR: LocalizationResource = { title: '이메일을 확인하세요', }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: '계속할 기업 계정을 선택해 주세요.', + title: '기업 계정 선택', }, forgotPassword: { formTitle: '비밀번호 재설정 코드', resendButton: '코드 재전송', - subtitle: 'to reset your password', + subtitle: '비밀번호를 재설정하려면', subtitle_email: '먼저 이메일로 전송된 코드를 입력하세요', subtitle_phone: '먼저 휴대폰으로 전송된 코드를 입력하세요', title: '비밀번호 재설정', @@ -678,15 +680,15 @@ export const koKR: LocalizationResource = { label__alternativeMethods: '또는 다른 방법으로 로그인', title: '비밀번호를 잊으셨나요?', }, - newDeviceVerificationNotice: '새로운 기기에서 로그인하고 있습니다. 계정 보안을 위해 확인을 요청하고 있습니다.', + newDeviceVerificationNotice: '새로운 기기에서 로그인 중이에요. 계정 보안을 위해 확인을 요청하고 있어요.', noAvailableMethods: { - message: '로그인을 계속할 수 없습니다. 사용 가능한 인증 방법이 없습니다.', - subtitle: '오류가 발생했습니다', - title: '로그인할 수 없습니다', + message: '로그인을 계속할 수 없어요. 사용할 수 있는 인증 방법이 없어요.', + subtitle: '오류가 발생했어요', + title: '로그인할 수 없어요', }, passkey: { - subtitle: undefined, - title: undefined, + subtitle: '패스키로 로그인하면 본인 확인이 돼요. 기기에서 지문, 얼굴 또는 화면 잠금을 요청할 수 있어요.', + title: '패스키 사용', }, password: { actionLink: '다른 방법 사용하기', @@ -694,13 +696,13 @@ export const koKR: LocalizationResource = { title: '비밀번호를 입력하세요', }, passwordCompromised: { - title: undefined, + title: '비밀번호가 유출됐을 수 있어요', }, passwordPwned: { - title: undefined, + title: '유출된 비밀번호예요', }, passwordUntrusted: { - title: undefined, + title: '신뢰할 수 없는 비밀번호예요', }, phoneCode: { formTitle: '인증 코드', @@ -716,30 +718,30 @@ export const koKR: LocalizationResource = { }, resetPassword: { formButtonPrimary: '비밀번호 재설정', - requiredMessage: 'For security reasons, it is required to reset your password.', - successMessage: '비밀번호가 성공적으로 변경되었습니다. 로그인하는 중입니다. 잠시만 기다려주세요.', + requiredMessage: '보안을 위해 비밀번호를 재설정해야 해요.', + successMessage: '비밀번호가 변경됐어요. 로그인 중이에요. 잠시만 기다려 주세요.', title: '비밀번호 재설정', }, resetPasswordMfa: { - detailsLabel: '비밀번호를 재설정하기 전에 신원을 확인해야 합니다.', + detailsLabel: '비밀번호를 재설정하기 전에 신원을 확인해야 해요.', }, start: { actionLink: '회원가입', - actionLink__join_waitlist: undefined, + actionLink__join_waitlist: '대기 목록 참여', actionLink__use_email: '이메일 사용하기', - actionLink__use_email_username: '이메일 또는 사용자 이름 사용하기', - actionLink__use_passkey: undefined, + actionLink__use_email_username: '이메일 또는 아이디 사용하기', + actionLink__use_passkey: '패스키 사용하기', actionLink__use_phone: '휴대폰 번호 사용하기', - actionLink__use_username: '사용자 이름 사용하기', + actionLink__use_username: '아이디 사용하기', actionText: '계정이 없으신가요?', - actionText__join_waitlist: undefined, + actionText__join_waitlist: '미리 사용해 보고 싶으신가요?', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: '다른 방법 사용하기', + label: '{{provider}} 휴대폰 번호', + subtitle: '{{provider}}로 인증 코드를 받을 휴대폰 번호를 입력하세요.', + title: '{{provider}}로 {{applicationName}}에 로그인', }, - subtitle: '환영합니다! 계속하려면 로그인해 주세요', + subtitle: '환영해요! 계속하려면 로그인해 주세요', subtitleCombined: undefined, title: '{{applicationName}}에 로그인', titleCombined: '{{applicationName}}로 계속', @@ -757,9 +759,9 @@ export const koKR: LocalizationResource = { signInEnterPasswordTitle: '비밀번호를 입력하세요', signUp: { alternativePhoneCodeProvider: { - resendButton: undefined, - subtitle: undefined, - title: undefined, + resendButton: '코드를 받지 못하셨나요? 다시 보내기', + subtitle: '{{provider}}로 전송된 인증 코드를 입력하세요', + title: '{{provider}} 인증', }, continue: { actionLink: '로그인', @@ -776,10 +778,10 @@ export const koKR: LocalizationResource = { }, emailLink: { clientMismatch: { - subtitle: undefined, - title: undefined, + subtitle: '계속하려면 가입을 시작한 기기와 브라우저에서 링크를 열어 주세요.', + title: '이 기기에서는 인증 링크를 사용할 수 없어요', }, - formSubtitle: '이메일 주소로 전송된 인증 링크를 사용합니다.', + formSubtitle: '이메일로 받은 인증 링크를 사용해 주세요.', formTitle: '인증 링크', loading: { title: '가입 중...', @@ -788,7 +790,7 @@ export const koKR: LocalizationResource = { subtitle: '{{applicationName}}로 계속하려면', title: '이메일 인증하기', verified: { - title: '성공적으로 가입에 성공했습니다', + title: '가입이 완료됐어요', }, verifiedSwitchTab: { subtitle: '계속하려면 새로 연 탭으로 돌아가기', @@ -797,18 +799,19 @@ export const koKR: LocalizationResource = { }, }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: '계속할 기업 계정을 선택해 주세요.', + title: '기업 계정 선택', }, legalConsent: { checkbox: { - label__onlyPrivacyPolicy: undefined, - label__onlyTermsOfService: undefined, - label__termsOfServiceAndPrivacyPolicy: undefined, + label__onlyPrivacyPolicy: '{{ privacyPolicyLink || link("개인정보처리방침") }}에 동의해요', + label__onlyTermsOfService: '{{ termsOfServiceLink || link("서비스 약관") }}에 동의해요', + label__termsOfServiceAndPrivacyPolicy: + '{{ termsOfServiceLink || link("서비스 약관") }}과 {{ privacyPolicyLink || link("개인정보처리방침") }}에 동의해요', }, continue: { - subtitle: undefined, - title: undefined, + subtitle: '계속하려면 약관에 동의해 주세요', + title: '약관 동의', }, }, phoneCode: { @@ -819,27 +822,27 @@ export const koKR: LocalizationResource = { title: '휴대폰 번호 인증', }, restrictedAccess: { - actionLink: undefined, - actionText: undefined, - blockButton__emailSupport: undefined, - blockButton__joinWaitlist: undefined, - subtitle: undefined, - subtitleWaitlist: undefined, - title: undefined, + actionLink: '로그인', + actionText: '이미 계정이 있나요?', + blockButton__emailSupport: '이메일 지원', + blockButton__joinWaitlist: '대기 목록 참여', + subtitle: '현재 회원가입이 중단돼 있어요. 접근 권한이 필요하다면 지원팀에 문의해 주세요.', + subtitleWaitlist: '회원가입이 중단돼 있어요. 출시 소식을 가장 먼저 받으려면 대기 목록에 참여해 주세요.', + title: '접근 제한', }, start: { actionLink: '로그인하기', - actionLink__use_email: undefined, - actionLink__use_phone: undefined, + actionLink__use_email: '이메일로 가입', + actionLink__use_phone: '휴대폰으로 가입', actionText: '계정이 있으신가요?', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: '다른 방법 사용하기', + label: '{{provider}} 휴대폰 번호', + subtitle: '{{provider}}로 인증 코드를 받을 휴대폰 번호를 입력하세요.', + title: '{{provider}}로 {{applicationName}}에 가입', }, - subtitle: '환영합니다! 아래 정보를 입력해주세요.', - subtitleCombined: '환영합니다! 아래 정보를 입력해주세요.', + subtitle: '환영해요! 아래 정보를 입력해 주세요.', + subtitleCombined: '환영해요! 아래 정보를 입력해 주세요.', title: '계정 만들기', titleCombined: '계정 만들기', }, @@ -849,71 +852,71 @@ export const koKR: LocalizationResource = { }, }, socialButtonsBlockButton: '{{provider|titleize}}로 계속하기', - socialButtonsBlockButtonManyInView: undefined, + socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { chooseOrganization: { - action__createOrganization: undefined, - action__invitationAccept: undefined, - action__suggestionsAccept: undefined, - subtitle: undefined, - subtitle__createOrganizationDisabled: undefined, - suggestionsAcceptedLabel: undefined, - title: undefined, + action__createOrganization: '새 조직 만들기', + action__invitationAccept: '참여', + action__suggestionsAccept: '참여 요청', + subtitle: '기존 조직에 참여하거나 새 조직을 만드세요', + subtitle__createOrganizationDisabled: '기존 조직에 참여하세요', + suggestionsAcceptedLabel: '승인 대기 중', + title: '조직 선택', }, createOrganization: { - formButtonReset: undefined, - formButtonSubmit: undefined, - formFieldInputPlaceholder__name: undefined, - formFieldInputPlaceholder__slug: undefined, - formFieldLabel__name: undefined, - formFieldLabel__slug: undefined, - subtitle: undefined, - title: undefined, + formButtonReset: '취소', + formButtonSubmit: '계속', + formFieldInputPlaceholder__name: '내 조직', + formFieldInputPlaceholder__slug: 'nae-jigug', + formFieldLabel__name: '이름', + formFieldLabel__slug: '슬러그', + subtitle: '조직 정보를 입력해 계속하세요', + title: '조직 설정', }, organizationCreationDisabled: { - title: '조직에 소속되어야 합니다', - subtitle: '초대를 받으려면 조직 관리자에게 문의하세요.', + title: '조직에 소속돼야 해요', + subtitle: '초대가 필요하면 조직 관리자에게 문의해 주세요.', }, signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: '로그아웃', + actionText: '{{identifier}}로 로그인됨', }, alerts: { organizationAlreadyExists: - '감지된 회사 이름 ({{organizationName}}) 및 {{organizationDomain}}에 대한 조직이 이미 존재합니다. 초대를 통해 가입하세요.', + '감지된 회사 이름({{organizationName}})과 {{organizationDomain}}에 해당하는 조직이 이미 있어요. 초대로 참여해 주세요.', }, }, taskResetPassword: { - formButtonPrimary: undefined, + formButtonPrimary: '비밀번호 재설정', signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: '로그아웃', + actionText: '{{identifier}}로 로그인됨', }, - subtitle: undefined, - title: undefined, + subtitle: '계속하려면 비밀번호를 새로 설정해야 해요', + title: '비밀번호 재설정', }, unstable__errors: { - already_a_member_in_organization: undefined, - avatar_file_size_exceeded: '파일 크기가 최대 10MB 제한을 초과합니다. 더 작은 파일을 선택해 주세요.', - avatar_file_type_invalid: '지원되지 않는 파일 형식입니다. JPG, PNG, GIF 또는 WEBP 이미지를 업로드해 주세요.', + already_a_member_in_organization: '{{email}}은(는) 이미 이 조직의 멤버예요.', + avatar_file_size_exceeded: '파일 크기가 최대 10MB 제한을 초과해요. 더 작은 파일을 선택해 주세요.', + avatar_file_type_invalid: '지원되지 않는 파일 형식이에요. JPG, PNG, GIF 또는 WEBP 이미지를 업로드해 주세요.', captcha_invalid: - 'Sign up unsuccessful due to failed security validations. Please refresh the page to try again or reach out to support for more assistance.', + '보안 검증에 실패해 회원가입을 완료할 수 없어요. 페이지를 새로고침한 뒤 다시 시도하거나 지원팀에 문의해 주세요.', captcha_unavailable: - 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', + '봇 검증에 실패해 회원가입을 완료할 수 없어요. 페이지를 새로고침한 뒤 다시 시도하거나 지원팀에 문의해 주세요.', form_code_incorrect: undefined, form_email_address_blocked: - '임시 이메일 서비스는 지원되지 않습니다. 계정을 만들려면 일반 이메일 주소를 사용해 주세요.', + '임시 이메일 서비스는 지원되지 않아요. 계정을 만들려면 일반 이메일 주소를 사용해 주세요.', form_identifier_exists__email_address: undefined, form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, - form_identifier_not_found: '이 세부 정보와 일치하는 계정을 찾을 수 없습니다.', - form_new_password_matches_current: undefined, + form_identifier_not_found: '이 정보와 일치하는 계정을 찾을 수 없어요.', + form_new_password_matches_current: '새 비밀번호는 현재 비밀번호와 같을 수 없어요.', form_param_format_invalid: undefined, - form_param_format_invalid__email_address: 'Email address must be a valid email address.', - form_param_format_invalid__phone_number: 'Phone number must be in a valid international format', - form_param_max_length_exceeded__first_name: 'First name should not exceed 256 characters.', - form_param_max_length_exceeded__last_name: 'Last name should not exceed 256 characters.', - form_param_max_length_exceeded__name: 'Name should not exceed 256 characters.', + form_param_format_invalid__email_address: '이메일 주소 형식이 올바르지 않아요.', + form_param_format_invalid__phone_number: '전화번호는 올바른 국제 형식이어야 해요.', + form_param_max_length_exceeded__first_name: '이름은 256자를 넘을 수 없어요.', + form_param_max_length_exceeded__last_name: '성은 256자를 넘을 수 없어요.', + form_param_max_length_exceeded__name: '이름은 256자를 넘을 수 없어요.', form_param_nil: undefined, form_param_type_invalid: undefined, form_param_type_invalid__email_address: undefined, @@ -921,33 +924,35 @@ export const koKR: LocalizationResource = { form_param_value_invalid: undefined, form_password_incorrect: undefined, form_password_or_identifier_incorrect: - '비밀번호 또는 이메일 주소가 올바르지 않습니다. 다시 시도하거나 다른 방법을 사용하세요.', - form_password_length_too_short: undefined, - form_password_not_strong_enough: '비밀번호가 충분히 안전하지 않습니다.', - form_password_pwned: '이 비밀번호는 유출사항이 발견되어 사용할 수 없으므로 대신 다른 비밀번호를 사용해 보세요.', - form_password_pwned__sign_in: undefined, + '비밀번호 또는 이메일 주소가 올바르지 않아요. 다시 시도하거나 다른 방법을 사용해 보세요.', + form_password_length_too_short: '비밀번호가 너무 짧아요. 최소 8자 이상이어야 해요.', + form_password_not_strong_enough: '비밀번호가 충분히 안전하지 않아요.', + form_password_pwned: '이 비밀번호는 유출된 기록이 있어 사용할 수 없어요. 다른 비밀번호를 사용해 주세요.', + form_password_pwned__sign_in: '이 비밀번호는 유출된 비밀번호예요. 비밀번호를 재설정해 주세요.', form_password_size_in_bytes_exceeded: - '비밀번호가 허용되는 최대 바이트 수를 초과했습니다. 비밀번호를 줄이거나 일부 특수 문자를 제거해 주세요.', - form_password_untrusted__sign_in: undefined, + '비밀번호가 허용되는 최대 바이트 수를 초과했어요. 비밀번호를 줄이거나 일부 특수 문자를 제거해 주세요.', + form_password_untrusted__sign_in: + '비밀번호가 유출됐을 수 있어요. 계정을 보호하기 위해 다른 방법으로 로그인해 주세요. 로그인 후 비밀번호를 재설정해야 해요.', form_password_validation_failed: '잘못된 비밀번호', form_username_invalid_character: undefined, - form_username_invalid_length: undefined, - form_username_needs_non_number_char: '사용자 이름에는 숫자가 아닌 문자가 하나 이상 포함되어야 합니다.', - identification_deletion_failed: 'You cannot delete your last identification.', + form_username_invalid_length: '아이디는 {{min_length}}~{{max_length}}자여야 해요.', + form_username_needs_non_number_char: '아이디에는 숫자가 아닌 문자가 하나 이상 포함돼야 해요.', + identification_deletion_failed: '마지막 식별 정보는 삭제할 수 없어요.', not_allowed_access: - "이메일 주소 또는 전화번호는 가입에 사용할 수 없습니다. 이는 '+', '=', '#' 또는 '.'이 이메일 주소에 사용되었거나 임시 이메일 서비스에 연결된 도메인이 사용되었거나 명시적 제외가 있는 경우입니다. 이 오류가 발생한 경우 지원에 문의하세요.", + "이메일 주소 또는 전화번호는 가입에 사용할 수 없어요. 이메일 주소에 '+', '=', '#' 또는 '.'이 포함됐거나 임시 이메일 서비스 도메인이거나, 명시적으로 제외된 경우예요. 이 오류가 계속되면 지원에 문의해 주세요.", organization_domain_blocked: undefined, organization_domain_common: undefined, organization_domain_exists_for_enterprise_connection: undefined, organization_membership_quota_exceeded: undefined, organization_minimum_permissions_needed: undefined, - organization_not_found_or_unauthorized: undefined, - organization_not_found_or_unauthorized_with_create_organization_disabled: undefined, - passkey_already_exists: undefined, - passkey_not_supported: undefined, - passkey_pa_not_supported: undefined, - passkey_registration_cancelled: undefined, - passkey_retrieval_cancelled: undefined, + organization_not_found_or_unauthorized: '이 조직의 멤버가 아니에요. 다른 조직을 선택하거나 새로 만들어 주세요.', + organization_not_found_or_unauthorized_with_create_organization_disabled: + '이 조직의 멤버가 아니에요. 다른 조직을 선택해 주세요.', + passkey_already_exists: '이 기기에 이미 패스키가 등록되어 있어요.', + passkey_not_supported: '이 기기에서는 패스키를 지원하지 않아요.', + passkey_pa_not_supported: '등록을 위해 플랫폼 인증기가 필요하지만, 이 기기는 지원하지 않아요.', + passkey_registration_cancelled: '패스키 등록이 취소되었거나 시간이 초과됐어요.', + passkey_retrieval_cancelled: '패스키 인증이 취소되었거나 시간이 초과됐어요.', passwordComplexity: { maximumLength: '{{length}} 보다 짧은 문자열', minimumLength: '{{length}} 또는 그 이상의 문자열', @@ -955,50 +960,50 @@ export const koKR: LocalizationResource = { requireNumbers: '숫자', requireSpecialCharacter: '특수문자', requireUppercase: '대문자', - sentencePrefix: '당신의 비밀번호는 반드시 포함해야합니다', + sentencePrefix: '비밀번호에는 다음이 꼭 포함돼야 해요', }, - phone_number_exists: '이 전화번호는 이미 사용중입니다. 다른 번호를 시도해 주세요.', - session_exists: '이미 로그인 중입니다.', - web3_missing_identifier: undefined, - web3_signature_request_rejected: '서명 요청을 거부했습니다. 계속하려면 다시 시도해 주세요.', - web3_solana_signature_generation_failed: '서명을 생성하는 동안 오류가 발생했습니다. 계속하려면 다시 시도해 주세요.', + phone_number_exists: '이 전화번호는 이미 사용 중이에요. 다른 번호를 시도해 주세요.', + session_exists: '이미 로그인 중이에요.', + web3_missing_identifier: 'Web3 지갑 확장 프로그램을 찾을 수 없어요. 계속하려면 설치해 주세요.', + web3_signature_request_rejected: '서명 요청을 거부했어요. 계속하려면 다시 시도해 주세요.', + web3_solana_signature_generation_failed: '서명을 생성하는 동안 오류가 발생했어요. 계속하려면 다시 시도해 주세요.', zxcvbn: { - couldBeStronger: '비밀번호는 작동하지만 더 강력할 수 있습니다. 문자를 더 추가해 보세요.', - goodPassword: '수고하셨습니다. 훌륭한 비밀번호입니다.', - notEnough: '비밀번호가 충분히 안전하지 않습니다.', + couldBeStronger: '비밀번호는 괜찮지만 더 강하게 만들 수 있어요. 문자를 더 추가해 보세요.', + goodPassword: '좋아요! 훌륭한 비밀번호예요.', + notEnough: '비밀번호가 충분히 안전하지 않아요.', suggestions: { - allUppercase: '모든 문자가 아닌 일부 문자를 대문자로 표시합니다.', - anotherWord: '덜 일반적인 단어를 더 추가합니다.', - associatedYears: '귀하와 연관된 연도는 피하세요.', - capitalization: '한 글자 이상을 대문자로 표기하세요.', - dates: '자신과 관련된 날짜와 연도는 피하세요.', + allUppercase: '모든 글자가 아닌 일부 글자만 대문자로 바꿔 보세요.', + anotherWord: '덜 흔한 단어를 더 추가해 보세요.', + associatedYears: '나와 관련된 연도는 피하는 게 좋아요.', + capitalization: '첫 글자 외에도 대문자를 섞어 보세요.', + dates: '나와 관련된 날짜나 연도는 피하는 게 좋아요.', l33t: "'a'에서 '@'와 같이 예측 가능한 문자 대체를 피하세요.", - longerKeyboardPattern: '더 긴 키보드 패턴을 사용하고 타이핑 방향을 여러 번 변경합니다.', - noNeed: '기호, 숫자 또는 대문자를 사용하지 않고도 강력한 비밀번호를 만들 수 있습니다.', - pwned: '이 비밀번호를 다른 곳에서 사용하는 경우 변경해야 합니다.', + longerKeyboardPattern: '더 긴 키보드 패턴을 쓰고 입력 방향을 바꿔 보세요.', + noNeed: '기호, 숫자, 대문자 없이도 강한 비밀번호를 만들 수 있어요.', + pwned: '이 비밀번호를 다른 곳에서도 쓴다면 변경해 주세요.', recentYears: '최근 연도는 피하세요.', - repeated: '반복되는 단어와 문자를 피하세요.', - reverseWords: '일반적인 단어의 철자를 거꾸로 쓰지 마세요.', - sequences: '일반적인 문자 시퀀스를 피하세요.', - useWords: '여러 단어를 사용하되 일반적인 문구는 피하세요.', + repeated: '반복되는 단어나 문자는 피하세요.', + reverseWords: '익숙한 단어를 거꾸로 쓰지 마세요.', + sequences: '흔한 문자 순서는 피하세요.', + useWords: '여러 단어를 쓰되 흔한 문구는 피하세요.', }, warnings: { - common: '일반적으로 사용되는 비밀번호입니다.', - commonNames: '일반적인 이름과 성은 추측하기 쉽습니다.', - dates: '날짜는 쉽게 추측할 수 있습니다.', - extendedRepeat: '"abcabcabc"와 같이 반복되는 문자 패턴은 쉽게 추측할 수 있습니다.', - keyPattern: '짧은 패턴은 추측하기 쉽습니다.', - namesByThemselves: '단일 이름이나 성은 추측하기 쉽습니다.', - pwned: '인터넷에서 데이터 유출로 인해 비밀번호가 노출되었습니다.', - recentYears: '최근연도는 쉽게 추측할 수 있습니다.', - sequences: '"abc"와 같은 일반적인 문자 시퀀스는 쉽게 추측할 수 있습니다.', - similarToCommon: '일반적으로 사용되는 비밀번호와 유사합니다.', - simpleRepeat: '"aaa"와 같이 반복되는 문자는 쉽게 추측할 수 있습니다.', - straightRow: '같은 줄에 위치한 키보드를 사용하는 것은 추측하기 쉽습니다.', - topHundred: '자주 사용되는 비밀번호입니다.', - topTen: '아주 많이 사용되는 비밀번호입니다.', - userInputs: '개인 정보나 페이지 관련 데이터가 없어야 합니다.', - wordByItself: '한 단어는 쉽게 추측할 수 있습니다.', + common: '자주 쓰는 비밀번호예요.', + commonNames: '흔한 이름이나 성은 추측하기 쉬워요.', + dates: '날짜는 쉽게 추측돼요.', + extendedRepeat: '"abcabcabc" 같은 반복 패턴은 쉽게 추측돼요.', + keyPattern: '짧은 키보드 패턴은 추측하기 쉬워요.', + namesByThemselves: '단일 이름이나 성은 추측하기 쉬워요.', + pwned: '인터넷 유출로 비밀번호가 노출됐어요.', + recentYears: '최근 연도는 추측하기 쉬워요.', + sequences: '"abc" 같은 흔한 문자 순서는 추측하기 쉬워요.', + similarToCommon: '자주 쓰는 비밀번호와 비슷해요.', + simpleRepeat: '"aaa" 같은 반복 문자는 추측하기 쉬워요.', + straightRow: '키보드 한 줄 패턴은 추측하기 쉬워요.', + topHundred: '자주 쓰는 비밀번호예요.', + topTen: '아주 많이 쓰는 비밀번호예요.', + userInputs: '개인 정보나 페이지 관련 데이터는 피하는 게 좋아요.', + wordByItself: '한 단어만 쓰면 추측하기 쉬워요.', }, }, }, @@ -1012,232 +1017,228 @@ export const koKR: LocalizationResource = { }, userProfile: { apiKeysPage: { - title: undefined, + title: 'API 키', }, backupCodePage: { actionLabel__copied: '복사 완료!', actionLabel__copy: '전체 복사', actionLabel__download: '.txt 다운로드', actionLabel__print: '인쇄', - infoText1: '이 계정에 대해 백업 코드가 활성화됩니다.', - infoText2: - '백업 코드를 비밀로 유지하고 안전하게 보관하세요. 백업 코드가 손상된 것으로 의심되는 경우 백업 코드를 다시 생성할 수 있습니다.', + infoText1: '이 계정에 백업 코드가 활성화돼요.', + infoText2: '백업 코드는 비밀로 보관해 주세요. 노출이 의심되면 다시 생성할 수 있어요.', subtitle__codelist: '안전하게 저장하고 비밀로 유지하세요.', successMessage: - '이제 백업 코드가 활성화되었습니다. 인증 장치에 액세스할 수 없는 경우 이 중 하나를 사용하여 계정에 로그인할 수 있습니다. 각 코드는 한 번만 사용할 수 있습니다.', - successSubtitle: '인증 장치에 액세스할 수 없는 경우 이 중 하나를 사용하여 계정에 로그인할 수 있습니다.', + '이제 백업 코드가 활성화됐어요. 인증 장치에 접근할 수 없을 때 이 중 하나로 로그인할 수 있어요. 각 코드는 한 번만 사용할 수 있어요.', + successSubtitle: '인증 장치에 접근할 수 없을 때 이 중 하나로 로그인할 수 있어요.', title: '백업 코드 인증 추가', title__codelist: '백업 코드', }, billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: '결제 내역이 없어요', + notFound: '결제 시도를 찾을 수 없어요', + tableHeader__amount: '금액', + tableHeader__date: '날짜', + tableHeader__status: '상태', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: '기본으로 설정', + actionLabel__remove: '삭제', + add: '새 결제 수단 추가', + addSubtitle: '계정에 새 결제 수단을 추가하세요.', + cancelButton: '취소', + formButtonPrimary__add: '결제 수단 추가', + formButtonPrimary__pay: '{{amount}} 결제', + payWithTestCardButton: '테스트 카드로 결제', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}}가 이 계정에서 삭제돼요.', + messageLine2: '이 결제 수단은 더 이상 사용할 수 없고, 연결된 구독도 작동하지 않아요.', + successMessage: '{{paymentMethod}}이(가) 계정에서 삭제됐어요.', + title: '결제 수단 삭제', }, - title: undefined, + title: '결제 수단', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: '결제', + headerTitle__plans: '플랜', + headerTitle__statements: '명세서', + headerTitle__subscriptions: '구독', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: '표시할 명세서가 없어요', + itemCaption__paidForPlan: '{{plan}} {{period}} 플랜 결제', + itemCaption__proratedCredit: '이전 구독 일부 사용에 대한 비례 크레딧', + itemCaption__subscribedAndPaidForPlan: '{{plan}} {{period}} 플랜을 구독하고 결제했어요', + notFound: '명세서를 찾을 수 없어요', + tableHeader__amount: '금액', + tableHeader__date: '날짜', + title: '명세서', + totalPaid: '총 결제', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: '관리', + actionLabel__newSubscription: '플랜 구독하기', + actionLabel__switchPlan: '플랜 변경', + tableHeader__edit: '편집', + tableHeader__plan: '플랜', + tableHeader__startDate: '시작일', + title: '구독', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: '관리', }, switchPlansSection: { - title: undefined, + title: '플랜 변경', }, - title: undefined, + title: '결제', }, connectedAccountPage: { formHint: '계정을 연결할 제공자를 선택하세요', - formHint__noAccounts: '사용 가능한 외부 계정 제공자가 없습니다.', + formHint__noAccounts: '사용 가능한 외부 계정 제공자가 없어요.', removeResource: { - messageLine1: '{{identifier}}가 이 계정에서 제거 될 예정입니다.', - messageLine2: '이 연결된 계정을 더 이상 사용할 수 없으며 종속된 모든 기능이 더 이상 작동하지 않습니다.', - successMessage: '{{connectedAccount}}가 당신의 계정에서 제거되었습니다.', + messageLine1: '{{identifier}}가 이 계정에서 제거될 예정이에요.', + messageLine2: '이 연결된 계정은 더 이상 사용할 수 없고, 관련 기능도 작동하지 않아요.', + successMessage: '{{connectedAccount}}가 계정에서 삭제됐어요.', title: '연결된 계정 제거', }, socialButtonsBlockButton: '{{provider|titleize}} 계정 연결', - successMessage: '이 제공자가 계정에 추가되었습니다.', + successMessage: '이 제공자가 계정에 추가됐어요.', title: '연결된 계정 추가하기', }, deletePage: { actionDescription: '계속하려면 아래에 계정 삭제를 입력하세요.', confirm: '계정 삭제', messageLine1: - '계정을 삭제하시겠습니까? 일부 관련 데이터가 보관될 수 있습니다. 전체 데이터 삭제를 요청하려면 고객 지원에 문의하세요.', - messageLine2: '이 작업은 영구적이며 되돌릴 수 없습니다.', + '계정을 삭제할까요? 일부 관련 데이터는 보관될 수 있어요. 전체 데이터 삭제를 요청하려면 고객 지원에 문의해 주세요.', + messageLine2: '이 작업은 되돌릴 수 없어요.', title: '계정 삭제', }, emailAddressPage: { emailCode: { - formHint: '이 이메일 주소로 인증 코드가 포함된 이메일이 전송됩니다.', - formSubtitle: '{{identifier}}에게 전송된 인증 코드를 입력합니다', + formHint: '이 이메일 주소로 인증 코드가 포함된 이메일이 전송돼요.', + formSubtitle: '{{identifier}}에게 전송된 인증 코드를 입력해 주세요', formTitle: '인증 코드', resendButton: '코드 재전송', - successMessage: '{{identifier}} 이메일이 당신의 계정에 추가되었습니다.', + successMessage: '{{identifier}} 이메일이 계정에 추가됐어요.', }, emailLink: { - formHint: '인증 링크가 포함된 이메일이 이 이메일 주소로 전송됩니다.', - formSubtitle: '{{identifier}}에게 전송된 이메일의 링크를 클릭합니다.', + formHint: '인증 링크가 포함된 이메일이 이 이메일 주소로 전송돼요.', + formSubtitle: '{{identifier}}에게 전송된 이메일의 링크를 클릭해 주세요.', formTitle: '인증 링크', resendButton: '링크 재전송', - successMessage: '{{identifier}} 이메일이 당신의 계정에 추가되었습니다.', + successMessage: '{{identifier}} 이메일이 계정에 추가됐어요.', }, enterpriseSSOLink: { - formButton: undefined, - formSubtitle: undefined, + formButton: '로그인 계속하기', + formSubtitle: '{{identifier}}로 로그인 완료', }, - formHint: undefined, + formHint: '이 이메일 주소를 추가하려면 먼저 인증해야 해요.', removeResource: { - messageLine1: '{{identifier}} 이메일이 이 계정에서 제거 될 에정입니다.', - messageLine2: '더 이상 이 이메일 주소로 로그인할 수 없습니다.', - successMessage: '{{emailAddress}} 이메일이 당신의 계정에서 삭제되었습니다', + messageLine1: '{{identifier}} 이메일이 이 계정에서 제거될 예정이에요.', + messageLine2: '더 이상 이 이메일 주소로 로그인할 수 없어요.', + successMessage: '{{emailAddress}} 이메일이 계정에서 삭제됐어요.', title: '이메일 제거', }, title: '이메일 주소 추가', - verifyTitle: 'Verify email address', + verifyTitle: '이메일 주소 인증', }, - formButtonPrimary__add: 'Add', + formButtonPrimary__add: '추가', formButtonPrimary__continue: '계속', formButtonPrimary__finish: '완료', - formButtonPrimary__remove: 'Remove', - formButtonPrimary__save: 'Save', + formButtonPrimary__remove: '삭제', + formButtonPrimary__save: '저장', formButtonReset: '취소', mfaPage: { - formHint: '추가할 방법을 선택합니다.', + formHint: '추가할 방법을 선택해 주세요.', title: '2단계 인증 추가', }, mfaPhoneCodePage: { - backButton: 'Use existing number', + backButton: '기존 번호 사용', primaryButton__addPhoneNumber: '휴대폰 번호 추가', removeResource: { - messageLine1: '{{identifier}}는 로그인할 때 더 이상 인증 코드를 받지 않습니다.', - messageLine2: '계정이 안전하지 않을 수 있습니다. 계속하시겠습니까?', - successMessage: '{{mfaPhoneCode}}에 대한 SMS 코드 2단계 인증이 제거되었습니다', + messageLine1: '{{identifier}}는 로그인할 때 더 이상 인증 코드를 받지 않아요.', + messageLine2: '계정이 안전하지 않을 수 있어요. 계속할까요?', + successMessage: '{{mfaPhoneCode}}에 대한 SMS 코드 2단계 인증이 제거됐어요.', title: '2단계 인증 제거', }, subtitle__availablePhoneNumbers: 'SMS 코드 2단계 인증을 위해 등록할 휴대폰 번호를 선택하세요.', - subtitle__unavailablePhoneNumbers: 'SMS 코드 2단계 인증에 등록할 수 있는 휴대폰 번호가 없습니다.', - successMessage1: - 'When signing in, you will need to enter a verification code sent to this phone number as an additional step.', + subtitle__unavailablePhoneNumbers: 'SMS 코드 2단계 인증에 등록할 수 있는 휴대폰 번호가 없어요.', + successMessage1: '로그인할 때 이 휴대폰 번호로 전송된 인증 코드를 추가로 입력해야 해요.', successMessage2: - 'Save these backup codes and store them somewhere safe. If you lose access to your authentication device, you can use backup codes to sign in.', - successTitle: 'SMS code verification enabled', + '백업 코드를 안전한 곳에 보관해 주세요. 인증 기기에 접근할 수 없게 되면 백업 코드로 로그인할 수 있어요.', + successTitle: 'SMS 코드 인증이 활성화됐어요', title: 'SMS 코드 인증 추가', }, mfaTOTPPage: { authenticatorApp: { buttonAbleToScan__nonPrimary: '대신 QR 코드 스캔 하세요', buttonUnableToScan__nonPrimary: 'QR 코드를 스캔할 수 없나요?', - infoText__ableToScan: '인증 앱에서 새 로그인 방법을 설정하고 다음 QR 코드를 스캔하여 계정에 연결합니다.', - infoText__unableToScan: '인증 장치에서 새 로그인 방법을 설정하고 아래에 제공된 키를 입력합니다.', - inputLabel__unableToScan1: - '시간 기반 또는 일회용 비밀번호가 사용 설정되어 있는지 확인한 다음 계정 연결을 완료합니다.', - inputLabel__unableToScan2: '또는 인증자가 TOTP URI를 지원하는 경우 전체 URI를 복사할 수도 있습니다.', + infoText__ableToScan: '인증 앱에서 새 로그인 방법을 만들고 QR 코드를 스캔해 계정에 연결해 주세요.', + infoText__unableToScan: '인증 장치에서 새 로그인 방법을 만든 다음 아래 키를 입력해 주세요.', + inputLabel__unableToScan1: '시간 기반 또는 일회용 비밀번호가 켜져 있는지 확인한 뒤 계정 연결을 완료해 주세요.', + inputLabel__unableToScan2: '인증 앱이 TOTP URI를 지원한다면 전체 URI를 복사해도 돼요.', }, removeResource: { - messageLine1: '로그인할 때 더 이상 이 인증자의 인증 코드가 필요하지 않습니다.', - messageLine2: '계정이 안전하지 않을 수 있습니다. 계속 진행하시겠습니까?', - successMessage: '인증자 애플리케이션을 통한 2단계 인증이 제거되었습니다.', + messageLine1: '로그인할 때 더 이상 이 인증자의 인증 코드가 필요하지 않아요.', + messageLine2: '계정이 안전하지 않을 수 있어요. 계속할까요?', + successMessage: '인증 앱을 통한 2단계 인증이 제거됐어요.', title: '2단계 인증 제거', }, - successMessage: - '이제 2단계 인증이 활성화되었습니다. 로그인할 때 추가 단계로 이 인증자의 인증 코드를 입력해야 합니다.', + successMessage: '이제 2단계 인증이 활성화됐어요. 로그인할 때 추가 단계로 이 인증자의 인증 코드를 입력해야 해요.', title: '인증 애플리케이션 추가', - verifySubtitle: '인증자가 생성한 인증 코드를 입력합니다', + verifySubtitle: '인증 앱이 생성한 인증 코드를 입력해 주세요', verifyTitle: '인증 코드', }, mobileButton__menu: '메뉴', navbar: { account: '프로필', - apiKeys: undefined, - billing: undefined, + apiKeys: 'API 키', + billing: '결제', description: '계정 정보를 관리하세요.', security: '보안', title: '계정', }, passkeyScreen: { removeResource: { - messageLine1: undefined, - title: undefined, + messageLine1: '{{name}}이(가) 이 계정에서 삭제돼요.', + title: '패스키 삭제', }, - subtitle__rename: undefined, - title__rename: undefined, + subtitle__rename: '패스키 이름을 바꾸면 더 쉽게 찾을 수 있어요.', + title__rename: '패스키 이름 변경', }, passwordPage: { checkboxInfoText__signOutOfOtherSessions: - 'It is recommended to sign out of all other devices which may have used your old password.', - readonly: 'Your password can currently not be edited because you can sign in only via the enterprise connection.', - successMessage__set: '비밀번호가 설정되었습니다.', - successMessage__signOutOfOtherSessions: '다른 모든 기기는 로그아웃되었습니다.', - successMessage__update: '비밀번호가 업데이트되었습니다.', + '이전 비밀번호를 사용했을 수 있는 다른 기기에서 로그아웃하는 것을 권장해요.', + readonly: '기업 연결로만 로그인할 수 있어 비밀번호를 변경할 수 없어요.', + successMessage__set: '비밀번호가 설정됐어요.', + successMessage__signOutOfOtherSessions: '다른 모든 기기는 로그아웃됐어요.', + successMessage__update: '비밀번호가 업데이트됐어요.', title__set: '비밀번호 설정', title__update: '비밀번호 변경', }, phoneNumberPage: { - infoText: '인증 링크가 포함된 문자 메시지가 이 휴대폰 번호로 전송됩니다.', + infoText: '인증 코드가 포함된 문자 메시지가 이 휴대폰 번호로 전송돼요. 통신사 요금이 부과될 수 있어요.', removeResource: { - messageLine1: '{{identifier}}가 당신의 계정에서 제거 될 예정입니다.', - messageLine2: '더 이상 이 휴대폰 번호로 로그인할 수 없습니다.', - successMessage: '{{phoneNumber}}가 당신의 계정에서 제거되었습니다.', + messageLine1: '{{identifier}}가 계정에서 제거될 예정이에요.', + messageLine2: '더 이상 이 휴대폰 번호로 로그인할 수 없어요.', + successMessage: '{{phoneNumber}}가 계정에서 제거됐어요.', title: '휴대폰 번호 제거', }, - successMessage: '{{identifier}}가 당신의 계정에 추가되었습니다.', + successMessage: '{{identifier}}가 계정에 추가됐어요.', title: '휴대폰 번호 추가', - verifySubtitle: 'Enter the verification code sent to {{identifier}}', - verifyTitle: 'Verify phone number', + verifySubtitle: '{{identifier}}로 전송된 인증 코드를 입력하세요', + verifyTitle: '휴대폰 번호 인증', }, plansPage: { - title: undefined, + title: '플랜', }, profilePage: { - fileDropAreaHint: '10MB보다 작은 JPG, PNG, GIF 또는 WEBP 이미지를 업로드합니다', + fileDropAreaHint: '10MB보다 작은 JPG, PNG, GIF, WEBP 이미지를 업로드해 주세요.', imageFormDestructiveActionSubtitle: '이미지 제거', imageFormSubtitle: '이미지 업로드', imageFormTitle: '프로필 이미지', - readonly: 'Your profile information has been provided by the enterprise connection and cannot be edited.', - successMessage: '프로필이 업데이트되었습니다.', + readonly: '기업 연결에서 제공된 프로필 정보라 수정할 수 없어요.', + successMessage: '프로필이 업데이트됐어요.', title: '프로필 업데이트', }, start: { @@ -1250,9 +1251,9 @@ export const koKR: LocalizationResource = { actionLabel__reauthorize: '지금 인증하기', destructiveActionTitle: '제거', primaryButton: '계정 연결하기', - subtitle__disconnected: undefined, + subtitle__disconnected: '이 계정은 연결이 해제됐어요.', subtitle__reauthorize: - 'The required scopes have been updated, and you may be experiencing limited functionality. Please re-authorize this application to avoid any issues', + '필요한 권한 범위가 업데이트되어 일부 기능이 제한될 수 있어요. 문제를 피하려면 이 애플리케이션을 다시 인증해 주세요.', title: '연결된 계정', }, dangerSection: { @@ -1276,7 +1277,7 @@ export const koKR: LocalizationResource = { backupCodes: { actionLabel__regenerate: '코드 재생성', headerTitle: '백업 코드', - subtitle__regenerate: '새로운 보안 백업 코드 세트를 받으세요. 이전 백업 코드는 삭제되며 사용할 수 없습니다.', + subtitle__regenerate: '새로운 보안 백업 코드 세트를 받아 보세요. 이전 백업 코드는 삭제돼 사용할 수 없어요.', title__regenerate: '백업 코드 재생성', }, phoneCode: { @@ -1291,10 +1292,10 @@ export const koKR: LocalizationResource = { }, }, passkeysSection: { - menuAction__destructive: undefined, - menuAction__rename: undefined, - primaryButton: undefined, - title: undefined, + menuAction__destructive: '삭제', + menuAction__rename: '이름 변경', + primaryButton: '패스키 추가', + title: '패스키', }, passwordSection: { primaryButton__setPassword: '비밀번호 설정', @@ -1314,14 +1315,14 @@ export const koKR: LocalizationResource = { title: '프로필', }, usernameSection: { - primaryButton__setUsername: '사용자 이름 설정', - primaryButton__updateUsername: '사용자 이름 변경', - title: '사용자 이름', + primaryButton__setUsername: '아이디 설정', + primaryButton__updateUsername: '아이디 변경', + title: '아이디', }, web3WalletsSection: { destructiveAction: '지갑 제거', - detailsAction__nonPrimary: undefined, - primaryButton: 'Web3 지갑', + detailsAction__nonPrimary: '기본으로 설정', + primaryButton: '지갑 연결하기', title: 'Web3 지갑', web3SelectSolanaWalletScreen: { subtitle: '계정에 연결할 Solana 지갑을 선택하세요.', @@ -1330,22 +1331,22 @@ export const koKR: LocalizationResource = { }, }, usernamePage: { - successMessage: '당신읭 사용자 이름이 업데이트되었습니다.', - title__set: '사용자 이름 업데이트', - title__update: '사용자 이름 업데이트', + successMessage: '아이디가 업데이트됐어요.', + title__set: '아이디 업데이트', + title__update: '아이디 업데이트', }, web3WalletPage: { removeResource: { - messageLine1: '{{identifier}}가 이 계정에서 제거 될 예정입니다.', - messageLine2: '더 이상 이 web3 지갑을 사용하여 로그인할 수 없습니다.', - successMessage: '{{web3Wallet}}가 당신의 계정에서 제거되었습니다.', + messageLine1: '{{identifier}}가 이 계정에서 제거될 예정이에요.', + messageLine2: '더 이상 이 Web3 지갑으로 로그인할 수 없어요.', + successMessage: '{{web3Wallet}}가 계정에서 제거됐어요.', title: 'web3 지갑 제거', }, subtitle__availableWallets: '계정에 연결할 web3 지갑을 선택하세요.', - subtitle__unavailableWallets: '사용 가능한 web3 지갑이 없습니다.', - successMessage: '지갑이 계정에 추가되었습니다ß.', + subtitle__unavailableWallets: '사용 가능한 Web3 지갑이 없어요.', + successMessage: '지갑이 계정에 추가됐어요.', title: 'web3 지갑 추가', - web3WalletButtonsBlockButton: undefined, + web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, waitlist: { @@ -1353,19 +1354,19 @@ export const koKR: LocalizationResource = { actionLink: '로그인', actionText: '이미 액세스 권한이 있으신가요?', formButton: '대기 목록에 가입', - subtitle: '이메일 주소를 입력하시면 준비되면 알려드리겠습니다', + subtitle: '이메일 주소를 입력하면 준비되는 대로 알려드릴게요', title: '대기 목록에 가입', }, success: { - message: '곧 리디렉션됩니다...', - subtitle: '준비되면 연락드리겠습니다', - title: '대기 목록에 가입해 주셔서 감사합니다!', + message: '곧 이동돼요...', + subtitle: '준비되는 대로 연락드릴게요', + title: '대기 목록에 함께해 주셔서 고마워요!', }, }, web3SolanaWalletButtons: { connect: '{{walletName}}(으)로 연결', continue: '{{walletName}}(으)로 계속', noneAvailable: - 'Solana Web3 지갑을 찾을 수 없습니다. Web3를 지원하는 {{ solanaWalletsLink || link("wallet extension") }}을(를) 설치해 주세요.', + 'Solana Web3 지갑을 찾을 수 없어요. Web3를 지원하는 {{ solanaWalletsLink || link("wallet extension") }}을(를) 설치해 주세요.', }, } as const; From e995cc3572f85aa47bdee8f7b56130a383488a7f Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Tue, 20 Jan 2026 13:28:25 -0600 Subject: [PATCH 057/123] fix(shared): prevent prototype pollution in deep merge utilities (backport #7621) (#7625) --- .changeset/secure-foxes-guard.md | 5 + .../src/__tests__/fastDeepMerge.spec.ts | 106 +++++++++++++++++- packages/shared/src/utils/fastDeepMerge.ts | 11 ++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 .changeset/secure-foxes-guard.md diff --git a/.changeset/secure-foxes-guard.md b/.changeset/secure-foxes-guard.md new file mode 100644 index 00000000000..98f229413ab --- /dev/null +++ b/.changeset/secure-foxes-guard.md @@ -0,0 +1,5 @@ +--- +"@clerk/shared": patch +--- + +Fix prototype pollution vulnerability in `fastDeepMergeAndReplace` and `fastDeepMergeAndKeep` utilities by blocking dangerous keys (`__proto__`, `constructor`, `prototype`) during object merging. diff --git a/packages/shared/src/__tests__/fastDeepMerge.spec.ts b/packages/shared/src/__tests__/fastDeepMerge.spec.ts index 8ac9bdf1594..a0840f321d4 100644 --- a/packages/shared/src/__tests__/fastDeepMerge.spec.ts +++ b/packages/shared/src/__tests__/fastDeepMerge.spec.ts @@ -1,7 +1,15 @@ -import { describe, expect, it } from 'vitest'; +import { afterEach, describe, expect, it } from 'vitest'; import { fastDeepMergeAndKeep, fastDeepMergeAndReplace } from '../utils/fastDeepMerge'; +// Helper to clean up any accidental prototype pollution during tests +afterEach(() => { + // @ts-expect-error - cleaning up potential pollution + delete Object.prototype.polluted; + // @ts-expect-error - cleaning up potential pollution + delete Object.prototype.isAdmin; +}); + describe('fastDeepMergeReplace', () => { it('merges simple objects', () => { const source = { a: '1', b: '2', c: '3' }; @@ -61,3 +69,99 @@ describe('fastDeepMergeKeep', () => { expect(target).toEqual({ a: '10', b: '2', c: '3', obj: { a: '10', b: '20' } }); }); }); + +describe('prototype pollution prevention', () => { + describe('fastDeepMergeAndReplace', () => { + it('should not pollute Object.prototype via __proto__', () => { + const payload = JSON.parse('{"__proto__": {"polluted": "true"}}'); + const target = {}; + + fastDeepMergeAndReplace(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + // @ts-expect-error - checking for pollution + expect({}.polluted).toBeUndefined(); + }); + + it('should not pollute via constructor.prototype', () => { + const payload = { constructor: { prototype: { isAdmin: true } } }; + const target = {}; + + fastDeepMergeAndReplace(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.isAdmin).toBeUndefined(); + // @ts-expect-error - checking for pollution + expect({}.isAdmin).toBeUndefined(); + }); + + it('should not pollute via nested __proto__', () => { + const payload = JSON.parse('{"nested": {"__proto__": {"polluted": "nested"}}}'); + const target = { nested: {} }; + + fastDeepMergeAndReplace(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + }); + + it('should still merge safe keys normally', () => { + const payload = JSON.parse('{"__proto__": {"polluted": "true"}, "safe": "value"}'); + const target = {}; + + fastDeepMergeAndReplace(payload, target); + + expect(target).toEqual({ safe: 'value' }); + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + }); + }); + + describe('fastDeepMergeAndKeep', () => { + it('should not pollute Object.prototype via __proto__', () => { + const payload = JSON.parse('{"__proto__": {"polluted": "true"}}'); + const target = {}; + + fastDeepMergeAndKeep(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + // @ts-expect-error - checking for pollution + expect({}.polluted).toBeUndefined(); + }); + + it('should not pollute via constructor.prototype', () => { + const payload = { constructor: { prototype: { isAdmin: true } } }; + const target = {}; + + fastDeepMergeAndKeep(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.isAdmin).toBeUndefined(); + // @ts-expect-error - checking for pollution + expect({}.isAdmin).toBeUndefined(); + }); + + it('should not pollute via nested __proto__', () => { + const payload = JSON.parse('{"nested": {"__proto__": {"polluted": "nested"}}}'); + const target = { nested: {} }; + + fastDeepMergeAndKeep(payload, target); + + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + }); + + it('should still merge safe keys normally', () => { + const payload = JSON.parse('{"__proto__": {"polluted": "true"}, "safe": "value"}'); + const target = {}; + + fastDeepMergeAndKeep(payload, target); + + expect(target).toEqual({ safe: 'value' }); + // @ts-expect-error - checking for pollution + expect(Object.prototype.polluted).toBeUndefined(); + }); + }); +}); diff --git a/packages/shared/src/utils/fastDeepMerge.ts b/packages/shared/src/utils/fastDeepMerge.ts index 617f097df3c..ed3497d2787 100644 --- a/packages/shared/src/utils/fastDeepMerge.ts +++ b/packages/shared/src/utils/fastDeepMerge.ts @@ -1,3 +1,6 @@ +// Keys that could lead to prototype pollution attacks +const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']); + /** * Merges 2 objects without creating new object references * The merged props will appear on the `target` object @@ -12,6 +15,10 @@ export const fastDeepMergeAndReplace = ( } for (const key in source) { + // Skip dangerous keys to prevent prototype pollution + if (DANGEROUS_KEYS.has(key)) { + continue; + } if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === undefined) { target[key] = new (Object.getPrototypeOf(source[key]).constructor)(); @@ -32,6 +39,10 @@ export const fastDeepMergeAndKeep = ( } for (const key in source) { + // Skip dangerous keys to prevent prototype pollution + if (DANGEROUS_KEYS.has(key)) { + continue; + } if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === undefined) { target[key] = new (Object.getPrototypeOf(source[key]).constructor)(); From 55646e2697f2c2cca608c6599178d14bb54c7901 Mon Sep 17 00:00:00 2001 From: Jacob Foshee Date: Wed, 21 Jan 2026 12:36:03 -0600 Subject: [PATCH 058/123] feat(ui): Special handling of offline_access scope in OAuth Consent screen (#7631) Co-authored-by: Cursor Agent --- .changeset/quiet-dolphins-swim.md | 5 +++++ packages/clerk-js/sandbox/app.ts | 3 ++- .../src/ui/components/OAuthConsent/OAuthConsent.tsx | 9 ++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .changeset/quiet-dolphins-swim.md diff --git a/.changeset/quiet-dolphins-swim.md b/.changeset/quiet-dolphins-swim.md new file mode 100644 index 00000000000..27d7c215f83 --- /dev/null +++ b/.changeset/quiet-dolphins-swim.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': minor +--- + +Handle `offline_access` scope in OAuth consent screen by filtering it from the displayed scopes list (as it describes access duration rather than what can be accessed) and appending informational text about staying signed in when the scope is present. diff --git a/packages/clerk-js/sandbox/app.ts b/packages/clerk-js/sandbox/app.ts index 1382070c66a..d94192d9041 100644 --- a/packages/clerk-js/sandbox/app.ts +++ b/packages/clerk-js/sandbox/app.ts @@ -333,7 +333,8 @@ void (async () => { const searchParams = new URLSearchParams(window.location.search); const scopes = (searchParams.get('scopes')?.split(',') ?? []).map(scope => ({ scope, - description: `Grants access to your ${scope}`, + description: scope === 'offline_access' ? null : `Grants access to your ${scope}`, + requires_consent: true, })); Clerk.__internal_mountOAuthConsent( app, diff --git a/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx b/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx index e2a215891db..8555248176f 100644 --- a/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx +++ b/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx @@ -16,6 +16,8 @@ import type { ThemableCssProp } from '@/ui/styledSystem'; import { common } from '@/ui/styledSystem'; import { colors } from '@/ui/utils/colors'; +const OFFLINE_ACCESS_SCOPE = 'offline_access'; + export function OAuthConsentInternal() { const { scopes, oAuthApplicationName, oAuthApplicationLogoUrl, oAuthApplicationUrl, redirectUrl, onDeny, onAllow } = useOAuthConsentContext(); @@ -25,6 +27,10 @@ export function OAuthConsentInternal() { const primaryEmailAddress = user?.emailAddresses.find(email => email.id === user.primaryEmailAddress?.id); + // Filter out offline_access from displayed scopes as it doesn't describe what can be accessed + const displayedScopes = (scopes || []).filter(item => item.scope !== OFFLINE_ACCESS_SCOPE); + const hasOfflineAccess = (scopes || []).some(item => item.scope === OFFLINE_ACCESS_SCOPE); + function getRootDomain(): string { try { const { hostname } = new URL(redirectUrl); @@ -132,7 +138,7 @@ export function OAuthConsentInternal() { as='ul' sx={t => ({ margin: t.sizes.$none, padding: t.sizes.$none })} > - {(scopes || []).map(item => ( + {displayedScopes.map(item => ( ({ @@ -240,6 +246,7 @@ export function OAuthConsentInternal() { + .{hasOfflineAccess && " You'll stay signed in until you sign out or revoke access."} From ef1b93359cf828236a485557c78be4188306e629 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 21 Jan 2026 16:47:25 -0300 Subject: [PATCH 059/123] fix(clerk-js): Handle logo upload failure in `TaskChooseOrganization` (#7635) --- .changeset/floppy-lions-listen.md | 5 + .../CreateOrganizationScreen.tsx | 28 ++++-- .../__tests__/TaskChooseOrganization.test.tsx | 97 ++++++++++++++++++- 3 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 .changeset/floppy-lions-listen.md diff --git a/.changeset/floppy-lions-listen.md b/.changeset/floppy-lions-listen.md new file mode 100644 index 00000000000..573009dcf0c --- /dev/null +++ b/.changeset/floppy-lions-listen.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Fix `TaskChooseOrganization` to complete organization activation when logo upload fails diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx index 0b8ab83cc94..7b714052830 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx @@ -1,5 +1,9 @@ import { useOrganizationList } from '@clerk/shared/react'; -import type { CreateOrganizationParams, OrganizationCreationDefaultsResource } from '@clerk/shared/types'; +import type { + CreateOrganizationParams, + OrganizationCreationDefaultsResource, + OrganizationResource, +} from '@clerk/shared/types'; import { useState } from 'react'; import { OrganizationProfileAvatarUploader } from '@/ui/components/OrganizationProfile/OrganizationProfileAvatarUploader'; @@ -64,14 +68,9 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = const organization = await createOrganization(createOrgParams); - if (file) { - await organization.setLogo({ file }); - } else if (defaultLogoUrl) { - const response = await fetch(defaultLogoUrl); - const blob = await response.blob(); - const logoFile = new File([blob], 'logo', { type: blob.type }); - await organization.setLogo({ file: logoFile }); - } + // If setting the logo fails, we still want to set the active organization + const uploadOrganizationLogoPromise = uploadOrganizationLogo(organization); + await Promise.allSettled([uploadOrganizationLogoPromise]); await setActive({ organization, @@ -84,6 +83,17 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = } }; + const uploadOrganizationLogo = async (organization: OrganizationResource) => { + if (file) { + await organization.setLogo({ file }); + } else if (defaultLogoUrl) { + const response = await fetch(defaultLogoUrl); + const blob = await response.blob(); + const logoFile = new File([blob], 'logo', { type: blob.type }); + await organization.setLogo({ file: logoFile }); + } + }; + const onChangeName = (event: React.ChangeEvent) => { nameField.setValue(event.target.value); updateSlugField(createSlug(event.target.value)); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx index 14ce04a7364..b7a0c773589 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/__tests__/TaskChooseOrganization.test.tsx @@ -1,5 +1,7 @@ +import type { OrganizationResource } from '@clerk/shared/types'; +import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { beforeEach, describe, expect, it } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { bindCreateFixtures } from '@/test/create-fixtures'; import { render } from '@/test/utils'; @@ -11,6 +13,54 @@ import { clearFetchCache } from '@/ui/hooks'; import { TaskChooseOrganization } from '..'; +type FakeOrganizationParams = { + id: string; + createdAt?: Date; + imageUrl?: string; + slug: string; + name: string; + membersCount: number; + pendingInvitationsCount: number; + adminDeleteEnabled: boolean; + maxAllowedMemberships: number; +}; + +const createFakeOrganization = (params: FakeOrganizationParams): OrganizationResource => { + return { + pathRoot: '', + id: params.id, + name: params.name, + slug: params.slug, + hasImage: !!params.imageUrl, + imageUrl: params.imageUrl || '', + membersCount: params.membersCount, + pendingInvitationsCount: params.pendingInvitationsCount, + publicMetadata: {}, + adminDeleteEnabled: params.adminDeleteEnabled, + maxAllowedMemberships: params?.maxAllowedMemberships, + createdAt: params?.createdAt || new Date(), + updatedAt: new Date(), + update: vi.fn() as any, + getMemberships: vi.fn() as any, + getInvitations: vi.fn() as any, + getRoles: vi.fn() as any, + addMember: vi.fn() as any, + inviteMember: vi.fn() as any, + inviteMembers: vi.fn() as any, + updateMember: vi.fn() as any, + removeMember: vi.fn() as any, + createDomain: vi.fn() as any, + getDomain: vi.fn() as any, + getDomains: vi.fn() as any, + getMembershipRequests: vi.fn() as any, + destroy: vi.fn() as any, + setLogo: vi.fn() as any, + reload: vi.fn() as any, + __internal_toSnapshot: vi.fn() as any, + initializePaymentMethod: vi.fn() as any, + } as OrganizationResource; +}; + const { createFixtures } = bindCreateFixtures('TaskChooseOrganization'); describe('TaskChooseOrganization', () => { @@ -402,4 +452,49 @@ describe('TaskChooseOrganization', () => { }); }); }); + + describe('on create organization submit', () => { + it('calls setActive even when logo upload fails', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withOrganizations(); + f.withForceOrganizationSelection(); + f.withUser({ + email_addresses: ['test@clerk.com'], + create_organization_enabled: true, + tasks: [{ key: 'choose-organization' }], + }); + }); + + const createdOrg = createFakeOrganization({ + id: '1', + adminDeleteEnabled: false, + maxAllowedMemberships: 1, + membersCount: 1, + name: 'new org', + pendingInvitationsCount: 0, + slug: 'new-org', + }); + + // Mock setLogo to reject with an error + createdOrg.setLogo = vi.fn().mockRejectedValue(new Error('Logo upload failed')); + + fixtures.clerk.createOrganization.mockReturnValue(Promise.resolve(createdOrg)); + + const { findByRole, findByLabelText } = render(, { wrapper }); + + const nameInput = await findByLabelText(/name/i); + await userEvent.type(nameInput, 'new org'); + + const submitButton = await findByRole('button', { name: /continue/i }); + await userEvent.click(submitButton); + + await waitFor(() => { + expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect.objectContaining({ + organization: createdOrg, + }), + ); + }); + }); + }); }); From 4e6e501e580504dcf33074d051be6548ecc1874e Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Wed, 21 Jan 2026 14:25:36 -0600 Subject: [PATCH 060/123] ci(repo): Version packages (Core 2) (#7624) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/afraid-plums-sing.md | 5 ----- .changeset/floppy-lions-listen.md | 5 ----- .changeset/quiet-dolphins-swim.md | 5 ----- .changeset/secure-foxes-guard.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 9 +++++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 14 ++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 ++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 9 +++++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 ++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 10 ++++++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 7 +++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 ++++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 48 files changed, 218 insertions(+), 42 deletions(-) delete mode 100644 .changeset/afraid-plums-sing.md delete mode 100644 .changeset/floppy-lions-listen.md delete mode 100644 .changeset/quiet-dolphins-swim.md delete mode 100644 .changeset/secure-foxes-guard.md diff --git a/.changeset/afraid-plums-sing.md b/.changeset/afraid-plums-sing.md deleted file mode 100644 index 0e57ebbac4c..00000000000 --- a/.changeset/afraid-plums-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Improved Greek (el-GR), French (fr-FR), and Korean (ko-KR) translations. diff --git a/.changeset/floppy-lions-listen.md b/.changeset/floppy-lions-listen.md deleted file mode 100644 index 573009dcf0c..00000000000 --- a/.changeset/floppy-lions-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Fix `TaskChooseOrganization` to complete organization activation when logo upload fails diff --git a/.changeset/quiet-dolphins-swim.md b/.changeset/quiet-dolphins-swim.md deleted file mode 100644 index 27d7c215f83..00000000000 --- a/.changeset/quiet-dolphins-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': minor ---- - -Handle `offline_access` scope in OAuth consent screen by filtering it from the displayed scopes list (as it describes access duration rather than what can be accessed) and appending informational text about staying signed in when the scope is present. diff --git a/.changeset/secure-foxes-guard.md b/.changeset/secure-foxes-guard.md deleted file mode 100644 index 98f229413ab..00000000000 --- a/.changeset/secure-foxes-guard.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/shared": patch ---- - -Fix prototype pollution vulnerability in `fastDeepMergeAndReplace` and `fastDeepMergeAndKeep` utilities by blocking dangerous keys (`__proto__`, `constructor`, `prototype`) during object merging. diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index ff2d838b1f9..7a51e6c40a0 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.16 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 0.2.15 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index ed10967f0b1..95f0d1aee28 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.15", + "version": "0.2.16", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 647c96dd51f..b74b8b7d93b 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 2.16.14 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 2.16.13 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 625d7cef181..6890a84418b 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.13", + "version": "2.16.14", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index ea9378da82a..0f9641e522f 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.29.4 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/types@4.101.12 + ## 2.29.3 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 654faba54d5..d1e750a6a85 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.29.3", + "version": "2.29.4", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 13d076e8d37..7672b153c9f 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.8.19 + +### Patch Changes + +- Updated dependencies [[`ef1b933`](https://github.com/clerk/javascript/commit/ef1b93359cf828236a485557c78be4188306e629), [`55646e2`](https://github.com/clerk/javascript/commit/55646e2697f2c2cca608c6599178d14bb54c7901), [`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/clerk-js@5.121.0 + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + ## 2.8.18 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 12f0bc59d58..045c2a0be9a 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.8.18", + "version": "2.8.19", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index c204ab0333c..6a3a346e3a3 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 5.121.0 + +### Minor Changes + +- Handle `offline_access` scope in OAuth consent screen by filtering it from the displayed scopes list (as it describes access duration rather than what can be accessed) and appending informational text about staying signed in when the scope is present. ([#7631](https://github.com/clerk/javascript/pull/7631)) by [@jfoshee](https://github.com/jfoshee) + +### Patch Changes + +- Fix `TaskChooseOrganization` to complete organization activation when logo upload fails ([#7635](https://github.com/clerk/javascript/pull/7635)) by [@LauraBeatris](https://github.com/LauraBeatris) + +- Updated dependencies [[`c650a04`](https://github.com/clerk/javascript/commit/c650a04e624e7da5b81f2bdc12af0b6940c20f82), [`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/localizations@3.35.1 + - @clerk/shared@3.43.1 + ## 5.120.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 6a0ca9efded..037e9459454 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.120.0", + "version": "5.121.0", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index c5deb4b016f..dd85df0d2ba 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.5 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/types@4.101.12 + ## 0.24.4 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 71f9da4c8a8..65fc4820ef4 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.4", + "version": "0.24.5", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 3f0d9cd4e7c..1a2f7035b29 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.31 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + ## 0.4.30 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 2b38cbfb041..9e0c0125e67 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.30", + "version": "0.4.31", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 5addd34b03a..f889c7008e7 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.19.19 + +### Patch Changes + +- Updated dependencies [[`ef1b933`](https://github.com/clerk/javascript/commit/ef1b93359cf828236a485557c78be4188306e629), [`55646e2`](https://github.com/clerk/javascript/commit/55646e2697f2c2cca608c6599178d14bb54c7901), [`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/clerk-js@5.121.0 + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/types@4.101.12 + ## 2.19.18 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 57d7f354a81..9e3ada17c04 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.18", + "version": "2.19.19", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 41a6d9f92f7..91b0329f7fc 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.64 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 1.7.63 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index e0e5f2d4c0d..fc625bb28a8 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.63", + "version": "1.7.64", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 944a7c29933..ca5aa63b83a 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.16 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 2.6.15 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 2e69a4bd0b0..f8794466ace 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.15", + "version": "2.6.16", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 5a47a8cec4e..8359f00bae1 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 3.35.1 + +### Patch Changes + +- Improved Greek (el-GR), French (fr-FR), and Korean (ko-KR) translations. ([#7619](https://github.com/clerk/javascript/pull/7619)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies []: + - @clerk/types@4.101.12 + ## 3.35.0 ### Minor Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index f0cf8561d28..3b5831a8281 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.35.0", + "version": "3.35.1", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 30d02b601f0..392a3ab5de2 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.36.9 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 6.36.8 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index bab4198a037..ed35c64fce5 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.36.8", + "version": "6.36.9", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 106105179a8..8b4a232966a 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.14 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + - @clerk/vue@1.17.9 + ## 1.13.13 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 7c482f62630..96439fd3e7e 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.13", + "version": "1.13.14", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 62f5fe727a6..efaaa967832 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.3.11 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 2.3.10 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 19b87ef534c..f5f64df0653 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.3.10", + "version": "2.3.11", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 4df813d3e4d..2c28569e67a 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 5.59.5 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + ## 5.59.4 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index dac0c1ba005..b9a4b6aee12 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.59.4", + "version": "5.59.5", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 46ff5021a9d..9c9c5d8f520 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.31 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 4.13.30 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index f507d933853..ab4f84f7c4c 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.30", + "version": "4.13.31", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 21be5b9c158..5e04179bb49 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.43.1 + +### Patch Changes + +- Fix prototype pollution vulnerability in `fastDeepMergeAndReplace` and `fastDeepMergeAndKeep` utilities by blocking dangerous keys (`__proto__`, `constructor`, `prototype`) during object merging. ([#7625](https://github.com/clerk/javascript/pull/7625)) by [@jacekradko](https://github.com/jacekradko) + ## 3.43.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 5c5d8356f68..8e084908ce9 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.43.0", + "version": "3.43.1", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 2bba67ef168..745265bfc42 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-react-start +## 0.27.16 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/clerk-react@5.59.5 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 0.27.15 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 38264ab7b70..9d77baa313f 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.27.15", + "version": "0.27.16", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 065821c7622..3193d322ecf 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.30 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/backend@2.29.4 + - @clerk/types@4.101.12 + ## 1.13.29 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 4cd9e56fa7c..44340ca89bd 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.29", + "version": "1.13.30", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 199a3d5aa30..56185762595 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.49 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + ## 2.4.48 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 29e6987ac5e..b4a009b5e35 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.48", + "version": "2.4.49", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 5b2047df797..a99fbd07392 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.12 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + ## 4.101.11 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 74757dbdeb0..f454f595ccd 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.11", + "version": "4.101.12", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 96b20b9eb2c..5d6b4b47c5d 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.9 + +### Patch Changes + +- Updated dependencies [[`e995cc3`](https://github.com/clerk/javascript/commit/e995cc3572f85aa47bdee8f7b56130a383488a7f)]: + - @clerk/shared@3.43.1 + - @clerk/types@4.101.12 + ## 1.17.8 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 5c35f5de339..4d4a57646b2 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.8", + "version": "1.17.9", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From ddf519b0528aebd952350da40738a066afc1953b Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Wed, 21 Jan 2026 17:29:35 -0500 Subject: [PATCH 061/123] chore(clerk-js): Updates keyless prompt content (#7636) --- .changeset/pretty-books-carry.md | 5 + .../devPrompts/KeylessPrompt/index.tsx | 141 +++++++++--------- 2 files changed, 75 insertions(+), 71 deletions(-) create mode 100644 .changeset/pretty-books-carry.md diff --git a/.changeset/pretty-books-carry.md b/.changeset/pretty-books-carry.md new file mode 100644 index 00000000000..aff653b03f4 --- /dev/null +++ b/.changeset/pretty-books-carry.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Updates keyless prompt content. diff --git a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx index d6e5070cdd4..94ea4cbd287 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx @@ -76,14 +76,6 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { }); }, [_props.copyKeysUrl]); - const getKeysUrlFromLastActive = useMemo(() => { - return withLastActiveFallback(() => { - const redirectUrlParts = handleDashboardUrlParsing(_props.copyKeysUrl); - const url = new URL(`${redirectUrlParts.baseDomain}/last-active?path=api-keys`); - return url.href; - }); - }, [_props.copyKeysUrl]); - const mainCTAStyles = css` ${basePromptElementStyles}; display: flex; @@ -133,7 +125,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { flexDirection: 'column', alignItems: 'flex-center', justifyContent: 'flex-center', - height: claimed || success ? 'fit-content' : isSignedIn ? '11rem' : '12rem', + height: claimed || success ? 'fit-content' : isSignedIn ? '8.5rem' : '12rem', overflow: 'hidden', width: 'fit-content', minWidth: '16.125rem', @@ -321,13 +313,12 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { aria-labelledby={buttonIdentifier} hidden={!isForcedExpanded} > -

{ `} > {success ? ( - <> +

Your application{' '} { > Clerk Dashboard - +

) : claimed ? ( - <> +

You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard. - +

+ ) : isSignedIn ? ( +

+ + You've created your first user! Link this application to your Clerk account to explore the + Dashboard. + +

) : ( - - {isSignedIn - ? "You've created your first user! Link this application to your Clerk account to explore the Dashboard." - : 'This app uses Clerk for authentication. We generated temporary API keys for you. Link this application to your Clerk account to configure it.'} - + <> +

+ Temporary API keys are enabled so you can get started immediately. +

+

+ Claim this application to access the Clerk Dashboard where you can manage auth settings and explore + more Clerk features. +

+ )} -

+ {isForcedExpanded && @@ -457,53 +503,6 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { > {claimed ? 'Get API keys' : 'Claim application'} - - {!claimed && ( - <> - - - - Already have a Clerk app? Get keys - - - )} ))} From b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1 Mon Sep 17 00:00:00 2001 From: Tom Milewski Date: Thu, 22 Jan 2026 16:46:55 -0500 Subject: [PATCH 062/123] fix(clerk-js,shared): Handle `unsafeMetadata` in transfer flows (#7647) --- .changeset/smooth-planes-work.md | 6 ++ .../clerk-js/src/core/__tests__/clerk.test.ts | 62 ++++++++++++++++++- packages/clerk-js/src/core/clerk.ts | 2 +- .../src/ui/components/SignIn/SignInStart.tsx | 1 + .../handleCombinedFlowTransfer.test.ts | 61 ++++++++++++++++++ .../SignIn/handleCombinedFlowTransfer.ts | 3 + .../src/ui/components/SignIn/index.tsx | 2 + .../src/ui/components/SignUp/index.tsx | 1 + packages/shared/src/types/clerk.ts | 4 ++ 9 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 .changeset/smooth-planes-work.md diff --git a/.changeset/smooth-planes-work.md b/.changeset/smooth-planes-work.md new file mode 100644 index 00000000000..02e250c772f --- /dev/null +++ b/.changeset/smooth-planes-work.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': patch +'@clerk/shared': patch +--- + +Fix `unsafeMetadata` being lost when users are transferred between sign-in and sign-up flows during OAuth/SSO authentication diff --git a/packages/clerk-js/src/core/__tests__/clerk.test.ts b/packages/clerk-js/src/core/__tests__/clerk.test.ts index ccf7ca9a091..a4f508df544 100644 --- a/packages/clerk-js/src/core/__tests__/clerk.test.ts +++ b/packages/clerk-js/src/core/__tests__/clerk.test.ts @@ -1094,7 +1094,67 @@ describe('Clerk singleton', () => { await sut.handleRedirectCallback(); await waitFor(() => { - expect(mockSignUpCreate).toHaveBeenCalledWith({ transfer: true }); + expect(mockSignUpCreate).toHaveBeenCalledWith({ transfer: true, unsafeMetadata: undefined }); + expect(mockSetActive).toHaveBeenCalled(); + }); + }); + + it('passes unsafeMetadata to signUp.create during OAuth transfer flow', async () => { + mockEnvironmentFetch.mockReturnValue( + Promise.resolve({ + authConfig: {}, + userSettings: mockUserSettings, + displayConfig: mockDisplayConfig, + isSingleSession: () => false, + isProduction: () => false, + isDevelopmentOrStaging: () => true, + onWindowLocationHost: () => false, + }), + ); + + mockClientFetch.mockReturnValue( + Promise.resolve({ + signedInSessions: [], + signIn: new SignIn({ + status: 'needs_identifier', + first_factor_verification: { + status: 'transferable', + strategy: 'oauth_google', + external_verification_redirect_url: '', + error: { + code: 'external_account_not_found', + long_message: 'The External Account was not found.', + message: 'Invalid external account', + }, + }, + second_factor_verification: null, + identifier: '', + user_data: null, + created_session_id: null, + created_user_id: null, + } as any as SignInJSON), + signUp: new SignUp(null), + }), + ); + + const mockSetActive = vi.fn(); + const mockSignUpCreate = vi + .fn() + .mockReturnValue(Promise.resolve({ status: 'complete', createdSessionId: '123' })); + + const sut = new Clerk(productionPublishableKey); + await sut.load(mockedLoadOptions); + if (!sut.client) { + fail('we should always have a client'); + } + sut.client.signUp.create = mockSignUpCreate; + sut.setActive = mockSetActive; + + const unsafeMetadata = { foo: 'bar', nested: { value: 123 } }; + await sut.handleRedirectCallback({ unsafeMetadata }); + + await waitFor(() => { + expect(mockSignUpCreate).toHaveBeenCalledWith({ transfer: true, unsafeMetadata }); expect(mockSetActive).toHaveBeenCalled(); }); }); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 081f50af569..f6c18b85eee 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2207,7 +2207,7 @@ export class Clerk implements ClerkInterface { return navigateToSignIn(); } - const res = await signUp.create({ transfer: true }); + const res = await signUp.create({ transfer: true, unsafeMetadata: params.unsafeMetadata }); switch (res.status) { case 'complete': return this.setActive({ diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx index f06012d7b20..eb4d2d9a50d 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx @@ -504,6 +504,7 @@ function SignInStartInternal(): JSX.Element { attribute, identifierField.value, ), + unsafeMetadata: ctx.unsafeMetadata, }); } else { handleError(e, [identifierField, instantPasswordField], card.setError); diff --git a/packages/clerk-js/src/ui/components/SignIn/__tests__/handleCombinedFlowTransfer.test.ts b/packages/clerk-js/src/ui/components/SignIn/__tests__/handleCombinedFlowTransfer.test.ts index 26e8cc5e819..c14adc916f7 100644 --- a/packages/clerk-js/src/ui/components/SignIn/__tests__/handleCombinedFlowTransfer.test.ts +++ b/packages/clerk-js/src/ui/components/SignIn/__tests__/handleCombinedFlowTransfer.test.ts @@ -47,6 +47,67 @@ describe('handleCombinedFlowTransfer', () => { expect(mockCompleteSignUpFlow).toHaveBeenCalled(); }); + it('should pass unsafeMetadata to signUp.create', async () => { + const mockCreate = vi.fn().mockResolvedValue({}); + const mockClerk = { + client: { + signUp: { + create: mockCreate, + optionalFields: [], + }, + }, + }; + + const unsafeMetadata = { foo: 'bar', nested: { value: 123 } }; + + await handleCombinedFlowTransfer({ + identifierAttribute: 'emailAddress', + identifierValue: 'test@test.com', + signUpMode: 'public', + navigate: mockNavigate, + handleError: mockHandleError, + clerk: mockClerk as unknown as LoadedClerk, + afterSignUpUrl: 'https://test.com', + passwordEnabled: false, + navigateOnSetActive: vi.fn(), + unsafeMetadata, + }); + + expect(mockCreate).toHaveBeenCalledWith({ + emailAddress: 'test@test.com', + unsafeMetadata, + }); + }); + + it('should pass undefined unsafeMetadata when not provided', async () => { + const mockCreate = vi.fn().mockResolvedValue({}); + const mockClerk = { + client: { + signUp: { + create: mockCreate, + optionalFields: [], + }, + }, + }; + + await handleCombinedFlowTransfer({ + identifierAttribute: 'emailAddress', + identifierValue: 'test@test.com', + signUpMode: 'public', + navigate: mockNavigate, + handleError: mockHandleError, + clerk: mockClerk as unknown as LoadedClerk, + afterSignUpUrl: 'https://test.com', + passwordEnabled: false, + navigateOnSetActive: vi.fn(), + }); + + expect(mockCreate).toHaveBeenCalledWith({ + emailAddress: 'test@test.com', + unsafeMetadata: undefined, + }); + }); + it('should call completeSignUpFlow with phone number if phone number is optional field.', async () => { const mockClerk = { client: { diff --git a/packages/clerk-js/src/ui/components/SignIn/handleCombinedFlowTransfer.ts b/packages/clerk-js/src/ui/components/SignIn/handleCombinedFlowTransfer.ts index 4528af4d064..64d7a91681a 100644 --- a/packages/clerk-js/src/ui/components/SignIn/handleCombinedFlowTransfer.ts +++ b/packages/clerk-js/src/ui/components/SignIn/handleCombinedFlowTransfer.ts @@ -25,6 +25,7 @@ type HandleCombinedFlowTransferProps = { passwordEnabled: boolean; alternativePhoneCodeChannel?: PhoneCodeChannel | null; navigateOnSetActive: (opts: { session: SessionResource; redirectUrl: string }) => Promise; + unsafeMetadata?: SignUpUnsafeMetadata; }; /** @@ -45,6 +46,7 @@ export function handleCombinedFlowTransfer({ passwordEnabled, navigateOnSetActive, alternativePhoneCodeChannel, + unsafeMetadata, }: HandleCombinedFlowTransferProps): Promise | void { if (signUpMode === SIGN_UP_MODES.WAITLIST) { const waitlistUrl = clerk.buildWaitlistUrl( @@ -85,6 +87,7 @@ export function handleCombinedFlowTransfer({ .create({ [identifierAttribute]: identifierValue, ...alternativePhoneCodeChannelParams, + unsafeMetadata, }) .then(async res => { const completeSignUpFlow = await lazyCompleteSignUpFlow(); diff --git a/packages/clerk-js/src/ui/components/SignIn/index.tsx b/packages/clerk-js/src/ui/components/SignIn/index.tsx index fd133325b78..5cf37522656 100644 --- a/packages/clerk-js/src/ui/components/SignIn/index.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/index.tsx @@ -73,6 +73,7 @@ function SignInRoutes(): JSX.Element { firstFactorUrl={'../factor-one'} secondFactorUrl={'../factor-two'} resetPasswordUrl={'../reset-password'} + unsafeMetadata={signInContext.unsafeMetadata} />
@@ -112,6 +113,7 @@ function SignInRoutes(): JSX.Element { continueSignUpUrl='../continue' verifyEmailAddressUrl='../verify-email-address' verifyPhoneNumberUrl='../verify-phone-number' + unsafeMetadata={signUpContext.unsafeMetadata} /> diff --git a/packages/clerk-js/src/ui/components/SignUp/index.tsx b/packages/clerk-js/src/ui/components/SignUp/index.tsx index 76a8a49f427..80b0ab9137c 100644 --- a/packages/clerk-js/src/ui/components/SignUp/index.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/index.tsx @@ -55,6 +55,7 @@ function SignUpRoutes(): JSX.Element { continueSignUpUrl='../continue' verifyEmailAddressUrl='../verify-email-address' verifyPhoneNumberUrl='../verify-phone-number' + unsafeMetadata={signUpContext.unsafeMetadata} /> diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 91aac9c86c4..e18204bed10 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -1022,6 +1022,10 @@ export type HandleOAuthCallbackParams = TransferableOption & * The underlying resource to optionally reload before processing an OAuth callback. */ reloadResource?: 'signIn' | 'signUp'; + /** + * Additional arbitrary metadata to be stored alongside the User object when a sign-up transfer occurs. + */ + unsafeMetadata?: SignUpUnsafeMetadata; }; export type HandleSamlCallbackParams = HandleOAuthCallbackParams; From a901fc96cdee47c152cd144ea0f93d6e3e45aa51 Mon Sep 17 00:00:00 2001 From: Tom Milewski Date: Thu, 22 Jan 2026 21:01:02 -0500 Subject: [PATCH 063/123] fix(clerk-js): Pass `unsafeMetadata` with sign up `ticket` flows (#7657) --- .changeset/bumpy-clowns-nail.md | 5 +++ .../src/ui/components/SignUp/SignUpStart.tsx | 2 +- .../SignUp/__tests__/SignUpStart.test.tsx | 45 ++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 .changeset/bumpy-clowns-nail.md diff --git a/.changeset/bumpy-clowns-nail.md b/.changeset/bumpy-clowns-nail.md new file mode 100644 index 00000000000..f4e27627ce8 --- /dev/null +++ b/.changeset/bumpy-clowns-nail.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +fix: Ensure unsafeMetadata is passed with Sign Up Ticket flow diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx index c03baabd7d0..ff910fcf2a8 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx @@ -146,7 +146,7 @@ function SignUpStartInternal(): JSX.Element { status.setLoading(); card.setLoading(); signUp - .create({ strategy: 'ticket', ticket: formState.ticket.value }) + .create({ strategy: 'ticket', ticket: formState.ticket.value, unsafeMetadata }) .then(signUp => { formState.emailAddress.setValue(signUp.emailAddress || ''); // In case we are in a Ticket flow and the sign up is not complete yet, update the state diff --git a/packages/clerk-js/src/ui/components/SignUp/__tests__/SignUpStart.test.tsx b/packages/clerk-js/src/ui/components/SignUp/__tests__/SignUpStart.test.tsx index ac433090735..f23d88561b4 100644 --- a/packages/clerk-js/src/ui/components/SignUp/__tests__/SignUpStart.test.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/__tests__/SignUpStart.test.tsx @@ -379,7 +379,11 @@ describe('SignUpStart', () => { ); await waitFor(() => - expect(fixtures.signUp.create).toHaveBeenCalledWith({ strategy: 'ticket', ticket: 'test_ticket' }), + expect(fixtures.signUp.create).toHaveBeenCalledWith({ + strategy: 'ticket', + ticket: 'test_ticket', + unsafeMetadata: undefined, + }), ); //don't remove the query param quite yet @@ -390,6 +394,39 @@ describe('SignUpStart', () => { ); }); + it('passes unsafeMetadata to signUp.create when ticket is detected', async () => { + const { wrapper, fixtures, props } = await createFixtures(f => { + f.withEmailAddress(); + f.withPassword(); + }); + fixtures.signUp.create.mockResolvedValueOnce({} as SignUpResource); + props.setProps({ unsafeMetadata: { foo: 'bar', nested: { value: 123 } } }); + + Object.defineProperty(window, 'location', { + writable: true, + value: { href: 'http://localhost/sign-up?__clerk_ticket=test_ticket' }, + }); + Object.defineProperty(window, 'history', { + writable: true, + value: { replaceState: vi.fn() }, + }); + + render( + + + , + { wrapper }, + ); + + await waitFor(() => + expect(fixtures.signUp.create).toHaveBeenCalledWith({ + strategy: 'ticket', + ticket: 'test_ticket', + unsafeMetadata: { foo: 'bar', nested: { value: 123 } }, + }), + ); + }); + it('removes the ticket from the url when completing the sign up', async () => { const { wrapper, fixtures } = await createFixtures(f => { f.withEmailAddress(); @@ -414,7 +451,11 @@ describe('SignUpStart', () => { ); await waitFor(() => - expect(fixtures.signUp.create).toHaveBeenCalledWith({ strategy: 'ticket', ticket: 'test_ticket' }), + expect(fixtures.signUp.create).toHaveBeenCalledWith({ + strategy: 'ticket', + ticket: 'test_ticket', + unsafeMetadata: undefined, + }), ); expect(window.history.replaceState).toHaveBeenCalledWith( From 6904ef5629dd462610a7da6901b2675144f6f112 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Fri, 23 Jan 2026 11:27:18 -0500 Subject: [PATCH 064/123] ci(repo): Version packages (Core 2) (#7641) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bumpy-clowns-nail.md | 5 ----- .changeset/pretty-books-carry.md | 5 ----- .changeset/smooth-planes-work.md | 6 ------ packages/agent-toolkit/CHANGELOG.md | 9 +++++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 14 ++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 ++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 7 +++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 ++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 10 ++++++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 7 +++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 ++++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 47 files changed, 216 insertions(+), 38 deletions(-) delete mode 100644 .changeset/bumpy-clowns-nail.md delete mode 100644 .changeset/pretty-books-carry.md delete mode 100644 .changeset/smooth-planes-work.md diff --git a/.changeset/bumpy-clowns-nail.md b/.changeset/bumpy-clowns-nail.md deleted file mode 100644 index f4e27627ce8..00000000000 --- a/.changeset/bumpy-clowns-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -fix: Ensure unsafeMetadata is passed with Sign Up Ticket flow diff --git a/.changeset/pretty-books-carry.md b/.changeset/pretty-books-carry.md deleted file mode 100644 index aff653b03f4..00000000000 --- a/.changeset/pretty-books-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Updates keyless prompt content. diff --git a/.changeset/smooth-planes-work.md b/.changeset/smooth-planes-work.md deleted file mode 100644 index 02e250c772f..00000000000 --- a/.changeset/smooth-planes-work.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': patch -'@clerk/shared': patch ---- - -Fix `unsafeMetadata` being lost when users are transferred between sign-in and sign-up flows during OAuth/SSO authentication diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 7a51e6c40a0..0a9386a7c25 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.17 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + ## 0.2.16 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index 95f0d1aee28..3b22238f88d 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.16", + "version": "0.2.17", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index b74b8b7d93b..56e34f70607 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 2.16.15 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + ## 2.16.14 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 6890a84418b..6beaa08b618 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.14", + "version": "2.16.15", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 0f9641e522f..b6c6d327027 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.29.5 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/types@4.101.13 + ## 2.29.4 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index d1e750a6a85..a90db94e932 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.29.4", + "version": "2.29.5", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 7672b153c9f..721cf25ac33 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.8.20 + +### Patch Changes + +- Updated dependencies [[`a901fc9`](https://github.com/clerk/javascript/commit/a901fc96cdee47c152cd144ea0f93d6e3e45aa51), [`ddf519b`](https://github.com/clerk/javascript/commit/ddf519b0528aebd952350da40738a066afc1953b), [`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/clerk-js@5.121.1 + - @clerk/shared@3.43.2 + - @clerk/clerk-react@5.59.6 + ## 2.8.19 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 045c2a0be9a..dc32079ca16 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.8.19", + "version": "2.8.20", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 6a3a346e3a3..2a652b57421 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 5.121.1 + +### Patch Changes + +- fix: Ensure unsafeMetadata is passed with Sign Up Ticket flow ([#7657](https://github.com/clerk/javascript/pull/7657)) by [@tmilewski](https://github.com/tmilewski) + +- Updates keyless prompt content. ([#7636](https://github.com/clerk/javascript/pull/7636)) by [@alexcarpenter](https://github.com/alexcarpenter) + +- Fix `unsafeMetadata` being lost when users are transferred between sign-in and sign-up flows during OAuth/SSO authentication ([#7647](https://github.com/clerk/javascript/pull/7647)) by [@tmilewski](https://github.com/tmilewski) + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/localizations@3.35.2 + ## 5.121.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 037e9459454..e18cf3e6ac1 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.121.0", + "version": "5.121.1", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index dd85df0d2ba..72a9bd34bba 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.6 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 0.24.5 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 65fc4820ef4..93a80d70e70 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.5", + "version": "0.24.6", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 1a2f7035b29..01d15322bce 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.32 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + ## 0.4.31 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 9e0c0125e67..9d2a4983e89 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.31", + "version": "0.4.32", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index f889c7008e7..1f5f873854c 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.19.20 + +### Patch Changes + +- Updated dependencies [[`a901fc9`](https://github.com/clerk/javascript/commit/a901fc96cdee47c152cd144ea0f93d6e3e45aa51), [`ddf519b`](https://github.com/clerk/javascript/commit/ddf519b0528aebd952350da40738a066afc1953b), [`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/clerk-js@5.121.1 + - @clerk/shared@3.43.2 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 2.19.19 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 9e3ada17c04..769c0b0443d 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.19", + "version": "2.19.20", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 91b0329f7fc..a06b18b192a 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.65 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + ## 1.7.64 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index fc625bb28a8..52964be7159 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.64", + "version": "1.7.65", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index ca5aa63b83a..1d9baa4efa2 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.17 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + ## 2.6.16 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index f8794466ace..50ab555cde3 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.16", + "version": "2.6.17", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 8359f00bae1..8811d07cb9a 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 3.35.2 + +### Patch Changes + +- Updated dependencies []: + - @clerk/types@4.101.13 + ## 3.35.1 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 3b5831a8281..bc02119fbd6 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.35.1", + "version": "3.35.2", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 392a3ab5de2..73bc2e54ab0 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.36.10 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 6.36.9 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index ed35c64fce5..b0bb4e714c7 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.36.9", + "version": "6.36.10", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 8b4a232966a..f6e729ddf1f 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.15 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + - @clerk/vue@1.17.10 + ## 1.13.14 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 96439fd3e7e..b6849e692dd 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.14", + "version": "1.13.15", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index efaaa967832..358d5f4be84 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.3.12 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 2.3.11 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index f5f64df0653..9a0c3191553 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.3.11", + "version": "2.3.12", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 2c28569e67a..e3c0aa78211 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 5.59.6 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + ## 5.59.5 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index b9a4b6aee12..f82f1f1baf4 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.59.5", + "version": "5.59.6", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 9c9c5d8f520..45da39c7a3e 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.32 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 4.13.31 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index ab4f84f7c4c..05647e6fd08 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.31", + "version": "4.13.32", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 5e04179bb49..e4f393663e9 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.43.2 + +### Patch Changes + +- Fix `unsafeMetadata` being lost when users are transferred between sign-in and sign-up flows during OAuth/SSO authentication ([#7647](https://github.com/clerk/javascript/pull/7647)) by [@tmilewski](https://github.com/tmilewski) + ## 3.43.1 ### Patch Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 8e084908ce9..93676ca1ba0 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.43.1", + "version": "3.43.2", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 745265bfc42..57c8b8a912d 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-react-start +## 0.27.17 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/clerk-react@5.59.6 + - @clerk/types@4.101.13 + ## 0.27.16 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 9d77baa313f..ddfffdd0efb 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.27.16", + "version": "0.27.17", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 3193d322ecf..4b32a408ff3 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.31 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/backend@2.29.5 + - @clerk/types@4.101.13 + ## 1.13.30 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 44340ca89bd..ade26094f15 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.30", + "version": "1.13.31", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 56185762595..786fcdc8b96 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.50 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + ## 2.4.49 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index b4a009b5e35..8cf8aebef5a 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.49", + "version": "2.4.50", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index a99fbd07392..cf88626e258 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.13 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + ## 4.101.12 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index f454f595ccd..8545c650001 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.12", + "version": "4.101.13", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 5d6b4b47c5d..e93acb949ca 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.10 + +### Patch Changes + +- Updated dependencies [[`b7a4e1e`](https://github.com/clerk/javascript/commit/b7a4e1eabe7aa61e7d2cb7f27cbd22671c49f2b1)]: + - @clerk/shared@3.43.2 + - @clerk/types@4.101.13 + ## 1.17.9 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 4d4a57646b2..91863a964a6 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.9", + "version": "1.17.10", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 71b20f126042a55148a9da146dcedd672a230811 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Fri, 23 Jan 2026 19:49:09 -0800 Subject: [PATCH 065/123] chore(localizations): Update Spanish and Hebrew translations (#7669) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Álvaro <165289321+fgbbd@users.noreply.github.com> Co-authored-by: Arye <103104162+AryeDepoint@users.noreply.github.com> Co-authored-by: Arye Co-authored-by: Jacek --- .changeset/blue-plums-sin.md | 5 + .changeset/two-ladybugs-run.md | 5 + packages/localizations/src/es-ES.ts | 188 ++++++++++++++-------------- packages/localizations/src/he-IL.ts | 12 +- 4 files changed, 113 insertions(+), 97 deletions(-) create mode 100644 .changeset/blue-plums-sin.md create mode 100644 .changeset/two-ladybugs-run.md diff --git a/.changeset/blue-plums-sin.md b/.changeset/blue-plums-sin.md new file mode 100644 index 00000000000..16694604058 --- /dev/null +++ b/.changeset/blue-plums-sin.md @@ -0,0 +1,5 @@ +--- +"@clerk/localizations": patch +--- + +Updated Hebrew localization placeholders for user input fields diff --git a/.changeset/two-ladybugs-run.md b/.changeset/two-ladybugs-run.md new file mode 100644 index 00000000000..5ad58c377c5 --- /dev/null +++ b/.changeset/two-ladybugs-run.md @@ -0,0 +1,5 @@ +--- +"@clerk/localizations": patch +--- + +Updated es-ES translations for billing diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index 17b5e0eed16..e617868c231 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -74,109 +74,115 @@ export const esES: LocalizationResource = { badge__userDevice: 'Dispositivo de usuario', badge__you: 'Usted', billing: { - addPaymentMethod__label: undefined, - alwaysFree: undefined, - annually: undefined, - availableFeatures: undefined, - billedAnnually: undefined, - billedMonthlyOnly: undefined, - cancelFreeTrial: undefined, - cancelFreeTrialAccessUntil: undefined, - cancelFreeTrialTitle: undefined, - cancelSubscription: undefined, - cancelSubscriptionAccessUntil: undefined, - cancelSubscriptionNoCharge: undefined, - cancelSubscriptionPastDue: undefined, - cancelSubscriptionTitle: undefined, - cannotSubscribeMonthly: undefined, - cannotSubscribeUnrecoverable: undefined, + addPaymentMethod__label: 'Añadir nuevo método de pago', + alwaysFree: 'Siempre gratis', + annually: 'Anualmente', + availableFeatures: 'Funciones disponibles', + billedAnnually: 'Facturado anualmente', + billedMonthlyOnly: 'Solo facturado mensualmente', + cancelFreeTrial: 'Cancelar prueba gratuita', + cancelFreeTrialAccessUntil: + "Tu prueba seguirá activa hasta el {{ date | longDate('es-ES') }}. Después perderás el acceso a las funciones de prueba. No se te cobrará nada.", + cancelFreeTrialTitle: '¿Cancelar la prueba gratuita del plan {{plan}}?', + cancelSubscription: 'Cancelar suscripción', + cancelSubscriptionAccessUntil: + "Puedes seguir usando las funciones de '{{plan}}' hasta el {{ date | longDate('es-ES') }}, después ya no tendrás acceso.", + cancelSubscriptionNoCharge: 'No se te cobrará por esta suscripción.', + cancelSubscriptionPastDue: + 'Tu suscripción finalizará inmediatamente y perderás el acceso a todas las funciones del plan. Se te pedirá que pagues el importe pendiente en tu próxima suscripción.', + cancelSubscriptionTitle: '¿Cancelar la suscripción {{plan}}?', + cannotSubscribeMonthly: + 'No puedes suscribirte a este plan con pago mensual. Para suscribirte, debes elegir el pago anual.', + cannotSubscribeUnrecoverable: 'No puedes suscribirte a este plan. Tu suscripción actual es más cara que este plan.', checkout: { - description__paymentSuccessful: undefined, - description__subscriptionSuccessful: undefined, - downgradeNotice: undefined, + description__paymentSuccessful: 'Tu pago se ha realizado correctamente.', + description__subscriptionSuccessful: 'Tu nueva suscripción está lista.', + downgradeNotice: + 'Mantendrás tu suscripción actual y sus funciones hasta el final del ciclo de facturación; después se te cambiará a esta suscripción.', emailForm: { - subtitle: undefined, - title: undefined, + subtitle: + 'Antes de completar la compra, debes añadir una dirección de correo electrónico donde se enviarán los recibos.', + title: 'Añadir dirección de correo electrónico', }, lineItems: { - title__freeTrialEndsAt: undefined, - title__paymentMethod: undefined, - title__statementId: undefined, - title__subscriptionBegins: undefined, - title__totalPaid: undefined, - }, - pastDueNotice: undefined, - perMonth: undefined, - title: undefined, - title__paymentSuccessful: undefined, - title__subscriptionSuccessful: undefined, - title__trialSuccess: undefined, - totalDueAfterTrial: undefined, - }, - credit: undefined, - creditRemainder: undefined, - defaultFreePlanActive: undefined, - free: undefined, - getStarted: undefined, - keepFreeTrial: undefined, - keepSubscription: undefined, - manage: undefined, - manageSubscription: undefined, - month: undefined, - monthly: undefined, - pastDue: undefined, - pay: undefined, + title__freeTrialEndsAt: 'La prueba termina el', + title__paymentMethod: 'Método de pago', + title__statementId: 'ID del extracto', + title__subscriptionBegins: 'La suscripción comienza el', + title__totalPaid: 'Total pagado', + }, + pastDueNotice: 'Tu suscripción anterior tenía un pago pendiente.', + perMonth: 'al mes', + title: 'Pago', + title__paymentSuccessful: '¡Pago realizado con éxito!', + title__subscriptionSuccessful: '¡Todo listo!', + title__trialSuccess: '¡La prueba se ha iniciado correctamente!', + totalDueAfterTrial: 'Total a pagar cuando termine la prueba en {{days}} días', + }, + credit: 'Crédito', + creditRemainder: 'Crédito por el tiempo restante de tu suscripción actual.', + defaultFreePlanActive: 'Actualmente estás en el plan gratuito', + free: 'Gratis', + getStarted: 'Empezar', + keepFreeTrial: 'Mantener prueba gratuita', + keepSubscription: 'Mantener suscripción', + manage: 'Gestionar', + manageSubscription: 'Gestionar suscripción', + month: 'Mes', + monthly: 'Mensual', + pastDue: 'Pago pendiente', + pay: 'Pagar {{amount}}', paymentMethod: { applePayDescription: { - annual: undefined, - monthly: undefined, + annual: 'Pago anual', + monthly: 'Pago mensual', }, dev: { - anyNumbers: undefined, - cardNumber: undefined, - cvcZip: undefined, - developmentMode: undefined, - expirationDate: undefined, - testCardInfo: undefined, + anyNumbers: 'Cualquier número', + cardNumber: 'Número de tarjeta', + cvcZip: 'CVC, código postal', + developmentMode: 'Modo de desarrollo', + expirationDate: 'Fecha de caducidad', + testCardInfo: 'Información de tarjeta de prueba', }, }, - paymentMethods__label: undefined, - popular: undefined, + paymentMethods__label: 'Métodos de pago', + popular: 'Popular', pricingTable: { - billingCycle: undefined, - included: undefined, - }, - reSubscribe: undefined, - seeAllFeatures: undefined, - startFreeTrial: undefined, - startFreeTrial__days: undefined, - subscribe: undefined, + billingCycle: 'Ciclo de facturación', + included: 'Incluido', + }, + reSubscribe: 'Volver a suscribirse', + seeAllFeatures: 'Ver todas las funciones', + startFreeTrial: 'Iniciar prueba gratuita', + startFreeTrial__days: 'Iniciar prueba gratuita de {{days}} días', + subscribe: 'Suscribirse', subscriptionDetails: { - beginsOn: undefined, - currentBillingCycle: undefined, - endsOn: undefined, - firstPaymentAmount: undefined, - firstPaymentOn: undefined, - nextPaymentAmount: undefined, - nextPaymentOn: undefined, - pastDueAt: undefined, - renewsAt: undefined, - subscribedOn: undefined, - title: undefined, - trialEndsOn: undefined, - trialStartedOn: undefined, - }, - subtotal: undefined, - switchPlan: undefined, - switchToAnnual: undefined, - switchToAnnualWithAnnualPrice: undefined, - switchToMonthly: undefined, - switchToMonthlyWithPrice: undefined, - totalDue: undefined, - totalDueToday: undefined, - viewFeatures: undefined, - viewPayment: undefined, - year: undefined, + beginsOn: 'Comienza el', + currentBillingCycle: 'Ciclo de facturación actual', + endsOn: 'Finaliza el', + firstPaymentAmount: 'Importe del primer pago', + firstPaymentOn: 'Primer pago el', + nextPaymentAmount: 'Importe del próximo pago', + nextPaymentOn: 'Próximo pago el', + pastDueAt: 'Pago pendiente desde', + renewsAt: 'Se renueva el', + subscribedOn: 'Suscrito el', + title: 'Suscripción', + trialEndsOn: 'La prueba termina el', + trialStartedOn: 'La prueba comenzó el', + }, + subtotal: 'Subtotal', + switchPlan: 'Cambiar a este plan', + switchToAnnual: 'Cambiar a anual', + switchToAnnualWithAnnualPrice: 'Cambiar a anual {{currency}}{{price}} / año', + switchToMonthly: 'Cambiar a mensual', + switchToMonthlyWithPrice: 'Cambiar a mensual {{currency}}{{price}} / mes', + totalDue: 'Total a pagar', + totalDueToday: 'Total a pagar hoy', + viewFeatures: 'Ver funciones', + viewPayment: 'Ver pago', + year: 'Año', }, createOrganization: { formButtonSubmit: 'Crear organización', diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 9238e00bd41..a0e7a7ba717 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -212,17 +212,17 @@ export const heIL: LocalizationResource = { formFieldInputPlaceholder__apiKeyName: undefined, formFieldInputPlaceholder__backupCode: undefined, formFieldInputPlaceholder__confirmDeletionUserAccount: 'מחיקת חשבון', - formFieldInputPlaceholder__emailAddress: undefined, + formFieldInputPlaceholder__emailAddress: 'כתובת הדוא"ל שלך', formFieldInputPlaceholder__emailAddress_username: undefined, formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__firstName: undefined, - formFieldInputPlaceholder__lastName: undefined, + formFieldInputPlaceholder__firstName: 'שם פרטי', + formFieldInputPlaceholder__lastName: 'שם משפחה', formFieldInputPlaceholder__organizationDomain: undefined, formFieldInputPlaceholder__organizationDomainEmailAddress: undefined, - formFieldInputPlaceholder__organizationName: undefined, + formFieldInputPlaceholder__organizationName: 'שם הארגון', formFieldInputPlaceholder__organizationSlug: 'הארגון-שלי', - formFieldInputPlaceholder__password: undefined, - formFieldInputPlaceholder__phoneNumber: undefined, + formFieldInputPlaceholder__password: 'הזן סיסמה', + formFieldInputPlaceholder__phoneNumber: 'הזן את מספר הטלפון שלך', formFieldInputPlaceholder__username: undefined, formFieldInput__emailAddress_format: undefined, formFieldLabel__apiKey: 'מפתח API', From da7acd44f8962ae7f202489de69542ae6d08c128 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Mon, 26 Jan 2026 11:52:33 -0500 Subject: [PATCH 066/123] chore(nextjs): Update middleware check for proxy usage (#7269) Co-authored-by: Robert Soriano --- .changeset/tangy-sides-crash.md | 5 + .../tests/middleware-placement.test.ts | 38 +++- packages/nextjs/src/app-router/server/auth.ts | 5 +- .../src/server/fs/middleware-location.ts | 16 +- .../src/utils/__tests__/sdk-versions.test.ts | 165 ++++++++++++++++++ packages/nextjs/src/utils/sdk-versions.ts | 20 ++- 6 files changed, 231 insertions(+), 18 deletions(-) create mode 100644 .changeset/tangy-sides-crash.md create mode 100644 packages/nextjs/src/utils/__tests__/sdk-versions.test.ts diff --git a/.changeset/tangy-sides-crash.md b/.changeset/tangy-sides-crash.md new file mode 100644 index 00000000000..318a91808ce --- /dev/null +++ b/.changeset/tangy-sides-crash.md @@ -0,0 +1,5 @@ +--- +'@clerk/nextjs': patch +--- + +Updates middleware location check to account for proxy.ts in next 16+ applications. diff --git a/integration/tests/middleware-placement.test.ts b/integration/tests/middleware-placement.test.ts index 42bc1b7227f..c756d83374a 100644 --- a/integration/tests/middleware-placement.test.ts +++ b/integration/tests/middleware-placement.test.ts @@ -71,10 +71,16 @@ test.describe('next start - missing middleware @quickstart', () => { }); test('Display error for missing middleware', async ({ page, context }) => { + const { version } = await detectNext(app); + const major = parseSemverMajor(version) ?? 0; const u = createTestUtils({ app, page, context }); await u.page.goToAppHome(); - expect(app.serveOutput).toContain('Your Middleware exists at ./src/middleware.(ts|js)'); + const expectedMessage = + major >= 16 + ? 'Your Middleware exists at ./src/middleware.(ts|js) or proxy.(ts|js)' + : 'Your Middleware exists at ./src/middleware.(ts|js)'; + expect(app.serveOutput).toContain(expectedMessage); }); }); @@ -105,10 +111,16 @@ test.describe('next start - invalid middleware at root on src/ @quickstart', () const u = createTestUtils({ app, page, context }); await u.page.goToAppHome(); - expect(app.serveOutput).not.toContain('Your Middleware exists at ./src/middleware.(ts|js)'); - expect(app.serveOutput).toContain( - 'Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./src/middleware.ts. Currently located at ./middleware.ts', - ); + const expectedMessage = + major >= 16 + ? 'Your Middleware exists at ./src/middleware.(ts|js) or proxy.(ts|js)' + : 'Your Middleware exists at ./src/middleware.(ts|js)'; + expect(app.serveOutput).not.toContain(expectedMessage); + const expectedError = + major >= 16 + ? 'Clerk: clerkMiddleware() was not run, your middleware or proxy file might be misplaced. Move your middleware or proxy file to ./src/middleware.ts. Currently located at ./middleware.ts' + : 'Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./src/middleware.ts. Currently located at ./middleware.ts'; + expect(app.serveOutput).toContain(expectedError); }); test('Does not display misplaced middleware error on Next 16+', async ({ page, context }) => { @@ -142,11 +154,19 @@ test.describe('next start - invalid middleware inside app on src/ @quickstart', page, context, }) => { + const { version } = await detectNext(app); + const major = parseSemverMajor(version) ?? 0; const u = createTestUtils({ app, page, context }); await u.page.goToAppHome(); - expect(app.serveOutput).not.toContain('Your Middleware exists at ./src/middleware.(ts|js)'); - expect(app.serveOutput).toContain( - 'Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./src/middleware.ts. Currently located at ./src/app/middleware.ts', - ); + const expectedMessage = + major >= 16 + ? 'Your Middleware exists at ./src/middleware.(ts|js) or proxy.(ts|js)' + : 'Your Middleware exists at ./src/middleware.(ts|js)'; + expect(app.serveOutput).not.toContain(expectedMessage); + const expectedError = + major >= 16 + ? 'Clerk: clerkMiddleware() was not run, your middleware or proxy file might be misplaced. Move your middleware or proxy file to ./src/middleware.ts. Currently located at ./src/app/middleware.ts' + : 'Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./src/middleware.ts. Currently located at ./src/app/middleware.ts'; + expect(app.serveOutput).toContain(expectedError); }); }); diff --git a/packages/nextjs/src/app-router/server/auth.ts b/packages/nextjs/src/app-router/server/auth.ts index 3a4f0efd544..2a332e44162 100644 --- a/packages/nextjs/src/app-router/server/auth.ts +++ b/packages/nextjs/src/app-router/server/auth.ts @@ -11,7 +11,7 @@ import { unauthorized } from '../../server/nextErrors'; import type { AuthProtect } from '../../server/protect'; import { createProtect } from '../../server/protect'; import { decryptClerkRequestData } from '../../server/utils'; -import { isNextWithUnstableServerActions } from '../../utils/sdk-versions'; +import { isNext16OrHigher, isNextWithUnstableServerActions } from '../../utils/sdk-versions'; import { buildRequestLike } from './utils'; /** @@ -81,7 +81,8 @@ export const auth: AuthFn = (async (options?: AuthOptions) => { try { const isSrcAppDir = await import('../../server/fs/middleware-location.js').then(m => m.hasSrcAppDir()); - return [`Your Middleware exists at ./${isSrcAppDir ? 'src/' : ''}middleware.(ts|js)`]; + const fileName = isNext16OrHigher ? 'middleware.(ts|js) or proxy.(ts|js)' : 'middleware.(ts|js)'; + return [`Your Middleware exists at ./${isSrcAppDir ? 'src/' : ''}${fileName}`]; } catch { return []; } diff --git a/packages/nextjs/src/server/fs/middleware-location.ts b/packages/nextjs/src/server/fs/middleware-location.ts index 3586d4a1ae2..67a7393e20d 100644 --- a/packages/nextjs/src/server/fs/middleware-location.ts +++ b/packages/nextjs/src/server/fs/middleware-location.ts @@ -1,3 +1,4 @@ +import { isNext16OrHigher } from '../../utils/sdk-versions'; import { nodeCwdOrThrow, nodeFsOrThrow, nodePathOrThrow } from './utils'; function hasSrcAppDir() { @@ -12,12 +13,17 @@ function hasSrcAppDir() { function suggestMiddlewareLocation() { const fileExtensions = ['ts', 'js'] as const; + // Next.js 16+ supports both middleware.ts (Edge runtime) and proxy.ts (Node.js runtime) + const fileNames = isNext16OrHigher ? ['middleware', 'proxy'] : ['middleware']; + const fileNameDisplay = isNext16OrHigher ? 'middleware or proxy' : 'middleware'; + const suggestionMessage = ( + fileName: string, extension: (typeof fileExtensions)[number], to: 'src/' | '', from: 'src/app/' | 'app/' | '', ) => - `Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./${to}middleware.${extension}. Currently located at ./${from}middleware.${extension}`; + `Clerk: clerkMiddleware() was not run, your ${fileNameDisplay} file might be misplaced. Move your ${fileNameDisplay} file to ./${to}${fileName}.${extension}. Currently located at ./${from}${fileName}.${extension}`; const { existsSync } = nodeFsOrThrow(); const path = nodePathOrThrow(); @@ -31,9 +37,11 @@ function suggestMiddlewareLocation() { to: 'src/' | '', from: 'src/app/' | 'app/' | '', ): string | undefined => { - for (const fileExtension of fileExtensions) { - if (existsSync(path.join(basePath, `middleware.${fileExtension}`))) { - return suggestionMessage(fileExtension, to, from); + for (const fileName of fileNames) { + for (const fileExtension of fileExtensions) { + if (existsSync(path.join(basePath, `${fileName}.${fileExtension}`))) { + return suggestionMessage(fileName, fileExtension, to, from); + } } } return undefined; diff --git a/packages/nextjs/src/utils/__tests__/sdk-versions.test.ts b/packages/nextjs/src/utils/__tests__/sdk-versions.test.ts new file mode 100644 index 00000000000..c37be227534 --- /dev/null +++ b/packages/nextjs/src/utils/__tests__/sdk-versions.test.ts @@ -0,0 +1,165 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +describe('sdk-versions', () => { + beforeEach(() => { + // Clear module cache to allow re-importing with different mocks + vi.resetModules(); + }); + + describe('meetsNextMinimumVersion', () => { + it('should return true when version meets minimum major version', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '16.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should return true when version exceeds minimum major version', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '17.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should return false when version is below minimum major version', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '15.9.9' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should return false when version is exactly one below minimum', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '15.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should handle patch versions correctly', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '16.5.3' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should handle beta/prerelease versions correctly', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '16.0.0-beta.1' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should return false when version is missing', async () => { + vi.doMock('next/package.json', () => ({ + default: {}, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should return false when version is null', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: null }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should return false when version is undefined', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: undefined }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should return false when version is an empty string', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should return false when version cannot be parsed as a number', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: 'invalid-version' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should handle single-digit major versions', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '9.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + + it('should handle double-digit major versions', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '20.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should handle version strings with leading zeros', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '016.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + }); + + describe('isNext16OrHigher', () => { + it('should be a boolean value', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '16.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(typeof isNext16OrHigher).toBe('boolean'); + }); + + it('should correctly identify Next.js 16', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '16.0.0' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(true); + }); + + it('should correctly identify Next.js 15 as not 16+', async () => { + vi.doMock('next/package.json', () => ({ + default: { version: '15.2.3' }, + })); + + const { isNext16OrHigher } = await import('../sdk-versions.js'); + expect(isNext16OrHigher).toBe(false); + }); + }); +}); diff --git a/packages/nextjs/src/utils/sdk-versions.ts b/packages/nextjs/src/utils/sdk-versions.ts index 729a096a6f9..2dc49c1698e 100644 --- a/packages/nextjs/src/utils/sdk-versions.ts +++ b/packages/nextjs/src/utils/sdk-versions.ts @@ -1,11 +1,25 @@ import nextPkg from 'next/package.json'; -const isNext13 = nextPkg.version.startsWith('13.'); +function meetsNextMinimumVersion(minimumMajorVersion: number) { + if (!nextPkg?.version) { + return false; + } + + const majorVersion = parseInt(nextPkg.version.split('.')[0], 10); + return !isNaN(majorVersion) && majorVersion >= minimumMajorVersion; +} + +const isNext13 = nextPkg?.version?.startsWith('13.') ?? false; /** * Those versions are affected by a bundling issue that will break the application if `node:fs` is used inside a server function. * The affected versions are >=next@13.5.4 and <=next@14.0.4 */ -const isNextWithUnstableServerActions = isNext13 || nextPkg.version.startsWith('14.0'); +const isNextWithUnstableServerActions = isNext13 || (nextPkg?.version?.startsWith('14.0') ?? false); + +/** + * Next.js 16+ renamed middleware.ts to proxy.ts + */ +const isNext16OrHigher = meetsNextMinimumVersion(16); -export { isNext13, isNextWithUnstableServerActions }; +export { isNext13, isNextWithUnstableServerActions, isNext16OrHigher }; From aebb8df24f19a932ef4663ee2c7c93a535d314f9 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Mon, 26 Jan 2026 14:17:57 -0800 Subject: [PATCH 067/123] chore(localizations): Update Spanish, Portuguese, and Finnish translations (#7683) Co-authored-by: fgbbd Co-authored-by: gilhrpenner Co-authored-by: vsalomaki --- .changeset/fifty-flies-repeat.md | 5 + packages/localizations/src/es-ES.ts | 166 +++---- packages/localizations/src/fi-FI.ts | 728 ++++++++++++++-------------- packages/localizations/src/pt-BR.ts | 25 +- 4 files changed, 471 insertions(+), 453 deletions(-) create mode 100644 .changeset/fifty-flies-repeat.md diff --git a/.changeset/fifty-flies-repeat.md b/.changeset/fifty-flies-repeat.md new file mode 100644 index 00000000000..8c63a788f48 --- /dev/null +++ b/.changeset/fifty-flies-repeat.md @@ -0,0 +1,5 @@ +--- +'@clerk/localizations': patch +--- + +Update translations for locales: Spanish (es-ES) billing page improvements, Portuguese (pt-BR) enterprise connections and password errors, and comprehensive Finnish (fi-FI) updates across authentication, billing, and organization management. diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index e617868c231..6cd8c91af18 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -290,62 +290,63 @@ export const esES: LocalizationResource = { badge__unverified: 'No verificado', billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'No hay historial de pagos', + notFound: 'No se ha encontrado el intento de pago', + tableHeader__amount: 'Importe', + tableHeader__date: 'Fecha', + tableHeader__status: 'Estado', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Establecer como predeterminado', + actionLabel__remove: 'Eliminar', + add: 'Añadir nuevo método de pago', + addSubtitle: 'Añade un nuevo método de pago a tu cuenta.', + cancelButton: 'Cancelar', + formButtonPrimary__add: 'Añadir método de pago', + formButtonPrimary__pay: 'Pagar {{amount}}', + payWithTestCardButton: 'Pagar con tarjeta de prueba', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}} se eliminará de esta cuenta.', + messageLine2: + 'Ya no podrás usar este método de pago y cualquier suscripción recurrente que dependa de él dejará de funcionar.', + successMessage: '{{paymentMethod}} se ha eliminado de tu cuenta.', + title: 'Eliminar método de pago', }, - title: undefined, + title: 'Métodos de pago', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Pagos', + headerTitle__plans: 'Planes', + headerTitle__statements: 'Facturas', + headerTitle__subscriptions: 'Suscripción', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'No hay facturas para mostrar', + itemCaption__paidForPlan: 'Pagado por el plan {{plan}} {{period}}', + itemCaption__proratedCredit: 'Crédito proporcional por el tiempo no utilizado de la suscripción anterior', + itemCaption__subscribedAndPaidForPlan: 'Suscrito y pagado por el plan {{plan}} {{period}}', + notFound: 'Factura no encontrada', + tableHeader__amount: 'Importe', + tableHeader__date: 'Fecha', + title: 'Facturas', + totalPaid: 'Total pagado', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Gestionar', + actionLabel__newSubscription: 'Suscribirse a un plan', + actionLabel__switchPlan: 'Cambiar de plan', + tableHeader__edit: 'Editar', + tableHeader__plan: 'Plan', + tableHeader__startDate: 'Fecha de inicio', + title: 'Suscripción', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Gestionar', }, switchPlansSection: { - title: undefined, + title: 'Cambiar de plan', }, - title: undefined, + title: 'Facturación', }, createDomainPage: { subtitle: @@ -1052,62 +1053,63 @@ export const esES: LocalizationResource = { }, billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'No hay historial de pagos', + notFound: 'No se ha encontrado el intento de pago', + tableHeader__amount: 'Importe', + tableHeader__date: 'Fecha', + tableHeader__status: 'Estado', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Establecer como predeterminado', + actionLabel__remove: 'Eliminar', + add: 'Añadir nuevo método de pago', + addSubtitle: 'Añade un nuevo método de pago a tu cuenta.', + cancelButton: 'Cancelar', + formButtonPrimary__add: 'Añadir método de pago', + formButtonPrimary__pay: 'Pagar {{amount}}', + payWithTestCardButton: 'Pagar con tarjeta de prueba', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}} se eliminará de esta cuenta.', + messageLine2: + 'Ya no podrás usar este método de pago y cualquier suscripción recurrente que dependa de él dejará de funcionar.', + successMessage: '{{paymentMethod}} se ha eliminado de tu cuenta.', + title: 'Eliminar método de pago', }, - title: undefined, + title: 'Métodos de pago', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Pagos', + headerTitle__plans: 'Planes', + headerTitle__statements: 'Facturas', + headerTitle__subscriptions: 'Suscripción', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'No hay facturas para mostrar', + itemCaption__paidForPlan: 'Pagado por el plan {{plan}} {{period}}', + itemCaption__proratedCredit: 'Crédito proporcional por el tiempo no utilizado de la suscripción anterior', + itemCaption__subscribedAndPaidForPlan: 'Suscrito y pagado por el plan {{plan}} {{period}}', + notFound: 'Factura no encontrada', + tableHeader__amount: 'Importe', + tableHeader__date: 'Fecha', + title: 'Facturas', + totalPaid: 'Total pagado', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Gestionar', + actionLabel__newSubscription: 'Suscribirse a un plan', + actionLabel__switchPlan: 'Cambiar de plan', + tableHeader__edit: 'Editar', + tableHeader__plan: 'Plan', + tableHeader__startDate: 'Fecha de inicio', + title: 'Suscripción', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Gestionar', }, switchPlansSection: { - title: undefined, + title: 'Cambiar de plan', }, - title: undefined, + title: 'Facturación', }, connectedAccountPage: { formHint: 'Seleccione un proveedor para conectar su cuenta.', diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index fac1ce9415f..bb579b51ed3 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -10,173 +10,179 @@ * ===================================================================================== */ -import type { LocalizationResource } from '@clerk/types'; +import type { LocalizationResource } from '@clerk/shared/types'; export const fiFI: LocalizationResource = { locale: 'fi-FI', apiKeys: { - action__add: undefined, - action__search: undefined, + action__add: 'Lisää uusi avain', + action__search: 'Etsi avaimia', copySecret: { formButtonPrimary__copyAndClose: 'Kopioi ja sulje', formHint: 'Tietoturvasyistä emme voi sallia sen tarkastelua myöhemmin.', formTitle: 'Kopioi API-avaimesi "{{name}}" nyt', }, - createdAndExpirationStatus__expiresOn: undefined, - createdAndExpirationStatus__never: undefined, - detailsTitle__emptyRow: undefined, - formButtonPrimary__add: undefined, - formFieldCaption__expiration__expiresOn: undefined, - formFieldCaption__expiration__never: undefined, - formFieldOption__expiration__180d: undefined, - formFieldOption__expiration__1d: undefined, - formFieldOption__expiration__1y: undefined, - formFieldOption__expiration__30d: undefined, - formFieldOption__expiration__60d: undefined, - formFieldOption__expiration__7d: undefined, - formFieldOption__expiration__90d: undefined, - formFieldOption__expiration__never: undefined, - formHint: undefined, - formTitle: undefined, - lastUsed__days: undefined, - lastUsed__hours: undefined, - lastUsed__minutes: undefined, - lastUsed__months: undefined, - lastUsed__seconds: undefined, - lastUsed__years: undefined, - menuAction__revoke: undefined, + createdAndExpirationStatus__expiresOn: + "Luotu {{ createdDate | shortDate('fi-FI') }} • Vanhenee {{ expiresDate | longDate('fi-FI') }}", + createdAndExpirationStatus__never: "Luotu {{ createdDate | shortDate('fi-FI') }} • Ei vanhene koskaan", + detailsTitle__emptyRow: 'API-avaimia ei löytynyt', + formButtonPrimary__add: 'Luo avain', + formFieldCaption__expiration__expiresOn: 'Vanhenee {{ date }}', + formFieldCaption__expiration__never: 'Tämä avain ei vanhene koskaan', + formFieldOption__expiration__180d: '180 päivää', + formFieldOption__expiration__1d: '1 päivä', + formFieldOption__expiration__1y: '1 vuosi', + formFieldOption__expiration__30d: '30 päivää', + formFieldOption__expiration__60d: '60 päivää', + formFieldOption__expiration__7d: '7 päivää', + formFieldOption__expiration__90d: '90 päivää', + formFieldOption__expiration__never: 'Ei koskaan', + formHint: 'Anna nimi uuden avaimen luomiseksi. Voit peruuttaa sen milloin tahansa.', + formTitle: 'Lisää uusi API-avain', + lastUsed__days: '{{days}} pv sitten', + lastUsed__hours: '{{hours}} h sitten', + lastUsed__minutes: '{{minutes}} min sitten', + lastUsed__months: '{{months}} kk sitten', + lastUsed__seconds: '{{seconds}} s sitten', + lastUsed__years: '{{years}} v sitten', + menuAction__revoke: 'Peruuta avain', revokeConfirmation: { - confirmationText: undefined, - formButtonPrimary__revoke: undefined, - formHint: undefined, - formTitle: undefined, + confirmationText: 'Peruuta', + formButtonPrimary__revoke: 'Peruuta avain', + formHint: 'Haluatko varmasti poistaa tämän salaisen avaimen?', + formTitle: 'Peruuttaako "{{apiKeyName}}" salainen avain?', }, }, backButton: 'Takaisin', - badge__activePlan: undefined, - badge__canceledEndsAt: undefined, - badge__currentPlan: undefined, + badge__activePlan: 'Aktiivinen', + badge__canceledEndsAt: "Peruutettu • Päättyy {{ date | shortDate('fi-FI') }}", + badge__currentPlan: 'Nykyinen paketti', badge__default: 'Oletus', - badge__endsAt: undefined, - badge__expired: undefined, - badge__freeTrial: undefined, + badge__endsAt: "Päättyy {{ date | shortDate('fi-FI') }}", + badge__expired: 'Vanhentunut', + badge__freeTrial: 'Ilmainen kokeilu', badge__otherImpersonatorDevice: 'Toinen jäljitelty laite', - badge__pastDueAt: undefined, - badge__pastDuePlan: undefined, + badge__pastDueAt: "Erääntynyt {{ date | shortDate('fi-FI') }}", + badge__pastDuePlan: 'Erääntynyt', badge__primary: 'Ensisijainen', - badge__renewsAt: undefined, + badge__renewsAt: "Uusitaan {{ date | shortDate('fi-FI') }}", badge__requiresAction: 'Vaaditaan toimia', - badge__startsAt: undefined, + badge__startsAt: "Alkaa {{ date | shortDate('fi-FI') }}", badge__thisDevice: 'Tämä laite', - badge__trialEndsAt: undefined, + badge__trialEndsAt: "Kokeilu päättyy {{ date | shortDate('fi-FI') }}", badge__unverified: 'Vahvistamaton', - badge__upcomingPlan: undefined, + badge__upcomingPlan: 'Tuleva', badge__userDevice: 'Käyttäjän laite', badge__you: 'Sinä', billing: { - addPaymentMethod__label: undefined, - alwaysFree: undefined, - annually: undefined, - availableFeatures: undefined, - billedAnnually: undefined, - billedMonthlyOnly: undefined, - cancelFreeTrial: undefined, - cancelFreeTrialAccessUntil: undefined, - cancelFreeTrialTitle: undefined, - cancelSubscription: undefined, - cancelSubscriptionAccessUntil: undefined, - cancelSubscriptionNoCharge: undefined, - cancelSubscriptionPastDue: undefined, - cancelSubscriptionTitle: undefined, - cannotSubscribeMonthly: undefined, - cannotSubscribeUnrecoverable: undefined, + addPaymentMethod__label: 'Lisää maksutapa', + alwaysFree: 'Aina ilmainen', + annually: 'Vuosittain', + availableFeatures: 'Sisältyvät ominaisuudet', + billedAnnually: 'Laskutetaan vuosittain', + billedMonthlyOnly: 'Laskutus vain kuukausittain', + cancelFreeTrial: 'Peruuta ilmainen kokeilu', + cancelFreeTrialAccessUntil: + "Kokeilusi pysyy aktiivisena {{ date | longDate('fi-FI') }} asti. Tämän jälkeen menetät pääsyn kokeiluominaisuuksiin. Sinulta ei veloiteta.", + cancelFreeTrialTitle: 'Peruuttaako {{plan}}-paketin ilmainen kokeilu?', + cancelSubscription: 'Peruuta tilaus', + cancelSubscriptionAccessUntil: + "Voit käyttää '{{plan}}' ominaisuuksia {{ date | longDate('fi-FI') }} asti, minkä jälkeen pääsy päättyy.", + cancelSubscriptionNoCharge: 'Tilauksesta ei veloiteta.', + cancelSubscriptionPastDue: + 'Tilauksesi päättyy välittömästi ja menetät pääsyn kaikkiin tilauksen ominaisuuksiin. Sinulta pyydetään maksamaan erääntynyt summa seuraavassa tilauksessa.', + cancelSubscriptionTitle: 'Peruuttaako {{plan}}-tilauksen?', + cannotSubscribeMonthly: + 'Et voi tilata tätä pakettia kuukausimaksulla. Tilataksesi tämän sinun on valittava vuositilaus.', + cannotSubscribeUnrecoverable: 'Et voi tilata tätä pakettia. Nykyinen tilauksesi on kalliimpi kuin tämä paketti.', checkout: { - description__paymentSuccessful: undefined, - description__subscriptionSuccessful: undefined, - downgradeNotice: undefined, + description__paymentSuccessful: 'Maksusi onnistui.', + description__subscriptionSuccessful: 'Uusi tilauksesi on valmis.', + downgradeNotice: + 'Säilytät nykyisen tilauksesi ja sen ominaisuudet laskutuskauden loppuun asti, minkä jälkeen siirryt tähän tilaukseen.', emailForm: { - subtitle: undefined, - title: undefined, + subtitle: 'Ennen ostoksen viimeistelyä sinun on lisättävä sähköpostiosoite, johon kuitit lähetetään.', + title: 'Lisää sähköpostiosoite', }, lineItems: { - title__freeTrialEndsAt: undefined, - title__paymentMethod: undefined, - title__statementId: undefined, - title__subscriptionBegins: undefined, - title__totalPaid: undefined, - }, - pastDueNotice: undefined, - perMonth: undefined, - title: undefined, - title__paymentSuccessful: undefined, - title__subscriptionSuccessful: undefined, - title__trialSuccess: undefined, - totalDueAfterTrial: undefined, - }, - credit: undefined, - creditRemainder: undefined, - defaultFreePlanActive: undefined, - free: undefined, - getStarted: undefined, - keepFreeTrial: undefined, - keepSubscription: undefined, - manage: undefined, - manageSubscription: undefined, - month: undefined, - monthly: undefined, - pastDue: undefined, - pay: undefined, + title__freeTrialEndsAt: 'Kokeilu päättyy', + title__paymentMethod: 'Maksutapa', + title__statementId: 'Tositenumero', + title__subscriptionBegins: 'Tilaus alkaa', + title__totalPaid: 'Maksettu yhteensä', + }, + pastDueNotice: 'Edellinen tilauksesi oli erääntynyt eikä maksua ole suoritettu.', + perMonth: 'kuukaudessa', + title: 'Kassa', + title__paymentSuccessful: 'Maksu onnistui!', + title__subscriptionSuccessful: 'Onnistui!', + title__trialSuccess: 'Kokeilu aloitettu onnistuneesti!', + totalDueAfterTrial: 'Erääntyy kokeilun päätyttyä {{days}} päivän kuluttua', + }, + credit: 'Hyvitys', + creditRemainder: 'Hyvitys nykyisen tilauksesi jäljellä olevalta ajalta.', + defaultFreePlanActive: 'Olet tällä hetkellä ilmaisella tilauksella.', + free: 'Ilmainen', + getStarted: 'Aloita', + keepFreeTrial: 'Pidä ilmainen kokeilu', + keepSubscription: 'Pidä tilaus', + manage: 'Hallinnoi', + manageSubscription: 'Hallinnoi tilausta', + month: 'Kuukausi', + monthly: 'Kuukausittain', + pastDue: 'Erääntynyt', + pay: 'Maksa {{amount}}', paymentMethod: { applePayDescription: { - annual: undefined, - monthly: undefined, + annual: 'Vuosimaksu', + monthly: 'Kuukausimaksu', }, dev: { - anyNumbers: undefined, - cardNumber: undefined, - cvcZip: undefined, - developmentMode: undefined, - expirationDate: undefined, - testCardInfo: undefined, + anyNumbers: 'Mitkä tahansa numerot', + cardNumber: 'Kortin numero', + cvcZip: 'CVC, postinumero', + developmentMode: 'Kehitystila', + expirationDate: 'Vanhenemispäivä', + testCardInfo: 'Testikortin tiedot', }, }, - paymentMethods__label: undefined, - popular: undefined, + paymentMethods__label: 'Maksutavat', + popular: 'Suosittu', pricingTable: { - billingCycle: undefined, - included: undefined, - }, - reSubscribe: undefined, - seeAllFeatures: undefined, - startFreeTrial: undefined, - startFreeTrial__days: undefined, - subscribe: undefined, + billingCycle: 'Laskutusjakso', + included: 'Sisältyy', + }, + reSubscribe: 'Tilaa uudelleen', + seeAllFeatures: 'Näytä kaikki ominaisuudet', + startFreeTrial: 'Aloita ilmainen kokeilu', + startFreeTrial__days: 'Aloita {{days}} päivän ilmainen kokeilu', + subscribe: 'Tilaa', subscriptionDetails: { - beginsOn: undefined, - currentBillingCycle: undefined, - endsOn: undefined, - firstPaymentAmount: undefined, - firstPaymentOn: undefined, - nextPaymentAmount: undefined, - nextPaymentOn: undefined, - pastDueAt: undefined, - renewsAt: undefined, - subscribedOn: undefined, - title: undefined, - trialEndsOn: undefined, - trialStartedOn: undefined, - }, - subtotal: undefined, - switchPlan: undefined, - switchToAnnual: undefined, - switchToAnnualWithAnnualPrice: undefined, - switchToMonthly: undefined, - switchToMonthlyWithPrice: undefined, - totalDue: undefined, - totalDueToday: undefined, - viewFeatures: undefined, - viewPayment: undefined, - year: undefined, + beginsOn: 'Alkaa', + currentBillingCycle: 'Nykyinen laskutusjakso', + endsOn: 'Päättyy', + firstPaymentAmount: 'Ensimmäinen maksu', + firstPaymentOn: 'Ensimmäinen maksu', + nextPaymentAmount: 'Seuraava maksu', + nextPaymentOn: 'Seuraava maksu', + pastDueAt: 'Erääntynyt', + renewsAt: 'Uusitaan', + subscribedOn: 'Tilattu', + title: 'Tilaus', + trialEndsOn: 'Kokeilu päättyy', + trialStartedOn: 'Kokeilu alkanut', + }, + subtotal: 'Välisumma', + switchPlan: 'Vaihda tähän tilaukseen', + switchToAnnual: 'Vaihda vuositilaukseen', + switchToAnnualWithAnnualPrice: 'Vaihda vuositilaukseen {{price}}{{currency}} / vuosi', + switchToMonthly: 'Vaihda kuukausitilaukseen', + switchToMonthlyWithPrice: 'Vaihda kuukausitilaukseen {{price}}{{currency}} / kuukausi', + totalDue: 'Maksettava yhteensä', + totalDueToday: 'Maksettava tänään', + viewFeatures: 'Näytä ominaisuudet', + viewPayment: 'Näytä maksu', + year: 'Vuosi', }, createOrganization: { formButtonSubmit: 'Luo organisaatio', @@ -194,7 +200,7 @@ export const fiFI: LocalizationResource = { sameDay: "Tänään klo {{ date | timeString('fi-FI') }}", }, dividerText: 'tai', - footerActionLink__alternativePhoneCodeProvider: undefined, + footerActionLink__alternativePhoneCodeProvider: 'Lähetä koodi tekstiviestillä', footerActionLink__useAnotherMethod: 'Käytä toista tapaa', footerPageLink__help: 'Apua', footerPageLink__privacy: 'Tietosuoja', @@ -208,24 +214,24 @@ export const fiFI: LocalizationResource = { formFieldHintText__optional: 'Valinnainen', formFieldHintText__slug: 'Slug on luettava tunniste, joka on oltava yksilöllinen. Sitä käytetään usein URL-osoitteissa.', - formFieldInputPlaceholder__apiKeyDescription: undefined, - formFieldInputPlaceholder__apiKeyExpirationDate: undefined, - formFieldInputPlaceholder__apiKeyName: undefined, - formFieldInputPlaceholder__backupCode: undefined, + formFieldInputPlaceholder__apiKeyDescription: 'Syötä selite API-avaimelle', + formFieldInputPlaceholder__apiKeyExpirationDate: 'Valitse päivämäärä', + formFieldInputPlaceholder__apiKeyName: 'Syötä API-avaimen nimi', + formFieldInputPlaceholder__backupCode: 'Syötä varakoodi', formFieldInputPlaceholder__confirmDeletionUserAccount: 'Poista tili', - formFieldInputPlaceholder__emailAddress: undefined, - formFieldInputPlaceholder__emailAddress_username: undefined, + formFieldInputPlaceholder__emailAddress: 'Syötä sähköpostiosoitteesi', + formFieldInputPlaceholder__emailAddress_username: 'Syötä käyttäjänimi tai sähköpostiosoite', formFieldInputPlaceholder__emailAddresses: 'esimerkki@domain.fi, esimerkki2@domain.fi', - formFieldInputPlaceholder__firstName: undefined, - formFieldInputPlaceholder__lastName: undefined, + formFieldInputPlaceholder__firstName: 'Etunimi', + formFieldInputPlaceholder__lastName: 'Sukunimi', formFieldInputPlaceholder__organizationDomain: undefined, formFieldInputPlaceholder__organizationDomainEmailAddress: undefined, - formFieldInputPlaceholder__organizationName: undefined, + formFieldInputPlaceholder__organizationName: 'Organisaation nimi', formFieldInputPlaceholder__organizationSlug: 'minun-org', - formFieldInputPlaceholder__password: undefined, - formFieldInputPlaceholder__phoneNumber: undefined, + formFieldInputPlaceholder__password: 'Syötä salasanasi', + formFieldInputPlaceholder__phoneNumber: 'Syötä puhelinnumerosi', formFieldInputPlaceholder__username: undefined, - formFieldInput__emailAddress_format: undefined, + formFieldInput__emailAddress_format: 'Esimerkki: nimi@esimerkki.fi', formFieldLabel__apiKey: 'API-avain', formFieldLabel__apiKeyDescription: 'Kuvaus', formFieldLabel__apiKeyExpiration: 'Vanheneminen', @@ -276,7 +282,7 @@ export const fiFI: LocalizationResource = { }, organizationProfile: { apiKeysPage: { - title: undefined, + title: 'API-avaimet', }, badge__automaticInvitation: 'Automaattiset kutsut', badge__automaticSuggestion: 'Automaattiset ehdotukset', @@ -284,62 +290,63 @@ export const fiFI: LocalizationResource = { badge__unverified: 'Vahvistamaton', billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'Ei maksuhistoriaa', + notFound: 'Maksuyritystä ei löytynyt', + tableHeader__amount: 'Summa', + tableHeader__date: 'Päivämäärä', + tableHeader__status: 'Tila', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Aseta oletukseksi', + actionLabel__remove: 'Poista', + add: 'Lisää uusi maksutapa', + addSubtitle: 'Lisää uusi maksutapa tilillesi.', + cancelButton: 'Peruuta', + formButtonPrimary__add: 'Lisää maksutapa', + formButtonPrimary__pay: 'Maksa {{amount}}', + payWithTestCardButton: 'Maksa testikortilla', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}} poistetaan tältä tililtä.', + messageLine2: + 'Et voi enää käyttää tätä maksutapaa, ja siihen sidotut toistuvat tilaukset lakkaavat toimimasta.', + successMessage: '{{paymentMethod}} on poistettu tililtäsi.', + title: 'Poista maksutapa', }, - title: undefined, + title: 'Maksutavat', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Maksut', + headerTitle__plans: 'Paketit', + headerTitle__statements: 'Tositteet', + headerTitle__subscriptions: 'Tilaukset', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'Ei tositteita näytettäväksi', + itemCaption__paidForPlan: 'Maksettu {{plan}} {{period}} -tilauksesta', + itemCaption__proratedCredit: 'Suhteutettu hyvitys edellisen tilauksen osittaisesta käytöstä', + itemCaption__subscribedAndPaidForPlan: 'Tilattu ja maksettu {{plan}} {{period}} -tilaus', + notFound: 'Tosite ei löytynyt', + tableHeader__amount: 'Summa', + tableHeader__date: 'Päivämäärä', + title: 'Tositteet', + totalPaid: 'Maksettu yhteensä', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Hallinnoi', + actionLabel__newSubscription: 'Tilaa', + actionLabel__switchPlan: 'Vaihda tilausta', + tableHeader__edit: 'Muokkaa', + tableHeader__plan: 'Paketti', + tableHeader__startDate: 'Aloituspäivä', + title: 'Tilaus', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Hallinnoi', }, switchPlansSection: { - title: undefined, + title: 'Vaihda tilausta', }, - title: undefined, + title: 'Laskutus', }, createDomainPage: { subtitle: @@ -357,10 +364,10 @@ export const fiFI: LocalizationResource = { }, membersPage: { action__invite: 'Kutsu', - action__search: undefined, + action__search: 'Etsi', activeMembersTab: { menuAction__remove: 'Poista jäsen', - tableHeader__actions: undefined, + tableHeader__actions: 'Toiminnot', tableHeader__joined: 'Liittynyt', tableHeader__role: 'Rooli', tableHeader__user: 'Käyttäjä', @@ -404,8 +411,8 @@ export const fiFI: LocalizationResource = { }, }, navbar: { - apiKeys: undefined, - billing: undefined, + apiKeys: 'API-avaimet', + billing: 'Laskutus', description: 'Hallitse organisaatiotasi.', general: 'Yleinen', members: 'Jäsenet', @@ -413,9 +420,9 @@ export const fiFI: LocalizationResource = { }, plansPage: { alerts: { - noPermissionsToManageBilling: undefined, + noPermissionsToManageBilling: 'Sinulla ei ole oikeuksia hallinnoida tämän organisaation laskutusta.', }, - title: undefined, + title: 'Tilaukset', }, profilePage: { dangerSection: { @@ -502,11 +509,11 @@ export const fiFI: LocalizationResource = { }, }, organizationSwitcher: { - action__closeOrganizationSwitcher: undefined, + action__closeOrganizationSwitcher: 'Sulje organisaatiovalitsin', action__createOrganization: 'Luo organisaatio', action__invitationAccept: 'Liity', action__manageOrganization: 'Hallitse', - action__openOrganizationSwitcher: undefined, + action__openOrganizationSwitcher: 'Avaa organisaatiovalitsin', action__suggestionsAccept: 'Pyydä liittymistä', notSelected: 'Ei valittua organisaatiota', personalWorkspace: 'Henkilökohtainen tili', @@ -518,63 +525,65 @@ export const fiFI: LocalizationResource = { paginationRowText__of: 'yhteensä', reverification: { alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__passkey: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, + actionLink: 'Hae apua', + actionText: 'Eikö mikään näistä ole käytettävissä?', + blockButton__backupCode: 'Käytä varakoodia', + blockButton__emailCode: 'Lähetä koodi sähköpostitse {{identifier}}', + blockButton__passkey: 'Käytä pääsyavaintasi', + blockButton__password: 'Jatka salasanallasi', + blockButton__phoneCode: 'Lähetä SMS-koodi {{identifier}}', + blockButton__totp: 'Käytä todennussovellustasi', getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, + blockButton__emailSupport: 'Sähköpostituki', + content: + 'Jos sinulla on ongelmia tilisi vahvistamisessa, lähetä meille sähköpostia, niin autamme sinua palauttamaan pääsyn mahdollisimman pian.', + title: 'Hae apua', }, - subtitle: undefined, - title: undefined, + subtitle: 'Ongelmia? Voit käyttää mitä tahansa näistä vahvistusmenetelmistä.', + title: 'Käytä toista menetelmää', }, backupCodeMfa: { - subtitle: undefined, - title: undefined, + subtitle: 'Syötä varakoodi, jonka sait kaksivaiheista todennusta asettaessasi', + title: 'Syötä varakoodi', }, emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Vahvistuskoodi', + resendButton: 'Etkö saanut koodia? Lähetä uudelleen', + subtitle: 'Syötä sähköpostiisi lähetetty koodi jatkaaksesi', + title: 'Vahvistus vaaditaan', }, noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, + message: 'Vahvistusta ei voida suorittaa. Sopivaa todennusmenetelmää ei ole määritetty.', + subtitle: 'Tapahtui virhe', + title: 'Tiliä ei voi vahvistaa', }, passkey: { - blockButton__passkey: undefined, - subtitle: undefined, - title: undefined, + blockButton__passkey: 'Käytä pääsyavaintasi', + subtitle: + 'Pääsyavaimen käyttö vahvistaa henkilöllisyytesi. Laitteesi saattaa pyytää sormenjälkeä, kasvoja tai näytön lukitusta.', + title: 'Käytä pääsyavaintasi', }, password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Käytä toista menetelmää', + subtitle: 'Syötä nykyinen salasanasi jatkaaksesi', + title: 'Vahvistus vaaditaan', }, phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Vahvistuskoodi', + resendButton: 'Etkö saanut koodia? Lähetä uudelleen', + subtitle: 'Syötä puhelimeesi lähetetty koodi jatkaaksesi', + title: 'Vahvistus vaaditaan', }, phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Vahvistuskoodi', + resendButton: 'Etkö saanut koodia? Lähetä uudelleen', + subtitle: 'Syötä puhelimeesi lähetetty koodi jatkaaksesi', + title: 'Vahvistus vaaditaan', }, totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Vahvistuskoodi', + subtitle: 'Syötä todennussovelluksesi luoma koodi jatkaaksesi', + title: 'Vahvistus vaaditaan', }, }, signIn: { @@ -585,7 +594,7 @@ export const fiFI: LocalizationResource = { title: 'Valitse tili', }, alternativeMethods: { - actionLink: 'Hanki apua', + actionLink: 'Ota yhteyttä ongelmatilanteissa', actionText: 'Eikö sinulla ole näitä?', blockButton__backupCode: 'Käytä varakoodia', blockButton__emailCode: 'Lähetä koodi sähköpostitse {{identifier}}', @@ -598,16 +607,16 @@ export const fiFI: LocalizationResource = { blockButton__emailSupport: 'Sähköpostituki', content: 'Jos sinulla on vaikeuksia kirjautua tilillesi, lähetä meille sähköpostia, niin autamme sinua palauttamaan pääsyn tiliisi mahdollisimman pian.', - title: 'Hanki apua', + title: 'Ota yhteyttä ongelmatilanteissa', }, subtitle: 'Ongelmia? Voit kirjautua sisään millä tahansa näistä tavoista.', title: 'Käytä toista tapaa', }, alternativePhoneCodeProvider: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Vahvistuskoodi', + resendButton: 'Etkö saanut koodia? Lähetä uudelleen', + subtitle: 'jatkaaksesi kohteeseen {{applicationName}}', + title: 'Tarkista {{provider}}', }, backupCodeMfa: { subtitle: 'Varakoodi on se, jonka sait asettaessasi kaksivaiheisen todennuksen.', @@ -667,8 +676,8 @@ export const fiFI: LocalizationResource = { title: 'Tarkista sähköpostisi', }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Valitse yritystili, jolla haluat jatkaa.', + title: 'Valitse yritystilisi', }, forgotPassword: { formTitle: 'Nollaa salasana', @@ -704,7 +713,7 @@ export const fiFI: LocalizationResource = { title: undefined, }, passwordPwned: { - title: 'Salasana kompromisoitu', + title: 'Salasana tietomurrossa', }, passwordUntrusted: { title: undefined, @@ -732,21 +741,21 @@ export const fiFI: LocalizationResource = { }, start: { actionLink: 'Rekisteröidy', - actionLink__join_waitlist: undefined, + actionLink__join_waitlist: 'Liity jonotuslistalle', actionLink__use_email: 'Käytä sähköpostia', actionLink__use_email_username: 'Käytä sähköpostia tai käyttäjänimeä', actionLink__use_passkey: 'Käytä pääsyavainta', actionLink__use_phone: 'Käytä puhelinta', actionLink__use_username: 'Käytä käyttäjänimeä', actionText: 'Eikö sinulla ole tiliä?', - actionText__join_waitlist: undefined, + actionText__join_waitlist: 'Haluatko varhaisen pääsyn?', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Käytä toista tapaa', + label: '{{provider}}-puhelinnumero', + subtitle: 'Syötä puhelinnumerosi saadaksesi vahvistuskoodin {{provider}} kautta.', + title: 'Kirjaudu {{applicationName}}-palveluun {{provider}} avulla', }, - subtitle: 'jatkaaksesi kohteeseen {{applicationName}}', + subtitle: 'Tervetuloa takaisin! Kirjaudu sisään jatkaaksesi', subtitleCombined: undefined, title: 'Kirjaudu sisään', titleCombined: undefined, @@ -764,9 +773,9 @@ export const fiFI: LocalizationResource = { signInEnterPasswordTitle: 'Syötä salasanasi', signUp: { alternativePhoneCodeProvider: { - resendButton: undefined, - subtitle: undefined, - title: undefined, + resendButton: 'Etkö saanut koodia? Lähetä uudelleen', + subtitle: 'Syötä {{provider}}-palveluun lähetetty vahvistuskoodi', + title: 'Vahvista {{provider}}', }, continue: { actionLink: 'Kirjaudu sisään', @@ -804,8 +813,8 @@ export const fiFI: LocalizationResource = { }, }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Valitse yritystili, jolla haluat jatkaa.', + title: 'Valitse yritystilisi', }, legalConsent: { checkbox: { @@ -827,24 +836,26 @@ export const fiFI: LocalizationResource = { title: 'Tarkista puhelimesi', }, restrictedAccess: { - actionLink: undefined, - actionText: undefined, - blockButton__emailSupport: undefined, - blockButton__joinWaitlist: undefined, - subtitle: undefined, - subtitleWaitlist: undefined, - title: undefined, + actionLink: 'Kirjaudu sisään', + actionText: 'Onko sinulla jo tili?', + blockButton__emailSupport: 'Sähköpostituki', + blockButton__joinWaitlist: 'Liity jonotuslistalle', + subtitle: + 'Rekisteröityminen on tällä hetkellä pois käytöstä. Jos uskot, että sinulla pitäisi olla pääsy, ota yhteyttä tukeen.', + subtitleWaitlist: + 'Rekisteröityminen on tällä hetkellä pois käytöstä. Liity jonotuslistalle saadaksesi tiedon heti kun palvelu avautuu.', + title: 'Pääsy rajoitettu', }, start: { actionLink: 'Kirjaudu sisään', - actionLink__use_email: undefined, - actionLink__use_phone: undefined, + actionLink__use_email: 'Käytä sähköpostia', + actionLink__use_phone: 'Käytä puhelinta', actionText: 'Onko sinulla jo tili?', alternativePhoneCodeProvider: { - actionLink: undefined, - label: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'Käytä toista tapaa', + label: '{{provider}}-puhelinnumero', + subtitle: 'Syötä puhelinnumerosi saadaksesi vahvistuskoodin {{provider}} kautta.', + title: 'Rekisteröidy {{applicationName}}-palveluun {{provider}} avulla', }, subtitle: 'Tervetuloa! Luo tili jatkaaksesi.', subtitleCombined: 'Tervetuloa! Luo tili jatkaaksesi.', @@ -860,31 +871,27 @@ export const fiFI: LocalizationResource = { socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { chooseOrganization: { - action__createOrganization: undefined, - action__invitationAccept: undefined, - action__suggestionsAccept: undefined, - subtitle: undefined, - subtitle__createOrganizationDisabled: undefined, - suggestionsAcceptedLabel: undefined, - title: undefined, + action__createOrganization: 'Luo uusi organisaatio', + action__invitationAccept: 'Liity', + action__suggestionsAccept: 'Pyydä liittymistä', + subtitle: 'Liity olemassa olevaan organisaatioon tai luo uusi', + subtitle__createOrganizationDisabled: 'Liity olemassa olevaan organisaatioon', + suggestionsAcceptedLabel: 'Odottaa hyväksyntää', + title: 'Valitse organisaatio', }, createOrganization: { - formButtonReset: undefined, - formButtonSubmit: undefined, - formFieldInputPlaceholder__name: undefined, - formFieldInputPlaceholder__slug: undefined, - formFieldLabel__name: undefined, - formFieldLabel__slug: undefined, - subtitle: undefined, - title: undefined, - }, - organizationCreationDisabled: { - title: 'Sinun täytyy kuulua organisaatioon', - subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.', + formButtonReset: 'Peruuta', + formButtonSubmit: 'Jatka', + formFieldInputPlaceholder__name: 'Oma organisaatio', + formFieldInputPlaceholder__slug: 'oma-organisaatio', + formFieldLabel__name: 'Nimi', + formFieldLabel__slug: 'Slug', + subtitle: 'Syötä organisaation tiedot jatkaaksesi', + title: 'Määritä organisaatiosi', }, signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Kirjaudu ulos', + actionText: 'Kirjautuneena käyttäjänä {{identifier}}', }, alerts: { organizationAlreadyExists: @@ -892,16 +899,16 @@ export const fiFI: LocalizationResource = { }, }, taskResetPassword: { - formButtonPrimary: undefined, + formButtonPrimary: 'Nollaa salasana', signOut: { - actionLink: undefined, - actionText: undefined, + actionLink: 'Kirjaudu ulos', + actionText: 'Kirjautuneena käyttäjänä {{identifier}}', }, subtitle: undefined, title: undefined, }, unstable__errors: { - already_a_member_in_organization: undefined, + already_a_member_in_organization: '{{email}} on jo tämän organisaation jäsen.', avatar_file_size_exceeded: 'Tiedostokoko ylittää enimmäisrajan 10 Mt. Valitse pienempi tiedosto.', avatar_file_type_invalid: 'Tiedostotyyppiä ei tueta. Lataa JPG-, PNG-, GIF- tai WEBP-kuva.', captcha_invalid: @@ -932,8 +939,8 @@ export const fiFI: LocalizationResource = { 'Salasana tai sähköpostiosoite on väärä. Yritä uudelleen tai käytä toista menetelmää.', form_password_length_too_short: undefined, form_password_not_strong_enough: 'Salasana ei ole riittävän vahva.', - form_password_pwned: 'Salasana on ollut osallisena tietovuodossa. Valitse toinen salasana.', - form_password_pwned__sign_in: 'Salasana on ollut osallisena tietovuodossa. Vaihdathan salasanasi.', + form_password_pwned: 'Salasana on ollut mukana julkisissa tietovuodoissa. Valitse toinen salasana.', + form_password_pwned__sign_in: 'Salasana on ollut mukana julkisissa tietovuodoissa. Vaihdathan salasanasi.', form_password_size_in_bytes_exceeded: 'Salasanasi on ylittänyt sallitun tavumäärän, lyhennä sitä tai poista joitain erikoismerkkejä.', form_password_untrusted__sign_in: undefined, @@ -949,8 +956,10 @@ export const fiFI: LocalizationResource = { organization_domain_exists_for_enterprise_connection: undefined, organization_membership_quota_exceeded: undefined, organization_minimum_permissions_needed: undefined, - organization_not_found_or_unauthorized: undefined, - organization_not_found_or_unauthorized_with_create_organization_disabled: undefined, + organization_not_found_or_unauthorized: + 'Et ole enää tämän organisaation jäsen. Valitse tai luo toinen organisaatio.', + organization_not_found_or_unauthorized_with_create_organization_disabled: + 'Et ole enää tämän organisaation jäsen. Valitse toinen organisaatio.', passkey_already_exists: 'Pääsyavain on jo rekisteröity tähän laitteeseen.', passkey_not_supported: 'Pääsyavain ei ole tuettu tällä laitteella.', passkey_pa_not_supported: 'Rekisteröinti vaatii alustan autentikaattorin, mutta laite ei tue sitä.', @@ -967,7 +976,7 @@ export const fiFI: LocalizationResource = { }, phone_number_exists: 'Tämä puhelinnumero on jo käytössä. Kokeile toista.', session_exists: 'Olet jo kirjautunut sisään.', - web3_missing_identifier: undefined, + web3_missing_identifier: 'Web3-lompakkoa ei löytynyt. Asenna sellainen jatkaaksesi.', web3_signature_request_rejected: 'Hylkäsit allekirjoituspyynnön. Yritä uudelleen jatkaaksesi.', web3_solana_signature_generation_failed: 'Allekirjoitusta luotaessa tapahtui virhe. Yritä uudelleen jatkaaksesi.', zxcvbn: { @@ -1012,15 +1021,15 @@ export const fiFI: LocalizationResource = { }, userButton: { action__addAccount: 'Lisää tili', - action__closeUserMenu: undefined, + action__closeUserMenu: 'Sulje käyttäjävalikko', action__manageAccount: 'Hallitse tiliä', - action__openUserMenu: undefined, + action__openUserMenu: 'Avaa käyttäjävalikko', action__signOut: 'Kirjaudu ulos', - action__signOutAll: 'Kirjaudu ulos kaikista tileistä', + action__signOutAll: 'Kirjaudu ulos kaikilta tileiltä', }, userProfile: { apiKeysPage: { - title: undefined, + title: 'API-avaimet', }, backupCodePage: { actionLabel__copied: 'Kopioitu', @@ -1040,62 +1049,63 @@ export const fiFI: LocalizationResource = { }, billingPage: { paymentHistorySection: { - empty: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - tableHeader__status: undefined, + empty: 'Ei maksuhistoriaa', + notFound: 'Maksuyritystä ei löytynyt', + tableHeader__amount: 'Summa', + tableHeader__date: 'Päivämäärä', + tableHeader__status: 'Tila', }, paymentMethodsSection: { - actionLabel__default: undefined, - actionLabel__remove: undefined, - add: undefined, - addSubtitle: undefined, - cancelButton: undefined, - formButtonPrimary__add: undefined, - formButtonPrimary__pay: undefined, - payWithTestCardButton: undefined, + actionLabel__default: 'Aseta oletukseksi', + actionLabel__remove: 'Poista', + add: 'Lisää uusi maksutapa', + addSubtitle: 'Lisää uusi maksutapa tilillesi.', + cancelButton: 'Peruuta', + formButtonPrimary__add: 'Lisää maksutapa', + formButtonPrimary__pay: 'Maksa {{amount}}', + payWithTestCardButton: 'Maksa testikortilla', removeMethod: { - messageLine1: undefined, - messageLine2: undefined, - successMessage: undefined, - title: undefined, + messageLine1: '{{identifier}} poistetaan tältä tililtä.', + messageLine2: + 'Et voi enää käyttää tätä maksutapaa, ja siihen sidotut toistuvat tilaukset lakkaavat toimimasta.', + successMessage: '{{paymentMethod}} on poistettu tililtäsi.', + title: 'Poista maksutapa', }, - title: undefined, + title: 'Maksutavat', }, start: { - headerTitle__payments: undefined, - headerTitle__plans: undefined, - headerTitle__statements: undefined, - headerTitle__subscriptions: undefined, + headerTitle__payments: 'Maksut', + headerTitle__plans: 'Paketit', + headerTitle__statements: 'Tositteet', + headerTitle__subscriptions: 'Tilaukset', }, statementsSection: { - empty: undefined, - itemCaption__paidForPlan: undefined, - itemCaption__proratedCredit: undefined, - itemCaption__subscribedAndPaidForPlan: undefined, - notFound: undefined, - tableHeader__amount: undefined, - tableHeader__date: undefined, - title: undefined, - totalPaid: undefined, + empty: 'Ei tositteita näytettäväksi', + itemCaption__paidForPlan: 'Maksettu {{plan}} {{period}} -paketista', + itemCaption__proratedCredit: 'Suhteutettu hyvitys edellisen tilauksen osittaisesta käytöstä', + itemCaption__subscribedAndPaidForPlan: 'Tilattu ja maksettu {{plan}} {{period}} -paketti', + notFound: 'Tosite ei löytynyt', + tableHeader__amount: 'Summa', + tableHeader__date: 'Päivämäärä', + title: 'Tositteet', + totalPaid: 'Maksettu yhteensä', }, subscriptionsListSection: { - actionLabel__manageSubscription: undefined, - actionLabel__newSubscription: undefined, - actionLabel__switchPlan: undefined, - tableHeader__edit: undefined, - tableHeader__plan: undefined, - tableHeader__startDate: undefined, - title: undefined, + actionLabel__manageSubscription: 'Hallinnoi', + actionLabel__newSubscription: 'Tilaa paketti', + actionLabel__switchPlan: 'Vaihda pakettia', + tableHeader__edit: 'Muokkaa', + tableHeader__plan: 'Paketti', + tableHeader__startDate: 'Aloituspäivä', + title: 'Tilaus', }, subscriptionsSection: { - actionLabel__default: undefined, + actionLabel__default: 'Hallinnoi', }, switchPlansSection: { - title: undefined, + title: 'Vaihda pakettia', }, - title: undefined, + title: 'Laskutus', }, connectedAccountPage: { formHint: 'Valitse palveluntarjoaja yhdistääksesi tilisi.', @@ -1135,10 +1145,10 @@ export const fiFI: LocalizationResource = { successMessage: 'Sähköpostiosoitteesi {{identifier}} on nyt lisätty tilillesi.', }, enterpriseSSOLink: { - formButton: undefined, - formSubtitle: undefined, + formButton: 'Kirjaudu sisään', + formSubtitle: 'Viimeistele kirjautuminen {{identifier}} avulla', }, - formHint: undefined, + formHint: 'Sinun on vahvistettava tämä sähköpostiosoite ennen kuin se voidaan lisätä tilillesi.', removeResource: { messageLine1: '{{identifier}} poistetaan tililtäsi.', messageLine2: @@ -1206,8 +1216,8 @@ export const fiFI: LocalizationResource = { mobileButton__menu: 'Valikko', navbar: { account: 'Profiili', - apiKeys: undefined, - billing: undefined, + apiKeys: 'API-avaimet', + billing: 'Laskutus', description: 'Hallitse tilisi tietoja', security: 'Turvallisuus', title: 'Tili', @@ -1246,7 +1256,7 @@ export const fiFI: LocalizationResource = { verifyTitle: 'Vahvista puhelinnumero', }, plansPage: { - title: undefined, + title: 'Paketit', }, profilePage: { fileDropAreaHint: 'Suositeltu koko 1:1, enintään 10 Mt.', @@ -1267,7 +1277,7 @@ export const fiFI: LocalizationResource = { actionLabel__reauthorize: 'Valtuuta nyt', destructiveActionTitle: 'Poista', primaryButton: 'Yhdistä tili', - subtitle__disconnected: undefined, + subtitle__disconnected: 'Tämän tilin liitos on katkaistu.', subtitle__reauthorize: 'Tarvittavat käyttöoikeudet on päivitetty, ja saatat kokea rajoitettua toiminnallisuutta. Valtuuta tämä sovellus välttääksesi mahdolliset ongelmat.', title: 'Yhdistetyt tilit', @@ -1311,7 +1321,7 @@ export const fiFI: LocalizationResource = { passkeysSection: { menuAction__destructive: 'Poista', menuAction__rename: 'Nimeä uudelleen', - primaryButton: undefined, + primaryButton: 'Lisää pääsyavain', title: 'Pääsyavaimet', }, passwordSection: { @@ -1338,8 +1348,8 @@ export const fiFI: LocalizationResource = { }, web3WalletsSection: { destructiveAction: 'Poista lompakko', - detailsAction__nonPrimary: undefined, - primaryButton: 'Web3-lompakot', + detailsAction__nonPrimary: 'Aseta ensisijaiseksi', + primaryButton: 'Yhdistä lompakko', title: 'Web3-lompakot', web3SelectSolanaWalletScreen: { subtitle: 'Valitse Solana-lompakko yhdistettäväksi tiliisi.', @@ -1363,21 +1373,21 @@ export const fiFI: LocalizationResource = { subtitle__unavailableWallets: 'Ei ole käytettävissä olevia web3-lompakoita yhdistääksesi tilisi.', successMessage: 'Web3-lompakko on lisätty tilillesi.', title: 'Lisää web3-lompakko', - web3WalletButtonsBlockButton: undefined, + web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, waitlist: { start: { actionLink: 'Kirjaudu sisään', actionText: 'Onko sinulla jo pääsy?', - formButton: 'Liity jonoon', + formButton: 'Liity jonotuslistalle', subtitle: 'Syötä sähköpostiosoitteesi ja ilmoitamme sinulle, kun paikkasi on valmis', - title: 'Liity jonoon', + title: 'Liity jonotuslistalle', }, success: { message: 'Sinut ohjataan pian...', - subtitle: 'Olemme yhteydessä, kun paikkasi on valmis', - title: 'Kiitos liittymisestä jonoon!', + subtitle: 'Otamme yhteyttä, kun paikkasi on valmis', + title: 'Kiitos liittymisestä jonotuslistalle!', }, }, web3SolanaWalletButtons: { diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 75e143c13ac..1706cd5e3de 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -231,7 +231,7 @@ export const ptBR: LocalizationResource = { formFieldInputPlaceholder__password: 'Digite sua senha', formFieldInputPlaceholder__phoneNumber: 'Digite seu número de telefone', formFieldInputPlaceholder__username: 'Digite seu nome de usuário', - formFieldInput__emailAddress_format: undefined, + formFieldInput__emailAddress_format: 'Formato de exemplo: nome@exemplo.com', formFieldLabel__apiKey: 'Chave API', formFieldLabel__apiKeyDescription: 'Descrição', formFieldLabel__apiKeyExpiration: 'Expiração', @@ -510,11 +510,11 @@ export const ptBR: LocalizationResource = { }, }, organizationSwitcher: { - action__closeOrganizationSwitcher: undefined, + action__closeOrganizationSwitcher: 'Fechar seletor de organização', action__createOrganization: 'Criar organização', action__invitationAccept: 'Participar', action__manageOrganization: 'Gerenciar organização', - action__openOrganizationSwitcher: undefined, + action__openOrganizationSwitcher: 'Abrir seletor de organização', action__suggestionsAccept: 'Solicitar participação', notSelected: 'Nenhuma organização selecionada', personalWorkspace: 'Conta pessoal', @@ -676,8 +676,8 @@ export const ptBR: LocalizationResource = { title: 'Verifique seu e-mail', }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Selecione a conta corporativa com a qual deseja continuar.', + title: 'Escolha sua conta corporativa', }, forgotPassword: { formTitle: 'Código de redefinição de senha', @@ -710,13 +710,13 @@ export const ptBR: LocalizationResource = { title: 'Insira sua senha', }, passwordCompromised: { - title: undefined, + title: 'Senha comprometida', }, passwordPwned: { title: 'Senha comprometida', }, passwordUntrusted: { - title: undefined, + title: 'Senha não confiável', }, phoneCode: { formTitle: 'Código de verificação', @@ -814,8 +814,8 @@ export const ptBR: LocalizationResource = { }, }, enterpriseConnections: { - subtitle: undefined, - title: undefined, + subtitle: 'Selecione a conta corporativa com a qual deseja continuar.', + title: 'Escolha sua conta corporativa', }, legalConsent: { checkbox: { @@ -909,7 +909,7 @@ export const ptBR: LocalizationResource = { actionLink: 'Sair', actionText: 'Conectado como {{identifier}}', }, - subtitle: undefined, + subtitle: 'Sua conta requer uma nova senha antes de continuar', title: 'Resetar senha', }, unstable__errors: { @@ -928,7 +928,7 @@ export const ptBR: LocalizationResource = { form_identifier_exists__phone_number: 'Telefone já está em uso. Por favor, tente outro.', form_identifier_exists__username: 'Nome de usuário já está em uso. Por favor, tente outro.', form_identifier_not_found: 'Não foi possível encontrar o usuário.', - form_new_password_matches_current: undefined, + form_new_password_matches_current: 'A nova senha não pode ser igual à senha atual.', form_param_format_invalid: 'Formato inválido.', form_param_format_invalid__email_address: 'O endereço de e-mail deve ser um endereço de e-mail válido.', form_param_format_invalid__phone_number: 'Número de telefone precisa estar num formato internacional válido.', @@ -949,7 +949,8 @@ export const ptBR: LocalizationResource = { form_password_pwned__sign_in: 'Esta senha foi comprometida, por favor redefina sua senha.', form_password_size_in_bytes_exceeded: 'Sua senha excedeu o número máximo de bytes permitidos, por favor, encurte-a ou remova alguns caracteres especiais.', - form_password_untrusted__sign_in: undefined, + form_password_untrusted__sign_in: + 'Sua senha pode estar comprometida. Para proteger sua conta, continue com um método de login alternativo. Você precisará redefinir sua senha após o login.', form_password_validation_failed: 'Senha incorreta', form_username_invalid_character: 'Nome de usuário contém caracteres inválidos. Por favor, tente outro.', form_username_invalid_length: 'Nome de usuário deve ter entre 3 e 256 caracteres.', From 64a35f79e9a49dfc140b4c8a8df517b74d46d6c6 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:08:14 -0300 Subject: [PATCH 068/123] feat(clerk-js,shared): Export `useOrganizationCreationDefaults` hook (#7690) --- .changeset/blue-books-return.md | 8 ++ .../tasks/TaskChooseOrganization/index.tsx | 11 +-- packages/nextjs/src/client-boundary/hooks.ts | 2 + packages/nextjs/src/index.ts | 5 ++ .../__snapshots__/exports.test.ts.snap | 1 + packages/react/src/hooks/index.ts | 2 + .../__snapshots__/exports.test.ts.snap | 1 + packages/shared/src/react/hooks/index.ts | 5 ++ .../useOrganizationCreationDefaults.rq.tsx | 66 +++++++++++++++++ .../useOrganizationCreationDefaults.shared.ts | 20 +++++ .../useOrganizationCreationDefaults.swr.tsx | 74 +++++++++++++++++++ .../hooks/useOrganizationCreationDefaults.tsx | 5 ++ .../useOrganizationCreationDefaults.types.ts | 36 +++++++++ packages/shared/src/react/stable-keys.ts | 6 ++ packages/shared/tsconfig.json | 3 + .../__snapshots__/exports.test.ts.snap | 1 + 16 files changed, 238 insertions(+), 8 deletions(-) create mode 100644 .changeset/blue-books-return.md create mode 100644 packages/shared/src/react/hooks/useOrganizationCreationDefaults.rq.tsx create mode 100644 packages/shared/src/react/hooks/useOrganizationCreationDefaults.shared.ts create mode 100644 packages/shared/src/react/hooks/useOrganizationCreationDefaults.swr.tsx create mode 100644 packages/shared/src/react/hooks/useOrganizationCreationDefaults.tsx create mode 100644 packages/shared/src/react/hooks/useOrganizationCreationDefaults.types.ts diff --git a/.changeset/blue-books-return.md b/.changeset/blue-books-return.md new file mode 100644 index 00000000000..377357a585c --- /dev/null +++ b/.changeset/blue-books-return.md @@ -0,0 +1,8 @@ +--- +'@clerk/clerk-js': minor +'@clerk/nextjs': minor +'@clerk/shared': minor +'@clerk/clerk-react': minor +--- + +Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx index 170167214f6..b150389e4de 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/index.tsx @@ -1,13 +1,12 @@ -import { useClerk, useSession, useUser } from '@clerk/shared/react'; +import { useClerk, useOrganizationCreationDefaults, useSession, useUser } from '@clerk/shared/react'; import type { OrganizationCreationDefaultsResource } from '@clerk/shared/types'; import { useState } from 'react'; -import { useEnvironment, useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts'; +import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts'; import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables'; import { Card } from '@/ui/elements/Card'; import { withCardStateProvider } from '@/ui/elements/contexts'; import { Header } from '@/ui/elements/Header'; -import { useFetch } from '@/ui/hooks'; import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions'; import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView'; @@ -18,11 +17,7 @@ import { CreateOrganizationScreen } from './CreateOrganizationScreen'; const TaskChooseOrganizationInternal = () => { const { user } = useUser(); const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView(); - const { organizationSettings } = useEnvironment(); - const organizationCreationDefaults = useFetch( - organizationSettings.organizationCreationDefaults?.enabled ? user?.getOrganizationCreationDefaults : undefined, - 'organization-creation-defaults', - ); + const organizationCreationDefaults = useOrganizationCreationDefaults(); const isLoading = userMemberships?.isLoading || diff --git a/packages/nextjs/src/client-boundary/hooks.ts b/packages/nextjs/src/client-boundary/hooks.ts index c7748535767..6d4e5e68336 100644 --- a/packages/nextjs/src/client-boundary/hooks.ts +++ b/packages/nextjs/src/client-boundary/hooks.ts @@ -4,6 +4,7 @@ export { useClerk, useEmailLink, useOrganization, + useOrganizationCreationDefaults, useOrganizationList, useSession, useSessionList, @@ -12,6 +13,7 @@ export { useUser, useReverification, } from '@clerk/clerk-react'; +export type { UseOrganizationCreationDefaultsParams, UseOrganizationCreationDefaultsReturn } from '@clerk/clerk-react'; export { isClerkAPIResponseError, diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index b9c24e9b7ce..744d1f13f68 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -51,6 +51,7 @@ export { useClerk, useEmailLink, useOrganization, + useOrganizationCreationDefaults, useOrganizationList, useReverification, useSession, @@ -59,6 +60,10 @@ export { useSignUp, useUser, } from './client-boundary/hooks'; +export type { + UseOrganizationCreationDefaultsParams, + UseOrganizationCreationDefaultsReturn, +} from './client-boundary/hooks'; /** * Conditionally export components that exhibit different behavior diff --git a/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap index d18d9ab6027..7a9f5772212 100644 --- a/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap @@ -52,6 +52,7 @@ exports[`root public exports > should not change unexpectedly 1`] = ` "useClerk", "useEmailLink", "useOrganization", + "useOrganizationCreationDefaults", "useOrganizationList", "useReverification", "useSession", diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index 824dedaade5..a7a39722cac 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -5,6 +5,7 @@ export { useSignUp } from './useSignUp'; export { useClerk, useOrganization, + useOrganizationCreationDefaults, useOrganizationList, useSessionList, useUser, @@ -16,3 +17,4 @@ export { __experimental_PaymentElementProvider, __experimental_PaymentElement, } from '@clerk/shared/react'; +export type { UseOrganizationCreationDefaultsParams, UseOrganizationCreationDefaultsReturn } from '@clerk/shared/react'; diff --git a/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap index 6d04f1d2b92..6e6d65b16e2 100644 --- a/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap @@ -47,6 +47,7 @@ exports[`root public exports > should not change unexpectedly 1`] = ` "useClerk", "useEmailLink", "useOrganization", + "useOrganizationCreationDefaults", "useOrganizationList", "useReverification", "useSession", diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 01739678aee..743abbe6e48 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -1,6 +1,11 @@ export { assertContextExists, createContextAndHook } from './createContextAndHook'; export { useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; export { useOrganization } from './useOrganization'; +export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults'; +export type { + UseOrganizationCreationDefaultsParams, + UseOrganizationCreationDefaultsReturn, +} from './useOrganizationCreationDefaults'; export { useOrganizationList } from './useOrganizationList'; export { useAttemptToEnableOrganizations } from './useAttemptToEnableOrganizations'; export { useSafeLayoutEffect } from './useSafeLayoutEffect'; diff --git a/packages/shared/src/react/hooks/useOrganizationCreationDefaults.rq.tsx b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.rq.tsx new file mode 100644 index 00000000000..ca5968661f4 --- /dev/null +++ b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.rq.tsx @@ -0,0 +1,66 @@ +import { eventMethodCalled } from '../../telemetry/events/method-called'; +import type { EnvironmentResource } from '../../types/environment'; +import { defineKeepPreviousDataFn } from '../clerk-rq/keep-previous-data'; +import { useClerkQuery } from '../clerk-rq/useQuery'; +import { useClerkInstanceContext, useUserContext } from '../contexts'; +import { useOrganizationCreationDefaultsCacheKeys } from './useOrganizationCreationDefaults.shared'; +import type { + UseOrganizationCreationDefaultsParams, + UseOrganizationCreationDefaultsReturn, +} from './useOrganizationCreationDefaults.types'; + +/** + * The `useOrganizationCreationDefaults()` hook retrieves the organization creation defaults for the current user. + * + * @example + * ### Basic usage + * + * ```tsx + * import { useOrganizationCreationDefaults } from '@clerk/clerk-react' + * + * export default function CreateOrganizationForm() { + * const { data, isLoading } = useOrganizationCreationDefaults() + * + * if (isLoading) return
Loading...
+ * + * return ( + *
+ * + * + * + *
+ * ) + * } + * ``` + */ +export function useOrganizationCreationDefaults( + params: UseOrganizationCreationDefaultsParams = {}, +): UseOrganizationCreationDefaultsReturn { + const { keepPreviousData = true, enabled = true } = params; + const clerk = useClerkInstanceContext(); + const user = useUserContext(); + + // @ts-expect-error `__unstable__environment` is not typed + const environment = clerk.__unstable__environment as unknown as EnvironmentResource | null | undefined; + const featureEnabled = environment?.organizationSettings?.organizationCreationDefaults?.enabled ?? false; + + clerk.telemetry?.record(eventMethodCalled('useOrganizationCreationDefaults')); + + const { queryKey } = useOrganizationCreationDefaultsCacheKeys({ userId: user?.id ?? null }); + + const queryEnabled = Boolean(user) && enabled && featureEnabled && clerk.loaded; + + const query = useClerkQuery({ + queryKey, + queryFn: user?.getOrganizationCreationDefaults, + enabled: queryEnabled, + placeholderData: defineKeepPreviousDataFn(keepPreviousData), + }); + + return { + data: query.data, + error: (query.error ?? null) as UseOrganizationCreationDefaultsReturn['error'], + isLoading: query.isLoading, + isFetching: query.isFetching, + }; +} diff --git a/packages/shared/src/react/hooks/useOrganizationCreationDefaults.shared.ts b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.shared.ts new file mode 100644 index 00000000000..6a840f30309 --- /dev/null +++ b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.shared.ts @@ -0,0 +1,20 @@ +import { useMemo } from 'react'; + +import { STABLE_KEYS } from '../stable-keys'; +import { createCacheKeys } from './createCacheKeys'; + +export function useOrganizationCreationDefaultsCacheKeys(params: { userId: string | null }) { + const { userId } = params; + return useMemo(() => { + return createCacheKeys({ + stablePrefix: STABLE_KEYS.ORGANIZATION_CREATION_DEFAULTS_KEY, + authenticated: Boolean(userId), + tracked: { + userId: userId ?? null, + }, + untracked: { + args: {}, + }, + }); + }, [userId]); +} diff --git a/packages/shared/src/react/hooks/useOrganizationCreationDefaults.swr.tsx b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.swr.tsx new file mode 100644 index 00000000000..77477d2ba33 --- /dev/null +++ b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.swr.tsx @@ -0,0 +1,74 @@ +import { eventMethodCalled } from '../../telemetry/events/method-called'; +import type { EnvironmentResource } from '../../types/environment'; +import { useSWR } from '../clerk-swr'; +import { useClerkInstanceContext, useUserContext } from '../contexts'; +import { useOrganizationCreationDefaultsCacheKeys } from './useOrganizationCreationDefaults.shared'; +import type { + UseOrganizationCreationDefaultsParams, + UseOrganizationCreationDefaultsReturn, +} from './useOrganizationCreationDefaults.types'; + +/** + * The `useOrganizationCreationDefaults()` hook retrieves the organization creation defaults for the current user. + * + * @example + * ### Basic usage + * + * ```tsx + * import { useOrganizationCreationDefaults } from '@clerk/clerk-react' + * + * export default function CreateOrganizationForm() { + * const { data, isLoading } = useOrganizationCreationDefaults() + * + * if (isLoading) return
Loading...
+ * + * return ( + *
+ * + * + * + *
+ * ) + * } + * ``` + */ +function useOrganizationCreationDefaultsHook( + params: UseOrganizationCreationDefaultsParams = {}, +): UseOrganizationCreationDefaultsReturn { + const { keepPreviousData = true, enabled = true } = params; + const clerk = useClerkInstanceContext(); + const user = useUserContext(); + + // @ts-expect-error `__unstable__environment` is not typed + const environment = clerk.__unstable__environment as unknown as EnvironmentResource | null | undefined; + const featureEnabled = environment?.organizationSettings?.organizationCreationDefaults?.enabled ?? false; + + clerk.telemetry?.record(eventMethodCalled('useOrganizationCreationDefaults')); + + const { queryKey } = useOrganizationCreationDefaultsCacheKeys({ userId: user?.id ?? null }); + + const queryEnabled = Boolean(user) && enabled && featureEnabled && clerk.loaded; + + const swr = useSWR( + queryEnabled ? queryKey : null, + () => { + if (!user) { + throw new Error('User is required to fetch organization creation defaults'); + } + return user.getOrganizationCreationDefaults(); + }, + { + dedupingInterval: 1_000 * 60, + keepPreviousData, + }, + ); + + return { + data: swr.data, + error: (swr.error ?? null) as UseOrganizationCreationDefaultsReturn['error'], + isLoading: swr.isLoading, + isFetching: swr.isValidating, + }; +} + +export { useOrganizationCreationDefaultsHook as useOrganizationCreationDefaults }; diff --git a/packages/shared/src/react/hooks/useOrganizationCreationDefaults.tsx b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.tsx new file mode 100644 index 00000000000..308d41d1245 --- /dev/null +++ b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.tsx @@ -0,0 +1,5 @@ +export { useOrganizationCreationDefaults } from 'virtual:data-hooks/useOrganizationCreationDefaults'; +export type { + UseOrganizationCreationDefaultsParams, + UseOrganizationCreationDefaultsReturn, +} from './useOrganizationCreationDefaults.types'; diff --git a/packages/shared/src/react/hooks/useOrganizationCreationDefaults.types.ts b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.types.ts new file mode 100644 index 00000000000..38af7290d7d --- /dev/null +++ b/packages/shared/src/react/hooks/useOrganizationCreationDefaults.types.ts @@ -0,0 +1,36 @@ +import type { ClerkAPIResponseError } from '../../errors/clerkApiResponseError'; +import type { OrganizationCreationDefaultsResource } from '../../types'; + +export type UseOrganizationCreationDefaultsParams = { + /** + * If true, the previous data will be kept in the cache until new data is fetched. + * + * @default true + */ + keepPreviousData?: boolean; + /** + * If `true`, a request will be triggered when the hook is mounted. + * + * @default true + */ + enabled?: boolean; +}; + +export type UseOrganizationCreationDefaultsReturn = { + /** + * The organization creation defaults resource, `undefined` before the first fetch, or `null` if not available. + */ + data: OrganizationCreationDefaultsResource | undefined | null; + /** + * Any error that occurred during the data fetch, or `null` if no error occurred. + */ + error: ClerkAPIResponseError | null; + /** + * A boolean that indicates whether the initial data is still being fetched. + */ + isLoading: boolean; + /** + * A boolean that indicates whether any request is still in flight, including background updates. + */ + isFetching: boolean; +}; diff --git a/packages/shared/src/react/stable-keys.ts b/packages/shared/src/react/stable-keys.ts index ef597662235..01122e0b1e6 100644 --- a/packages/shared/src/react/stable-keys.ts +++ b/packages/shared/src/react/stable-keys.ts @@ -12,6 +12,9 @@ const INVITATIONS_KEY = 'invitations'; // Keys for `useAPIKeys` const API_KEYS_KEY = 'apiKeys'; +// Keys for `useOrganizationCreationDefaults` +const ORGANIZATION_CREATION_DEFAULTS_KEY = 'organizationCreationDefaults'; + // Keys for `usePlans` const PLANS_KEY = 'billing-plans'; @@ -48,6 +51,9 @@ export const STABLE_KEYS = { // Keys for `useAPIKeys` API_KEYS_KEY, + + // Keys for `useOrganizationCreationDefaults` + ORGANIZATION_CREATION_DEFAULTS_KEY, } as const; export type ResourceCacheStableKey = (typeof STABLE_KEYS)[keyof typeof STABLE_KEYS]; diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 27300eb64f4..e1e5f2e5b45 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -30,6 +30,9 @@ "virtual:data-hooks/useStatementQuery": ["./src/react/hooks/useStatementQuery.swr.tsx"], "virtual:data-hooks/usePaymentAttemptQuery": ["./src/react/hooks/usePaymentAttemptQuery.swr.tsx"], "virtual:data-hooks/usePlanDetailsQuery": ["./src/react/hooks/usePlanDetailsQuery.swr.tsx"], + "virtual:data-hooks/useOrganizationCreationDefaults": [ + "./src/react/hooks/useOrganizationCreationDefaults.swr.tsx" + ], "virtual:data-hooks/useInitializePaymentMethod": ["./src/react/billing/useInitializePaymentMethod.swr.tsx"], "virtual:data-hooks/useStripeClerkLibs": ["./src/react/billing/useStripeClerkLibs.swr.tsx"], "virtual:data-hooks/useStripeLoader": ["./src/react/billing/useStripeLoader.swr.tsx"] diff --git a/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap index 3d3eb5e00bd..eca649e8e36 100644 --- a/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/tanstack-react-start/src/__tests__/__snapshots__/exports.test.ts.snap @@ -57,6 +57,7 @@ exports[`root public exports > should not change unexpectedly 1`] = ` "useClerk", "useEmailLink", "useOrganization", + "useOrganizationCreationDefaults", "useOrganizationList", "useReverification", "useSession", From ce03902429aacfdee4364b386d15bbef0c516245 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:34:09 -0300 Subject: [PATCH 069/123] fix(repo): Add missing packages to changeset (#7695) --- .changeset/blue-books-return.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.changeset/blue-books-return.md b/.changeset/blue-books-return.md index 377357a585c..8656688b2fa 100644 --- a/.changeset/blue-books-return.md +++ b/.changeset/blue-books-return.md @@ -1,4 +1,7 @@ --- +'@clerk/tanstack-react-start': minor +'@clerk/chrome-extension': minor +'@clerk/react-router': minor '@clerk/clerk-js': minor '@clerk/nextjs': minor '@clerk/shared': minor From 717ab4f6c7f8703322c0c959b073bb6595465acc Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:35:36 -0500 Subject: [PATCH 070/123] ci(repo): Version packages (Core 2) (#7671) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/blue-books-return.md | 11 ----------- .changeset/blue-plums-sin.md | 5 ----- .changeset/fifty-flies-repeat.md | 5 ----- .changeset/tangy-sides-crash.md | 5 ----- .changeset/two-ladybugs-run.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 9 +++++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 13 +++++++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 12 ++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 ++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 13 +++++++++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 16 ++++++++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 14 ++++++++++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 11 +++++++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 ++++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 14 ++++++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 49 files changed, 242 insertions(+), 53 deletions(-) delete mode 100644 .changeset/blue-books-return.md delete mode 100644 .changeset/blue-plums-sin.md delete mode 100644 .changeset/fifty-flies-repeat.md delete mode 100644 .changeset/tangy-sides-crash.md delete mode 100644 .changeset/two-ladybugs-run.md diff --git a/.changeset/blue-books-return.md b/.changeset/blue-books-return.md deleted file mode 100644 index 8656688b2fa..00000000000 --- a/.changeset/blue-books-return.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@clerk/tanstack-react-start': minor -'@clerk/chrome-extension': minor -'@clerk/react-router': minor -'@clerk/clerk-js': minor -'@clerk/nextjs': minor -'@clerk/shared': minor -'@clerk/clerk-react': minor ---- - -Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules diff --git a/.changeset/blue-plums-sin.md b/.changeset/blue-plums-sin.md deleted file mode 100644 index 16694604058..00000000000 --- a/.changeset/blue-plums-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Updated Hebrew localization placeholders for user input fields diff --git a/.changeset/fifty-flies-repeat.md b/.changeset/fifty-flies-repeat.md deleted file mode 100644 index 8c63a788f48..00000000000 --- a/.changeset/fifty-flies-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/localizations': patch ---- - -Update translations for locales: Spanish (es-ES) billing page improvements, Portuguese (pt-BR) enterprise connections and password errors, and comprehensive Finnish (fi-FI) updates across authentication, billing, and organization management. diff --git a/.changeset/tangy-sides-crash.md b/.changeset/tangy-sides-crash.md deleted file mode 100644 index 318a91808ce..00000000000 --- a/.changeset/tangy-sides-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/nextjs': patch ---- - -Updates middleware location check to account for proxy.ts in next 16+ applications. diff --git a/.changeset/two-ladybugs-run.md b/.changeset/two-ladybugs-run.md deleted file mode 100644 index 5ad58c377c5..00000000000 --- a/.changeset/two-ladybugs-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Updated es-ES translations for billing diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 0a9386a7c25..dac4fe0a48b 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.18 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 0.2.17 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index 3b22238f88d..3e5ffb39500 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.17", + "version": "0.2.18", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 56e34f70607..b954f4ef6f7 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 2.16.16 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 2.16.15 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 6beaa08b618..54a989e4405 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.15", + "version": "2.16.16", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index b6c6d327027..eeb7e55454d 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.29.6 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/types@4.101.14 + ## 2.29.5 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index a90db94e932..8f679f75f59 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.29.5", + "version": "2.29.6", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 721cf25ac33..5fe327716e1 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 2.9.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/clerk-js@5.122.0 + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + ## 2.8.20 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index dc32079ca16..b9b7a880f18 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.8.20", + "version": "2.9.0", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 2a652b57421..f802c94db4f 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## 5.122.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6), [`71b20f1`](https://github.com/clerk/javascript/commit/71b20f126042a55148a9da146dcedd672a230811), [`aebb8df`](https://github.com/clerk/javascript/commit/aebb8df24f19a932ef4663ee2c7c93a535d314f9), [`71b20f1`](https://github.com/clerk/javascript/commit/71b20f126042a55148a9da146dcedd672a230811)]: + - @clerk/shared@3.44.0 + - @clerk/localizations@3.35.3 + ## 5.121.1 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index e18cf3e6ac1..5abcd21c0c2 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.121.1", + "version": "5.122.0", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 72a9bd34bba..450ccbd94d6 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.7 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/types@4.101.14 + ## 0.24.6 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 93a80d70e70..bf44de77419 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.6", + "version": "0.24.7", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 01d15322bce..5c725f5c5b1 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.33 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + ## 0.4.32 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 9d2a4983e89..1a67a240e53 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.32", + "version": "0.4.33", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 1f5f873854c..ce414b4d03a 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.19.21 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/clerk-js@5.122.0 + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/types@4.101.14 + ## 2.19.20 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 769c0b0443d..259149102ad 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.20", + "version": "2.19.21", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index a06b18b192a..12b8b2cbd25 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.66 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 1.7.65 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 52964be7159..8d004ffdd2a 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.65", + "version": "1.7.66", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 1d9baa4efa2..94d99798b43 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.18 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 2.6.17 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 50ab555cde3..bdc47e1ce42 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.17", + "version": "2.6.18", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 8811d07cb9a..ff147d43b42 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 3.35.3 + +### Patch Changes + +- Updated Hebrew localization placeholders for user input fields ([#7669](https://github.com/clerk/javascript/pull/7669)) by [@wobsoriano](https://github.com/wobsoriano) + +- Update translations for locales: Spanish (es-ES) billing page improvements, Portuguese (pt-BR) enterprise connections and password errors, and comprehensive Finnish (fi-FI) updates across authentication, billing, and organization management. ([#7683](https://github.com/clerk/javascript/pull/7683)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated es-ES translations for billing ([#7669](https://github.com/clerk/javascript/pull/7669)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies []: + - @clerk/types@4.101.14 + ## 3.35.2 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index bc02119fbd6..e3171531482 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.35.2", + "version": "3.35.3", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 73bc2e54ab0..2dc91130296 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,21 @@ # Change Log +## 6.37.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updates middleware location check to account for proxy.ts in next 16+ applications. ([#7269](https://github.com/clerk/javascript/pull/7269)) by [@alexcarpenter](https://github.com/alexcarpenter) + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 6.36.10 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index b0bb4e714c7..a2d542926c4 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.36.10", + "version": "6.37.0", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index f6e729ddf1f..65fb66cbac0 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.16 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + - @clerk/vue@1.17.11 + ## 1.13.15 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index b6849e692dd..9038fec56de 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.15", + "version": "1.13.16", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 358d5f4be84..050a0f9c302 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 2.4.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 2.3.12 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 9a0c3191553..c09da8ea226 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.3.12", + "version": "2.4.0", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index e3c0aa78211..c25f903b1ed 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## 5.60.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + ## 5.59.6 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index f82f1f1baf4..dbbc4bbd262 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.59.6", + "version": "5.60.0", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 45da39c7a3e..5dc9409dd3d 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.33 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 4.13.32 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 05647e6fd08..db2175303ec 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.32", + "version": "4.13.33", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index e4f393663e9..c57b077d6d0 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.44.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + ## 3.43.2 ### Patch Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 93676ca1ba0..9fc24c91b14 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.43.2", + "version": "3.44.0", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 57c8b8a912d..7da4309b86a 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,19 @@ # @clerk/tanstack-react-start +## 0.28.0 + +### Minor Changes + +- Export `useOrganizationCreationDefaults` hook to fetch suggested organization name and logo from default naming rules ([#7690](https://github.com/clerk/javascript/pull/7690)) by [@LauraBeatris](https://github.com/LauraBeatris) + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/clerk-react@5.60.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 0.27.17 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index ddfffdd0efb..228eb958110 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.27.17", + "version": "0.28.0", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 4b32a408ff3..c96266225ec 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.32 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/backend@2.29.6 + - @clerk/types@4.101.14 + ## 1.13.31 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index ade26094f15..0a6d51c1546 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.31", + "version": "1.13.32", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 786fcdc8b96..37afe19e63e 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.51 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + ## 2.4.50 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 8cf8aebef5a..30fb9682ad4 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.50", + "version": "2.4.51", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index cf88626e258..40429e01665 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.14 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + ## 4.101.13 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 8545c650001..2cc51e62d98 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.13", + "version": "4.101.14", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index e93acb949ca..227ca81f22b 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.11 + +### Patch Changes + +- Updated dependencies [[`64a35f7`](https://github.com/clerk/javascript/commit/64a35f79e9a49dfc140b4c8a8df517b74d46d6c6)]: + - @clerk/shared@3.44.0 + - @clerk/types@4.101.14 + ## 1.17.10 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 91863a964a6..37f22631141 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.10", + "version": "1.17.11", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 559cd84a320a1d808fb38c404f31437046198123 Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Thu, 29 Jan 2026 14:17:28 -0600 Subject: [PATCH 071/123] fix(backend): correct `createInvitationBulk` return type to `Promise` (#7702) Co-authored-by: Mario Jerkovic --- .changeset/spotty-terms-heal.md | 5 +++++ packages/backend/src/api/endpoints/InvitationApi.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/spotty-terms-heal.md diff --git a/.changeset/spotty-terms-heal.md b/.changeset/spotty-terms-heal.md new file mode 100644 index 00000000000..3d1b355f208 --- /dev/null +++ b/.changeset/spotty-terms-heal.md @@ -0,0 +1,5 @@ +--- +'@clerk/backend': patch +--- + +fix: correct `createInvitationBulk` return type to `Promise` diff --git a/packages/backend/src/api/endpoints/InvitationApi.ts b/packages/backend/src/api/endpoints/InvitationApi.ts index f869234ec99..40ecebd9e86 100644 --- a/packages/backend/src/api/endpoints/InvitationApi.ts +++ b/packages/backend/src/api/endpoints/InvitationApi.ts @@ -67,7 +67,7 @@ export class InvitationAPI extends AbstractAPI { } public async createInvitationBulk(params: CreateBulkParams) { - return this.request({ + return this.request({ method: 'POST', path: joinPaths(basePath, 'bulk'), bodyParams: params, From df2b381cacbf3bec0109fb8de0b86b982d2d5893 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Thu, 29 Jan 2026 16:41:37 -0800 Subject: [PATCH 072/123] fix(astro): Automatically use CSR control components for prerendered pages (#7708) --- .changeset/pink-dingos-exercise.md | 5 ++++ .../astro-node/src/pages/index.astro | 5 ++++ .../astro-node/src/pages/prerendered.astro | 25 ++++++++++++++++ integration/tests/astro/components.test.ts | 30 +++++++++++++++++++ .../astro-components/control/Protect.astro | 5 +++- .../astro-components/control/ProtectCSR.astro | 2 +- .../astro-components/control/SignedIn.astro | 5 +++- .../astro-components/control/SignedOut.astro | 5 +++- 8 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 .changeset/pink-dingos-exercise.md create mode 100644 integration/templates/astro-node/src/pages/prerendered.astro diff --git a/.changeset/pink-dingos-exercise.md b/.changeset/pink-dingos-exercise.md new file mode 100644 index 00000000000..2fb1f4cdb76 --- /dev/null +++ b/.changeset/pink-dingos-exercise.md @@ -0,0 +1,5 @@ +--- +"@clerk/astro": patch +--- + +Fixed an error when using Control components (``, ``) in prerendered pages diff --git a/integration/templates/astro-node/src/pages/index.astro b/integration/templates/astro-node/src/pages/index.astro index 089eac14653..2f773ce2930 100644 --- a/integration/templates/astro-node/src/pages/index.astro +++ b/integration/templates/astro-node/src/pages/index.astro @@ -64,6 +64,11 @@ import { SignedIn, SignedOut, SignOutButton, OrganizationSwitcher } from '@clerk title='For members' body='Learn how Astro works and explore the official API docs.' /> + diff --git a/integration/templates/astro-node/src/pages/prerendered.astro b/integration/templates/astro-node/src/pages/prerendered.astro new file mode 100644 index 00000000000..c9d79d9d9b1 --- /dev/null +++ b/integration/templates/astro-node/src/pages/prerendered.astro @@ -0,0 +1,25 @@ +--- +import { SignedIn, SignedOut } from '@clerk/astro/components'; +import Layout from '../layouts/Layout.astro'; + +// This page is prerendered at build time despite output: 'server' mode +export const prerender = true; +--- + + +

Prerendered Page with Clerk Components

+ +

This page is statically generated at build time (prerender = true) in server output mode.

+ + +
+

✅ You are signed in! (This content should be hidden initially and shown after client-side auth check)

+
+
+ + +
+

🔒 You are signed out. (This content should be visible initially for signed-out users)

+
+
+
diff --git a/integration/tests/astro/components.test.ts b/integration/tests/astro/components.test.ts index 93e8f21b35b..77f76f15468 100644 --- a/integration/tests/astro/components.test.ts +++ b/integration/tests/astro/components.test.ts @@ -511,4 +511,34 @@ testAgainstRunningApps({ withPattern: ['astro.node.withCustomRoles'] })('basic f // await expect(u.page.getByText('Loading')).toBeHidden(); await expect(u.page.getByText("I'm an admin")).toBeVisible(); }); + + test('prerendered page with control components works correctly', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + + // Test while signed out + await u.page.goToRelative('/prerendered'); + await u.page.waitForClerkJsLoaded(); + await u.po.expect.toBeSignedOut(); + + // Verify SignedOut content is visible and SignedIn is hidden + await expect(u.page.locator('#signed-out-content')).toBeVisible(); + await expect(u.page.locator('#signed-in-content')).toBeHidden(); + + // Sign in + await u.page.goToRelative('/sign-in'); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ + email: fakeAdmin.email, + password: fakeAdmin.password, + }); + await u.po.expect.toBeSignedIn(); + + // Visit prerendered page again while signed in + await u.page.goToRelative('/prerendered'); + await u.page.waitForClerkJsLoaded(); + + // Verify SignedIn content is visible and SignedOut is hidden + await expect(u.page.locator('#signed-in-content')).toBeVisible(); + await expect(u.page.locator('#signed-out-content')).toBeHidden(); + }); }); diff --git a/packages/astro/src/astro-components/control/Protect.astro b/packages/astro/src/astro-components/control/Protect.astro index c7e039987f4..d2d2f2263f6 100644 --- a/packages/astro/src/astro-components/control/Protect.astro +++ b/packages/astro/src/astro-components/control/Protect.astro @@ -26,7 +26,10 @@ type Props = ProtectProps & { const { isStatic, ...props } = Astro.props; -const ProtectComponent = isStaticOutput(isStatic) ? ProtectCSR : ProtectSSR; +// If user explicitly sets isStatic prop, honor it +// Otherwise, detect based on runtime (whether auth function exists) +const shouldUseCSR = isStatic !== undefined ? isStaticOutput(isStatic) : !Astro.locals.auth; +const ProtectComponent = shouldUseCSR ? ProtectCSR : ProtectSSR; // Note: Astro server islands also use a "fallback" slot for loading states // See: https://docs.astro.build/en/guides/server-islands/#server-island-fallback-content diff --git a/packages/astro/src/astro-components/control/ProtectCSR.astro b/packages/astro/src/astro-components/control/ProtectCSR.astro index cee284935c5..e3aa5ca8f3c 100644 --- a/packages/astro/src/astro-components/control/ProtectCSR.astro +++ b/packages/astro/src/astro-components/control/ProtectCSR.astro @@ -44,7 +44,7 @@ const { diff --git a/integration/tests/astro/billingStore.test.ts b/integration/tests/astro/billingStore.test.ts new file mode 100644 index 00000000000..4f2adc5651d --- /dev/null +++ b/integration/tests/astro/billingStore.test.ts @@ -0,0 +1,36 @@ +import { expect, test } from '@playwright/test'; + +import type { Application } from '../../models/application'; +import { appConfigs } from '../../presets'; +import { createTestUtils } from '../../testUtils'; + +test.describe('Astro billingStore @astro @billing', () => { + test.describe.configure({ mode: 'parallel' }); + let app: Application; + + test.beforeAll(async () => { + test.setTimeout(90_000); // Wait for app to be ready + + app = await appConfigs.astro.node.clone().commit(); + + await app.setup(); + await app.withEnv(appConfigs.envs.withBilling); + await app.dev(); + }); + + test.afterAll(async () => { + await app.teardown(); + }); + + test('should render plans from getPlans()', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + await u.page.goToRelative('/billing/billing-store'); + + await u.page.waitForClerkJsLoaded(); + + await expect(u.page.getByText('Free')).toBeVisible(); + await expect(u.page.getByText('Plus')).toBeVisible(); + await expect(u.page.getByText('Pro')).toBeVisible(); + await expect(u.page.getByText('Trial')).toBeVisible(); + }); +}); diff --git a/packages/astro/src/stores/external.ts b/packages/astro/src/stores/external.ts index bdebe805116..252c8bb9f9d 100644 --- a/packages/astro/src/stores/external.ts +++ b/packages/astro/src/stores/external.ts @@ -114,6 +114,16 @@ export const $signInStore = computed([$clientStore], client => client?.signIn); */ export const $signUpStore = computed([$clientStore], client => client?.signUp); +/** + * A client side store that is populated after clerk-js has loaded. + * The store returns a `BillingNamespace` or `null`. + * It is a nanostore, for instructions on how to use nanostores please review the [documentation](https://github.com/nanostores/nanostores) + * + * @example + * $billingStore.subscribe((billing) => billing.getPlans().then((plans) => console.log(plans.data.length))) + */ +export const $billingStore = computed([$clerk], clerk => clerk?.billing); + /** * Records a telemetry event when a store is used to match React hooks telemetry. * From 1ee809254854cf59bc1c17e4f8c8bfd5cb9d30d9 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Mon, 2 Feb 2026 17:49:24 -0800 Subject: [PATCH 077/123] chore(tanstack-react-start): Bump minimum version and replace deprecated API (#7720) --- .changeset/fast-paws-promise.md | 5 + .../tanstack-react-start/package.json | 10 +- .../tanstack-react-start/src/routeTree.gen.ts | 62 +- .../src/routes/{sign-in.tsx => sign-in.$.tsx} | 2 +- .../tanstack-react-start/vite.config.ts | 9 + packages/tanstack-react-start/package.json | 8 +- .../src/server/clerkMiddleware.ts | 4 +- pnpm-lock.yaml | 2213 ++++++++--------- 8 files changed, 1161 insertions(+), 1152 deletions(-) create mode 100644 .changeset/fast-paws-promise.md rename integration/templates/tanstack-react-start/src/routes/{sign-in.tsx => sign-in.$.tsx} (77%) diff --git a/.changeset/fast-paws-promise.md b/.changeset/fast-paws-promise.md new file mode 100644 index 00000000000..b079e1c66d8 --- /dev/null +++ b/.changeset/fast-paws-promise.md @@ -0,0 +1,5 @@ +--- +"@clerk/tanstack-react-start": minor +--- + +Bumped minimum required TanStack Start dependencies to 1.157.0+ and removed usage of deprecated `json()` in favor of standard Web APIs. diff --git a/integration/templates/tanstack-react-start/package.json b/integration/templates/tanstack-react-start/package.json index bf45f3efb8d..7121e87e555 100644 --- a/integration/templates/tanstack-react-start/package.json +++ b/integration/templates/tanstack-react-start/package.json @@ -8,11 +8,11 @@ "start": "vite start --port=$PORT" }, "dependencies": { - "@tanstack/react-router": "1.132.47", - "@tanstack/react-router-devtools": "1.132.51", - "@tanstack/react-start": "1.132.51", - "react": "18.3.1", - "react-dom": "18.3.1", + "@tanstack/react-router": "1.157.16", + "@tanstack/react-router-devtools": "1.157.16", + "@tanstack/react-start": "1.157.16", + "react": "^19.0.0", + "react-dom": "^19.0.0", "tailwind-merge": "^2.5.4" }, "devDependencies": { diff --git a/integration/templates/tanstack-react-start/src/routeTree.gen.ts b/integration/templates/tanstack-react-start/src/routeTree.gen.ts index fd38a624939..20c9b2a203a 100644 --- a/integration/templates/tanstack-react-start/src/routeTree.gen.ts +++ b/integration/templates/tanstack-react-start/src/routeTree.gen.ts @@ -9,12 +9,13 @@ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. import { Route as rootRouteImport } from './routes/__root'; -import { Route as SignInRouteImport } from './routes/sign-in'; +import { Route as UserRouteImport } from './routes/user'; import { Route as IndexRouteImport } from './routes/index'; +import { Route as SignInSplatRouteImport } from './routes/sign-in.$'; -const SignInRoute = SignInRouteImport.update({ - id: '/sign-in', - path: '/sign-in', +const UserRoute = UserRouteImport.update({ + id: '/user', + path: '/user', getParentRoute: () => rootRouteImport, } as any); const IndexRoute = IndexRouteImport.update({ @@ -22,35 +23,51 @@ const IndexRoute = IndexRouteImport.update({ path: '/', getParentRoute: () => rootRouteImport, } as any); +const SignInSplatRoute = SignInSplatRouteImport.update({ + id: '/sign-in/$', + path: '/sign-in/$', + getParentRoute: () => rootRouteImport, +} as any); export interface FileRoutesByFullPath { '/': typeof IndexRoute; - '/sign-in': typeof SignInRoute; + '/user': typeof UserRoute; + '/sign-in/$': typeof SignInSplatRoute; } export interface FileRoutesByTo { '/': typeof IndexRoute; - '/sign-in': typeof SignInRoute; + '/user': typeof UserRoute; + '/sign-in/$': typeof SignInSplatRoute; } export interface FileRoutesById { __root__: typeof rootRouteImport; '/': typeof IndexRoute; - '/sign-in': typeof SignInRoute; + '/user': typeof UserRoute; + '/sign-in/$': typeof SignInSplatRoute; } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath; - fullPaths: '/' | '/sign-in'; + fullPaths: '/' | '/user' | '/sign-in/$'; fileRoutesByTo: FileRoutesByTo; - to: '/' | '/sign-in'; - id: '__root__' | '/' | '/sign-in'; + to: '/' | '/user' | '/sign-in/$'; + id: '__root__' | '/' | '/user' | '/sign-in/$'; fileRoutesById: FileRoutesById; } export interface RootRouteChildren { IndexRoute: typeof IndexRoute; - SignInRoute: typeof SignInRoute; + UserRoute: typeof UserRoute; + SignInSplatRoute: typeof SignInSplatRoute; } declare module '@tanstack/react-router' { interface FileRoutesByPath { + '/user': { + id: '/user'; + path: '/user'; + fullPath: '/user'; + preLoaderRoute: typeof UserRouteImport; + parentRoute: typeof rootRouteImport; + }; '/': { id: '/'; path: '/'; @@ -58,11 +75,11 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof IndexRouteImport; parentRoute: typeof rootRouteImport; }; - '/sign-in': { - id: '/sign-in'; - path: '/sign-in'; - fullPath: '/sign-in'; - preLoaderRoute: typeof SignInRouteImport; + '/sign-in/$': { + id: '/sign-in/$'; + path: '/sign-in/$'; + fullPath: '/sign-in/$'; + preLoaderRoute: typeof SignInSplatRouteImport; parentRoute: typeof rootRouteImport; }; } @@ -70,6 +87,17 @@ declare module '@tanstack/react-router' { const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, - SignInRoute: SignInRoute, + UserRoute: UserRoute, + SignInSplatRoute: SignInSplatRoute, }; export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes(); + +import type { getRouter } from './router.tsx'; +import type { startInstance } from './start.ts'; +declare module '@tanstack/react-start' { + interface Register { + ssr: true; + router: Awaited>; + config: Awaited>; + } +} diff --git a/integration/templates/tanstack-react-start/src/routes/sign-in.tsx b/integration/templates/tanstack-react-start/src/routes/sign-in.$.tsx similarity index 77% rename from integration/templates/tanstack-react-start/src/routes/sign-in.tsx rename to integration/templates/tanstack-react-start/src/routes/sign-in.$.tsx index 353ccdcf24a..66cec812b17 100644 --- a/integration/templates/tanstack-react-start/src/routes/sign-in.tsx +++ b/integration/templates/tanstack-react-start/src/routes/sign-in.$.tsx @@ -1,7 +1,7 @@ import { SignIn } from '@clerk/tanstack-react-start'; import { createFileRoute } from '@tanstack/react-router'; -export const Route = createFileRoute('/sign-in')({ +export const Route = createFileRoute('/sign-in/$')({ component: Page, }); diff --git a/integration/templates/tanstack-react-start/vite.config.ts b/integration/templates/tanstack-react-start/vite.config.ts index bce0dc21dd9..18ebce4167f 100644 --- a/integration/templates/tanstack-react-start/vite.config.ts +++ b/integration/templates/tanstack-react-start/vite.config.ts @@ -13,4 +13,13 @@ export default defineConfig({ tailwindcss(), viteReact(), ], + // See https://github.com/TanStack/router/issues/5738 + resolve: { + alias: [ + { + find: 'use-sync-external-store/shim/index.js', + replacement: 'react', + }, + ], + }, }); diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 17517416f45..c501a4ed71b 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -81,13 +81,13 @@ "tslib": "catalog:repo" }, "devDependencies": { - "@tanstack/react-router": "1.132.0", - "@tanstack/react-start": "1.132.0", + "@tanstack/react-router": "1.157.16", + "@tanstack/react-start": "1.157.16", "esbuild-plugin-file-path-extensions": "^2.1.4" }, "peerDependencies": { - "@tanstack/react-router": "^1.132.0", - "@tanstack/react-start": "^1.132.0", + "@tanstack/react-router": "^1.157.0", + "@tanstack/react-start": "^1.157.0", "react": "catalog:peer-react", "react-dom": "catalog:peer-react" }, diff --git a/packages/tanstack-react-start/src/server/clerkMiddleware.ts b/packages/tanstack-react-start/src/server/clerkMiddleware.ts index dd4c77d97e3..572b9e37355 100644 --- a/packages/tanstack-react-start/src/server/clerkMiddleware.ts +++ b/packages/tanstack-react-start/src/server/clerkMiddleware.ts @@ -3,7 +3,7 @@ import { AuthStatus, constants, createClerkRequest } from '@clerk/backend/intern import { handleNetlifyCacheInDevInstance } from '@clerk/shared/netlifyCacheHandler'; import type { PendingSessionOptions } from '@clerk/types'; import type { AnyRequestMiddleware } from '@tanstack/react-start'; -import { createMiddleware, json } from '@tanstack/react-start'; +import { createMiddleware } from '@tanstack/react-start'; import { clerkClient } from './clerkClient'; import { loadOptions } from './loadOptions'; @@ -28,7 +28,7 @@ export const clerkMiddleware = (options?: ClerkMiddlewareOptions): AnyRequestMid }); // Trigger a handshake redirect // eslint-disable-next-line @typescript-eslint/only-throw-error - throw json(null, { status: 307, headers: requestState.headers }); + throw new Response(null, { status: 307, headers: requestState.headers }); } if (requestState.status === AuthStatus.Handshake) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e18b9953f2..f23f4cb8ce4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -264,7 +264,7 @@ importers: version: 1.2.2 ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.2.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) tsdown: specifier: catalog:repo version: 0.15.7(publint@0.3.12)(typescript@5.8.3) @@ -427,7 +427,7 @@ importers: dependencies: '@base-org/account': specifier: 2.0.1 - version: 2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.6.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@clerk/localizations': specifier: workspace:^ version: link:../localizations @@ -457,7 +457,7 @@ importers: version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': specifier: 0.15.39 - version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-standard': specifier: 1.1.4 version: 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) @@ -569,7 +569,7 @@ importers: version: 14.1.0 jscodeshift: specifier: ^17.3.0 - version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.6)) packages/elements: dependencies: @@ -621,7 +621,7 @@ importers: version: 9.2.1 next: specifier: 14.2.33 - version: 14.2.33(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.33(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) packages/expo: dependencies: @@ -648,7 +648,7 @@ importers: version: 18.3.1(react@18.3.1) react-native-url-polyfill: specifier: 2.0.0 - version: 2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + version: 2.0.0(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) tslib: specifier: catalog:repo version: 2.8.1 @@ -661,25 +661,25 @@ importers: version: 1.0.2 expo-apple-authentication: specifier: ^7.2.4 - version: 7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + version: 7.2.4(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) expo-auth-session: specifier: ^5.4.0 - version: 5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + version: 5.4.0(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-crypto: specifier: ^15.0.7 - version: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + version: 15.0.7(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-local-authentication: specifier: ^13.8.0 - version: 13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + version: 13.8.0(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-secure-store: specifier: ^12.8.1 - version: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + version: 12.8.1(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-web-browser: specifier: ^12.8.2 - version: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + version: 12.8.2(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) react-native: specifier: ^0.81.4 - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + version: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) packages/expo-passkeys: dependencies: @@ -691,11 +691,11 @@ importers: version: 18.3.1 react-native: specifier: '*' - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + version: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) devDependencies: expo: specifier: ~52.0.47 - version: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + version: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) packages/express: dependencies: @@ -785,7 +785,7 @@ importers: version: 2.1.0 next: specifier: 14.2.33 - version: 14.2.33(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.33(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) packages/nuxt: dependencies: @@ -991,11 +991,11 @@ importers: version: 2.8.1 devDependencies: '@tanstack/react-router': - specifier: 1.132.0 - version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.157.16 + version: 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': - specifier: 1.132.0 - version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + specifier: 1.157.16 + version: 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) esbuild-plugin-file-path-extensions: specifier: ^2.1.4 version: 2.1.4 @@ -1078,7 +1078,7 @@ importers: version: 4.1.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) jscodeshift: specifier: ^17.0.0 - version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.6)) marked: specifier: ^11.1.1 version: 11.2.0 @@ -1100,10 +1100,10 @@ importers: devDependencies: '@babel/cli': specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.28.4) + version: 7.24.7(@babel/core@7.28.6) '@babel/preset-react': specifier: ^7.24.7 - version: 7.26.3(@babel/core@7.28.4) + version: 7.26.3(@babel/core@7.28.6) '@types/jscodeshift': specifier: ^0.12.0 version: 0.12.0 @@ -1261,24 +1261,24 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -1289,8 +1289,8 @@ packages: resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.28.3': @@ -1318,12 +1318,12 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1356,8 +1356,8 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': @@ -1368,16 +1368,16 @@ packages: resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.25.9': resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1963,16 +1963,16 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} '@base-org/account@2.0.1': @@ -3565,21 +3565,21 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@oozcitak/dom@1.15.10': - resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} - engines: {node: '>=8.0'} + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} - '@oozcitak/infra@1.0.8': - resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} - engines: {node: '>=6.0'} + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} - '@oozcitak/url@1.0.4': - resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} - engines: {node: '>=8.0'} + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} - '@oozcitak/util@8.3.8': - resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} - engines: {node: '>=8.0'} + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -4353,6 +4353,9 @@ packages: '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-beta.43': resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} @@ -4874,9 +4877,6 @@ packages: '@stablelib/base64@1.0.1': resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@statelyai/inspect@0.4.0': resolution: {integrity: sha512-VxQldRlKYcu6rzLY83RSXVwMYexkH6hNx85B89YWYyXYWtNGaWHFCwV7a/Kz8FFPeUz8EKVAnyMOg2kNpn07wQ==} peerDependencies: @@ -5056,70 +5056,64 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} - '@tanstack/directive-functions-plugin@1.132.0': - resolution: {integrity: sha512-5+K3msIpSYkiDE0PTIAT2HzZRps/M2uQsDEA5HApXxOhIAWykQ/yyO1umgkMwYpgJqnT96AVHb0E559Dfvhj0A==} - engines: {node: '>=12'} - peerDependencies: - vite: '>=6.0.0 || >=7.0.0' - - '@tanstack/history@1.132.0': - resolution: {integrity: sha512-GG2R9I6QSlbNR9fEuX2sQCigY6K28w51h2634TWmkaHXlzQw+rWuIWr4nAGM9doA+kWRi1LFSFMvAiG3cOqjXQ==} + '@tanstack/history@1.154.14': + resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} engines: {node: '>=12'} '@tanstack/query-core@5.87.4': resolution: {integrity: sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==} - '@tanstack/react-router@1.132.0': - resolution: {integrity: sha512-tGNmQrFc4zWQZvjqYnC8ib84H/9QokRl73hr0P2XlxCY2KAgPTk2QjdzW03LqXgQZRXg7++vKznJt4LS9/M3iA==} + '@tanstack/react-router@1.157.16': + resolution: {integrity: sha512-xwFQa7S7dhBhm3aJYwU79cITEYgAKSrcL6wokaROIvl2JyIeazn8jueWqUPJzFjv+QF6Q8euKRlKUEyb5q2ymg==} engines: {node: '>=12'} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@tanstack/react-start-client@1.132.0': - resolution: {integrity: sha512-j76SOnplxlk4OrQR0hZHD/+xceUw75PUUBEyCWTgz9TK92o9WuN+zrSJLV0ZCby3Lgj19wrbbtohNEu7HUVMXQ==} + '@tanstack/react-start-client@1.157.16': + resolution: {integrity: sha512-r3XTxYPJXZ/szhbloxqT6CQtsoEjw8DjbnZh/3ZsQv2PLKTOl925cy7YVdQc2cWZyXtn5e19Ig78R+8tsoTpig==} engines: {node: '>=22.12.0'} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@tanstack/react-start-server@1.132.0': - resolution: {integrity: sha512-kuucNaq3ik1EYQgn3eSmSgMCR1DXWPs6zIK7Q2mmGtV65BHdWe1AD96VSYmXt3cDycLtJM5iB9uem5sT1Mqfrg==} + '@tanstack/react-start-server@1.157.16': + resolution: {integrity: sha512-1YkBss4SUQ+HqVC1yGN/j7VNwjvdHHd3K58fASe0bz+uf7GrkGJlRXPkMJdxJkkmefYHQfyBL+q7o723N4CMYA==} engines: {node: '>=22.12.0'} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@tanstack/react-start@1.132.0': - resolution: {integrity: sha512-DqafNGJq2Yerk8KwUyGdvSayfrHsR92M1V89RZFYsVkfCvMBNBrU+Pa37b76jFDY8uYXZDN3ZTX0vPf+mIdhkw==} + '@tanstack/react-start@1.157.16': + resolution: {integrity: sha512-FO6UYjsZyNaC0ickSSvClqfVZemp9/HWnbRJQU2dOKYQsI+wnznhLp9IkgG90iFBLcuMAWhcNHMiIuz603GJBg==} engines: {node: '>=22.12.0'} peerDependencies: react: 18.3.1 react-dom: 18.3.1 vite: '>=7.0.0' - '@tanstack/react-store@0.7.0': - resolution: {integrity: sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==} + '@tanstack/react-store@0.8.0': + resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@tanstack/router-core@1.132.0': - resolution: {integrity: sha512-Iy33xln3oICuifgs4ltukWQLkd2F8ysUxalBFYZ8rs7N8EUfL2xIKnv4kEyffGDMwAxnNzSq/jS7XKy00KmC8Q==} + '@tanstack/router-core@1.157.16': + resolution: {integrity: sha512-eJuVgM7KZYTTr4uPorbUzUflmljMVcaX2g6VvhITLnHmg9SBx9RAgtQ1HmT+72mzyIbRSlQ1q0fY/m+of/fosA==} engines: {node: '>=12'} - '@tanstack/router-generator@1.132.0': - resolution: {integrity: sha512-3N1rHNzxLzvFXO9iLguz/J4GTr1I6uCPkr5R13kP15jGCZ/AQIDeZjT8jQPZA9gAUAl9+yOyUIRXeL09a6RVVg==} + '@tanstack/router-generator@1.157.16': + resolution: {integrity: sha512-Ae2M00VTFjjED7glSCi/mMLENRzhEym6NgjoOx7UVNbCC/rLU/5ASDe5VIlDa8QLEqP5Pj088Gi51gjmRuICvQ==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.132.0': - resolution: {integrity: sha512-ycAhaxf871tmAfmDOxzXOMu9yXM/4PVDOi2/IrcHdqZx3Lgh0l3tBVVdz5P9LY+jxy2spZW1E8GSKbMCNcGdGA==} + '@tanstack/router-plugin@1.157.16': + resolution: {integrity: sha512-YQg7L06xyCJAYyrEJNZGAnDL8oChILU+G/eSDIwEfcWn5iLk+47x1Gcdxr82++47PWmOPhzuTo8edDQXWs7kAA==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.132.0 + '@tanstack/react-router': ^1.157.16 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' - vite-plugin-solid: ^2.11.8 + vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' peerDependenciesMeta: '@rsbuild/core': @@ -5133,37 +5127,37 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.132.0': - resolution: {integrity: sha512-WDnvAi9kO20joLDzlsTvfgXNv+FgQ4G98xAD8r4jKWoTdTTG05DU2sRYimtbdq4Q7E3uVdvyvPdhRy45wan7bw==} + '@tanstack/router-utils@1.154.7': + resolution: {integrity: sha512-61bGx32tMKuEpVRseu2sh1KQe8CfB7793Mch/kyQt0EP3tD7X0sXmimCl3truRiDGUtI0CaSoQV1NPjAII1RBA==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.132.0': - resolution: {integrity: sha512-0a5NVOfiWWdkHI+ZO63tdUF4n8Qksts76pxYd+PUf0+fx6ENsOjeAF9NJS8RAYfNnjtB/aiyAbElvOxcL756Hw==} - engines: {node: '>=12'} + '@tanstack/start-client-core@1.157.16': + resolution: {integrity: sha512-O+7H133MWQTkOxmXJNhrLXiOhDcBlxvpEcCd/N25Ga6eyZ7/P5vvFzNkSSxeQNkZV+RiPWnA5B75gT+U+buz3w==} + engines: {node: '>=22.12.0'} - '@tanstack/start-client-core@1.132.0': - resolution: {integrity: sha512-7hhH6eLC2He2BRRobmnk/MRINueBgMT1LiesA1kuEWSHkklilOe77r53+3VPIuRwd94wYdxq+5R+H31l0HgPcw==} + '@tanstack/start-fn-stubs@1.154.7': + resolution: {integrity: sha512-D69B78L6pcFN5X5PHaydv7CScQcKLzJeEYqs7jpuyyqGQHSUIZUjS955j+Sir8cHhuDIovCe2LmsYHeZfWf3dQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.132.0': - resolution: {integrity: sha512-ZnbTDzbTo7aYt7/id1IaPkCcISy3gz/q9C3qbjgb2JYGzZHOwwvA4OzRS7PfcxAVzu/bqE6QHuuG096ai11DOw==} + '@tanstack/start-plugin-core@1.157.16': + resolution: {integrity: sha512-VmRXuvP5flryUAHeBM4Xb06n544qLtyA2cwmlQLRTUYtQiQEAdd9CvCGy8CPAly3f7eeXKqC7aX0v3MwWkLR8w==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.132.0': - resolution: {integrity: sha512-0WJtlCxh1Eo5k77StWfMDc19TxMH7ojdaiRc22a+c32OezYXRt5GAV7PmzHq8bGRVnGy4pudAMKX2nS6uNRgzQ==} + '@tanstack/start-server-core@1.157.16': + resolution: {integrity: sha512-PEltFleYfiqz6+KcmzNXxc1lXgT7VDNKP6G6i1TirdHBDbRJ9CIY+ASLPlhrRwqwA2PL9PpFjXZl8u5bH/+Q9A==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.132.0': - resolution: {integrity: sha512-RGzyNVqSe3cJ+ajjKOQ62elr1jR8quBX6lniBElDC2P66MMvESSwi5Lr+tvSuq7DsVLRWJKexJsIemJt0MARKA==} + '@tanstack/start-storage-context@1.157.16': + resolution: {integrity: sha512-56izE0oihAw2YRwYUEds2H+uO5dyT2CahXCgWX62+l+FHou09M9mSep68n1lBKPdphC2ZU3cPV7wnvgeraJWHg==} engines: {node: '>=22.12.0'} - '@tanstack/store@0.7.0': - resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + '@tanstack/store@0.8.0': + resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@tanstack/virtual-file-routes@1.132.0': - resolution: {integrity: sha512-d3do4ih9IdLPBVY4Gb8x7Ho7z0oFDLpxoao7uNVkfWtYU7nc3B+rnnVejXIgprmI5gt1hNzyNDJFr8G/W926GA==} + '@tanstack/virtual-file-routes@1.154.7': + resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} engines: {node: '>=12'} '@testing-library/dom@10.1.0': @@ -6544,8 +6538,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-dead-code-elimination@1.0.10: - resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -8862,9 +8856,6 @@ packages: fetch-retry@4.1.1: resolution: {integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==} - fetchdts@0.1.7: - resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} - fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -9290,8 +9281,8 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} - h3@2.0.0-beta.4: - resolution: {integrity: sha512-/JdwHUGuHjbBXAVxQN7T7QeI9cVlhsqMKVNFHebZVs9RoEYH85Ogh9O1DEy/1ZiJkmMwa1gNg6bBcGhc1Itjdg==} + h3@2.0.1-rc.11: + resolution: {integrity: sha512-2myzjCqy32c1As9TjZW9fNZXtLqNedjFSrdFy2AjFBQQ3LzrnGoDdFDYfC0tV2e4vcyfJ2Sfo/F6NQhO2Ly/Mw==} engines: {node: '>=20.11.1'} peerDependencies: crossws: ^0.4.1 @@ -10336,6 +10327,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -11493,6 +11488,7 @@ packages: next@14.2.33: resolution: {integrity: sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==} engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -13157,8 +13153,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rou3@0.7.5: - resolution: {integrity: sha512-bwUHDHw1HSARty7TWNV71R0NZs5fOt74OM+hcMdJyPfchfRktEmxLoMSNa7PwEp6WqJ0a3feKztsIfTUEYhskw==} + rou3@0.7.12: + resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} router@2.1.0: resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} @@ -13308,14 +13304,14 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - seroval-plugins@1.3.2: - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + seroval-plugins@1.5.0: + resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.3.2: - resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + seroval@1.5.0: + resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} engines: {node: '>=10'} serve-index@1.9.1: @@ -13596,8 +13592,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - srvx@0.8.7: - resolution: {integrity: sha512-g3+15LlwVOGL2QpoTPZlvRjg+9a5Tx/69CatXjFP6txvhIaW2FmGyzJfb8yft5wyfGddvJmP/Yx+e/uNDMRSLQ==} + srvx@0.10.1: + resolution: {integrity: sha512-A//xtfak4eESMWWydSRFUVvCTQbSwivnGCEf8YGPe2eHU0+Z6znfUTCPF0a7oV3sObSOcrXHlL6Bs9vVctfXdg==} engines: {node: '>=20.16.0'} hasBin: true @@ -13949,10 +13945,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} @@ -14781,8 +14779,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: 18.3.1 @@ -15427,9 +15425,9 @@ packages: resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} engines: {node: '>=4.0.0'} - xmlbuilder2@3.1.1: - resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} - engines: {node: '>=12.0'} + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} @@ -15732,7 +15730,7 @@ snapshots: hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 import-meta-resolve: 4.2.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 @@ -15766,9 +15764,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/cli@7.24.7(@babel/core@7.28.4)': + '@babel/cli@7.24.7(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@jridgewell/trace-mapping': 0.3.31 commander: 6.2.1 convert-source-map: 2.0.0 @@ -15789,31 +15787,31 @@ snapshots: '@babel/highlight': 7.25.9 picocolors: 1.1.1 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.28.6': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.6': {} - '@babel/core@7.28.4': + '@babel/core@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -15823,57 +15821,57 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': + '@babel/generator@7.28.6': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.6 '@babel/helper-validator-option': 7.27.1 browserslist: 4.26.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.28.4)': + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.1.1 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.28.4)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 @@ -15885,780 +15883,780 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.28.4)': + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.4': + '@babel/helpers@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.28.4': + '@babel/parser@7.28.6': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.28.4) + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.28.4)': + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.4) + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.22.3(@babel/core@7.28.4)': + '@babel/plugin-transform-react-constant-elements@7.22.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 regenerator-transform: 0.15.2 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.28.4)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.28.4) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.28.4) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.28.4) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.28.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.26.0(@babel/core@7.28.4)': + '@babel/preset-env@7.26.0(@babel/core@7.28.6)': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.28.4 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.28.4) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.28.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.28.4) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.28.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.28.4) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.28.4) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.28.4) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.28.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.28.6) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.28.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.28.6) core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.28.4)': + '@babel/preset-flow@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 esutils: 2.0.3 - '@babel/preset-react@7.26.3(@babel/core@7.28.4)': + '@babel/preset-react@7.26.3(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.28.4) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/register@7.27.1(@babel/core@7.28.4)': + '@babel/register@7.27.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -16667,30 +16665,30 @@ snapshots: '@babel/runtime@7.27.6': {} - '@babel/template@7.27.2': + '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 - '@babel/traverse@7.28.4': + '@babel/traverse@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@base-org/account@2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@base-org/account@2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.6.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -16699,7 +16697,7 @@ snapshots: ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) preact: 10.24.2 viem: 2.33.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) + zustand: 5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -17081,7 +17079,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/runtime': 7.27.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -17351,7 +17349,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -17451,7 +17449,7 @@ snapshots: - supports-color - utf-8-validate - '@expo/cli@54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@expo/cli@54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.11.0) '@expo/code-signing-certificates': 0.0.5 @@ -17463,11 +17461,11 @@ snapshots: '@expo/json-file': 10.0.7 '@expo/mcp-tunnel': 0.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/osascript': 2.3.7 '@expo/package-manager': 1.9.8 '@expo/plist': 0.4.7 - '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) '@expo/schema-utils': 0.1.7 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 @@ -17486,7 +17484,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3(supports-color@8.1.1) env-editor: 0.4.2 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server: 1.0.1 freeport-async: 2.0.0 getenv: 2.0.0 @@ -17519,7 +17517,7 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -17667,12 +17665,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: chalk: 4.1.2 optionalDependencies: react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/env@0.4.2': dependencies: @@ -17791,10 +17789,10 @@ snapshots: '@expo/metro-config@0.19.12': dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@expo/config': 10.0.11 '@expo/env': 0.4.2 '@expo/json-file': 9.0.2 @@ -17812,11 +17810,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-config@54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@expo/metro-config@54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 '@expo/config': 12.0.10 '@expo/env': 2.0.7 '@expo/json-file': 10.0.7 @@ -17836,7 +17834,7 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -17893,7 +17891,7 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': + '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 @@ -17902,7 +17900,7 @@ snapshots: '@expo/json-file': 10.0.7 '@react-native/normalize-colors': 0.81.4 debug: 4.4.3(supports-color@8.1.1) - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -17949,11 +17947,11 @@ snapshots: dependencies: prop-types: 15.8.1 - '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/ws-tunnel@1.0.6': {} @@ -17962,7 +17960,7 @@ snapshots: '@babel/code-frame': 7.10.4 chalk: 4.1.2 find-up: 5.0.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 '@faker-js/faker@9.9.0': {} @@ -18383,7 +18381,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 @@ -19124,22 +19122,22 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@oozcitak/dom@1.15.10': + '@oozcitak/dom@2.0.2': dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/url': 1.0.4 - '@oozcitak/util': 8.3.8 + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 - '@oozcitak/infra@1.0.8': + '@oozcitak/infra@2.0.2': dependencies: - '@oozcitak/util': 8.3.8 + '@oozcitak/util': 10.0.0 - '@oozcitak/url@1.0.4': + '@oozcitak/url@3.0.0': dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 - '@oozcitak/util@8.3.8': {} + '@oozcitak/util@10.0.0': {} '@open-draft/deferred-promise@2.2.0': {} @@ -19459,10 +19457,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 - '@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))': + '@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: merge-options: 3.0.4 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) optional: true '@react-native-community/cli-clean@12.3.7': @@ -19620,140 +19618,140 @@ snapshots: '@react-native/assets-registry@0.81.4': {} - '@react-native/babel-plugin-codegen@0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.4))': + '@react-native/babel-plugin-codegen@0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.6))': dependencies: - '@react-native/codegen': 0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + '@react-native/codegen': 0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.6)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.28.4)': + '@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.28.6)': dependencies: - '@babel/traverse': 7.28.4 - '@react-native/codegen': 0.81.4(@babel/core@7.28.4) + '@babel/traverse': 7.28.6 + '@react-native/codegen': 0.81.4(@babel/core@7.28.6) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.76.9(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))': - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.4) - '@babel/template': 7.27.2 - '@react-native/babel-plugin-codegen': 0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + '@react-native/babel-preset@0.76.9(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.6)) babel-plugin-syntax-hermes-parser: 0.25.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.4) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.81.4(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.4) - '@babel/template': 7.27.2 - '@react-native/babel-plugin-codegen': 0.81.4(@babel/core@7.28.4) + '@react-native/babel-preset@0.81.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.81.4(@babel/core@7.28.6) babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.4) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.4))': + '@react-native/codegen@0.76.9(@babel/preset-env@7.26.0(@babel/core@7.28.6))': dependencies: - '@babel/parser': 7.28.4 - '@babel/preset-env': 7.26.0(@babel/core@7.28.4) + '@babel/parser': 7.28.6 + '@babel/preset-env': 7.26.0(@babel/core@7.28.6) glob: 7.2.3 hermes-parser: 0.23.1 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + jscodeshift: 0.14.0(@babel/preset-env@7.26.0(@babel/core@7.28.6)) mkdirp: 0.5.6 nullthrows: 1.1.1 yargs: 17.7.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.81.4(@babel/core@7.28.4)': + '@react-native/codegen@0.81.4(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 glob: 7.2.3 hermes-parser: 0.29.1 invariant: 2.2.4 @@ -19827,12 +19825,12 @@ snapshots: '@react-native/normalize-colors@0.81.4': {} - '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 18.3.26 @@ -19910,6 +19908,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.29': {} + '@rolldown/pluginutils@1.0.0-beta.40': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} '@rolldown/pluginutils@1.0.0-beta.50': {} @@ -20341,9 +20341,9 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) bs58: 5.0.0 js-base64: 3.7.8 @@ -20354,14 +20354,14 @@ snapshots: - react-native - typescript - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': dependencies: '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) '@solana/wallet-standard-util': 1.1.2 '@wallet-standard/core': 1.1.1 js-base64: 3.7.8 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' @@ -20370,25 +20370,25 @@ snapshots: - react - typescript - '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) - '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) js-base64: 3.7.8 optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - react - react-native - typescript - '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@wallet-standard/base': 1.1.0 @@ -20458,9 +20458,9 @@ snapshots: '@wallet-standard/features': 1.1.0 eventemitter3: 5.0.1 - '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': dependencies: - '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -20607,8 +20607,6 @@ snapshots: '@stablelib/base64@1.0.1': {} - '@standard-schema/spec@1.0.0': {} - '@statelyai/inspect@0.4.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(xstate@5.20.2)': dependencies: fast-safe-stringify: 2.1.1 @@ -20630,54 +20628,54 @@ snapshots: '@stripe/stripe-js@5.6.0': {} - '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.4)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.4)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - '@svgr/babel-preset@6.5.1(@babel/core@7.28.4)': + '@svgr/babel-preset@6.5.1(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.28.4) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.28.4) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.28.4) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.28.4) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.28.4) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.28.6) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.6) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.6) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.28.6) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.28.6) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.28.6) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.28.6) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.28.6) '@svgr/core@6.5.1': dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 6.5.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@svgr/babel-preset': 6.5.1(@babel/core@7.28.6) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -20686,13 +20684,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@6.5.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 entities: 4.5.0 '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 6.5.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@svgr/babel-preset': 6.5.1(@babel/core@7.28.6) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -20708,11 +20706,11 @@ snapshots: '@svgr/webpack@6.5.1': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-constant-elements': 7.22.3(@babel/core@7.28.4) - '@babel/preset-env': 7.26.0(@babel/core@7.28.4) - '@babel/preset-react': 7.26.3(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-constant-elements': 7.22.3(@babel/core@7.28.6) + '@babel/preset-env': 7.26.0(@babel/core@7.28.6) + '@babel/preset-react': 7.26.3(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -20783,65 +20781,52 @@ snapshots: '@swc/counter': 0.1.3 optional: true - '@tanstack/directive-functions-plugin@1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.4 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@tanstack/router-utils': 1.132.0 - babel-dead-code-elimination: 1.0.10 - tiny-invariant: 1.3.3 - vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) - transitivePeerDependencies: - - supports-color - - '@tanstack/history@1.132.0': {} + '@tanstack/history@1.154.14': {} '@tanstack/query-core@5.87.4': {} - '@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.132.0 - '@tanstack/react-store': 0.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.132.0 + '@tanstack/history': 1.154.14 + '@tanstack/react-store': 0.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-core': 1.157.16 isbot: 5.1.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-start-client@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.132.0 - '@tanstack/start-client-core': 1.132.0 - cookie-es: 1.2.2 + '@tanstack/react-router': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-core': 1.157.16 + '@tanstack/start-client-core': 1.157.16 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-start-server@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.132.0 - '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-core': 1.132.0 - '@tanstack/start-client-core': 1.132.0 - '@tanstack/start-server-core': 1.132.0 + '@tanstack/history': 1.154.14 + '@tanstack/react-router': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-core': 1.157.16 + '@tanstack/start-client-core': 1.157.16 + '@tanstack/start-server-core': 1.157.16 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/react-start@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-client': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-server': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-utils': 1.132.0 - '@tanstack/start-client-core': 1.132.0 - '@tanstack/start-plugin-core': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/react-router': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-start-client': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-start-server': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-utils': 1.154.7 + '@tanstack/start-client-core': 1.157.16 + '@tanstack/start-plugin-core': 1.157.16(@tanstack/react-router@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/start-server-core': 1.157.16 pathe: 2.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20853,28 +20838,28 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-store@0.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-store@0.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/store': 0.7.0 + '@tanstack/store': 0.8.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) - '@tanstack/router-core@1.132.0': + '@tanstack/router-core@1.157.16': dependencies: - '@tanstack/history': 1.132.0 - '@tanstack/store': 0.7.0 - cookie-es: 1.2.2 - seroval: 1.3.2 - seroval-plugins: 1.3.2(seroval@1.3.2) + '@tanstack/history': 1.154.14 + '@tanstack/store': 0.8.0 + cookie-es: 2.0.0 + seroval: 1.5.0 + seroval-plugins: 1.5.0(seroval@1.5.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-generator@1.132.0': + '@tanstack/router-generator@1.157.16': dependencies: - '@tanstack/router-core': 1.132.0 - '@tanstack/router-utils': 1.132.0 - '@tanstack/virtual-file-routes': 1.132.0 + '@tanstack/router-core': 1.157.16 + '@tanstack/router-utils': 1.154.7 + '@tanstack/virtual-file-routes': 1.154.7 prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.6 @@ -20883,87 +20868,74 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.0 - '@tanstack/router-generator': 1.132.0 - '@tanstack/router-utils': 1.132.0 - '@tanstack/virtual-file-routes': 1.132.0 - babel-dead-code-elimination: 1.0.10 + '@tanstack/router-plugin@1.157.16(@tanstack/react-router@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@tanstack/router-core': 1.157.16 + '@tanstack/router-generator': 1.157.16 + '@tanstack/router-utils': 1.154.7 + '@tanstack/virtual-file-routes': 1.154.7 + babel-dead-code-elimination: 1.0.12 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.24.2 optionalDependencies: - '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.132.0': + '@tanstack/router-utils@1.154.7': dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 ansis: 4.2.0 diff: 8.0.2 - fast-glob: 3.3.3 pathe: 2.0.3 + tinyglobby: 0.2.15 transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.4 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) - babel-dead-code-elimination: 1.0.10 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - supports-color - - vite - - '@tanstack/start-client-core@1.132.0': + '@tanstack/start-client-core@1.157.16': dependencies: - '@tanstack/router-core': 1.132.0 - '@tanstack/start-storage-context': 1.132.0 - cookie-es: 1.2.2 - seroval: 1.3.2 + '@tanstack/router-core': 1.157.16 + '@tanstack/start-fn-stubs': 1.154.7 + '@tanstack/start-storage-context': 1.157.16 + seroval: 1.5.0 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.28.4 - '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.0 - '@tanstack/router-generator': 1.132.0 - '@tanstack/router-plugin': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@tanstack/router-utils': 1.132.0 - '@tanstack/server-functions-plugin': 1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.0 - babel-dead-code-elimination: 1.0.10 + '@tanstack/start-fn-stubs@1.154.7': {} + + '@tanstack/start-plugin-core@1.157.16(@tanstack/react-router@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.6 + '@babel/types': 7.28.6 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.157.16 + '@tanstack/router-generator': 1.157.16 + '@tanstack/router-plugin': 1.157.16(@tanstack/react-router@1.157.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/router-utils': 1.154.7 + '@tanstack/start-client-core': 1.157.16 + '@tanstack/start-server-core': 1.157.16 + babel-dead-code-elimination: 1.0.12 cheerio: 1.1.0 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.8.7 + srvx: 0.10.1 + tinyglobby: 0.2.15 ufo: 1.6.1 vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) vitefu: 1.1.1(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) - xmlbuilder2: 3.1.1 + xmlbuilder2: 4.0.3 zod: 3.24.2 transitivePeerDependencies: - '@rsbuild/core' @@ -20973,32 +20945,29 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.132.0': + '@tanstack/start-server-core@1.157.16': dependencies: - '@standard-schema/spec': 1.0.0 - '@tanstack/history': 1.132.0 - '@tanstack/router-core': 1.132.0 - '@tanstack/start-client-core': 1.132.0 - '@tanstack/start-storage-context': 1.132.0 - cookie-es: 2.0.0 - fetchdts: 0.1.7 - h3: 2.0.0-beta.4 - seroval: 1.3.2 + '@tanstack/history': 1.154.14 + '@tanstack/router-core': 1.157.16 + '@tanstack/start-client-core': 1.157.16 + '@tanstack/start-storage-context': 1.157.16 + h3-v2: h3@2.0.1-rc.11 + seroval: 1.5.0 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.132.0': + '@tanstack/start-storage-context@1.157.16': dependencies: - '@tanstack/router-core': 1.132.0 + '@tanstack/router-core': 1.157.16 - '@tanstack/store@0.7.0': {} + '@tanstack/store@0.8.0': {} - '@tanstack/virtual-file-routes@1.132.0': {} + '@tanstack/virtual-file-routes@1.154.7': {} '@testing-library/dom@10.1.0': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 '@babel/runtime': 7.27.6 '@types/aria-query': 5.0.1 aria-query: 5.3.0 @@ -21009,7 +20978,7 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 '@babel/runtime': 7.27.6 '@types/aria-query': 5.0.1 aria-query: 5.1.3 @@ -21082,24 +21051,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@types/base-64@1.0.2': {} @@ -21727,9 +21696,9 @@ snapshots: '@vitejs/plugin-react@4.5.2(vite@7.1.5(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) '@rolldown/pluginutils': 1.0.0-beta.11 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 @@ -21739,11 +21708,11 @@ snapshots: '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.6) '@rolldown/pluginutils': 1.0.0-beta.50 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.6) vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) vue: 3.5.21(typescript@5.8.3) transitivePeerDependencies: @@ -21902,36 +21871,36 @@ snapshots: '@vue/babel-helper-vue-transform-on@1.5.0': {} - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.4)': + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.6)': dependencies: - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 '@vue/babel-helper-vue-transform-on': 1.5.0 - '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.4) + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.6) '@vue/shared': 3.5.22 optionalDependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.4)': + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.6)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 '@vue/compiler-sfc': 3.5.21 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.21': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 '@vue/shared': 3.5.21 entities: 4.5.0 estree-walker: 2.0.2 @@ -21944,7 +21913,7 @@ snapshots: '@vue/compiler-sfc@3.5.21': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 '@vue/compiler-core': 3.5.21 '@vue/compiler-dom': 3.5.21 '@vue/compiler-ssr': 3.5.21 @@ -22207,7 +22176,7 @@ snapshots: dependencies: react: 18.3.1 use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.26)(react@18.3.1) - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: xstate: 5.20.2 transitivePeerDependencies: @@ -22548,7 +22517,7 @@ snapshots: ast-kit@2.1.3: dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 pathe: 2.0.3 ast-types-flow@0.0.8: {} @@ -22573,7 +22542,7 @@ snapshots: ast-walker-scope@0.8.1: dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 ast-kit: 2.1.3 astral-regex@1.0.0: @@ -22614,7 +22583,7 @@ snapshots: html-escaper: 3.0.3 http-cache-semantics: 4.2.0 import-meta-resolve: 4.2.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 magic-string: 0.30.19 magicast: 0.3.5 mrmime: 2.0.1 @@ -22747,26 +22716,26 @@ snapshots: b4a@1.6.6: {} - babel-core@7.0.0-bridge.0(@babel/core@7.28.4): + babel-core@7.0.0-bridge.0(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 - babel-dead-code-elimination@1.0.10: + babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.28.4): + babel-jest@29.7.0(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.28.4) + babel-preset-jest: 29.6.3(@babel/core@7.28.6) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -22785,8 +22754,8 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 @@ -22796,33 +22765,33 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.28.4): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.28.6): dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.4) + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.28.4): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.6) core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.28.4): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.4) + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.28.6) transitivePeerDependencies: - supports-color babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 babel-plugin-react-native-web@0.19.13: {} @@ -22836,37 +22805,37 @@ snapshots: dependencies: hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.4): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.6): dependencies: - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - '@babel/core' - babel-preset-current-node-syntax@1.0.1(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) - - babel-preset-expo@12.0.11(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4)): - dependencies: - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) - '@babel/preset-react': 7.26.3(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@react-native/babel-preset': 0.76.9(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4)) + babel-preset-current-node-syntax@1.0.1(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + + babel-preset-expo@12.0.11(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6)): + dependencies: + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) + '@babel/preset-react': 7.26.3(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + '@react-native/babel-preset': 0.76.9(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6)) babel-plugin-react-native-web: 0.19.13 react-refresh: 0.14.2 transitivePeerDependencies: @@ -22874,43 +22843,43 @@ snapshots: - '@babel/preset-env' - supports-color - babel-preset-expo@54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2): - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.4) - '@babel/preset-react': 7.26.3(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@react-native/babel-preset': 0.81.4(@babel/core@7.28.4) + babel-preset-expo@54.0.4(@babel/core@7.28.6)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2): + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.28.6) + '@babel/preset-react': 7.26.3(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + '@react-native/babel-preset': 0.81.4(@babel/core@7.28.6) babel-plugin-react-compiler: 1.0.0 babel-plugin-react-native-web: 0.21.1 babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.4) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) debug: 4.4.3(supports-color@8.1.1) react-refresh: 0.14.2 resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.27.6 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - supports-color - babel-preset-jest@29.6.3(@babel/core@7.28.4): + babel-preset-jest@29.6.3(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.4) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.6) bail@2.0.2: {} @@ -23765,7 +23734,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.8.3 @@ -25096,129 +25065,129 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 md5-file: 3.2.3 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.8.7 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) - expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) - expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) - expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 8.5.6 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 10.0.11 '@expo/env': 0.4.2 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + expo: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 12.0.10 '@expo/env': 2.0.7 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + expo: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 - expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) invariant: 2.2.4 expo-modules-autolinking@2.0.8: @@ -25245,25 +25214,25 @@ snapshots: dependencies: invariant: 2.2.4 - expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: invariant: 2.2.4 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server@1.0.1: {} - expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): + expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: compare-urls: 2.0.0 - expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo: 54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) url: 0.11.3 - expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): + expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 '@expo/cli': 0.22.26(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10) @@ -25272,17 +25241,17 @@ snapshots: '@expo/fingerprint': 0.11.11 '@expo/metro-config': 0.19.12 '@expo/vector-icons': 14.0.4 - babel-preset-expo: 12.0.11(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4)) - expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) - expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) - expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + babel-preset-expo: 12.0.11(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6)) + expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.6)(@babel/preset-env@7.26.0(@babel/core@7.28.6))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 2.0.8 expo-modules-core: 2.2.3 fbemitter: 3.0.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -25296,29 +25265,29 @@ snapshots: - supports-color - utf-8-validate - expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): + expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 - '@expo/cli': 54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@expo/cli': 54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 - '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@expo/fingerprint': 0.15.1 '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2) - expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) - expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) - expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + babel-preset-expo: 54.0.4(@babel/core@7.28.6)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2) + expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.6)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 3.0.15 - expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) pretty-format: 29.7.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -25564,8 +25533,6 @@ snapshots: fetch-retry@4.1.1: {} - fetchdts@0.1.7: {} - fflate@0.8.2: {} figures@3.2.0: @@ -26067,12 +26034,10 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - h3@2.0.0-beta.4: + h3@2.0.1-rc.11: dependencies: - cookie-es: 2.0.0 - fetchdts: 0.1.7 - rou3: 0.7.5 - srvx: 0.8.7 + rou3: 0.7.12 + srvx: 0.10.1 handle-thing@2.0.1: {} @@ -26884,8 +26849,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -26894,8 +26859,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.3 @@ -27031,10 +26996,10 @@ snapshots: jest-config@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.4) + babel-jest: 29.7.0(@babel/core@7.28.6) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -27135,7 +27100,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -27231,15 +27196,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.28.4 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.6) + '@babel/types': 7.28.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.4) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.6) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -27354,23 +27319,27 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)): - dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/preset-env': 7.26.0(@babel/core@7.28.4) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/register': 7.27.1(@babel/core@7.28.4) - babel-core: 7.0.0-bridge.0(@babel/core@7.28.4) + jscodeshift@0.14.0(@babel/preset-env@7.26.0(@babel/core@7.28.6)): + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/preset-env': 7.26.0(@babel/core@7.28.6) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + '@babel/register': 7.27.1(@babel/core@7.28.6) + babel-core: 7.0.0-bridge.0(@babel/core@7.28.6) chalk: 4.1.2 flow-parser: 0.275.0 graceful-fs: 4.2.11 @@ -27383,18 +27352,18 @@ snapshots: transitivePeerDependencies: - supports-color - jscodeshift@17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)): - dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/register': 7.27.1(@babel/core@7.28.4) + jscodeshift@17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.6)): + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.6) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + '@babel/register': 7.27.1(@babel/core@7.28.6) flow-parser: 0.275.0 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -27404,7 +27373,7 @@ snapshots: tmp: 0.2.3 write-file-atomic: 5.0.1 optionalDependencies: - '@babel/preset-env': 7.26.0(@babel/core@7.28.4) + '@babel/preset-env': 7.26.0(@babel/core@7.28.6) transitivePeerDependencies: - supports-color @@ -28003,8 +27972,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 source-map-js: 1.2.1 make-dir@2.1.0: @@ -28255,7 +28224,7 @@ snapshots: metro-babel-transformer@0.83.1: dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 flow-enums-runtime: 0.0.6 hermes-parser: 0.29.1 nullthrows: 1.1.1 @@ -28326,9 +28295,9 @@ snapshots: metro-source-map@0.83.1: dependencies: - '@babel/traverse': 7.28.4 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.4' - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.6 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.6' + '@babel/types': 7.28.6 flow-enums-runtime: 0.0.6 invariant: 2.2.4 metro-symbolicate: 0.83.1 @@ -28352,10 +28321,10 @@ snapshots: metro-transform-plugins@0.83.1: dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -28363,10 +28332,10 @@ snapshots: metro-transform-worker@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 flow-enums-runtime: 0.0.6 metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-babel-transformer: 0.83.1 @@ -28383,13 +28352,13 @@ snapshots: metro@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -28861,7 +28830,7 @@ snapshots: qs: 6.14.0 optional: true - next@14.2.33(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.33(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.33 '@swc/helpers': 0.5.5 @@ -28871,7 +28840,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.28.6)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.33 '@next/swc-darwin-x64': 14.2.33 @@ -29664,14 +29633,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.1.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 index-to-position: 0.1.2 type-fest: 4.41.0 @@ -30330,25 +30299,25 @@ snapshots: react-is@18.3.1: {} - react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): + react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) whatwg-url-without-unicode: 8.0.0-3 - react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10): + react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.4 - '@react-native/codegen': 0.81.4(@babel/core@7.28.4) + '@react-native/codegen': 0.81.4(@babel/core@7.28.6) '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.81.4 '@react-native/js-polyfills': 0.81.4 '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.6)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.28.4) + babel-jest: 29.7.0(@babel/core@7.28.6) babel-plugin-syntax-hermes-parser: 0.29.1 base64-js: 1.5.1 commander: 12.1.0 @@ -30800,9 +30769,9 @@ snapshots: rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.43)(typescript@5.8.3): dependencies: - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 ast-kit: 2.1.3 birpc: 2.6.1 debug: 4.4.3(supports-color@8.1.1) @@ -30875,7 +30844,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 - rou3@0.7.5: {} + rou3@0.7.12: {} router@2.1.0: dependencies: @@ -31050,11 +31019,11 @@ snapshots: dependencies: randombytes: 2.1.0 - seroval-plugins@1.3.2(seroval@1.3.2): + seroval-plugins@1.5.0(seroval@1.5.0): dependencies: - seroval: 1.3.2 + seroval: 1.5.0 - seroval@1.3.2: {} + seroval@1.5.0: {} serve-index@1.9.1: dependencies: @@ -31437,9 +31406,7 @@ snapshots: sprintf-js@1.0.3: {} - srvx@0.8.7: - dependencies: - cookie-es: 2.0.0 + srvx@0.10.1: {} sshpk@1.18.0: dependencies: @@ -31665,12 +31632,12 @@ snapshots: structured-headers@0.4.1: {} - styled-jsx@5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.28.6)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 babel-plugin-macros: 3.1.0 stylehacks@7.0.5(postcss@8.5.6): @@ -31794,7 +31761,7 @@ snapshots: dependencies: dequal: 2.0.3 react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) symbol-tree@3.2.4: {} @@ -32045,7 +32012,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.2.5(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.6))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -32059,10 +32026,10 @@ snapshots: typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.4) + babel-jest: 29.7.0(@babel/core@7.28.6) ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3): dependencies: @@ -32664,7 +32631,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 - use-sync-external-store@1.5.0(react@18.3.1): + use-sync-external-store@1.6.0(react@18.3.1): dependencies: react: 18.3.1 @@ -32866,7 +32833,7 @@ snapshots: vite-plugin-checker@0.10.3(eslint@9.31.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.8.3)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3)): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 chokidar: 4.0.3 npm-run-path: 6.0.0 picocolors: 1.1.1 @@ -33482,12 +33449,12 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 - xmlbuilder2@3.1.1: + xmlbuilder2@4.0.3: dependencies: - '@oozcitak/dom': 1.15.10 - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 - js-yaml: 3.14.1 + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.1.1 xmlbuilder@11.0.1: {} @@ -33637,11 +33604,11 @@ snapshots: zod@3.25.76: {} - zustand@5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): + zustand@5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): optionalDependencies: '@types/react': 18.3.26 react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) zwitch@2.0.4: {} From 2fc548824f229d1fb94b6eb74cdac3d8c24610ce Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 3 Feb 2026 10:22:00 -0800 Subject: [PATCH 078/123] fix(vue): Prevent TDZ error in watch callbacks (#7744) --- .changeset/red-shoes-drum.md | 5 + packages/vue/src/composables/useAuth.ts | 5 +- .../vue/src/composables/useOrganization.ts | 5 +- packages/vue/src/composables/useSignIn.ts | 15 +- packages/vue/src/composables/useSignUp.ts | 15 +- .../utils/__tests__/useClerkLoaded.test.ts | 151 ++++++++++++++++++ packages/vue/src/utils/useClerkLoaded.ts | 5 +- 7 files changed, 184 insertions(+), 17 deletions(-) create mode 100644 .changeset/red-shoes-drum.md create mode 100644 packages/vue/src/utils/__tests__/useClerkLoaded.test.ts diff --git a/.changeset/red-shoes-drum.md b/.changeset/red-shoes-drum.md new file mode 100644 index 00000000000..09752718a21 --- /dev/null +++ b/.changeset/red-shoes-drum.md @@ -0,0 +1,5 @@ +--- +"@clerk/vue": patch +--- + +Fixed an error occurring in the composables where watchers attempted to call unwatch() within their own initialization. diff --git a/packages/vue/src/composables/useAuth.ts b/packages/vue/src/composables/useAuth.ts index b7f9ff67ae9..a63e00aba7f 100644 --- a/packages/vue/src/composables/useAuth.ts +++ b/packages/vue/src/composables/useAuth.ts @@ -13,11 +13,14 @@ import { useClerkContext } from './useClerkContext'; */ function clerkLoaded(clerk: ShallowRef) { return new Promise(resolve => { - watch( + let unwatch: (() => void) | undefined; + // eslint-disable-next-line prefer-const + unwatch = watch( clerk, value => { if (value?.loaded) { resolve(value); + unwatch?.(); } }, { immediate: true }, diff --git a/packages/vue/src/composables/useOrganization.ts b/packages/vue/src/composables/useOrganization.ts index 7310cae8add..5545b284e9c 100644 --- a/packages/vue/src/composables/useOrganization.ts +++ b/packages/vue/src/composables/useOrganization.ts @@ -56,7 +56,7 @@ export const useOrganization: UseOrganization = () => { const { clerk, organizationCtx } = useClerkContext('useOrganization'); const { session } = useSession(); - const unwatch = watch( + watch( clerk, value => { if (value) { @@ -65,10 +65,9 @@ export const useOrganization: UseOrganization = () => { for: 'organizations', caller: 'useOrganization', }); - unwatch(); } }, - { immediate: true }, + { once: true }, ); const result = computed(() => { diff --git a/packages/vue/src/composables/useSignIn.ts b/packages/vue/src/composables/useSignIn.ts index 4931829c592..b2af94dfa0a 100644 --- a/packages/vue/src/composables/useSignIn.ts +++ b/packages/vue/src/composables/useSignIn.ts @@ -32,12 +32,15 @@ type UseSignIn = () => ToComputedRefs; export const useSignIn: UseSignIn = () => { const { clerk, clientCtx } = useClerkContext('useSignIn'); - const unwatch = watch(clerk, value => { - if (value) { - value.telemetry?.record(eventMethodCalled('useSignIn')); - unwatch(); - } - }); + watch( + clerk, + value => { + if (value) { + value.telemetry?.record(eventMethodCalled('useSignIn')); + } + }, + { once: true }, + ); const result = computed(() => { if (!clerk.value || !clientCtx.value) { diff --git a/packages/vue/src/composables/useSignUp.ts b/packages/vue/src/composables/useSignUp.ts index 097a1cada60..8596f990d1f 100644 --- a/packages/vue/src/composables/useSignUp.ts +++ b/packages/vue/src/composables/useSignUp.ts @@ -32,12 +32,15 @@ type UseSignUp = () => ToComputedRefs; export const useSignUp: UseSignUp = () => { const { clerk, clientCtx } = useClerkContext('useSignUp'); - const unwatch = watch(clerk, value => { - if (value) { - value.telemetry?.record(eventMethodCalled('useSignUp')); - unwatch(); - } - }); + watch( + clerk, + value => { + if (value) { + value.telemetry?.record(eventMethodCalled('useSignUp')); + } + }, + { once: true }, + ); const result = computed(() => { if (!clerk.value || !clientCtx.value) { diff --git a/packages/vue/src/utils/__tests__/useClerkLoaded.test.ts b/packages/vue/src/utils/__tests__/useClerkLoaded.test.ts new file mode 100644 index 00000000000..97ad0805793 --- /dev/null +++ b/packages/vue/src/utils/__tests__/useClerkLoaded.test.ts @@ -0,0 +1,151 @@ +import type { Clerk } from '@clerk/shared/types'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { nextTick, ref, type ShallowRef } from 'vue'; + +import * as composables from '../../composables'; +import { useClerkLoaded } from '../useClerkLoaded'; + +// Mock the useClerk composable +vi.mock('../../composables', () => ({ + useClerk: vi.fn(), +})); + +describe('useClerkLoaded', () => { + let clerkRef: ShallowRef; + let mockClerk: Partial; + + beforeEach(() => { + clerkRef = ref(null) as ShallowRef; + mockClerk = { + loaded: false, + }; + vi.mocked(composables.useClerk).mockReturnValue(clerkRef); + }); + + it('should not call callback when clerk is null', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + await nextTick(); + + expect(callback).not.toHaveBeenCalled(); + }); + + it('should not call callback when clerk exists but not loaded', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + // Set clerk instance but not loaded + clerkRef.value = { ...mockClerk, loaded: false } as Clerk; + + await nextTick(); + + expect(callback).not.toHaveBeenCalled(); + }); + + it('should call callback when clerk becomes loaded', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + // Set clerk instance as loaded + const loadedClerk = { ...mockClerk, loaded: true } as Clerk; + clerkRef.value = loadedClerk; + + await nextTick(); + + expect(callback).toHaveBeenCalledOnce(); + expect(callback).toHaveBeenCalledWith(loadedClerk); + }); + + it('should call callback immediately if clerk is already loaded', async () => { + const callback = vi.fn(); + + // Set clerk instance as loaded before calling useClerkLoaded + const loadedClerk = { ...mockClerk, loaded: true } as Clerk; + clerkRef.value = loadedClerk; + + // Call useClerkLoaded + useClerkLoaded(callback); + + await nextTick(); + + expect(callback).toHaveBeenCalledOnce(); + expect(callback).toHaveBeenCalledWith(loadedClerk); + }); + + it('should only call callback once even if clerk updates multiple times', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + // Set clerk instance as loaded + const loadedClerk1 = { ...mockClerk, loaded: true, client: { id: 'client_1' } } as Clerk; + clerkRef.value = loadedClerk1; + + await nextTick(); + + expect(callback).toHaveBeenCalledOnce(); + + // Update clerk instance again (simulating a resource update) + const loadedClerk2 = { ...mockClerk, loaded: true, client: { id: 'client_2' } } as Clerk; + clerkRef.value = loadedClerk2; + + await nextTick(); + + // Should still only be called once due to unwatch() + expect(callback).toHaveBeenCalledOnce(); + expect(callback).toHaveBeenCalledWith(loadedClerk1); + }); + + it('should handle transition from null -> not loaded -> loaded', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + // Initial state: null + expect(callback).not.toHaveBeenCalled(); + + // Clerk instance created but not loaded + clerkRef.value = { ...mockClerk, loaded: false } as Clerk; + await nextTick(); + expect(callback).not.toHaveBeenCalled(); + + // Clerk becomes loaded + clerkRef.value = { ...mockClerk, loaded: true } as Clerk; + await nextTick(); + + expect(callback).toHaveBeenCalledOnce(); + }); + + it('should properly clean up watcher after callback is called', async () => { + const callback = vi.fn(); + + // Call useClerkLoaded + useClerkLoaded(callback); + + // Set clerk as loaded + const loadedClerk = { ...mockClerk, loaded: true } as Clerk; + clerkRef.value = loadedClerk; + + await nextTick(); + + expect(callback).toHaveBeenCalledOnce(); + + // Simulate multiple updates (watcher should be cleaned up) + for (let i = 0; i < 5; i++) { + clerkRef.value = { ...mockClerk, loaded: true, session: { id: `sess_${i}` } } as Clerk; + await nextTick(); + } + + // Should still only be called once + expect(callback).toHaveBeenCalledOnce(); + }); +}); diff --git a/packages/vue/src/utils/useClerkLoaded.ts b/packages/vue/src/utils/useClerkLoaded.ts index fd7adc0d17c..dcdee50f2ad 100644 --- a/packages/vue/src/utils/useClerkLoaded.ts +++ b/packages/vue/src/utils/useClerkLoaded.ts @@ -17,7 +17,9 @@ import { useClerk } from '../composables'; export const useClerkLoaded = (callback: (clerk: LoadedClerk) => void) => { const clerk = useClerk(); - watch( + let unwatch: (() => void) | undefined; + // eslint-disable-next-line prefer-const + unwatch = watch( clerk, unwrappedClerk => { if (!unwrappedClerk?.loaded) { @@ -25,6 +27,7 @@ export const useClerkLoaded = (callback: (clerk: LoadedClerk) => void) => { } callback(unwrappedClerk as LoadedClerk); + unwatch?.(); }, { immediate: true }, ); From 08fac3d65334a81f96e13167b6e49d455f43001c Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Tue, 3 Feb 2026 15:59:09 -0600 Subject: [PATCH 079/123] docs(repo): Add JSDoc comments for OauthAccessToken object (#7752) --- .changeset/thick-taxes-tell.md | 2 ++ .../src/api/resources/OauthAccessToken.ts | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 .changeset/thick-taxes-tell.md diff --git a/.changeset/thick-taxes-tell.md b/.changeset/thick-taxes-tell.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/thick-taxes-tell.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/backend/src/api/resources/OauthAccessToken.ts b/packages/backend/src/api/resources/OauthAccessToken.ts index e83c8f4089c..45ec8d056b4 100644 --- a/packages/backend/src/api/resources/OauthAccessToken.ts +++ b/packages/backend/src/api/resources/OauthAccessToken.ts @@ -1,18 +1,45 @@ import type { OauthAccessTokenJSON } from './JSON'; +/** + * The Backend `OauthAccessToken` object holds information about an OAuth access token associated with a user that has previously authenticated with a particular OAuth provider. + */ export class OauthAccessToken { constructor( + /** + * The ID of the external account associated with this token. + */ readonly externalAccountId: string, + /** + * The OAuth provider (e.g., `google`, `github`). + */ readonly provider: string, + /** + * The OAuth access token. + */ readonly token: string, + /** + * Metadata that can be read from the Frontend API and [Backend API](https://clerk.com/docs/reference/backend-api){{ target: '_blank' }} and can be set only from the Backend API. + */ readonly publicMetadata: Record = {}, + /** + * A descriptive label to differentiate multiple access tokens of the same user for the same provider. + */ readonly label: string, + /** + * The scopes granted for this access token. + */ readonly scopes?: string[], + /** + * The token secret, if applicable (e.g., for OAuth 1.0 providers). + */ readonly tokenSecret?: string, + /** + * The date when the access token expires. + */ readonly expiresAt?: number, /** - * The ID token retrieved from the OIDC provider. - * Only present for OIDC-compliant OAuth 2.0 providers when available. + * The user's OIDC ID Token, if available. + * This token contains user identity information as a JWT and is returned when the provider supports [OpenID Connect (OIDC)](/docs/guides/configure/auth-strategies/oauth/overview). Not all OAuth providers implement OIDC, so this field may be `undefined` for some providers. */ readonly idToken?: string, ) {} From 7917ff4214fc9e1001e2698c7241bbfa4b68e5af Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 3 Feb 2026 15:45:12 -0800 Subject: [PATCH 080/123] fix(nextjs,backend): Accommodate JWT OAuth access tokens (#7756) Co-authored-by: Jeremy Wright --- .changeset/polite-shirts-change.md | 6 ++++++ packages/backend/src/__tests__/exports.test.ts | 1 + packages/backend/src/internal.ts | 8 +++++++- packages/nextjs/src/server/data/getAuthDataFromRequest.ts | 4 ++-- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 .changeset/polite-shirts-change.md diff --git a/.changeset/polite-shirts-change.md b/.changeset/polite-shirts-change.md new file mode 100644 index 00000000000..239b26fc745 --- /dev/null +++ b/.changeset/polite-shirts-change.md @@ -0,0 +1,6 @@ +--- +"@clerk/backend": patch +"@clerk/nextjs": patch +--- + +Fixed an issue where JWT OAuth access tokens where not treated as a machine token diff --git a/packages/backend/src/__tests__/exports.test.ts b/packages/backend/src/__tests__/exports.test.ts index c9709c61722..5b24d6c619a 100644 --- a/packages/backend/src/__tests__/exports.test.ts +++ b/packages/backend/src/__tests__/exports.test.ts @@ -51,6 +51,7 @@ describe('subpath /internal exports', () => { "getAuthObjectFromJwt", "getMachineTokenType", "invalidTokenAuthObject", + "isMachineToken", "isMachineTokenByPrefix", "isMachineTokenType", "isTokenTypeAccepted", diff --git a/packages/backend/src/internal.ts b/packages/backend/src/internal.ts index 30c2365150a..27861fd6e52 100644 --- a/packages/backend/src/internal.ts +++ b/packages/backend/src/internal.ts @@ -56,4 +56,10 @@ export { reverificationError, reverificationErrorResponse } from '@clerk/shared/ export { verifyMachineAuthToken } from './tokens/verify'; -export { isMachineTokenByPrefix, isMachineTokenType, getMachineTokenType, isTokenTypeAccepted } from './tokens/machine'; +export { + isMachineTokenByPrefix, + isMachineTokenType, + getMachineTokenType, + isTokenTypeAccepted, + isMachineToken, +} from './tokens/machine'; diff --git a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts index 82b949d3ef3..d242129b954 100644 --- a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts +++ b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts @@ -11,7 +11,7 @@ import { getAuthObjectForAcceptedToken, getAuthObjectFromJwt, invalidTokenAuthObject, - isMachineTokenByPrefix, + isMachineToken, isTokenTypeAccepted, signedOutAuthObject, TokenType, @@ -147,7 +147,7 @@ const handleMachineToken = ( acceptsToken: NonNullable, options: Record, ): MachineAuthObject | null => { - const hasMachineToken = bearerToken && isMachineTokenByPrefix(bearerToken); + const hasMachineToken = bearerToken && isMachineToken(bearerToken); const acceptsOnlySessionToken = acceptsToken === TokenType.SessionToken || From 865d65b04b378b4d120b27e2e5f310c2dab6524f Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Tue, 3 Feb 2026 19:04:50 -0500 Subject: [PATCH 081/123] ci(repo): Version packages (Core 2) (#7731) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/busy-buttons-camp.md | 2 -- .changeset/fast-paws-promise.md | 5 ----- .changeset/polite-shirts-change.md | 6 ------ .changeset/red-shoes-drum.md | 5 ----- .changeset/shaky-otters-care.md | 7 ------- .changeset/six-tips-check.md | 5 ----- .changeset/thick-taxes-tell.md | 2 -- packages/agent-toolkit/CHANGELOG.md | 7 +++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 11 +++++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 12 ++++++++++++ packages/backend/package.json | 2 +- packages/express/CHANGELOG.md | 7 +++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 7 +++++++ packages/fastify/package.json | 2 +- packages/nextjs/CHANGELOG.md | 9 +++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 8 ++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 7 +++++++ packages/react-router/package.json | 2 +- packages/remix/CHANGELOG.md | 7 +++++++ packages/remix/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 11 +++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 7 +++++++ packages/testing/package.json | 2 +- packages/vue/CHANGELOG.md | 6 ++++++ packages/vue/package.json | 2 +- 31 files changed, 111 insertions(+), 44 deletions(-) delete mode 100644 .changeset/busy-buttons-camp.md delete mode 100644 .changeset/fast-paws-promise.md delete mode 100644 .changeset/polite-shirts-change.md delete mode 100644 .changeset/red-shoes-drum.md delete mode 100644 .changeset/shaky-otters-care.md delete mode 100644 .changeset/six-tips-check.md delete mode 100644 .changeset/thick-taxes-tell.md diff --git a/.changeset/busy-buttons-camp.md b/.changeset/busy-buttons-camp.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/busy-buttons-camp.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fast-paws-promise.md b/.changeset/fast-paws-promise.md deleted file mode 100644 index b079e1c66d8..00000000000 --- a/.changeset/fast-paws-promise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/tanstack-react-start": minor ---- - -Bumped minimum required TanStack Start dependencies to 1.157.0+ and removed usage of deprecated `json()` in favor of standard Web APIs. diff --git a/.changeset/polite-shirts-change.md b/.changeset/polite-shirts-change.md deleted file mode 100644 index 239b26fc745..00000000000 --- a/.changeset/polite-shirts-change.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@clerk/backend": patch -"@clerk/nextjs": patch ---- - -Fixed an issue where JWT OAuth access tokens where not treated as a machine token diff --git a/.changeset/red-shoes-drum.md b/.changeset/red-shoes-drum.md deleted file mode 100644 index 09752718a21..00000000000 --- a/.changeset/red-shoes-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/vue": patch ---- - -Fixed an error occurring in the composables where watchers attempted to call unwatch() within their own initialization. diff --git a/.changeset/shaky-otters-care.md b/.changeset/shaky-otters-care.md deleted file mode 100644 index b8a9919ec27..00000000000 --- a/.changeset/shaky-otters-care.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@clerk/backend': minor ---- - -Add `lastSignInAtAfter` and `lastSignInAtBefore` filters to the Users API list and count endpoints. - -These parameters are supported by `users.getUserList()` and are forwarded to `/v1/users` and `/v1/users/count` to filter users by last sign-in timestamp. diff --git a/.changeset/six-tips-check.md b/.changeset/six-tips-check.md deleted file mode 100644 index ecc0f127a0e..00000000000 --- a/.changeset/six-tips-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/astro': minor ---- - -Add `$billingStore` for access to the `Clerk.billing` object containing various Clerk Billing methods. diff --git a/.changeset/thick-taxes-tell.md b/.changeset/thick-taxes-tell.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/thick-taxes-tell.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index f22ebfbecc8..830bf3ecac0 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/agent-toolkit +## 0.2.20 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 0.2.19 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index f2dd6f60281..fd87c98e920 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.19", + "version": "0.2.20", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 3e6fe6c02b0..a8965bb5a03 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,16 @@ # @clerk/astro +## 2.17.0 + +### Minor Changes + +- Add `$billingStore` for access to the `Clerk.billing` object containing various Clerk Billing methods. ([#7733](https://github.com/clerk/javascript/pull/7733)) by [@dstaley](https://github.com/dstaley) + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 2.16.17 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index a63cf51e414..96b859aba5b 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.16.17", + "version": "2.17.0", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index dc4f43066cc..ee19cbf99c1 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## 2.30.0 + +### Minor Changes + +- Add `lastSignInAtAfter` and `lastSignInAtBefore` filters to the Users API list and count endpoints. ([#7721](https://github.com/clerk/javascript/pull/7721)) by [@Jibaru](https://github.com/Jibaru) + + These parameters are supported by `users.getUserList()` and are forwarded to `/v1/users` and `/v1/users/count` to filter users by last sign-in timestamp. + +### Patch Changes + +- Fixed an issue where JWT OAuth access tokens where not treated as a machine token ([#7756](https://github.com/clerk/javascript/pull/7756)) by [@wobsoriano](https://github.com/wobsoriano) + ## 2.29.7 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index de5f995c875..a1ed1e40ab3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.29.7", + "version": "2.30.0", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 805afc5718a..19ba0a7fc5c 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 1.7.68 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 1.7.67 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index af6c52f50d9..3729eae7402 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.67", + "version": "1.7.68", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 8b8ad71a41e..3fe9e5dd091 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.6.20 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 2.6.19 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index be2a8c67726..c793915b0d1 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.19", + "version": "2.6.20", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index f4ec6934820..e0fb415d801 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 6.37.2 + +### Patch Changes + +- Fixed an issue where JWT OAuth access tokens where not treated as a machine token ([#7756](https://github.com/clerk/javascript/pull/7756)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 6.37.1 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index d33f16bea6b..17442453cce 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.37.1", + "version": "6.37.2", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index df5760627c1..93f9aa1593c 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/nuxt +## 1.13.18 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`2fc5488`](https://github.com/clerk/javascript/commit/2fc548824f229d1fb94b6eb74cdac3d8c24610ce), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + - @clerk/vue@1.17.12 + ## 1.13.17 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index e2bee8b0c44..de5b1085e2d 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.17", + "version": "1.13.18", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 3b2fcad5ccb..75d167d0d79 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.2 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 2.4.1 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 91368f93dbf..c9bf1a7ae95 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.4.1", + "version": "2.4.2", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 5fa9967c21e..6a04635b843 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.13.35 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 4.13.34 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 0fe83b10215..2716e475c8f 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.34", + "version": "4.13.35", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index d05c8628155..9a108abb62e 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,16 @@ # @clerk/tanstack-react-start +## 0.29.0 + +### Minor Changes + +- Bumped minimum required TanStack Start dependencies to 1.157.0+ and removed usage of deprecated `json()` in favor of standard Web APIs. ([#7720](https://github.com/clerk/javascript/pull/7720)) by [@wobsoriano](https://github.com/wobsoriano) + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 0.28.1 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index c501a4ed71b..8c6a4310b85 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.28.1", + "version": "0.29.0", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 5f33206bfd6..6d200e6a86d 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/testing +## 1.13.34 + +### Patch Changes + +- Updated dependencies [[`7917ff4`](https://github.com/clerk/javascript/commit/7917ff4214fc9e1001e2698c7241bbfa4b68e5af), [`b0d28c1`](https://github.com/clerk/javascript/commit/b0d28c14815a6136c67a719efb1dc5496ffb5c82)]: + - @clerk/backend@2.30.0 + ## 1.13.33 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index c51b449146c..eed932aa7f6 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.33", + "version": "1.13.34", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 227ca81f22b..866495cb69b 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,11 @@ # @clerk/vue +## 1.17.12 + +### Patch Changes + +- Fixed an error occurring in the composables where watchers attempted to call unwatch() within their own initialization. ([#7744](https://github.com/clerk/javascript/pull/7744)) by [@wobsoriano](https://github.com/wobsoriano) + ## 1.17.11 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 37f22631141..689c48f0329 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.11", + "version": "1.17.12", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From a726252610ea0cbef2d971ec3ce8d0d4be3a3468 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Wed, 4 Feb 2026 15:38:56 -0800 Subject: [PATCH 082/123] chore(backend): Reject OAuth JWTs for session token token type (#7764) --- .changeset/thin-balloons-grin.md | 5 +++++ integration/tests/machine-auth/oauth.test.ts | 2 +- .../src/tokens/__tests__/request.test.ts | 18 +++++++++++++++++- packages/backend/src/tokens/request.ts | 15 ++++++++++++++- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 .changeset/thin-balloons-grin.md diff --git a/.changeset/thin-balloons-grin.md b/.changeset/thin-balloons-grin.md new file mode 100644 index 00000000000..201f8b39755 --- /dev/null +++ b/.changeset/thin-balloons-grin.md @@ -0,0 +1,5 @@ +--- +"@clerk/backend": patch +--- + +Improved token type validation in authentication requests diff --git a/integration/tests/machine-auth/oauth.test.ts b/integration/tests/machine-auth/oauth.test.ts index 863c86ea212..a501a15bfad 100644 --- a/integration/tests/machine-auth/oauth.test.ts +++ b/integration/tests/machine-auth/oauth.test.ts @@ -50,7 +50,7 @@ test.describe('OAuth machine authentication @machine', () => { .commit(); await app.setup(); - await app.withEnv(appConfigs.envs.withEmailCodes); + await app.withEnv(appConfigs.envs.withAPIKeys); await app.dev(); // Test user that will authorize the OAuth application diff --git a/packages/backend/src/tokens/__tests__/request.test.ts b/packages/backend/src/tokens/__tests__/request.test.ts index 450da616de5..df3429c2277 100644 --- a/packages/backend/src/tokens/__tests__/request.test.ts +++ b/packages/backend/src/tokens/__tests__/request.test.ts @@ -10,7 +10,12 @@ import { mockJwtPayload, mockMalformedJwt, } from '../../fixtures'; -import { mockMachineAuthResponses, mockTokens, mockVerificationResults } from '../../fixtures/machine'; +import { + mockMachineAuthResponses, + mockSignedOAuthAccessTokenJwt, + mockTokens, + mockVerificationResults, +} from '../../fixtures/machine'; import { server } from '../../mock-server'; import type { AuthReason } from '../authStatus'; import { AuthErrorReason, AuthStatus } from '../authStatus'; @@ -1390,6 +1395,17 @@ describe('tokens.authenticateRequest(options)', () => { isAuthenticated: false, }); }); + + test('rejects OAuth JWT token when acceptsToken is session_token', async () => { + const request = mockRequest({ authorization: `Bearer ${mockSignedOAuthAccessTokenJwt}` }); + const result = await authenticateRequest(request, mockOptions({ acceptsToken: 'session_token' })); + + expect(result).toBeSignedOut({ + reason: AuthErrorReason.TokenTypeMismatch, + message: '', + }); + expect(result.toAuth()).toBeSignedOutToAuth(); + }); }); describe('Array of Accepted Token Types', () => { diff --git a/packages/backend/src/tokens/request.ts b/packages/backend/src/tokens/request.ts index 88999fedc0c..ccef1a8cc42 100644 --- a/packages/backend/src/tokens/request.ts +++ b/packages/backend/src/tokens/request.ts @@ -14,7 +14,7 @@ import { AuthErrorReason, handshake, signedIn, signedOut, signedOutInvalidToken import { createClerkRequest } from './clerkRequest'; import { getCookieName, getCookieValue } from './cookie'; import { HandshakeService } from './handshake'; -import { getMachineTokenType, isMachineToken, isTokenTypeAccepted } from './machine'; +import { getMachineTokenType, isMachineToken, isOAuthJwt, isTokenTypeAccepted } from './machine'; import { OrganizationMatcher } from './organizationMatcher'; import type { MachineTokenType, SessionTokenType } from './tokenTypes'; import { TokenType } from './tokenTypes'; @@ -411,6 +411,19 @@ export const authenticateRequest: AuthenticateRequest = (async ( async function authenticateRequestWithTokenInHeader() { const { tokenInHeader } = authenticateContext; + // Reject OAuth JWTs that may appear in headers when expecting session tokens. + // OAuth JWTs are valid Clerk-signed JWTs and will pass verifyToken() verification, + // but should not be accepted as session tokens. + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (isOAuthJwt(tokenInHeader!)) { + return signedOut({ + tokenType: TokenType.SessionToken, + authenticateContext, + reason: AuthErrorReason.TokenTypeMismatch, + message: '', + }); + } + try { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const { data, errors } = await verifyToken(tokenInHeader!, authenticateContext); From 68dc50234bd418c44501e1407fbce47d35dbfb1a Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Wed, 4 Feb 2026 18:21:26 -0600 Subject: [PATCH 083/123] feat(clerk-js): Add debug logging for Turnstile captcha errors (#7768) --- .changeset/captcha-error-diagnostics.md | 5 ++ .../clerk-js/src/utils/captcha/turnstile.ts | 50 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 .changeset/captcha-error-diagnostics.md diff --git a/.changeset/captcha-error-diagnostics.md b/.changeset/captcha-error-diagnostics.md new file mode 100644 index 00000000000..2c652e83027 --- /dev/null +++ b/.changeset/captcha-error-diagnostics.md @@ -0,0 +1,5 @@ +--- +"@clerk/clerk-js": patch +--- + +Improve captcha error diagnostics diff --git a/packages/clerk-js/src/utils/captcha/turnstile.ts b/packages/clerk-js/src/utils/captcha/turnstile.ts index 1a21f57d1dc..a4e75ad2826 100644 --- a/packages/clerk-js/src/utils/captcha/turnstile.ts +++ b/packages/clerk-js/src/utils/captcha/turnstile.ts @@ -2,6 +2,8 @@ import { waitForElement } from '@clerk/shared/dom'; import { loadScript } from '@clerk/shared/loadScript'; import type { CaptchaAppearanceOptions, CaptchaWidgetType } from '@clerk/shared/types'; +import { debugLogger } from '@/utils/debug'; + import { CAPTCHA_ELEMENT_ID, CAPTCHA_INVISIBLE_CLASSNAME } from './constants'; import type { CaptchaOptions } from './types'; @@ -74,8 +76,24 @@ export const getTurnstileToken = async (opts: CaptchaOptions) => { const { siteKey, widgetType, invisibleSiteKey, nonce } = opts; const { modalContainerQuerySelector, modalWrapperQuerySelector, closeModal, openModal } = opts; const captcha: Turnstile.Turnstile = await loadCaptcha(nonce); + + // Error codes array - used for actual error handling (unchanged from original behavior) const errorCodes: (string | number)[] = []; + // Diagnostic tracking - wrapped in try-catch to never affect production behavior + let startTime = 0; + const errorTimeline: Array<{ code: string | number; t: number }> = []; + let captchaAttemptId = ''; + try { + startTime = Date.now(); + captchaAttemptId = + typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' + ? crypto.randomUUID() + : Math.random().toString(36).substring(2, 9); + } catch { + // Silently ignore - diagnostics should never break captcha flow + } + let captchaToken = ''; let id = ''; let turnstileSiteKey = siteKey; @@ -180,7 +198,14 @@ export const getTurnstileToken = async (opts: CaptchaOptions) => { } }, 'error-callback': function (errorCode) { + // Track error for actual error handling (original behavior) errorCodes.push(errorCode); + // Track timing for diagnostics only + try { + errorTimeline.push({ code: errorCode, t: Date.now() - startTime }); + } catch { + // Silently ignore - diagnostics should never break captcha flow + } /** * By setting retry to 'never' the responsibility for implementing retrying is ours * https://developers.cloudflare.com/turnstile/reference/client-side-errors/#retrying @@ -219,6 +244,31 @@ export const getTurnstileToken = async (opts: CaptchaOptions) => { // After a failed challenge remove it captcha.remove(id); } + + // Log failure with full error history for debugging - wrapped to never affect production + try { + const containerExistsAtFailure = widgetContainerQuerySelector + ? !!document.querySelector(widgetContainerQuerySelector) + : false; + + debugLogger.error( + 'Turnstile captcha challenge failed', + { + captchaAttemptId, + errorTimeline, + lastErrorCode: errorTimeline.length > 0 ? errorTimeline[errorTimeline.length - 1].code : null, + finalError: String(e), + retriesAttempted: retries, + widgetType: captchaTypeUsed, + containerExistsAtFailure, + totalDurationMs: Date.now() - startTime, + }, + 'captcha', + ); + } catch { + // Silently ignore - diagnostics should never break captcha flow + } + // eslint-disable-next-line @typescript-eslint/only-throw-error throw { captchaError: e, From 3340546e92a3b5cd28e8588804e587426e78f80c Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Wed, 4 Feb 2026 21:12:02 -0500 Subject: [PATCH 084/123] ci(repo): Version packages (Core 2) (#7770) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/captcha-error-diagnostics.md | 5 ----- .changeset/thin-balloons-grin.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 7 +++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 7 +++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 6 ++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 7 +++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 6 ++++++ packages/clerk-js/package.json | 2 +- packages/expo/CHANGELOG.md | 7 +++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 7 +++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 7 +++++++ packages/fastify/package.json | 2 +- packages/nextjs/CHANGELOG.md | 7 +++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 7 +++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 7 +++++++ packages/react-router/package.json | 2 +- packages/remix/CHANGELOG.md | 7 +++++++ packages/remix/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 7 +++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 7 +++++++ packages/testing/package.json | 2 +- 30 files changed, 110 insertions(+), 24 deletions(-) delete mode 100644 .changeset/captcha-error-diagnostics.md delete mode 100644 .changeset/thin-balloons-grin.md diff --git a/.changeset/captcha-error-diagnostics.md b/.changeset/captcha-error-diagnostics.md deleted file mode 100644 index 2c652e83027..00000000000 --- a/.changeset/captcha-error-diagnostics.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/clerk-js": patch ---- - -Improve captcha error diagnostics diff --git a/.changeset/thin-balloons-grin.md b/.changeset/thin-balloons-grin.md deleted file mode 100644 index 201f8b39755..00000000000 --- a/.changeset/thin-balloons-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/backend": patch ---- - -Improved token type validation in authentication requests diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 830bf3ecac0..9b786322f7b 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/agent-toolkit +## 0.2.21 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 0.2.20 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index fd87c98e920..7fb6b8ae51c 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.20", + "version": "0.2.21", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index a8965bb5a03..c3e8df05c08 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/astro +## 2.17.1 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 2.17.0 ### Minor Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 96b859aba5b..f077b72ecf6 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.17.0", + "version": "2.17.1", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index ee19cbf99c1..ef239511a90 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 2.30.1 + +### Patch Changes + +- Improved token type validation in authentication requests ([#7764](https://github.com/clerk/javascript/pull/7764)) by [@wobsoriano](https://github.com/wobsoriano) + ## 2.30.0 ### Minor Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index a1ed1e40ab3..cdbe1df3783 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.30.0", + "version": "2.30.1", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 5fe327716e1..b1b69f86167 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.9.1 + +### Patch Changes + +- Updated dependencies [[`68dc502`](https://github.com/clerk/javascript/commit/68dc50234bd418c44501e1407fbce47d35dbfb1a)]: + - @clerk/clerk-js@5.122.1 + ## 2.9.0 ### Minor Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index b9b7a880f18..b1dc6df07d4 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.9.0", + "version": "2.9.1", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index f802c94db4f..22f3813ec83 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 5.122.1 + +### Patch Changes + +- Improve captcha error diagnostics ([#7768](https://github.com/clerk/javascript/pull/7768)) by [@jacekradko](https://github.com/jacekradko) + ## 5.122.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 5abcd21c0c2..2d224ee4ad1 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.122.0", + "version": "5.122.1", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index ce414b4d03a..a8b527c588f 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.19.22 + +### Patch Changes + +- Updated dependencies [[`68dc502`](https://github.com/clerk/javascript/commit/68dc50234bd418c44501e1407fbce47d35dbfb1a)]: + - @clerk/clerk-js@5.122.1 + ## 2.19.21 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 259149102ad..5c83a367943 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.21", + "version": "2.19.22", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 19ba0a7fc5c..b9295fdda99 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 1.7.69 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 1.7.68 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 3729eae7402..fa2410f35e4 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.68", + "version": "1.7.69", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 3fe9e5dd091..f4868069d0b 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.6.21 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 2.6.20 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index c793915b0d1..5bb87b3510d 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.20", + "version": "2.6.21", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index e0fb415d801..7a575e9b149 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 6.37.3 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 6.37.2 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 17442453cce..48fdb537ba6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.37.2", + "version": "6.37.3", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 93f9aa1593c..46257a89bc5 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/nuxt +## 1.13.19 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 1.13.18 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index de5b1085e2d..a90e61fb717 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.18", + "version": "1.13.19", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 75d167d0d79..4b74ea85f62 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.3 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 2.4.2 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index c9bf1a7ae95..0d8f15e0780 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.4.2", + "version": "2.4.3", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 6a04635b843..d27b91702ac 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.13.36 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 4.13.35 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 2716e475c8f..d2509a1d9f1 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.35", + "version": "4.13.36", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 9a108abb62e..177067dc1aa 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/tanstack-react-start +## 0.29.1 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 0.29.0 ### Minor Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 8c6a4310b85..16c178472ee 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.29.0", + "version": "0.29.1", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 6d200e6a86d..df6f1e8d139 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/testing +## 1.13.35 + +### Patch Changes + +- Updated dependencies [[`a726252`](https://github.com/clerk/javascript/commit/a726252610ea0cbef2d971ec3ce8d0d4be3a3468)]: + - @clerk/backend@2.30.1 + ## 1.13.34 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index eed932aa7f6..dfcfd658f2a 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.34", + "version": "1.13.35", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", From 03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db Mon Sep 17 00:00:00 2001 From: Ignacior <54339832+Jibaru@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:43:01 -0500 Subject: [PATCH 085/123] feat(backend): Add bulk create method for waitlist entries core-2 (#7762) --- .changeset/tough-taxis-care.md | 5 ++ .../backend/src/api/__tests__/factory.test.ts | 67 +++++++++++++++++++ .../src/api/endpoints/WaitlistEntryApi.ts | 14 ++++ 3 files changed, 86 insertions(+) create mode 100644 .changeset/tough-taxis-care.md diff --git a/.changeset/tough-taxis-care.md b/.changeset/tough-taxis-care.md new file mode 100644 index 00000000000..93b2f08d298 --- /dev/null +++ b/.changeset/tough-taxis-care.md @@ -0,0 +1,5 @@ +--- +'@clerk/backend': minor +--- + +Add `createBulk()` method to `WaitlistEntryAPI` for bulk creating waitlist entries diff --git a/packages/backend/src/api/__tests__/factory.test.ts b/packages/backend/src/api/__tests__/factory.test.ts index 337581f52cb..03086f91640 100644 --- a/packages/backend/src/api/__tests__/factory.test.ts +++ b/packages/backend/src/api/__tests__/factory.test.ts @@ -465,4 +465,71 @@ describe('api.client', () => { expect(response.id).toBe('mt_test'); }); }); + + describe('WaitlistEntry', () => { + it('executes a successful backend API request to bulk create waitlist entries', async () => { + const emailAddresses = ['foo@bar.com', 'bar@foo.com']; + const ids = ['wle_123', 'wle_456']; + const createdAt = 1700000000; + const updatedAt = 1700000100; + + server.use( + http.post( + `https://api.clerk.test/v1/waitlist_entries/bulk`, + validateHeaders(async ({ request }) => { + const body = await request.json(); + expect(body).toEqual([ + { email_address: emailAddresses[0] }, + { email_address: emailAddresses[1], notify: true }, + ]); + + return HttpResponse.json([ + { + object: 'waitlist_entry', + id: ids[0], + email_address: emailAddresses[0], + status: 'pending', + is_locked: false, + created_at: createdAt, + updated_at: updatedAt, + invitation: null, + }, + { + object: 'waitlist_entry', + id: ids[1], + email_address: emailAddresses[1], + status: 'pending', + is_locked: false, + created_at: createdAt, + updated_at: updatedAt, + invitation: null, + }, + ]); + }), + ), + ); + + const response = await apiClient.waitlistEntries.createBulk([ + { emailAddress: emailAddresses[0] }, + { emailAddress: emailAddresses[1], notify: true }, + ]); + + expect(response).toHaveLength(2); + expect(response[0].id).toBe(ids[0]); + expect(response[0].emailAddress).toBe(emailAddresses[0]); + expect(response[0].status).toBe('pending'); + expect(response[0].isLocked).toBe(false); + expect(response[0].createdAt).toBe(createdAt); + expect(response[0].updatedAt).toBe(updatedAt); + expect(response[0].invitation).toBe(null); + + expect(response[1].id).toBe(ids[1]); + expect(response[1].emailAddress).toBe(emailAddresses[1]); + expect(response[1].status).toBe('pending'); + expect(response[1].isLocked).toBe(false); + expect(response[1].createdAt).toBe(createdAt); + expect(response[1].updatedAt).toBe(updatedAt); + expect(response[1].invitation).toBe(null); + }); + }); }); diff --git a/packages/backend/src/api/endpoints/WaitlistEntryApi.ts b/packages/backend/src/api/endpoints/WaitlistEntryApi.ts index 7dc7b7d3f24..b5f4602cde6 100644 --- a/packages/backend/src/api/endpoints/WaitlistEntryApi.ts +++ b/packages/backend/src/api/endpoints/WaitlistEntryApi.ts @@ -24,6 +24,8 @@ type WaitlistEntryCreateParams = { notify?: boolean; }; +type WaitlistEntryBulkCreateParams = Array; + type WaitlistEntryInviteParams = { /** * When true, do not error if an invitation already exists. Default: false. @@ -56,6 +58,18 @@ export class WaitlistEntryAPI extends AbstractAPI { }); } + /** + * Bulk create waitlist entries. + * @param params An array of parameters for creating waitlist entries. + */ + public async createBulk(params: WaitlistEntryBulkCreateParams) { + return this.request({ + method: 'POST', + path: joinPaths(basePath, 'bulk'), + bodyParams: params, + }); + } + /** * Invite a waitlist entry. * @param id The waitlist entry ID. From 8cb461d796434084c72a1bdcfa253497bd609b34 Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Thu, 5 Feb 2026 21:02:36 -0600 Subject: [PATCH 086/123] fix(clerk-js): Disable ConsoleTransport for debug logger (#7786) --- .changeset/disable-console-transport.md | 5 ++ .../core/modules/debug/transports/console.ts | 66 ++----------------- 2 files changed, 9 insertions(+), 62 deletions(-) create mode 100644 .changeset/disable-console-transport.md diff --git a/.changeset/disable-console-transport.md b/.changeset/disable-console-transport.md new file mode 100644 index 00000000000..1e9b3c31372 --- /dev/null +++ b/.changeset/disable-console-transport.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Disable ConsoleTransport for debug logger by default diff --git a/packages/clerk-js/src/core/modules/debug/transports/console.ts b/packages/clerk-js/src/core/modules/debug/transports/console.ts index 1b064e2a729..79b90bed128 100644 --- a/packages/clerk-js/src/core/modules/debug/transports/console.ts +++ b/packages/clerk-js/src/core/modules/debug/transports/console.ts @@ -1,35 +1,10 @@ import type { DebugLogEntry, DebugTransport } from '../types'; -/** - * ANSI color codes for console output - */ -const COLORS = { - blue: '\x1b[34m', - bright: '\x1b[1m', - cyan: '\x1b[36m', - dim: '\x1b[2m', - gray: '\x1b[90m', - green: '\x1b[32m', - magenta: '\x1b[35m', - red: '\x1b[31m', - reset: '\x1b[0m', - white: '\x1b[37m', - yellow: '\x1b[33m', -} as const; - -/** - * Color mapping for different log levels - */ -const LEVEL_COLORS = { - debug: COLORS.green, - error: COLORS.red, - info: COLORS.blue, - warn: COLORS.yellow, -} as const; - /** * A transport that writes debug logs to the host environment's console - * (e.g. browser devtools or Node.js stdout) with ANSI color accents. + * (e.g. browser devtools or Node.js stdout). + * + * Currently disabled by default (noop). * * @public */ @@ -40,40 +15,7 @@ export class ConsoleTransport implements DebugTransport { * * @param entry - The debug log entry to print */ - send(entry: DebugLogEntry): Promise { - const timestamp = new Date(entry.timestamp).toISOString(); - const level = entry.level.toUpperCase(); - const source = entry.source ? `[${entry.source}]` : ''; - const context = entry.context ? ` ${JSON.stringify(entry.context)}` : ''; - - const levelColor = LEVEL_COLORS[entry.level] || COLORS.white; - - const prefix = `${COLORS.bright}${COLORS.cyan}[Clerk Debug]${COLORS.reset}`; - const timestampColored = `${COLORS.dim}${timestamp}${COLORS.reset}`; - const levelColored = `${levelColor}${level}${COLORS.reset}`; - const sourceColored = source ? `${COLORS.gray}${source}${COLORS.reset}` : ''; - const messageColored = `${COLORS.white}${entry.message}${COLORS.reset}`; - const contextColored = context ? `${COLORS.dim}${context}${COLORS.reset}` : ''; - - const message = `${prefix} ${timestampColored} ${levelColored}${sourceColored}: ${messageColored}${contextColored}`; - - switch (entry.level) { - case 'error': - console.error(message); - break; - case 'warn': - console.warn(message); - break; - case 'info': - console.info(message); - break; - case 'debug': - console.debug(message); - break; - default: - console.log(message); - } - + send(_entry: DebugLogEntry): Promise { return Promise.resolve(); } } From 1fe87acf1b214ba805ab15fe6a2b2254c5dcdaa2 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 6 Feb 2026 13:53:39 +0200 Subject: [PATCH 087/123] fix(clerk-js): prevent infinite spinner on factor-two without active 2fa session (#7787) --- .changeset/fix-factor-two-infinite-spinner.md | 5 +++++ .../ui/components/SignIn/SignInFactorTwo.tsx | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 .changeset/fix-factor-two-infinite-spinner.md diff --git a/.changeset/fix-factor-two-infinite-spinner.md b/.changeset/fix-factor-two-infinite-spinner.md new file mode 100644 index 00000000000..284b7617613 --- /dev/null +++ b/.changeset/fix-factor-two-infinite-spinner.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Fix infinite loading spinner when navigating to factor-two sign-in route without an active 2FA session diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx index 61b94f57262..a082a03b183 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx @@ -1,3 +1,4 @@ +import { useClerk } from '@clerk/shared/react'; import type { SignInFactor } from '@clerk/shared/types'; import React from 'react'; @@ -6,6 +7,7 @@ import { LoadingCard } from '@/ui/elements/LoadingCard'; import { withRedirectToAfterSignIn, withRedirectToSignInTask } from '../../common'; import { useCoreSignIn } from '../../contexts'; +import { useRouter } from '../../router'; import { SignInFactorTwoAlternativeMethods } from './SignInFactorTwoAlternativeMethods'; import { SignInFactorTwoBackupCodeCard } from './SignInFactorTwoBackupCodeCard'; import { SignInFactorTwoEmailCodeCard } from './SignInFactorTwoEmailCodeCard'; @@ -26,7 +28,9 @@ const factorKey = (factor: SignInFactor | null | undefined) => { }; function SignInFactorTwoInternal(): JSX.Element { + const { __internal_setActiveInProgress } = useClerk(); const signIn = useCoreSignIn(); + const router = useRouter(); const availableFactors = signIn.supportedSecondFactors; const lastPreparedFactorKeyRef = React.useRef(''); @@ -45,6 +49,19 @@ function SignInFactorTwoInternal(): JSX.Element { toggleAllStrategies(); }; + React.useEffect(() => { + if (__internal_setActiveInProgress) { + return; + } + + // If the sign-in was reset or doesn't exist, redirect back to the start. + // Don't redirect for 'complete' status - setActive will handle navigation. + if (signIn.status === null || signIn.status === 'needs_identifier' || signIn.status === 'needs_first_factor') { + void router.navigate('../'); + } + // eslint-disable-next-line react-hooks/exhaustive-deps -- Match SignInFactorOne pattern: only run on mount and when setActiveInProgress changes + }, [__internal_setActiveInProgress]); + if (!currentFactor) { return ; } From 57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d Mon Sep 17 00:00:00 2001 From: Ignacior <54339832+Jibaru@users.noreply.github.com> Date: Fri, 6 Feb 2026 08:54:33 -0500 Subject: [PATCH 088/123] feat(backend,clerk-js): Add providerUserId field to ExternalAccount (#7778) --- .changeset/legal-crabs-shout.md | 6 ++++++ packages/backend/src/api/resources/ExternalAccount.ts | 6 ++++++ .../src/core/resources/__tests__/ExternalAccount.test.ts | 4 ++++ 3 files changed, 16 insertions(+) create mode 100644 .changeset/legal-crabs-shout.md diff --git a/.changeset/legal-crabs-shout.md b/.changeset/legal-crabs-shout.md new file mode 100644 index 00000000000..1f694546d75 --- /dev/null +++ b/.changeset/legal-crabs-shout.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': minor +'@clerk/backend': minor +--- + +Add `providerUserId` field to `ExternalAccount` resource as the preferred way to access the unique user ID from the OAuth provider. The existing `externalId` field is now deprecated in favor of `providerUserId` for better clarity and consistency across the API. diff --git a/packages/backend/src/api/resources/ExternalAccount.ts b/packages/backend/src/api/resources/ExternalAccount.ts index a4fcd8bbb80..a623a7f8a51 100644 --- a/packages/backend/src/api/resources/ExternalAccount.ts +++ b/packages/backend/src/api/resources/ExternalAccount.ts @@ -16,12 +16,17 @@ export class ExternalAccount { * The provider name (e.g., `google`). */ readonly provider: string, + /** + * The unique ID of the user in the provider. + */ + readonly providerUserId: string, /** * The identification with which this external account is associated. */ readonly identificationId: string, /** * The unique ID of the user in the provider. + * @deprecated Use providerUserId instead */ readonly externalId: string, /** @@ -70,6 +75,7 @@ export class ExternalAccount { return new ExternalAccount( data.id, data.provider, + data.provider_user_id, data.identification_id, data.provider_user_id, data.approved_scopes, diff --git a/packages/clerk-js/src/core/resources/__tests__/ExternalAccount.test.ts b/packages/clerk-js/src/core/resources/__tests__/ExternalAccount.test.ts index 9c59639cdb1..5e01de7b539 100644 --- a/packages/clerk-js/src/core/resources/__tests__/ExternalAccount.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/ExternalAccount.test.ts @@ -9,6 +9,8 @@ describe('External account', () => { const externalAccountJSON = { object: 'external_account', id: targetId, + provider_user_id: 'test_provider_user_id', + identification_id: 'test_identification_id', }; // @ts-ignore @@ -35,6 +37,8 @@ describe('External account', () => { object: 'external_account', id: targetId, deleted: true, + provider_user_id: 'test_provider_user_id', + identification_id: 'test_identification_id', }; // @ts-ignore From 4a58c10b94de5bee04d8b7ee24e14910ee8d675d Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Fri, 6 Feb 2026 08:21:49 -0600 Subject: [PATCH 089/123] docs(repo): Add types for WaitlistEntry (#7784) --- .changeset/clever-carrots-add.md | 2 ++ .typedoc/custom-plugin.mjs | 1 + .../src/api/resources/WaitlistEntry.ts | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 .changeset/clever-carrots-add.md diff --git a/.changeset/clever-carrots-add.md b/.changeset/clever-carrots-add.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/clever-carrots-add.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.typedoc/custom-plugin.mjs b/.typedoc/custom-plugin.mjs index 5b137e740de..233c6b7c39a 100644 --- a/.typedoc/custom-plugin.mjs +++ b/.typedoc/custom-plugin.mjs @@ -73,6 +73,7 @@ const LINK_REPLACEMENTS = [ ['phone-number', '/docs/reference/backend/types/backend-phone-number'], ['saml-account', '/docs/reference/backend/types/backend-saml-account'], ['web3-wallet', '/docs/reference/backend/types/backend-web3-wallet'], + ['invitation', '/docs/reference/backend/types/backend-invitation'], ['verify-token-options', '#verify-token-options'], ['localization-resource', '/docs/guides/customizing-clerk/localization'], ['confirm-checkout-params', '/docs/reference/javascript/types/billing-checkout-resource#parameters'], diff --git a/packages/backend/src/api/resources/WaitlistEntry.ts b/packages/backend/src/api/resources/WaitlistEntry.ts index 58c2ee71cf1..e3b3557b38e 100644 --- a/packages/backend/src/api/resources/WaitlistEntry.ts +++ b/packages/backend/src/api/resources/WaitlistEntry.ts @@ -2,14 +2,38 @@ import type { WaitlistEntryStatus } from './Enums'; import { Invitation } from './Invitation'; import type { WaitlistEntryJSON } from './JSON'; +/** + * The Backend `WaitlistEntry` object holds information about a waitlist entry for a given email address. + */ export class WaitlistEntry { constructor( + /** + * The unique identifier for this waitlist entry. + */ readonly id: string, + /** + * The email address to add to the waitlist. + */ readonly emailAddress: string, + /** + * The status of the waitlist entry. + */ readonly status: WaitlistEntryStatus, + /** + * The invitation associated with this waitlist entry. + */ readonly invitation: Invitation | null, + /** + * The date when the waitlist entry was first created. + */ readonly createdAt: number, + /** + * The date when the waitlist entry was last updated. + */ readonly updatedAt: number, + /** + * Whether the waitlist entry is locked or not. + */ readonly isLocked?: boolean, ) {} From ea9a038403e1d62a30a524e1d85ef06c0282687e Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Fri, 6 Feb 2026 12:04:15 -0600 Subject: [PATCH 090/123] docs(repo): Fix deprecated externalId JSdoc comment for Typedoc output (#7791) --- .changeset/fluffy-toys-wash.md | 2 ++ packages/backend/src/api/resources/ExternalAccount.ts | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .changeset/fluffy-toys-wash.md diff --git a/.changeset/fluffy-toys-wash.md b/.changeset/fluffy-toys-wash.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/fluffy-toys-wash.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/backend/src/api/resources/ExternalAccount.ts b/packages/backend/src/api/resources/ExternalAccount.ts index a623a7f8a51..71c072cbac3 100644 --- a/packages/backend/src/api/resources/ExternalAccount.ts +++ b/packages/backend/src/api/resources/ExternalAccount.ts @@ -25,8 +25,7 @@ export class ExternalAccount { */ readonly identificationId: string, /** - * The unique ID of the user in the provider. - * @deprecated Use providerUserId instead + * @deprecated Use `providerUserId` instead. */ readonly externalId: string, /** From 965a4cb051df26afb9053658c068c4a0aef946b0 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Fri, 6 Feb 2026 18:47:03 -0800 Subject: [PATCH 091/123] fix(clerk-js): Show primary email or phone number in OAuth consent screen (#7797) --- .changeset/fast-paws-double.md | 5 +++++ .../src/ui/components/OAuthConsent/OAuthConsent.tsx | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 .changeset/fast-paws-double.md diff --git a/.changeset/fast-paws-double.md b/.changeset/fast-paws-double.md new file mode 100644 index 00000000000..43b775ab514 --- /dev/null +++ b/.changeset/fast-paws-double.md @@ -0,0 +1,5 @@ +--- +"@clerk/clerk-js": patch +--- + +Fixed an issue where primary identifier shows undefined when signing in with phone number only diff --git a/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx b/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx index 8555248176f..1ad15bbfaf0 100644 --- a/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx +++ b/packages/clerk-js/src/ui/components/OAuthConsent/OAuthConsent.tsx @@ -25,7 +25,7 @@ export function OAuthConsentInternal() { const { applicationName, logoImageUrl } = useEnvironment().displayConfig; const [isUriModalOpen, setIsUriModalOpen] = useState(false); - const primaryEmailAddress = user?.emailAddresses.find(email => email.id === user.primaryEmailAddress?.id); + const primaryIdentifier = user?.primaryEmailAddress?.emailAddress || user?.primaryPhoneNumber?.phoneNumber; // Filter out offline_access from displayed scopes as it doesn't describe what can be accessed const displayedScopes = (scopes || []).filter(item => item.scope !== OFFLINE_ACCESS_SCOPE); @@ -106,9 +106,7 @@ export function OAuthConsentInternal() { )} - + ({ From bca677e090a3206efc03032635578bf6cb45ad32 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Mon, 9 Feb 2026 09:47:56 -0800 Subject: [PATCH 092/123] fix(astro): Ensure runInjectionScript runs on initial page loads with view transitions enabled (#7804) Co-authored-by: Lino Le Van <11367844+lino-levan@users.noreply.github.com> --- .changeset/ready-cats-tease.md | 5 +++++ packages/astro/src/integration/create-integration.ts | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/ready-cats-tease.md diff --git a/.changeset/ready-cats-tease.md b/.changeset/ready-cats-tease.md new file mode 100644 index 00000000000..2911d468559 --- /dev/null +++ b/.changeset/ready-cats-tease.md @@ -0,0 +1,5 @@ +--- +'@clerk/astro': patch +--- + +Fixed an issue when using `ClientRouter` where Clerk components don't load until navigation is performed. diff --git a/packages/astro/src/integration/create-integration.ts b/packages/astro/src/integration/create-integration.ts index 235484e40b2..d06ef924bc2 100644 --- a/packages/astro/src/integration/create-integration.ts +++ b/packages/astro/src/integration/create-integration.ts @@ -126,9 +126,10 @@ function createIntegration() } if (transitionEnabledOnThisPage()) { - const { navigate, swapFunctions } = await import('astro:transitions/client'); + // We must do the dynamic imports within the event listeners because otherwise we may race and miss initial astro:page-load + document.addEventListener('astro:before-swap', async (e) => { + const { swapFunctions } = await import('astro:transitions/client'); - document.addEventListener('astro:before-swap', (e) => { const clerkComponents = document.querySelector('#clerk-components'); // Keep the div element added by Clerk if (clerkComponents) { @@ -140,6 +141,8 @@ function createIntegration() }); document.addEventListener('astro:page-load', async (e) => { + const { navigate } = await import('astro:transitions/client'); + await runInjectionScript({ ...${JSON.stringify(internalParams)}, routerPush: navigate, From dbdf83ec1f9798b40fc71c09629e6fb294511f70 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:37:57 -0300 Subject: [PATCH 093/123] chore(clerk-js): Add handling for `user_deactivated` error code (#7811) --- .changeset/little-words-serve.md | 5 +++++ packages/clerk-js/src/core/constants.ts | 1 + packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx | 1 + packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx | 1 + 4 files changed, 8 insertions(+) create mode 100644 .changeset/little-words-serve.md diff --git a/.changeset/little-words-serve.md b/.changeset/little-words-serve.md new file mode 100644 index 00000000000..b56efdc6784 --- /dev/null +++ b/.changeset/little-words-serve.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Display message for `user_deactivated` error code on `SignIn` and `SignUp` diff --git a/packages/clerk-js/src/core/constants.ts b/packages/clerk-js/src/core/constants.ts index c2a728c71f4..981f66a6da0 100644 --- a/packages/clerk-js/src/core/constants.ts +++ b/packages/clerk-js/src/core/constants.ts @@ -41,6 +41,7 @@ export const ERROR_CODES = { FRAUD_ACTION_BLOCKED: 'action_blocked', SIGNUP_RATE_LIMIT_EXCEEDED: 'signup_rate_limit_exceeded', USER_BANNED: 'user_banned', + USER_DEACTIVATED: 'user_deactivated', } as const; export const SIGN_IN_INITIAL_VALUE_KEYS = ['email_address', 'phone_number', 'username']; diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx index eb4d2d9a50d..281bd79c3a5 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx @@ -295,6 +295,7 @@ function SignInStartInternal(): JSX.Element { case ERROR_CODES.FRAUD_ACTION_BLOCKED: case ERROR_CODES.SIGNUP_RATE_LIMIT_EXCEEDED: case ERROR_CODES.USER_BANNED: + case ERROR_CODES.USER_DEACTIVATED: card.setError(error); break; default: diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx index ff910fcf2a8..5f8e34e54a5 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx @@ -224,6 +224,7 @@ function SignUpStartInternal(): JSX.Element { case ERROR_CODES.FRAUD_ACTION_BLOCKED: case ERROR_CODES.SIGNUP_RATE_LIMIT_EXCEEDED: case ERROR_CODES.USER_BANNED: + case ERROR_CODES.USER_DEACTIVATED: card.setError(error); break; default: From 2e8d1bd3fc9b771784f66f41eac5912c11bb9d3a Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 10 Feb 2026 14:46:53 -0800 Subject: [PATCH 094/123] fix(repo): Handle framework param in keyless claim URL test (#7814) --- .changeset/spicy-sheep-divide.md | 2 ++ .../tests/next-quickstart-keyless.test.ts | 26 +++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/spicy-sheep-divide.md diff --git a/.changeset/spicy-sheep-divide.md b/.changeset/spicy-sheep-divide.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/spicy-sheep-divide.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/integration/tests/next-quickstart-keyless.test.ts b/integration/tests/next-quickstart-keyless.test.ts index d143b60385e..082367c1a7a 100644 --- a/integration/tests/next-quickstart-keyless.test.ts +++ b/integration/tests/next-quickstart-keyless.test.ts @@ -89,20 +89,24 @@ test.describe('Keyless mode @quickstart', () => { await newPage.waitForLoadState(); await newPage.waitForURL(url => { - const urlToReturnTo = `${dashboardUrl}apps/claim?token=`; - + const signInForceRedirectUrl = url.searchParams.get('sign_in_force_redirect_url'); const signUpForceRedirectUrl = url.searchParams.get('sign_up_force_redirect_url'); - const signUpForceRedirectUrlCheck = - signUpForceRedirectUrl?.startsWith(urlToReturnTo) || - (signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) && - signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim?token='))); + // Backend adds framework=nextjs query param before token, so use .includes() instead of .startsWith() + const signInHasRequiredParams = + signInForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) && signInForceRedirectUrl?.includes('token='); + + const signUpRegularCase = + signUpForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) && signUpForceRedirectUrl?.includes('token='); + + const signUpPrepareAccountCase = + signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) && + signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim')) && + signUpForceRedirectUrl?.includes(encodeURIComponent('token=')); + + const signUpHasRequiredParams = signUpRegularCase || signUpPrepareAccountCase; - return ( - url.pathname === '/apps/claim/sign-in' && - url.searchParams.get('sign_in_force_redirect_url')?.startsWith(urlToReturnTo) && - signUpForceRedirectUrlCheck - ); + return url.pathname === '/apps/claim/sign-in' && signInHasRequiredParams && signUpHasRequiredParams; }); }); From 5196122e36283bc55a517d04259cc2dee3ed7c96 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Tue, 10 Feb 2026 15:49:37 -0800 Subject: [PATCH 095/123] fix(clerk-js): Remove beforeunload event listener from SafeLock (#7775) (#7818) Co-authored-by: Ben Singer Co-authored-by: Claude Co-authored-by: Nikos Douvlis Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .changeset/remove-beforeunload-safelock.md | 5 +++++ packages/clerk-js/src/core/auth/safeLock.ts | 6 ------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 .changeset/remove-beforeunload-safelock.md diff --git a/.changeset/remove-beforeunload-safelock.md b/.changeset/remove-beforeunload-safelock.md new file mode 100644 index 00000000000..591a4eb3e19 --- /dev/null +++ b/.changeset/remove-beforeunload-safelock.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Removed redundant `beforeunload` event listener from SafeLock that was disabling the browser's back-forward cache (bfcache), degrading navigation performance. diff --git a/packages/clerk-js/src/core/auth/safeLock.ts b/packages/clerk-js/src/core/auth/safeLock.ts index 405190a73ff..5fb08ea5a06 100644 --- a/packages/clerk-js/src/core/auth/safeLock.ts +++ b/packages/clerk-js/src/core/auth/safeLock.ts @@ -3,12 +3,6 @@ import Lock from 'browser-tabs-lock'; export function SafeLock(key: string) { const lock = new Lock(); - // TODO: Figure out how to fix this linting error - // eslint-disable-next-line @typescript-eslint/no-misused-promises - window.addEventListener('beforeunload', async () => { - await lock.releaseLock(key); - }); - const acquireLockAndRun = async (cb: () => Promise) => { if ('locks' in navigator && isSecureContext) { const controller = new AbortController(); From b2be95757680fcc3e6374c8f7ef5485afc4f4272 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Thu, 12 Feb 2026 13:29:33 -0500 Subject: [PATCH 096/123] chore(clerk-js): Keyless ui refactor (#7798) Co-authored-by: Robert Soriano --- .changeset/beige-snakes-guess.md | 5 + .../tests/next-quickstart-keyless.test.ts | 2 - .../clerk-js/src/test/create-fixtures.tsx | 1 + packages/clerk-js/src/test/fixture-helpers.ts | 5 +- .../__tests__/KeylessPrompt.test.tsx | 335 ++++++ .../devPrompts/KeylessPrompt/index.tsx | 1003 +++++++++-------- .../unstable/page-objects/keylessPopover.ts | 17 +- 7 files changed, 860 insertions(+), 508 deletions(-) create mode 100644 .changeset/beige-snakes-guess.md create mode 100644 packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/__tests__/KeylessPrompt.test.tsx diff --git a/.changeset/beige-snakes-guess.md b/.changeset/beige-snakes-guess.md new file mode 100644 index 00000000000..5c97b912a16 --- /dev/null +++ b/.changeset/beige-snakes-guess.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Updates Keyless Prompt content. diff --git a/integration/tests/next-quickstart-keyless.test.ts b/integration/tests/next-quickstart-keyless.test.ts index 082367c1a7a..76b0f2033a7 100644 --- a/integration/tests/next-quickstart-keyless.test.ts +++ b/integration/tests/next-quickstart-keyless.test.ts @@ -78,8 +78,6 @@ test.describe('Keyless mode @quickstart', () => { await u.po.keylessPopover.waitForMounted(); - expect(await u.po.keylessPopover.isExpanded()).toBe(false); - await u.po.keylessPopover.toggle(); expect(await u.po.keylessPopover.isExpanded()).toBe(true); const claim = await u.po.keylessPopover.promptsToClaim(); diff --git a/packages/clerk-js/src/test/create-fixtures.tsx b/packages/clerk-js/src/test/create-fixtures.tsx index e9af007e3aa..a44f59378a2 100644 --- a/packages/clerk-js/src/test/create-fixtures.tsx +++ b/packages/clerk-js/src/test/create-fixtures.tsx @@ -92,6 +92,7 @@ const unboundCreateFixtures = ( 'SubscriptionDetails', 'PlanDetails', 'Checkout', + 'KeylessPrompt', ]; const contextWrappedChildren = !componentsWithoutContext.includes(componentName) ? ( { const withReverification = () => { ac.reverification = true; }; - return { withMultiSessionMode, withReverification }; + const withClaimedAt = (claimedAt: string | null) => { + ac.claimed_at = claimedAt; + }; + return { withMultiSessionMode, withReverification, withClaimedAt }; }; const createDisplayConfigFixtureHelpers = (environment: EnvironmentJSON) => { diff --git a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/__tests__/KeylessPrompt.test.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/__tests__/KeylessPrompt.test.tsx new file mode 100644 index 00000000000..d0ab9733be0 --- /dev/null +++ b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/__tests__/KeylessPrompt.test.tsx @@ -0,0 +1,335 @@ +import React from 'react'; +import { describe, expect, it, vi } from 'vitest'; + +import { bindCreateFixtures } from '@/test/create-fixtures'; +import { render } from '@/test/utils'; + +import { getCurrentState, getResolvedContent, KeylessPrompt } from '../index'; + +const { createFixtures } = bindCreateFixtures('KeylessPrompt' as any); + +describe('getCurrentState', () => { + it('returns completed when success is true', () => { + expect(getCurrentState(true, true, true)).toBe('completed'); + expect(getCurrentState(true, true, false)).toBe('completed'); + expect(getCurrentState(false, true, true)).toBe('completed'); + expect(getCurrentState(false, true, false)).toBe('completed'); + }); + + it('returns claimed when claimed is true and success is false', () => { + expect(getCurrentState(true, false, true)).toBe('claimed'); + expect(getCurrentState(true, false, false)).toBe('claimed'); + }); + + it('returns userCreated when isSignedIn is true and claimed/success are false', () => { + expect(getCurrentState(false, false, true)).toBe('userCreated'); + }); + + it('returns idle when all flags are false', () => { + expect(getCurrentState(false, false, false)).toBe('idle'); + }); + + it('follows precedence: completed > claimed > userCreated > idle', () => { + // All true -> completed + expect(getCurrentState(true, true, true)).toBe('completed'); + + // claimed + isSignedIn but no success -> claimed + expect(getCurrentState(true, false, true)).toBe('claimed'); + + // isSignedIn but no claimed/success -> userCreated + expect(getCurrentState(false, false, true)).toBe('userCreated'); + + // All false -> idle + expect(getCurrentState(false, false, false)).toBe('idle'); + }); +}); + +describe('getResolvedContent', () => { + const baseContext = { + appName: 'Test App', + instanceUrl: 'https://dashboard.clerk.com/apps/app_123/instances/ins_456', + claimUrl: 'https://dashboard.clerk.com/claim', + onDismiss: null, + }; + + describe('idle state', () => { + it('builds correct view model for idle state', () => { + const resolvedContent = getResolvedContent('idle', baseContext); + + expect(resolvedContent.state).toBe('idle'); + expect(resolvedContent.title).toBe('Configure your application'); + expect(resolvedContent.triggerWidth).toBe('14.25rem'); + expect(resolvedContent.cta.kind).toBe('link'); + expect(resolvedContent.cta.text).toBe('Configure your application'); + if (resolvedContent.cta.kind === 'link') { + expect(resolvedContent.cta.href).toBe(baseContext.claimUrl); + } + }); + + it('resolves static description correctly', () => { + const resolvedContent = getResolvedContent('idle', baseContext); + expect(resolvedContent.description).toBeDefined(); + expect(React.isValidElement(resolvedContent.description)).toBe(true); + }); + }); + + describe('userCreated state', () => { + it('builds correct view model for userCreated state', () => { + const resolvedContent = getResolvedContent('userCreated', baseContext); + + expect(resolvedContent.state).toBe('userCreated'); + expect(resolvedContent.title).toBe("You've created your first user!"); + expect(resolvedContent.triggerWidth).toBe('15.75rem'); + expect(resolvedContent.cta.kind).toBe('link'); + expect(resolvedContent.cta.text).toBe('Configure your application'); + if (resolvedContent.cta.kind === 'link') { + expect(resolvedContent.cta.href).toBe(baseContext.claimUrl); + } + }); + }); + + describe('claimed state', () => { + it('builds correct view model for claimed state', () => { + const resolvedContent = getResolvedContent('claimed', baseContext); + + expect(resolvedContent.state).toBe('claimed'); + expect(resolvedContent.title).toBe('Missing environment keys'); + expect(resolvedContent.triggerWidth).toBe('14.25rem'); + expect(resolvedContent.cta.kind).toBe('link'); + expect(resolvedContent.cta.text).toBe('Get API keys'); + if (resolvedContent.cta.kind === 'link') { + expect(resolvedContent.cta.href).toBe(baseContext.claimUrl); + } + }); + }); + + describe('completed state', () => { + it('builds correct view model for completed state', () => { + const resolvedContent = getResolvedContent('completed', baseContext); + + expect(resolvedContent.state).toBe('completed'); + expect(resolvedContent.title).toBe('Your app is ready'); + expect(resolvedContent.triggerWidth).toBe('10.5rem'); + expect(resolvedContent.cta.kind).toBe('action'); + expect(resolvedContent.cta.text).toBe('Dismiss'); + if (resolvedContent.cta.kind === 'action') { + expect(typeof resolvedContent.cta.onClick).toBe('function'); + } + }); + + it('resolves function-based description with context', () => { + const resolvedContent = getResolvedContent('completed', baseContext); + expect(resolvedContent.description).toBeDefined(); + expect(React.isValidElement(resolvedContent.description)).toBe(true); + }); + + it('creates onClick handler that calls onDismiss', async () => { + const onDismiss = vi.fn().mockResolvedValue(undefined); + // Note: window.location.reload cannot be easily mocked in jsdom, + // so we verify that onDismiss is called correctly + // The reload side effect is tested at integration level + + const resolvedContent = getResolvedContent('completed', { + ...baseContext, + onDismiss, + }); + + expect(resolvedContent.cta.kind).toBe('action'); + if (resolvedContent.cta.kind === 'action') { + resolvedContent.cta.onClick(); + // Wait for the promise chain to complete + await new Promise(resolve => setTimeout(resolve, 0)); + expect(onDismiss).toHaveBeenCalledOnce(); + // Note: window.location.reload() is called but cannot be verified in jsdom + } + }); + + it('handles null onDismiss gracefully', () => { + // Note: window.location.reload cannot be easily mocked in jsdom, + // so we verify the handler executes without error + // The reload side effect is tested at integration level + + const resolvedContent = getResolvedContent('completed', { + ...baseContext, + onDismiss: null, + }); + + expect(resolvedContent.cta.kind).toBe('action'); + if (resolvedContent.cta.kind === 'action') { + const onClick = resolvedContent.cta.onClick; + // Should execute without throwing an error even when onDismiss is null + expect(() => { + onClick(); + }).not.toThrow(); + // Note: window.location.reload() is called but cannot be verified in jsdom + // The onClick handler uses void to fire-and-forget the promise chain + } + }); + }); + + describe('CTA href resolution', () => { + it('resolves function-based href with context', () => { + const context = { + ...baseContext, + claimUrl: 'https://custom-claim.com', + instanceUrl: 'https://custom-instance.com', + }; + + const resolvedContent = getResolvedContent('idle', context); + expect(resolvedContent.cta.kind).toBe('link'); + if (resolvedContent.cta.kind === 'link') { + expect(resolvedContent.cta.href).toBe(context.claimUrl); + } + }); + + it('resolves string-based href directly', () => { + // This test verifies that if we had a string href, it would work + // Currently all states use function-based hrefs, but the logic supports both + const resolvedContent = getResolvedContent('idle', baseContext); + expect(resolvedContent.cta.kind).toBe('link'); + if (resolvedContent.cta.kind === 'link') { + expect(typeof resolvedContent.cta.href).toBe('string'); + } + }); + }); + + describe('description resolution', () => { + it('resolves static descriptions', () => { + const resolvedContent = getResolvedContent('idle', baseContext); + expect(React.isValidElement(resolvedContent.description)).toBe(true); + }); + + it('resolves function-based descriptions with context', () => { + const resolvedContent = getResolvedContent('completed', { + ...baseContext, + appName: 'My Test App', + instanceUrl: 'https://test-instance.com', + }); + + expect(React.isValidElement(resolvedContent.description)).toBe(true); + // The description should contain the app name + const descriptionString = JSON.stringify(resolvedContent.description); + expect(descriptionString).toContain('My Test App'); + }); + }); +}); + +describe('KeylessPrompt component', () => { + it('renders with idle state content when user is not signed in', async () => { + const { wrapper } = await createFixtures(); + const { getAllByText } = render( + , + { wrapper }, + ); + + // The text appears in both the trigger button and the CTA link + const elements = getAllByText('Configure your application'); + expect(elements).toHaveLength(2); + expect(elements[0]).toBeInTheDocument(); + expect(elements[1]).toBeInTheDocument(); + }); + + it('renders with userCreated state content when user is signed in', async () => { + const { wrapper } = await createFixtures(f => { + f.withUser({ email_addresses: ['test@clerk.com'] }); + }); + + const { getByText } = render( + , + { wrapper }, + ); + + expect(getByText("You've created your first user!")).toBeInTheDocument(); + }); + + it('renders CTA link with correct href for idle state', async () => { + const { wrapper } = await createFixtures(); + const claimUrl = 'https://dashboard.clerk.com/claim?test=123'; + + const { getByRole } = render( + , + { wrapper }, + ); + + const link = getByRole('link', { name: 'Configure your application' }); + expect(link).toBeInTheDocument(); + expect(link).toHaveAttribute('href', expect.stringContaining('claim')); + expect(link).toHaveAttribute('target', '_blank'); + expect(link).toHaveAttribute('rel', 'noopener noreferrer'); + }); + + it('renders CTA button for completed state when onDismiss is provided', async () => { + const onDismiss = vi.fn().mockResolvedValue(undefined); + const { wrapper } = await createFixtures(f => { + f.withUser({ email_addresses: ['test@clerk.com'] }); + // Mock environment to simulate claimed state + f.withClaimedAt(new Date().toISOString()); + }); + + const { getByRole } = render( + , + { wrapper }, + ); + + const button = getByRole('button', { name: 'Dismiss' }); + expect(button).toBeInTheDocument(); + expect(button.tagName).toBe('BUTTON'); + }); + + it('toggles expanded state when trigger button is clicked', async () => { + const { wrapper } = await createFixtures(); + const { getByRole, container } = render( + , + { wrapper }, + ); + + const triggerButton = getByRole('button', { name: /keyless prompt/i }); + const promptContainer = container.querySelector('[data-expanded]'); + + // Initially should be expanded (isOpen defaults to true) + expect(promptContainer).toHaveAttribute('data-expanded', 'true'); + + // Click to collapse + await triggerButton.click(); + expect(promptContainer).toHaveAttribute('data-expanded', 'false'); + + // Click again to expand + await triggerButton.click(); + expect(promptContainer).toHaveAttribute('data-expanded', 'true'); + }); + + it('renders description content correctly for idle state', async () => { + const { wrapper } = await createFixtures(); + const { getByText } = render( + , + { wrapper }, + ); + + expect(getByText(/Temporary API keys are enabled/i)).toBeInTheDocument(); + expect(getByText(/Add SSO connections/i)).toBeInTheDocument(); + }); +}); diff --git a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx index 94ea4cbd287..5bd8d6517ce 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx @@ -1,21 +1,10 @@ import { useUser } from '@clerk/shared/react'; // eslint-disable-next-line no-restricted-imports import { css } from '@emotion/react'; -import type { PropsWithChildren } from 'react'; -import { useEffect, useMemo, useState } from 'react'; -import { createPortal } from 'react-dom'; +import { type ReactNode, useId, useMemo, useState } from 'react'; -import { Flex, Link } from '../../../customizables'; -import { Portal } from '../../../elements/Portal'; import { InternalThemeProvider } from '../../../styledSystem'; -import { - basePromptElementStyles, - ClerkLogoIcon, - handleDashboardUrlParsing, - PromptContainer, - PromptSuccessIcon, -} from '../shared'; -import { KeySlashIcon } from './KeySlashIcon'; +import { handleDashboardUrlParsing } from '../shared'; import { useRevalidateEnvironment } from './use-revalidate-environment'; type KeylessPromptProps = { @@ -24,538 +13,564 @@ type KeylessPromptProps = { onDismiss: (() => Promise) | undefined | null; }; -const buttonIdentifierPrefix = `--clerk-keyless-prompt`; -const buttonIdentifier = `${buttonIdentifierPrefix}-button`; -const contentIdentifier = `${buttonIdentifierPrefix}-content`; - /** * If we cannot reconstruct the url properly, then simply fallback to Clerk Dashboard */ -function withLastActiveFallback(cb: () => string): string { +function withLastActiveFallback(callback: () => string): string { try { - return cb(); + return callback(); } catch { return 'https://dashboard.clerk.com/last-active'; } } -const KeylessPromptInternal = (_props: KeylessPromptProps) => { - const { isSignedIn } = useUser(); - const [isExpanded, setIsExpanded] = useState(false); +const WIDTH_OPEN = '18rem'; +const DURATION_OPEN = '220ms'; +const DURATION_CLOSE = '180ms'; +const EASE_BEZIER = 'cubic-bezier(0.2, 0, 0, 1)'; +const CSS_RESET = css` + margin: 0; + padding: 0; + box-sizing: border-box; + background: none; + border: none; + font-family: + -apple-system, + BlinkMacSystemFont, + avenir next, + avenir, + segoe ui, + helvetica neue, + helvetica, + Cantarell, + Ubuntu, + roboto, + noto, + arial, + sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + text-decoration: none; + color: inherit; + appearance: none; +`; + +function getDuration(isOpen: boolean): string { + return isOpen ? DURATION_OPEN : DURATION_CLOSE; +} - useEffect(() => { - if (isSignedIn) { - setIsExpanded(true); +const ctaButtonStyles = css` + ${CSS_RESET}; + margin: 0.75rem 0 0; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 1.75rem; + padding: 0.25rem 0.625rem; + border-radius: 0.375rem; + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0.12px; + color: #fde047; + text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); + white-space: nowrap; + user-select: none; + cursor: pointer; + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545; + box-shadow: + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.12), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48), + 0px 0px 4px 0px rgba(243, 107, 22, 0) inset; + outline: none; + &:hover { + background: #4b4b4b; + transition: background-color 120ms ease-in-out; + + @media (prefers-reduced-motion: reduce) { + transition: none; } - }, [isSignedIn]); + } + &:focus-visible { + outline: 2px solid #6c47ff; + outline-offset: 2px; + } +`; + +export type STATES = 'idle' | 'userCreated' | 'claimed' | 'completed'; + +type DescriptionContent = ReactNode | ((context: { appName: string; instanceUrl: string }) => ReactNode); + +type CtaLink = { + kind: 'link'; + text: string; + href: string | ((urls: { claimUrl: string; instanceUrl: string }) => string); +}; + +type CtaAction = { + kind: 'action'; + text: string; + onClick: (onDismiss: (() => Promise) | undefined | null) => void; +}; + +type ContentItem = { + triggerWidth: string; + title: string; + description: DescriptionContent; + cta: CtaLink | CtaAction; +}; + +const CONTENT: Record = { + idle: { + triggerWidth: '14.25rem', + title: 'Configure your application', + description: ( + <> +

Temporary API keys are enabled so you can get started immediately.

+
    + {['Add SSO connections (eg. GitHub)', 'Set up B2B authentication', 'Enable MFA'].map(item => ( +
  • {item}
  • + ))} +
+

Access the dashboard to customize auth settings and explore Clerk features.

+ + ), + cta: { + kind: 'link', + text: 'Configure your application', + href: ({ claimUrl }) => claimUrl, + }, + }, + userCreated: { + triggerWidth: '15.75rem', + title: "You've created your first user!", + description: ( +

Head to the dashboard to customize authentication settings, view user info, and explore more features.

+ ), + cta: { + kind: 'link', + text: 'Configure your application', + href: ({ claimUrl }) => claimUrl, + }, + }, + claimed: { + triggerWidth: '14.25rem', + title: 'Missing environment keys', + description: ( +

+ You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard. +

+ ), + cta: { + kind: 'link', + text: 'Get API keys', + href: ({ claimUrl }) => claimUrl, + }, + }, + completed: { + triggerWidth: '10.5rem', + title: 'Your app is ready', + description: ({ appName, instanceUrl }) => ( +

+ Your application{' '} + + {appName} + {' '} + has been configured. You may now customize your settings in the Clerk dashboard. +

+ ), + cta: { + kind: 'action', + text: 'Dismiss', + onClick: onDismiss => { + void onDismiss?.().then(() => { + window.location.reload(); + }); + }, + }, + }, +}; + +/** + * Determines the current state based on application lifecycle flags. + * State precedence: completed -> claimed -> userCreated -> idle + * + * Note: This is a structural refactor - the actual runtime behavior for + * `claimed` and `success` is determined by environment state and props. + * Currently, `claimed` comes from `environment.authConfig.claimedAt` and + * `success` is derived from `onDismiss` prop presence + claimed state. + */ +export function getCurrentState(claimed: boolean, success: boolean, isSignedIn: boolean): STATES { + if (success) { + return 'completed'; + } + if (claimed) { + return 'claimed'; + } + if (isSignedIn) { + return 'userCreated'; + } + return 'idle'; +} +type ResolvedContentContext = { + appName: string; + instanceUrl: string; + claimUrl: string; + onDismiss: (() => Promise) | undefined | null; +}; + +type ResolvedContent = { + state: STATES; + triggerWidth: string; + title: string; + description: ReactNode; + cta: + | { + kind: 'link'; + text: string; + href: string; + } + | { + kind: 'action'; + text: string; + onClick: () => void; + }; +}; + +/** + * Gets resolved content from state and context. + * This is a pure function that can be easily unit tested. + */ +export function getResolvedContent(state: STATES, context: ResolvedContentContext): ResolvedContent { + const content = CONTENT[state]; + + const description = + typeof content.description === 'function' + ? content.description({ appName: context.appName, instanceUrl: context.instanceUrl }) + : content.description; + + const ctaItem = content.cta; + const cta: ResolvedContent['cta'] = + ctaItem.kind === 'link' + ? { + kind: 'link', + text: ctaItem.text, + href: + typeof ctaItem.href === 'function' + ? ctaItem.href({ claimUrl: context.claimUrl, instanceUrl: context.instanceUrl }) + : ctaItem.href, + } + : { + kind: 'action', + text: ctaItem.text, + onClick: () => ctaItem.onClick(context.onDismiss), + }; + + return { + state, + triggerWidth: content.triggerWidth, + title: content.title, + description, + cta, + }; +} + +function KeylessPromptInternal(props: KeylessPromptProps) { + const id = useId(); const environment = useRevalidateEnvironment(); + const claimed = Boolean(environment.authConfig.claimedAt); - const success = typeof _props.onDismiss === 'function' && claimed; + const success = typeof props.onDismiss === 'function' && claimed; + const { isSignedIn } = useUser(); const appName = environment.displayConfig.applicationName; - const isForcedExpanded = claimed || success || isExpanded; const claimUrlToDashboard = useMemo(() => { if (claimed) { - return _props.copyKeysUrl; + return props.copyKeysUrl; } - - const url = new URL(_props.claimUrl); - // Clerk Dashboard accepts a `return_url` query param when visiting `/apps/claim`. + const url = new URL(props.claimUrl); url.searchParams.append('return_url', window.location.href); return url.href; - }, [claimed, _props.copyKeysUrl, _props.claimUrl]); + }, [claimed, props.copyKeysUrl, props.claimUrl]); const instanceUrlToDashboard = useMemo(() => { return withLastActiveFallback(() => { - const redirectUrlParts = handleDashboardUrlParsing(_props.copyKeysUrl); + const redirectUrlParts = handleDashboardUrlParsing(props.copyKeysUrl); const url = new URL( `${redirectUrlParts.baseDomain}/apps/${redirectUrlParts.appId}/instances/${redirectUrlParts.instanceId}/user-authentication/email-phone-username`, ); return url.href; }); - }, [_props.copyKeysUrl]); - - const mainCTAStyles = css` - ${basePromptElementStyles}; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 1.75rem; - max-width: 14.625rem; - padding: 0.25rem 0.625rem; - border-radius: 0.375rem; - font-size: 0.75rem; - font-weight: 500; - letter-spacing: 0.12px; - color: ${claimed ? 'white' : success ? 'white' : '#fde047'}; - text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); - white-space: nowrap; - user-select: none; - cursor: pointer; - background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545; - box-shadow: - 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, - 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, - 0px 0px 0px 1px rgba(0, 0, 0, 0.12), - 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48), - 0px 0px 4px 0px rgba(243, 107, 22, 0) inset; - `; + }, [props.copyKeysUrl]); + + const [isOpen, setIsOpen] = useState(true); + const currentState = getCurrentState(claimed, success, Boolean(isSignedIn)); + + const resolvedContent = useMemo( + () => + getResolvedContent(currentState, { + appName, + instanceUrl: instanceUrlToDashboard, + claimUrl: claimUrlToDashboard, + onDismiss: props.onDismiss, + }), + [currentState, appName, instanceUrlToDashboard, claimUrlToDashboard, props.onDismiss], + ); + + const ctaElement: ReactNode = + resolvedContent.cta.kind === 'link' ? ( + + {resolvedContent.cta.text} + + ) : ( + + ); return ( - - ({ - position: 'fixed', - bottom: '1.25rem', - right: '1.25rem', - height: `${t.sizes.$10}`, - minWidth: '13.4rem', - paddingLeft: `${t.space.$3}`, - borderRadius: '1.25rem', - transition: 'all 195ms cubic-bezier(0.2, 0.61, 0.1, 1)', - - '&[data-expanded="false"]:hover': { - background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.20) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', - }, - - '&[data-expanded="true"]': { - flexDirection: 'column', - alignItems: 'flex-center', - justifyContent: 'flex-center', - height: claimed || success ? 'fit-content' : isSignedIn ? '8.5rem' : '12rem', - overflow: 'hidden', - width: 'fit-content', - minWidth: '16.125rem', - gap: `${t.space.$1x5}`, - padding: `${t.space.$2x5} ${t.space.$3} ${t.space.$3} ${t.space.$3}`, - borderRadius: `${t.radii.$xl}`, - transition: 'all 230ms cubic-bezier(0.28, 1, 0.32, 1)', - }, - })} +
+ - - ({ - flexDirection: 'column', - gap: t.space.$3, - })} + `} + viewBox='0 0 16 16' + fill='none' + aria-hidden='true' + xmlns='http://www.w3.org/2000/svg' + > + + + +
+
- - {isForcedExpanded && - (success ? ( - - ) : ( - ({ - flexDirection: 'column', - alignItems: 'center', - gap: t.space.$2x5, - })} - > - - {claimed ? 'Get API keys' : 'Claim application'} - - - ))} - - - - - Skip to Clerk keyless mode content - - - + {ctaElement} +
+
+
+ ); -}; - -export const KeylessPrompt = (props: KeylessPromptProps) => ( - - - -); - -const BodyPortal = ({ children }: PropsWithChildren) => { - const [portalContainer, setPortalContainer] = useState(null); - - useEffect(() => { - const container = document.createElement('div'); - setPortalContainer(container); - document.body.insertBefore(container, document.body.firstChild); - return () => { - if (container) { - document.body.removeChild(container); - } - }; - }, []); +} - // Render the children inside the dynamically created div - return portalContainer ? createPortal(children, portalContainer) : null; -}; +export function KeylessPrompt(props: KeylessPromptProps) { + return ( + + + + ); +} diff --git a/packages/testing/src/playwright/unstable/page-objects/keylessPopover.ts b/packages/testing/src/playwright/unstable/page-objects/keylessPopover.ts index 69b5bbd4728..bca48c29274 100644 --- a/packages/testing/src/playwright/unstable/page-objects/keylessPopover.ts +++ b/packages/testing/src/playwright/unstable/page-objects/keylessPopover.ts @@ -2,20 +2,15 @@ import type { EnhancedPage } from './app'; export const createKeylessPopoverPageObject = (testArgs: { page: EnhancedPage }) => { const { page } = testArgs; - // TODO: Is this the ID we really want ? - const elementId = '#--clerk-keyless-prompt-button'; + const button = page.getByRole('button', { name: 'Keyless prompt' }); const self = { - waitForMounted: () => page.waitForSelector(elementId, { state: 'attached' }), - waitForUnmounted: () => page.waitForSelector(elementId, { state: 'detached' }), - isExpanded: () => - page - .locator(elementId) - .getAttribute('aria-expanded') - .then(val => val === 'true'), - toggle: () => page.locator(elementId).click(), + waitForMounted: () => button.waitFor({ state: 'attached' }), + waitForUnmounted: () => button.waitFor({ state: 'detached' }), + isExpanded: () => button.getAttribute('aria-expanded').then(val => val === 'true'), + toggle: () => button.click(), promptsToClaim: () => { - return page.getByRole('link', { name: /^claim application$/i }); + return page.getByRole('link', { name: /^configure your application$/i }); }, promptToUseClaimedKeys: () => { return page.getByRole('link', { name: /^get api keys$/i }); From 13056f06626727e7d87fcd5e04d5a03eeefb87ad Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Thu, 12 Feb 2026 11:24:53 -0800 Subject: [PATCH 097/123] chore(astro): Clean up integration scripts (#7829) --- .changeset/red-tools-explain.md | 2 + .../src/integration/create-integration.ts | 66 ++++-------- packages/astro/src/integration/snippets.ts | 100 ++++++++++++++++++ 3 files changed, 120 insertions(+), 48 deletions(-) create mode 100644 .changeset/red-tools-explain.md create mode 100644 packages/astro/src/integration/snippets.ts diff --git a/.changeset/red-tools-explain.md b/.changeset/red-tools-explain.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/red-tools-explain.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/astro/src/integration/create-integration.ts b/packages/astro/src/integration/create-integration.ts index d06ef924bc2..6f7ecccba09 100644 --- a/packages/astro/src/integration/create-integration.ts +++ b/packages/astro/src/integration/create-integration.ts @@ -1,9 +1,10 @@ -import type { ClerkOptions } from '@clerk/types'; +import type { ClerkOptions } from '@clerk/shared/types'; import type { AstroIntegration } from 'astro'; import { envField } from 'astro/config'; import { name as packageName, version as packageVersion } from '../../package.json'; import type { AstroClerkIntegrationParams } from '../types'; +import { buildBeforeHydrationSnippet, buildPageLoadSnippet } from './snippets'; import { vitePluginAstroConfig } from './vite-plugin-astro-config'; const buildEnvVarFromOption = (valueToBeStored: unknown, envName: keyof InternalEnv) => { @@ -95,63 +96,32 @@ function createIntegration() */ /** - * The above script will run before client frameworks like React hydrate. + * The before-hydration script will run before client frameworks like React hydrate. * This makes sure that we have initialized a Clerk instance and populated stores in order to avoid hydration issues. */ injectScript( 'before-hydration', - ` - ${command === 'dev' ? `console.log('${packageName}',"Initialize Clerk: before-hydration")` : ''} - import { runInjectionScript } from "${buildImportPath}"; - await runInjectionScript(${JSON.stringify(internalParams)});`, + buildBeforeHydrationSnippet({ + command, + packageName, + buildImportPath, + internalParams, + }), ); /** - * The above script only executes if a client framework like React needs to hydrate. - * We need to run the same script again for each page in order to initialize Clerk even if no UI framework is used in the client - * If no UI framework is used in the client, the above script with `before-hydration` will never run + * The page script only executes if a client framework like React needs to hydrate. + * We need to run the same script again for each page in order to initialize Clerk even if no UI framework is used in the client. + * If no UI framework is used in the client, the before-hydration script will never run. */ - injectScript( 'page', - ` - ${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: page")` : ''} - import { runInjectionScript, swapDocument } from "${buildImportPath}"; - - // Taken from https://github.com/withastro/astro/blob/e10b03e88c22592fbb42d7245b65c4f486ab736d/packages/astro/src/transitions/router.ts#L39. - // Importing it directly from astro:transitions/client breaks custom client-side routing - // even when View Transitions is disabled. - const transitionEnabledOnThisPage = () => { - return !!document.querySelector('[name="astro-view-transitions-enabled"]'); - } - - if (transitionEnabledOnThisPage()) { - // We must do the dynamic imports within the event listeners because otherwise we may race and miss initial astro:page-load - document.addEventListener('astro:before-swap', async (e) => { - const { swapFunctions } = await import('astro:transitions/client'); - - const clerkComponents = document.querySelector('#clerk-components'); - // Keep the div element added by Clerk - if (clerkComponents) { - const clonedEl = clerkComponents.cloneNode(true); - e.newDocument.body.appendChild(clonedEl); - } - - e.swap = () => swapDocument(swapFunctions, e.newDocument); - }); - - document.addEventListener('astro:page-load', async (e) => { - const { navigate } = await import('astro:transitions/client'); - - await runInjectionScript({ - ...${JSON.stringify(internalParams)}, - routerPush: navigate, - routerReplace: (url) => navigate(url, { history: 'replace' }), - }); - }) - } else { - await runInjectionScript(${JSON.stringify(internalParams)}); - }`, + buildPageLoadSnippet({ + command, + packageName, + buildImportPath, + internalParams, + }), ); }, 'astro:config:done': ({ injectTypes }) => { diff --git a/packages/astro/src/integration/snippets.ts b/packages/astro/src/integration/snippets.ts new file mode 100644 index 00000000000..698bf70c87f --- /dev/null +++ b/packages/astro/src/integration/snippets.ts @@ -0,0 +1,100 @@ +import type { ClerkOptions } from '@clerk/shared/types'; + +/** + * Creates a snippet that initializes Clerk before client-side framework hydration occurs. + * + * This script runs before frameworks like React, Vue, or Svelte hydrate their components, + * ensuring the Clerk instance is ready and stores are populated to prevent hydration mismatches. + * It performs a simple, synchronous initialization without handling view transitions. + * + * @param command - The Astro command being run ('dev' or 'build') + * @param packageName - The name of the Clerk package for debug logging + * @param buildImportPath - The import path to the internal Clerk utilities + * @param internalParams - Clerk configuration options including SDK metadata + * @returns A script string to be injected via Astro's 'before-hydration' stage + */ +export function buildBeforeHydrationSnippet({ + command, + packageName, + buildImportPath, + internalParams, +}: { + command: string; + packageName: string; + buildImportPath: string; + internalParams: ClerkOptions; +}) { + return ` + ${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: before-hydration")` : ''} + import { runInjectionScript } from "${buildImportPath}"; + await runInjectionScript(${JSON.stringify(internalParams)});`; +} + +/** + * Creates a snippet that initializes Clerk on page load with support for Astro View Transitions. + * + * This script handles two scenarios: + * 1. **With View Transitions enabled**: Listens for astro:page-load and astro:before-swap events + * to properly initialize Clerk and preserve its DOM elements during page transitions. + * 2. **Without View Transitions**: Performs standard initialization on initial page load. + * + * This script is necessary for pages without client-side frameworks, as the before-hydration + * script only runs when framework hydration occurs. This ensures Clerk is always initialized, + * regardless of whether UI frameworks are present. + * + * @param command - The Astro command being run ('dev' or 'build') + * @param packageName - The name of the Clerk package for debug logging + * @param buildImportPath - The import path to the internal Clerk utilities + * @param internalParams - Clerk configuration options including SDK metadata + * @returns A script string to be injected via Astro's 'page' stage + */ +export function buildPageLoadSnippet({ + command, + packageName, + buildImportPath, + internalParams, +}: { + command: string; + packageName: string; + buildImportPath: string; + internalParams: ClerkOptions; +}) { + return ` + ${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: page")` : ''} + import { runInjectionScript, swapDocument } from "${buildImportPath}"; + + // Taken from https://github.com/withastro/astro/blob/e10b03e88c22592fbb42d7245b65c4f486ab736d/packages/astro/src/transitions/router.ts#L39. + // Importing it directly from astro:transitions/client breaks custom client-side routing + // even when View Transitions is disabled. + const transitionEnabledOnThisPage = () => { + return !!document.querySelector('[name="astro-view-transitions-enabled"]'); + } + + if (transitionEnabledOnThisPage()) { + // We must do the dynamic imports within the event listeners because otherwise we may race and miss initial astro:page-load + document.addEventListener('astro:before-swap', async (e) => { + const { swapFunctions } = await import('astro:transitions/client'); + + const clerkComponents = document.querySelector('#clerk-components'); + // Keep the div element added by Clerk + if (clerkComponents) { + const clonedEl = clerkComponents.cloneNode(true); + e.newDocument.body.appendChild(clonedEl); + } + + e.swap = () => swapDocument(swapFunctions, e.newDocument); + }); + + document.addEventListener('astro:page-load', async (e) => { + const { navigate } = await import('astro:transitions/client'); + + await runInjectionScript({ + ...${JSON.stringify(internalParams)}, + routerPush: navigate, + routerReplace: (url) => navigate(url, { history: 'replace' }), + }); + }) + } else { + await runInjectionScript(${JSON.stringify(internalParams)}); + }`; +} From 35bcbd11f5753ee396cd090d3dd1848f3f2727e0 Mon Sep 17 00:00:00 2001 From: Ignacior <54339832+Jibaru@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:51:39 -0500 Subject: [PATCH 098/123] feat(clerk-js,shared): Adds username into public user data core-2 (#7837) --- .changeset/cute-crabs-agree.md | 6 ++++++ packages/clerk-js/src/core/resources/PublicUserData.ts | 3 +++ .../src/core/resources/__tests__/PublicUserData.test.ts | 2 ++ packages/shared/src/types/json.ts | 1 + 4 files changed, 12 insertions(+) create mode 100644 .changeset/cute-crabs-agree.md diff --git a/.changeset/cute-crabs-agree.md b/.changeset/cute-crabs-agree.md new file mode 100644 index 00000000000..488b993a039 --- /dev/null +++ b/.changeset/cute-crabs-agree.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': minor +'@clerk/shared': minor +--- + +Add `username` field into `PublicUserData` object. diff --git a/packages/clerk-js/src/core/resources/PublicUserData.ts b/packages/clerk-js/src/core/resources/PublicUserData.ts index b1e740b2a51..01ca46b7acd 100644 --- a/packages/clerk-js/src/core/resources/PublicUserData.ts +++ b/packages/clerk-js/src/core/resources/PublicUserData.ts @@ -11,6 +11,7 @@ export class PublicUserData implements IPublicUserData { hasImage!: boolean; identifier!: string; userId?: string; + username?: string; constructor(data: PublicUserDataJSON | PublicUserDataJSONSnapshot) { this.fromJSON(data); @@ -24,6 +25,7 @@ export class PublicUserData implements IPublicUserData { this.hasImage = data.has_image || false; this.identifier = data.identifier || ''; this.userId = data.user_id; + this.username = data.username; } return this; @@ -37,6 +39,7 @@ export class PublicUserData implements IPublicUserData { has_image: this.hasImage, identifier: this.identifier, user_id: this.userId, + username: this.username, }; } } diff --git a/packages/clerk-js/src/core/resources/__tests__/PublicUserData.test.ts b/packages/clerk-js/src/core/resources/__tests__/PublicUserData.test.ts index 4b22b7620eb..c7a378ebb69 100644 --- a/packages/clerk-js/src/core/resources/__tests__/PublicUserData.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/PublicUserData.test.ts @@ -13,6 +13,7 @@ describe('PublicUserData', () => { has_image: true, identifier: 'john-doe', user_id: '123', + username: 'johndoe', }); expect(pud).toMatchObject({ @@ -22,6 +23,7 @@ describe('PublicUserData', () => { hasImage: true, identifier: 'john-doe', userId: '123', + username: 'johndoe', }); }); }); diff --git a/packages/shared/src/types/json.ts b/packages/shared/src/types/json.ts index 6b2070b8283..e24e426cca2 100644 --- a/packages/shared/src/types/json.ts +++ b/packages/shared/src/types/json.ts @@ -338,6 +338,7 @@ export interface PublicUserDataJSON { has_image: boolean; identifier: string; user_id?: string; + username?: string; } export interface SessionWithActivitiesJSON extends Omit { From d7135bd8dc93e2744613210847da4157721d7617 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Fri, 13 Feb 2026 15:57:50 -0500 Subject: [PATCH 099/123] ci(repo): Version packages (Core 2) (#7780) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/beige-snakes-guess.md | 5 ---- .changeset/clever-carrots-add.md | 2 -- .changeset/cute-crabs-agree.md | 6 ----- .changeset/disable-console-transport.md | 5 ---- .changeset/fast-paws-double.md | 5 ---- .changeset/fix-factor-two-infinite-spinner.md | 5 ---- .changeset/fluffy-toys-wash.md | 2 -- .changeset/legal-crabs-shout.md | 6 ----- .changeset/little-words-serve.md | 5 ---- .changeset/ready-cats-tease.md | 5 ---- .changeset/red-tools-explain.md | 2 -- .changeset/remove-beforeunload-safelock.md | 5 ---- .changeset/spicy-sheep-divide.md | 2 -- .changeset/tough-taxis-care.md | 5 ---- packages/agent-toolkit/CHANGELOG.md | 9 +++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 11 ++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 14 ++++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 26 +++++++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 +++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 7 +++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 +++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 +++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 10 +++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 7 +++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 +++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 +++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 10 +++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++ packages/vue/package.json | 2 +- 58 files changed, 236 insertions(+), 82 deletions(-) delete mode 100644 .changeset/beige-snakes-guess.md delete mode 100644 .changeset/clever-carrots-add.md delete mode 100644 .changeset/cute-crabs-agree.md delete mode 100644 .changeset/disable-console-transport.md delete mode 100644 .changeset/fast-paws-double.md delete mode 100644 .changeset/fix-factor-two-infinite-spinner.md delete mode 100644 .changeset/fluffy-toys-wash.md delete mode 100644 .changeset/legal-crabs-shout.md delete mode 100644 .changeset/little-words-serve.md delete mode 100644 .changeset/ready-cats-tease.md delete mode 100644 .changeset/red-tools-explain.md delete mode 100644 .changeset/remove-beforeunload-safelock.md delete mode 100644 .changeset/spicy-sheep-divide.md delete mode 100644 .changeset/tough-taxis-care.md diff --git a/.changeset/beige-snakes-guess.md b/.changeset/beige-snakes-guess.md deleted file mode 100644 index 5c97b912a16..00000000000 --- a/.changeset/beige-snakes-guess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Updates Keyless Prompt content. diff --git a/.changeset/clever-carrots-add.md b/.changeset/clever-carrots-add.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/clever-carrots-add.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/cute-crabs-agree.md b/.changeset/cute-crabs-agree.md deleted file mode 100644 index 488b993a039..00000000000 --- a/.changeset/cute-crabs-agree.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': minor -'@clerk/shared': minor ---- - -Add `username` field into `PublicUserData` object. diff --git a/.changeset/disable-console-transport.md b/.changeset/disable-console-transport.md deleted file mode 100644 index 1e9b3c31372..00000000000 --- a/.changeset/disable-console-transport.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Disable ConsoleTransport for debug logger by default diff --git a/.changeset/fast-paws-double.md b/.changeset/fast-paws-double.md deleted file mode 100644 index 43b775ab514..00000000000 --- a/.changeset/fast-paws-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/clerk-js": patch ---- - -Fixed an issue where primary identifier shows undefined when signing in with phone number only diff --git a/.changeset/fix-factor-two-infinite-spinner.md b/.changeset/fix-factor-two-infinite-spinner.md deleted file mode 100644 index 284b7617613..00000000000 --- a/.changeset/fix-factor-two-infinite-spinner.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Fix infinite loading spinner when navigating to factor-two sign-in route without an active 2FA session diff --git a/.changeset/fluffy-toys-wash.md b/.changeset/fluffy-toys-wash.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/fluffy-toys-wash.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/legal-crabs-shout.md b/.changeset/legal-crabs-shout.md deleted file mode 100644 index 1f694546d75..00000000000 --- a/.changeset/legal-crabs-shout.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': minor -'@clerk/backend': minor ---- - -Add `providerUserId` field to `ExternalAccount` resource as the preferred way to access the unique user ID from the OAuth provider. The existing `externalId` field is now deprecated in favor of `providerUserId` for better clarity and consistency across the API. diff --git a/.changeset/little-words-serve.md b/.changeset/little-words-serve.md deleted file mode 100644 index b56efdc6784..00000000000 --- a/.changeset/little-words-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Display message for `user_deactivated` error code on `SignIn` and `SignUp` diff --git a/.changeset/ready-cats-tease.md b/.changeset/ready-cats-tease.md deleted file mode 100644 index 2911d468559..00000000000 --- a/.changeset/ready-cats-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/astro': patch ---- - -Fixed an issue when using `ClientRouter` where Clerk components don't load until navigation is performed. diff --git a/.changeset/red-tools-explain.md b/.changeset/red-tools-explain.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/red-tools-explain.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/remove-beforeunload-safelock.md b/.changeset/remove-beforeunload-safelock.md deleted file mode 100644 index 591a4eb3e19..00000000000 --- a/.changeset/remove-beforeunload-safelock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Removed redundant `beforeunload` event listener from SafeLock that was disabling the browser's back-forward cache (bfcache), degrading navigation performance. diff --git a/.changeset/spicy-sheep-divide.md b/.changeset/spicy-sheep-divide.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/spicy-sheep-divide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/tough-taxis-care.md b/.changeset/tough-taxis-care.md deleted file mode 100644 index 93b2f08d298..00000000000 --- a/.changeset/tough-taxis-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/backend': minor ---- - -Add `createBulk()` method to `WaitlistEntryAPI` for bulk creating waitlist entries diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 9b786322f7b..3952830c800 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.22 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + ## 0.2.21 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index 7fb6b8ae51c..49aaf44e258 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.21", + "version": "0.2.22", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index c3e8df05c08..a897456584e 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,16 @@ # @clerk/astro +## 2.17.2 + +### Patch Changes + +- Fixed an issue when using `ClientRouter` where Clerk components don't load until navigation is performed. ([#7804](https://github.com/clerk/javascript/pull/7804)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + ## 2.17.1 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index f077b72ecf6..b549703c829 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.17.1", + "version": "2.17.2", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index ef239511a90..5f80c3e67ff 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 2.31.0 + +### Minor Changes + +- Add `providerUserId` field to `ExternalAccount` resource as the preferred way to access the unique user ID from the OAuth provider. The existing `externalId` field is now deprecated in favor of `providerUserId` for better clarity and consistency across the API. ([#7778](https://github.com/clerk/javascript/pull/7778)) by [@Jibaru](https://github.com/Jibaru) + +- Add `createBulk()` method to `WaitlistEntryAPI` for bulk creating waitlist entries ([#7762](https://github.com/clerk/javascript/pull/7762)) by [@Jibaru](https://github.com/Jibaru) + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + - @clerk/types@4.101.15 + ## 2.30.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index cdbe1df3783..406a1b6f0b4 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.30.1", + "version": "2.31.0", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index b1b69f86167..b02b50d6e2b 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.9.2 + +### Patch Changes + +- Updated dependencies [[`b2be957`](https://github.com/clerk/javascript/commit/b2be95757680fcc3e6374c8f7ef5485afc4f4272), [`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`8cb461d`](https://github.com/clerk/javascript/commit/8cb461d796434084c72a1bdcfa253497bd609b34), [`965a4cb`](https://github.com/clerk/javascript/commit/965a4cb051df26afb9053658c068c4a0aef946b0), [`1fe87ac`](https://github.com/clerk/javascript/commit/1fe87acf1b214ba805ab15fe6a2b2254c5dcdaa2), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`dbdf83e`](https://github.com/clerk/javascript/commit/dbdf83ec1f9798b40fc71c09629e6fb294511f70), [`5196122`](https://github.com/clerk/javascript/commit/5196122e36283bc55a517d04259cc2dee3ed7c96)]: + - @clerk/clerk-js@5.123.0 + - @clerk/shared@3.45.0 + - @clerk/clerk-react@5.60.1 + ## 2.9.1 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index b1dc6df07d4..2a1b7ec06cf 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.9.1", + "version": "2.9.2", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 22f3813ec83..676a6cac8c6 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,31 @@ # Change Log +## 5.123.0 + +### Minor Changes + +- Add `username` field into `PublicUserData` object. ([#7837](https://github.com/clerk/javascript/pull/7837)) by [@Jibaru](https://github.com/Jibaru) + +- Add `providerUserId` field to `ExternalAccount` resource as the preferred way to access the unique user ID from the OAuth provider. The existing `externalId` field is now deprecated in favor of `providerUserId` for better clarity and consistency across the API. ([#7778](https://github.com/clerk/javascript/pull/7778)) by [@Jibaru](https://github.com/Jibaru) + +### Patch Changes + +- Updates Keyless Prompt content. ([#7798](https://github.com/clerk/javascript/pull/7798)) by [@alexcarpenter](https://github.com/alexcarpenter) + +- Disable ConsoleTransport for debug logger by default ([#7786](https://github.com/clerk/javascript/pull/7786)) by [@jacekradko](https://github.com/jacekradko) + +- Fixed an issue where primary identifier shows undefined when signing in with phone number only ([#7797](https://github.com/clerk/javascript/pull/7797)) by [@wobsoriano](https://github.com/wobsoriano) + +- Fix infinite loading spinner when navigating to factor-two sign-in route without an active 2FA session ([#7787](https://github.com/clerk/javascript/pull/7787)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Display message for `user_deactivated` error code on `SignIn` and `SignUp` ([#7811](https://github.com/clerk/javascript/pull/7811)) by [@LauraBeatris](https://github.com/LauraBeatris) + +- Removed redundant `beforeunload` event listener from SafeLock that was disabling the browser's back-forward cache (bfcache), degrading navigation performance. ([#7818](https://github.com/clerk/javascript/pull/7818)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + - @clerk/localizations@3.35.4 + ## 5.122.1 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 2d224ee4ad1..48add8e65f5 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.122.1", + "version": "5.123.0", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 450ccbd94d6..33f86fd165c 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.8 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 0.24.7 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index bf44de77419..23971645144 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.7", + "version": "0.24.8", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 5c725f5c5b1..0bce4292693 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.34 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + ## 0.4.33 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 1a67a240e53..fd8489811fd 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.33", + "version": "0.4.34", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index a8b527c588f..25fa840c513 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.19.23 + +### Patch Changes + +- Updated dependencies [[`b2be957`](https://github.com/clerk/javascript/commit/b2be95757680fcc3e6374c8f7ef5485afc4f4272), [`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`8cb461d`](https://github.com/clerk/javascript/commit/8cb461d796434084c72a1bdcfa253497bd609b34), [`965a4cb`](https://github.com/clerk/javascript/commit/965a4cb051df26afb9053658c068c4a0aef946b0), [`1fe87ac`](https://github.com/clerk/javascript/commit/1fe87acf1b214ba805ab15fe6a2b2254c5dcdaa2), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`dbdf83e`](https://github.com/clerk/javascript/commit/dbdf83ec1f9798b40fc71c09629e6fb294511f70), [`5196122`](https://github.com/clerk/javascript/commit/5196122e36283bc55a517d04259cc2dee3ed7c96)]: + - @clerk/clerk-js@5.123.0 + - @clerk/shared@3.45.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 2.19.22 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 5c83a367943..60560682431 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.22", + "version": "2.19.23", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index b9295fdda99..d1f6b9313a5 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.70 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + ## 1.7.69 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index fa2410f35e4..578aa1058e5 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.69", + "version": "1.7.70", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index f4868069d0b..73ff030d92d 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.22 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + ## 2.6.21 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 5bb87b3510d..74f34cd5864 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.21", + "version": "2.6.22", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index ff147d43b42..afaa1d6bed8 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 3.35.4 + +### Patch Changes + +- Updated dependencies []: + - @clerk/types@4.101.15 + ## 3.35.3 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index e3171531482..cdd1495bbb6 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.35.3", + "version": "3.35.4", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 7a575e9b149..37c5f392c14 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.37.4 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 6.37.3 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 48fdb537ba6..0524a6c20c4 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.37.3", + "version": "6.37.4", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 46257a89bc5..8e34cc7bf21 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.20 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + - @clerk/vue@1.17.13 + ## 1.13.19 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index a90e61fb717..a9c25dc95f6 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.19", + "version": "1.13.20", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 4b74ea85f62..c7ab8ebcc93 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.4.4 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 2.4.3 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 0d8f15e0780..78beee0cf6b 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.4.3", + "version": "2.4.4", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index c25f903b1ed..83d3d8c9358 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 5.60.1 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + ## 5.60.0 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index dbbc4bbd262..8a352ca2188 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.60.0", + "version": "5.60.1", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index d27b91702ac..8aea96eeb7b 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.37 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 4.13.36 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index d2509a1d9f1..0d6c0154c40 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.36", + "version": "4.13.37", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index c57b077d6d0..ceae251b8e1 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.45.0 + +### Minor Changes + +- Add `username` field into `PublicUserData` object. ([#7837](https://github.com/clerk/javascript/pull/7837)) by [@Jibaru](https://github.com/Jibaru) + ## 3.44.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 9fc24c91b14..8f412fa9c27 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.44.0", + "version": "3.45.0", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 177067dc1aa..959fc7a1d03 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-react-start +## 0.29.2 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/clerk-react@5.60.1 + - @clerk/types@4.101.15 + ## 0.29.1 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 16c178472ee..1228c63ecd3 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.29.1", + "version": "0.29.2", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index df6f1e8d139..b8c10b18277 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.36 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0), [`5740640`](https://github.com/clerk/javascript/commit/57406404d516cf0fa8d3bb9b38a0d3d1d69dc88d), [`03c61c1`](https://github.com/clerk/javascript/commit/03c61c122cc1eb2cf35ecdc20586f2fbb0a1e7db)]: + - @clerk/shared@3.45.0 + - @clerk/backend@2.31.0 + - @clerk/types@4.101.15 + ## 1.13.35 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index dfcfd658f2a..3fe93e23d8c 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.35", + "version": "1.13.36", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 37afe19e63e..16e072c3fef 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.52 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + ## 2.4.51 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 30fb9682ad4..d2801f14996 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.51", + "version": "2.4.52", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 40429e01665..1be1e88f9f5 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.15 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + ## 4.101.14 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 2cc51e62d98..81e63921209 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.14", + "version": "4.101.15", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 866495cb69b..45358ee33dd 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.13 + +### Patch Changes + +- Updated dependencies [[`35bcbd1`](https://github.com/clerk/javascript/commit/35bcbd11f5753ee396cd090d3dd1848f3f2727e0)]: + - @clerk/shared@3.45.0 + - @clerk/types@4.101.15 + ## 1.17.12 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 689c48f0329..b129d8c0d79 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.12", + "version": "1.17.13", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 90361c3cbc5352af53aec8754e31cb3ff77e3e22 Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Mon, 16 Feb 2026 12:18:49 -0600 Subject: [PATCH 100/123] docs(repo): Update typedoc link for custom flows (#7852) --- .changeset/large-ducks-cut.md | 2 ++ packages/react/src/hooks/useSignIn.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-ducks-cut.md diff --git a/.changeset/large-ducks-cut.md b/.changeset/large-ducks-cut.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/large-ducks-cut.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/react/src/hooks/useSignIn.ts b/packages/react/src/hooks/useSignIn.ts index 165d15ab9a6..dd6c352df9a 100644 --- a/packages/react/src/hooks/useSignIn.ts +++ b/packages/react/src/hooks/useSignIn.ts @@ -6,7 +6,7 @@ import { useIsomorphicClerkContext } from '../contexts/IsomorphicClerkContext'; import { useAssertWrappedByClerkProvider } from './useAssertWrappedByClerkProvider'; /** - * The `useSignIn()` hook provides access to the [`SignIn`](https://clerk.com/docs/reference/javascript/sign-in) object, which allows you to check the current state of a sign-in attempt and manage the sign-in flow. You can use this to create a [custom sign-in flow](https://clerk.com/docs/guides/development/custom-flows/overview#sign-in-flow). + * The `useSignIn()` hook provides access to the [`SignIn`](https://clerk.com/docs/reference/javascript/sign-in) object, which allows you to check the current state of a sign-in attempt and manage the sign-in flow. You can use this to create a [custom sign-in flow](!custom-flow). * * @unionReturnHeadings * ["Initialization", "Loaded"] From 4352cdf06a284897751673c68286a582c38f57b4 Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Mon, 16 Feb 2026 12:49:57 -0600 Subject: [PATCH 101/123] docs(repo): Update typedoc link for custom flows sign up (#7855) --- .changeset/long-readers-smoke.md | 2 ++ packages/react/src/hooks/useSignUp.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .changeset/long-readers-smoke.md diff --git a/.changeset/long-readers-smoke.md b/.changeset/long-readers-smoke.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/long-readers-smoke.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/react/src/hooks/useSignUp.ts b/packages/react/src/hooks/useSignUp.ts index 0ed9ffff8bd..0f57928e0f4 100644 --- a/packages/react/src/hooks/useSignUp.ts +++ b/packages/react/src/hooks/useSignUp.ts @@ -6,7 +6,7 @@ import { useIsomorphicClerkContext } from '../contexts/IsomorphicClerkContext'; import { useAssertWrappedByClerkProvider } from './useAssertWrappedByClerkProvider'; /** - * The `useSignUp()` hook provides access to the [`SignUp`](https://clerk.com/docs/reference/javascript/sign-up) object, which allows you to check the current state of a sign-up attempt and manage the sign-up flow. You can use this to create a [custom sign-up flow](https://clerk.com/docs/guides/development/custom-flows/overview#sign-up-flow). + * The `useSignUp()` hook provides access to the [`SignUp`](https://clerk.com/docs/reference/javascript/sign-up) object, which allows you to check the current state of a sign-up attempt and manage the sign-up flow. You can use this to create a [custom sign-up flow](!custom-flow) * * @unionReturnHeadings * ["Initialization", "Loaded"] From 6503c1dfef0a3e9256c0c30c9b10b651898887c9 Mon Sep 17 00:00:00 2001 From: Sarah Soutoul Date: Mon, 16 Feb 2026 13:41:44 -0600 Subject: [PATCH 102/123] fix(clerk-js): Handle missing window.location in React Native navigation (#7854) --- .changeset/sixty-gifts-stand.md | 5 +++++ packages/clerk-js/src/core/clerk.ts | 21 +++++++++++++++++++++ packages/react/src/hooks/useSignUp.ts | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/sixty-gifts-stand.md diff --git a/.changeset/sixty-gifts-stand.md b/.changeset/sixty-gifts-stand.md new file mode 100644 index 00000000000..5bdd8dfb7a0 --- /dev/null +++ b/.changeset/sixty-gifts-stand.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +fix(clerk-js): Handle missing window.location in React Native navigation diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index f6c18b85eee..620ac91d190 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1666,6 +1666,27 @@ export class Clerk implements ClerkInterface { return; } + // In React Native, window exists but window.location does not. + // If we have a custom router, use it directly. Otherwise, return early. + if (typeof window.location === 'undefined') { + const customNavigate = + options?.replace && this.#options.routerReplace ? this.#options.routerReplace : this.#options.routerPush; + + if (customNavigate) { + debugLogger.info(`Clerk is navigating to: ${to}`); + return await customNavigate(to, { windowNavigate }); + } + + // No window.location and no custom router - can't navigate + if (__DEV__) { + console.warn( + 'Clerk: Navigation was attempted but window.location is not available and no custom router (routerPush/routerReplace) was provided. ' + + 'If you are using React Native, please provide routerPush and routerReplace options to ClerkProvider.', + ); + } + return; + } + /** * Trigger all navigation listeners. In order for modal UI components to close. */ diff --git a/packages/react/src/hooks/useSignUp.ts b/packages/react/src/hooks/useSignUp.ts index 0f57928e0f4..023a9027b1a 100644 --- a/packages/react/src/hooks/useSignUp.ts +++ b/packages/react/src/hooks/useSignUp.ts @@ -6,7 +6,7 @@ import { useIsomorphicClerkContext } from '../contexts/IsomorphicClerkContext'; import { useAssertWrappedByClerkProvider } from './useAssertWrappedByClerkProvider'; /** - * The `useSignUp()` hook provides access to the [`SignUp`](https://clerk.com/docs/reference/javascript/sign-up) object, which allows you to check the current state of a sign-up attempt and manage the sign-up flow. You can use this to create a [custom sign-up flow](!custom-flow) + * The `useSignUp()` hook provides access to the [`SignUp`](https://clerk.com/docs/reference/javascript/sign-up) object, which allows you to check the current state of a sign-up attempt and manage the sign-up flow. You can use this to create a [custom sign-up flow](!custom-flow). * * @unionReturnHeadings * ["Initialization", "Loaded"] From b17e4bbbbad173969523e5494f2d8447d1887b95 Mon Sep 17 00:00:00 2001 From: Bryce Kalow Date: Tue, 17 Feb 2026 13:12:06 -0600 Subject: [PATCH 103/123] fix(clerk-js): Set SameSite=None on cookies for .replit.dev origins (core 2) (#7864) Co-authored-by: Claude Opus 4.6 --- .changeset/fix-samesite-replit-dev.md | 6 ++++ packages/clerk-js/bundlewatch.config.json | 2 +- .../auth/cookies/__tests__/clientUat.test.ts | 21 +++++++++++++ .../auth/cookies/__tests__/session.test.ts | 16 ++++++++++ .../src/core/auth/cookies/clientUat.ts | 7 ++++- .../src/core/auth/cookies/devBrowser.ts | 3 +- .../core/auth/cookies/requireSameSiteNone.ts | 1 + .../clerk-js/src/core/auth/cookies/session.ts | 3 +- .../__tests__/originPrefersPopup.test.ts | 15 +++++++--- .../src/ui/utils/originPrefersPopup.ts | 13 ++------ .../clerk-js/src/utils/thirdPartyDomains.ts | 30 +++++++++++++++++++ 11 files changed, 98 insertions(+), 19 deletions(-) create mode 100644 .changeset/fix-samesite-replit-dev.md create mode 100644 packages/clerk-js/src/core/auth/cookies/requireSameSiteNone.ts create mode 100644 packages/clerk-js/src/utils/thirdPartyDomains.ts diff --git a/.changeset/fix-samesite-replit-dev.md b/.changeset/fix-samesite-replit-dev.md new file mode 100644 index 00000000000..156b22b3c53 --- /dev/null +++ b/.changeset/fix-samesite-replit-dev.md @@ -0,0 +1,6 @@ +--- +'@clerk/shared': patch +'@clerk/clerk-js': patch +--- + +Set `SameSite=None` on cookies for `.replit.dev` origins and consolidate third-party domain list diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index a055cc6954f..c96f7bd1fb8 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -3,7 +3,7 @@ { "path": "./dist/clerk.js", "maxSize": "928KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, - { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, + { "path": "./dist/clerk.headless*.js", "maxSize": "67KB" }, { "path": "./dist/ui-common*.js", "maxSize": "123KB" }, { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "126KB" }, { "path": "./dist/vendors*.js", "maxSize": "50KB" }, diff --git a/packages/clerk-js/src/core/auth/cookies/__tests__/clientUat.test.ts b/packages/clerk-js/src/core/auth/cookies/__tests__/clientUat.test.ts index 889cca10513..3caca7f6c33 100644 --- a/packages/clerk-js/src/core/auth/cookies/__tests__/clientUat.test.ts +++ b/packages/clerk-js/src/core/auth/cookies/__tests__/clientUat.test.ts @@ -6,12 +6,14 @@ import { inCrossOriginIframe } from '../../../../utils'; import { getCookieDomain } from '../../getCookieDomain'; import { getSecureAttribute } from '../../getSecureAttribute'; import { createClientUatCookie } from '../clientUat'; +import { requiresSameSiteNone } from '../requireSameSiteNone'; vi.mock('@clerk/shared/cookie'); vi.mock('@clerk/shared/date'); vi.mock('../../../../utils'); vi.mock('../../getCookieDomain'); vi.mock('../../getSecureAttribute'); +vi.mock('../requireSameSiteNone'); describe('createClientUatCookie', () => { const mockCookieSuffix = 'test-suffix'; @@ -26,6 +28,7 @@ describe('createClientUatCookie', () => { mockGet.mockReset(); (addYears as ReturnType).mockReturnValue(mockExpires); (inCrossOriginIframe as ReturnType).mockReturnValue(false); + (requiresSameSiteNone as ReturnType).mockReturnValue(false); (getCookieDomain as ReturnType).mockReturnValue(mockDomain); (getSecureAttribute as ReturnType).mockReturnValue(true); (createCookieHandler as ReturnType).mockImplementation(() => ({ @@ -125,4 +128,22 @@ describe('createClientUatCookie', () => { expect(result).toBe(0); }); + + it('should set cookies with SameSite=None when the host requires it', () => { + (requiresSameSiteNone as ReturnType).mockReturnValue(true); + const cookieHandler = createClientUatCookie(mockCookieSuffix); + cookieHandler.set({ + id: 'test-client', + updatedAt: new Date('2024-01-01'), + signedInSessions: ['session1'], + }); + + expect(mockSet).toHaveBeenCalledWith('1704067200', { + domain: mockDomain, + expires: mockExpires, + sameSite: 'None', + secure: true, + partitioned: false, + }); + }); }); diff --git a/packages/clerk-js/src/core/auth/cookies/__tests__/session.test.ts b/packages/clerk-js/src/core/auth/cookies/__tests__/session.test.ts index 6248d78b9eb..2e63ad845ee 100644 --- a/packages/clerk-js/src/core/auth/cookies/__tests__/session.test.ts +++ b/packages/clerk-js/src/core/auth/cookies/__tests__/session.test.ts @@ -4,12 +4,14 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { inCrossOriginIframe } from '../../../../utils'; import { getSecureAttribute } from '../../getSecureAttribute'; +import { requiresSameSiteNone } from '../requireSameSiteNone'; import { createSessionCookie } from '../session'; vi.mock('@clerk/shared/cookie'); vi.mock('@clerk/shared/date'); vi.mock('../../../../utils'); vi.mock('../../getSecureAttribute'); +vi.mock('../requireSameSiteNone'); describe('createSessionCookie', () => { const mockCookieSuffix = 'test-suffix'; @@ -24,6 +26,7 @@ describe('createSessionCookie', () => { mockGet.mockReset(); (addYears as ReturnType).mockReturnValue(mockExpires); (inCrossOriginIframe as ReturnType).mockReturnValue(false); + (requiresSameSiteNone as ReturnType).mockReturnValue(false); (getSecureAttribute as ReturnType).mockReturnValue(true); (createCookieHandler as ReturnType).mockImplementation(() => ({ set: mockSet, @@ -113,4 +116,17 @@ describe('createSessionCookie', () => { expect(result).toBe('non-suffixed-value'); }); + + it('should set cookies with None sameSite on .replit.dev origins', () => { + (requiresSameSiteNone as ReturnType).mockReturnValue(true); + const cookieHandler = createSessionCookie(mockCookieSuffix); + cookieHandler.set(mockToken); + + expect(mockSet).toHaveBeenCalledWith(mockToken, { + expires: mockExpires, + sameSite: 'None', + secure: true, + partitioned: false, + }); + }); }); diff --git a/packages/clerk-js/src/core/auth/cookies/clientUat.ts b/packages/clerk-js/src/core/auth/cookies/clientUat.ts index a6d11bdd5a7..7d52af06e43 100644 --- a/packages/clerk-js/src/core/auth/cookies/clientUat.ts +++ b/packages/clerk-js/src/core/auth/cookies/clientUat.ts @@ -6,6 +6,7 @@ import type { ClientResource } from '@clerk/shared/types'; import { inCrossOriginIframe } from '../../../utils'; import { getCookieDomain } from '../getCookieDomain'; import { getSecureAttribute } from '../getSecureAttribute'; +import { requiresSameSiteNone } from './requireSameSiteNone'; const CLIENT_UAT_COOKIE_NAME = '__client_uat'; @@ -37,7 +38,11 @@ export const createClientUatCookie = (cookieSuffix: string): ClientUatCookieHand * Generally, this is handled by redirectWithAuth() being called and relying on the dev browser ID in the URL, * but if that isn't used we rely on this. In production, nothing is cross-domain and Lax is used when client_uat is set from FAPI. */ - const sameSite = __BUILD_VARIANT_CHIPS__ ? 'None' : inCrossOriginIframe() ? 'None' : 'Strict'; + const sameSite = __BUILD_VARIANT_CHIPS__ + ? 'None' + : inCrossOriginIframe() || requiresSameSiteNone() + ? 'None' + : 'Strict'; const secure = getSecureAttribute(sameSite); const partitioned = __BUILD_VARIANT_CHIPS__ && secure; const domain = getCookieDomain(); diff --git a/packages/clerk-js/src/core/auth/cookies/devBrowser.ts b/packages/clerk-js/src/core/auth/cookies/devBrowser.ts index 47edda5fadd..f7b6c6c5851 100644 --- a/packages/clerk-js/src/core/auth/cookies/devBrowser.ts +++ b/packages/clerk-js/src/core/auth/cookies/devBrowser.ts @@ -5,6 +5,7 @@ import { getSuffixedCookieName } from '@clerk/shared/keys'; import { inCrossOriginIframe } from '../../../utils'; import { getSecureAttribute } from '../getSecureAttribute'; +import { requiresSameSiteNone } from './requireSameSiteNone'; export type DevBrowserCookieHandler = { set: (jwt: string) => void; @@ -13,7 +14,7 @@ export type DevBrowserCookieHandler = { }; const getCookieAttributes = (): { sameSite: string; secure: boolean } => { - const sameSite = inCrossOriginIframe() ? 'None' : 'Lax'; + const sameSite = inCrossOriginIframe() || requiresSameSiteNone() ? 'None' : 'Lax'; const secure = getSecureAttribute(sameSite); return { sameSite, secure }; }; diff --git a/packages/clerk-js/src/core/auth/cookies/requireSameSiteNone.ts b/packages/clerk-js/src/core/auth/cookies/requireSameSiteNone.ts new file mode 100644 index 00000000000..973f689d979 --- /dev/null +++ b/packages/clerk-js/src/core/auth/cookies/requireSameSiteNone.ts @@ -0,0 +1 @@ +export { isThirdPartyCookieDomain as requiresSameSiteNone } from '../../../utils/thirdPartyDomains'; diff --git a/packages/clerk-js/src/core/auth/cookies/session.ts b/packages/clerk-js/src/core/auth/cookies/session.ts index 209755d96f4..abb91d54677 100644 --- a/packages/clerk-js/src/core/auth/cookies/session.ts +++ b/packages/clerk-js/src/core/auth/cookies/session.ts @@ -4,6 +4,7 @@ import { getSuffixedCookieName } from '@clerk/shared/keys'; import { inCrossOriginIframe } from '../../../utils'; import { getSecureAttribute } from '../getSecureAttribute'; +import { requiresSameSiteNone } from './requireSameSiteNone'; const SESSION_COOKIE_NAME = '__session'; @@ -14,7 +15,7 @@ export type SessionCookieHandler = { }; const getCookieAttributes = (): { sameSite: string; secure: boolean; partitioned: boolean } => { - const sameSite = __BUILD_VARIANT_CHIPS__ ? 'None' : inCrossOriginIframe() ? 'None' : 'Lax'; + const sameSite = __BUILD_VARIANT_CHIPS__ ? 'None' : inCrossOriginIframe() || requiresSameSiteNone() ? 'None' : 'Lax'; const secure = getSecureAttribute(sameSite); const partitioned = __BUILD_VARIANT_CHIPS__ && secure; return { sameSite, secure, partitioned }; diff --git a/packages/clerk-js/src/ui/utils/__tests__/originPrefersPopup.test.ts b/packages/clerk-js/src/ui/utils/__tests__/originPrefersPopup.test.ts index fccf944cb3c..af84faa32b2 100644 --- a/packages/clerk-js/src/ui/utils/__tests__/originPrefersPopup.test.ts +++ b/packages/clerk-js/src/ui/utils/__tests__/originPrefersPopup.test.ts @@ -15,11 +15,18 @@ describe('originPrefersPopup', () => { // Store original location to restore after tests const originalLocation = window.location; - // Helper function to mock window.location.origin + // Helper function to mock window.location.hostname const mockLocationOrigin = (origin: string) => { + let hostname: string; + try { + hostname = new URL(origin).hostname; + } catch { + hostname = origin; + } Object.defineProperty(window, 'location', { value: { origin, + hostname, }, writable: true, configurable: true, @@ -176,12 +183,12 @@ describe('originPrefersPopup', () => { expect(originPrefersPopup()).toBe(false); }); - it('should be case sensitive', () => { + it('should be case insensitive (hostnames are normalized to lowercase)', () => { mockLocationOrigin('https://app.LOVABLE.APP'); - expect(originPrefersPopup()).toBe(false); + expect(originPrefersPopup()).toBe(true); mockLocationOrigin('https://APP.V0.DEV'); - expect(originPrefersPopup()).toBe(false); + expect(originPrefersPopup()).toBe(true); }); it('should handle malformed origins gracefully', () => { diff --git a/packages/clerk-js/src/ui/utils/originPrefersPopup.ts b/packages/clerk-js/src/ui/utils/originPrefersPopup.ts index 41239354688..79554fed6c1 100644 --- a/packages/clerk-js/src/ui/utils/originPrefersPopup.ts +++ b/packages/clerk-js/src/ui/utils/originPrefersPopup.ts @@ -1,14 +1,5 @@ import { inIframe } from '@/utils'; - -const POPUP_PREFERRED_ORIGINS = [ - '.lovable.app', - '.lovableproject.com', - '.webcontainer-api.io', - '.vusercontent.net', - '.v0.dev', - '.v0.app', - '.lp.dev', -]; +import { THIRD_PARTY_COOKIE_DOMAINS } from '@/utils/thirdPartyDomains'; /** * Returns `true` if the current origin is one that is typically embedded via an iframe, which would benefit from the @@ -16,5 +7,5 @@ const POPUP_PREFERRED_ORIGINS = [ * @returns {boolean} Whether the current origin prefers the popup flow. */ export function originPrefersPopup(): boolean { - return inIframe() || POPUP_PREFERRED_ORIGINS.some(origin => window.location.origin.endsWith(origin)); + return inIframe() || THIRD_PARTY_COOKIE_DOMAINS.some(domain => window.location.hostname.endsWith(domain)); } diff --git a/packages/clerk-js/src/utils/thirdPartyDomains.ts b/packages/clerk-js/src/utils/thirdPartyDomains.ts new file mode 100644 index 00000000000..b61aa143641 --- /dev/null +++ b/packages/clerk-js/src/utils/thirdPartyDomains.ts @@ -0,0 +1,30 @@ +/** + * Domains of third-party embedding platforms (e.g. online IDEs, preview environments) + * that require special handling for cookies and OAuth flows. + * + * These domains need: + * - `SameSite=None` on cookies to function correctly + * - Popup-based OAuth flows instead of redirects + */ +export const THIRD_PARTY_COOKIE_DOMAINS = [ + '.lovable.app', + '.lovableproject.com', + '.webcontainer-api.io', + '.vusercontent.net', + '.v0.dev', + '.v0.app', + '.lp.dev', + '.replit.dev', +]; + +/** + * Returns `true` if the current origin belongs to a known third-party + * embedding platform that requires `SameSite=None` on cookies. + */ +export function isThirdPartyCookieDomain(): boolean { + try { + return THIRD_PARTY_COOKIE_DOMAINS.some(domain => window.location.hostname.endsWith(domain)); + } catch { + return false; + } +} From 9cdc7f04bc3768acdf4e2a753f4f288d5a9f23c6 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Tue, 17 Feb 2026 14:52:35 -0500 Subject: [PATCH 104/123] ci(repo): Version packages (Core 2) (#7856) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/fix-samesite-replit-dev.md | 6 ------ .changeset/large-ducks-cut.md | 2 -- .changeset/long-readers-smoke.md | 2 -- .changeset/sixty-gifts-stand.md | 5 ----- packages/agent-toolkit/CHANGELOG.md | 9 +++++++++ packages/agent-toolkit/package.json | 2 +- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 12 ++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 7 +++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 ++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 7 +++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 ++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react-router/CHANGELOG.md | 10 ++++++++++ packages/react-router/package.json | 2 +- packages/react/CHANGELOG.md | 7 +++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/shared/CHANGELOG.md | 6 ++++++ packages/shared/package.json | 2 +- packages/tanstack-react-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-react-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 7 +++++++ packages/types/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 48 files changed, 214 insertions(+), 37 deletions(-) delete mode 100644 .changeset/fix-samesite-replit-dev.md delete mode 100644 .changeset/large-ducks-cut.md delete mode 100644 .changeset/long-readers-smoke.md delete mode 100644 .changeset/sixty-gifts-stand.md diff --git a/.changeset/fix-samesite-replit-dev.md b/.changeset/fix-samesite-replit-dev.md deleted file mode 100644 index 156b22b3c53..00000000000 --- a/.changeset/fix-samesite-replit-dev.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/shared': patch -'@clerk/clerk-js': patch ---- - -Set `SameSite=None` on cookies for `.replit.dev` origins and consolidate third-party domain list diff --git a/.changeset/large-ducks-cut.md b/.changeset/large-ducks-cut.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/large-ducks-cut.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/long-readers-smoke.md b/.changeset/long-readers-smoke.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/long-readers-smoke.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/sixty-gifts-stand.md b/.changeset/sixty-gifts-stand.md deleted file mode 100644 index 5bdd8dfb7a0..00000000000 --- a/.changeset/sixty-gifts-stand.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -fix(clerk-js): Handle missing window.location in React Native navigation diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md index 3952830c800..59c41231259 100644 --- a/packages/agent-toolkit/CHANGELOG.md +++ b/packages/agent-toolkit/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/agent-toolkit +## 0.2.23 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + ## 0.2.22 ### Patch Changes diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json index 49aaf44e258..30a1f8564da 100644 --- a/packages/agent-toolkit/package.json +++ b/packages/agent-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/agent-toolkit", - "version": "0.2.22", + "version": "0.2.23", "description": "Clerk Toolkit for AI Agents", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index a897456584e..1ce88b6a9c4 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 2.17.3 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + ## 2.17.2 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index b549703c829..0f2604589e3 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "2.17.2", + "version": "2.17.3", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 5f80c3e67ff..344a8e8250b 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.31.1 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/types@4.101.16 + ## 2.31.0 ### Minor Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 406a1b6f0b4..5ea6ed4d4ad 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "2.31.0", + "version": "2.31.1", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index b02b50d6e2b..98f4b533a17 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.9.3 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95), [`6503c1d`](https://github.com/clerk/javascript/commit/6503c1dfef0a3e9256c0c30c9b10b651898887c9)]: + - @clerk/shared@3.45.1 + - @clerk/clerk-js@5.123.1 + - @clerk/clerk-react@5.60.2 + ## 2.9.2 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 2a1b7ec06cf..154653c90fd 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "2.9.2", + "version": "2.9.3", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 676a6cac8c6..20bb5958127 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## 5.123.1 + +### Patch Changes + +- Set `SameSite=None` on cookies for `.replit.dev` origins and consolidate third-party domain list ([#7864](https://github.com/clerk/javascript/pull/7864)) by [@brkalow](https://github.com/brkalow) + +- fix(clerk-js): Handle missing window.location in React Native navigation ([#7854](https://github.com/clerk/javascript/pull/7854)) by [@SarahSoutoul](https://github.com/SarahSoutoul) + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/localizations@3.35.5 + ## 5.123.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 48add8e65f5..3684c1ca8b7 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.123.0", + "version": "5.123.1", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 33f86fd165c..5c85660bcb7 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.24.9 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 0.24.8 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 23971645144..7953c881cc8 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.24.8", + "version": "0.24.9", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 0bce4292693..c92e41cba14 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/expo-passkeys +## 0.4.35 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + ## 0.4.34 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index fd8489811fd..66774cfcba4 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.4.34", + "version": "0.4.35", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 25fa840c513..8a23f790ebb 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.19.24 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95), [`6503c1d`](https://github.com/clerk/javascript/commit/6503c1dfef0a3e9256c0c30c9b10b651898887c9)]: + - @clerk/shared@3.45.1 + - @clerk/clerk-js@5.123.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 2.19.23 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 60560682431..1ae28a47fb4 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.19.23", + "version": "2.19.24", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index d1f6b9313a5..183d8a3921e 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.7.71 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + ## 1.7.70 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 578aa1058e5..971f0b334ca 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.7.70", + "version": "1.7.71", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 73ff030d92d..79f5dde84db 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.6.23 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + ## 2.6.22 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 74f34cd5864..91b2fddcfcd 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.6.22", + "version": "2.6.23", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index afaa1d6bed8..f19645fa5ae 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 3.35.5 + +### Patch Changes + +- Updated dependencies []: + - @clerk/types@4.101.16 + ## 3.35.4 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index cdd1495bbb6..970b422a605 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.35.4", + "version": "3.35.5", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 37c5f392c14..74f49fbba38 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.37.5 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 6.37.4 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 0524a6c20c4..615d5d0d4d4 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.37.4", + "version": "6.37.5", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 8e34cc7bf21..eac048accf8 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 1.13.21 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + - @clerk/vue@1.17.14 + ## 1.13.20 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index a9c25dc95f6..4083d287dba 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "1.13.20", + "version": "1.13.21", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index c7ab8ebcc93..19504e40e87 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.4.5 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 2.4.4 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 78beee0cf6b..fd913377032 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/react-router", - "version": "2.4.4", + "version": "2.4.5", "description": "Clerk SDK for React Router", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 83d3d8c9358..28845a5e676 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 5.60.2 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + ## 5.60.1 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index 8a352ca2188..65257f7a409 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.60.1", + "version": "5.60.2", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 8aea96eeb7b..4ad5d57c8af 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.13.38 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 4.13.37 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index 0d6c0154c40..2876cb4e860 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.13.37", + "version": "4.13.38", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index ceae251b8e1..e2a9d0d734f 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 3.45.1 + +### Patch Changes + +- Set `SameSite=None` on cookies for `.replit.dev` origins and consolidate third-party domain list ([#7864](https://github.com/clerk/javascript/pull/7864)) by [@brkalow](https://github.com/brkalow) + ## 3.45.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 8f412fa9c27..24fd14ca712 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "3.45.0", + "version": "3.45.1", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md index 959fc7a1d03..e54c2f9f764 100644 --- a/packages/tanstack-react-start/CHANGELOG.md +++ b/packages/tanstack-react-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-react-start +## 0.29.3 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/clerk-react@5.60.2 + - @clerk/types@4.101.16 + ## 0.29.2 ### Patch Changes diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json index 1228c63ecd3..711998ea9b2 100644 --- a/packages/tanstack-react-start/package.json +++ b/packages/tanstack-react-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-react-start", - "version": "0.29.2", + "version": "0.29.3", "description": "Clerk SDK for TanStack React Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index b8c10b18277..4f1e54810a5 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.13.37 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/backend@2.31.1 + - @clerk/types@4.101.16 + ## 1.13.36 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 3fe93e23d8c..c147adec253 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.13.36", + "version": "1.13.37", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 16e072c3fef..f2c8f6b3260 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.4.53 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + ## 2.4.52 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index d2801f14996..27a207d8fcf 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.4.52", + "version": "2.4.53", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 1be1e88f9f5..63d2ec939fa 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 4.101.16 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + ## 4.101.15 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 81e63921209..dcffd494f5e 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.101.15", + "version": "4.101.16", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 45358ee33dd..c1f59d8573b 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 1.17.14 + +### Patch Changes + +- Updated dependencies [[`b17e4bb`](https://github.com/clerk/javascript/commit/b17e4bbbbad173969523e5494f2d8447d1887b95)]: + - @clerk/shared@3.45.1 + - @clerk/types@4.101.16 + ## 1.17.13 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index b129d8c0d79..7c144585133 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "1.17.13", + "version": "1.17.14", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 935f780ab5b3871253da2ad46f0e44f9ce7e53e8 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:36:03 -0600 Subject: [PATCH 105/123] feat(clerk-js,localizations,shared): Add support for credits (#7870) --- .changeset/shy-loops-type.md | 7 ++ packages/clerk-js/bundlewatch.config.json | 2 +- .../ui/components/Checkout/CheckoutForm.tsx | 17 ++- .../Checkout/__tests__/Checkout.test.tsx | 107 ++++++++++++++++++ packages/clerk-js/src/utils/billing.ts | 26 ++++- packages/localizations/src/en-US.ts | 1 + .../react/__tests__/payment-element.test.tsx | 5 + packages/shared/src/types/billing.ts | 19 ++++ packages/shared/src/types/json.ts | 30 +++++ packages/shared/src/types/localization.ts | 1 + 10 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 .changeset/shy-loops-type.md diff --git a/.changeset/shy-loops-type.md b/.changeset/shy-loops-type.md new file mode 100644 index 00000000000..b55584f9cd2 --- /dev/null +++ b/.changeset/shy-loops-type.md @@ -0,0 +1,7 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/shared': minor +--- + +Add support for account credits in checkout. diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index c96f7bd1fb8..9ed455d99ca 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -24,7 +24,7 @@ { "path": "./dist/keylessPrompt*.js", "maxSize": "6.5KB" }, { "path": "./dist/enableOrganizationsPrompt*.js", "maxSize": "6.5KB" }, { "path": "./dist/pricingTable*.js", "maxSize": "4.02KB" }, - { "path": "./dist/checkout*.js", "maxSize": "8.82KB" }, + { "path": "./dist/checkout*.js", "maxSize": "10KB" }, { "path": "./dist/up-billing-page*.js", "maxSize": "3.0KB" }, { "path": "./dist/op-billing-page*.js", "maxSize": "3.0KB" }, { "path": "./dist/up-plans-page*.js", "maxSize": "1.0KB" }, diff --git a/packages/clerk-js/src/ui/components/Checkout/CheckoutForm.tsx b/packages/clerk-js/src/ui/components/Checkout/CheckoutForm.tsx index 7d7c7a4f2b1..cad7532cc74 100644 --- a/packages/clerk-js/src/ui/components/Checkout/CheckoutForm.tsx +++ b/packages/clerk-js/src/ui/components/Checkout/CheckoutForm.tsx @@ -35,7 +35,8 @@ export const CheckoutForm = withCardStateProvider(() => { return null; } - const showCredits = !!totals.credit?.amount && totals.credit.amount > 0; + const showProratedCredit = !!totals.credits?.proration?.amount && totals.credits.proration.amount.amount > 0; + const showAccountCredits = !!totals.credits?.payer?.appliedAmount && totals.credits.payer.appliedAmount.amount > 0; const showPastDue = !!totals.pastDue?.amount && totals.pastDue.amount > 0; const showDowngradeInfo = !isImmediatePlanChange; @@ -80,10 +81,20 @@ export const CheckoutForm = withCardStateProvider(() => { - {showCredits && ( + {showProratedCredit && ( - + + + )} + {showAccountCredits && ( + + + )} {showPastDue && ( diff --git a/packages/clerk-js/src/ui/components/Checkout/__tests__/Checkout.test.tsx b/packages/clerk-js/src/ui/components/Checkout/__tests__/Checkout.test.tsx index 74402763745..8414f0c9ea8 100644 --- a/packages/clerk-js/src/ui/components/Checkout/__tests__/Checkout.test.tsx +++ b/packages/clerk-js/src/ui/components/Checkout/__tests__/Checkout.test.tsx @@ -309,6 +309,113 @@ describe('Checkout', () => { }); }); + it('renders credit details', async () => { + const { wrapper, fixtures } = await createFixtures(f => { + f.withUser({ email_addresses: ['test@clerk.com'] }); + f.withBilling(); + }); + + fixtures.clerk.user?.getPaymentMethods.mockResolvedValue({ + data: [], + total_count: 0, + }); + + fixtures.clerk.billing.startCheckout.mockResolvedValue({ + id: 'chk_credits_1', + status: 'needs_confirmation', + externalClientSecret: 'cs_test_credits_1', + externalGatewayId: 'gw_test', + totals: { + subtotal: { amount: 2500, amountFormatted: '25.00', currency: 'USD', currencySymbol: '$' }, + grandTotal: { amount: 1000, amountFormatted: '10.00', currency: 'USD', currencySymbol: '$' }, + taxTotal: { amount: 0, amountFormatted: '0.00', currency: 'USD', currencySymbol: '$' }, + credit: { amount: 0, amountFormatted: '0.00', currency: 'USD', currencySymbol: '$' }, + credits: { + proration: { + amount: { amount: 500, amountFormatted: '5.00', currency: 'USD', currencySymbol: '$' }, + cycleDaysRemaining: 15, + cycleDaysTotal: 30, + cycleRemainingPercent: 50, + }, + payer: { + remainingBalance: { amount: 2000, amountFormatted: '20.00', currency: 'USD', currencySymbol: '$' }, + appliedAmount: { amount: 1000, amountFormatted: '10.00', currency: 'USD', currencySymbol: '$' }, + }, + total: { amount: 1500, amountFormatted: '15.00', currency: 'USD', currencySymbol: '$' }, + }, + pastDue: { amount: 0, amountFormatted: '0.00', currency: 'USD', currencySymbol: '$' }, + totalDueNow: { amount: 1000, amountFormatted: '10.00', currency: 'USD', currencySymbol: '$' }, + }, + isImmediatePlanChange: true, + planPeriod: 'month', + plan: { + id: 'plan_credits', + name: 'Pro', + description: 'Pro plan', + features: [], + fee: { + amount: 2500, + amountFormatted: '25.00', + currency: 'USD', + currencySymbol: '$', + }, + annualFee: { + amount: 30000, + amountFormatted: '300.00', + currency: 'USD', + currencySymbol: '$', + }, + annualMonthlyFee: { + amount: 2500, + amountFormatted: '25.00', + currency: 'USD', + currencySymbol: '$', + }, + slug: 'pro', + avatarUrl: '', + publiclyVisible: true, + isDefault: true, + isRecurring: true, + hasBaseFee: false, + forPayerType: 'user', + freeTrialDays: 7, + freeTrialEnabled: true, + }, + paymentMethod: undefined, + confirm: vi.fn(), + freeTrialEndsAt: null, + needsPaymentMethod: false, + } as any); + + const { getByRole, getByText } = render( + {}} + > + + , + { wrapper }, + ); + + await waitFor(() => { + expect(getByRole('heading', { name: 'Checkout' })).toBeVisible(); + }); + + const prorationCreditRow = getByText('Credit for the remainder of your current subscription.').closest( + '.cl-lineItemsGroup', + ); + const accountCreditRow = getByText('Credit from account balance.').closest('.cl-lineItemsGroup'); + + expect(prorationCreditRow).toBeInTheDocument(); + expect(accountCreditRow).toBeInTheDocument(); + + expect(prorationCreditRow).toHaveTextContent('- $5.00'); + expect(accountCreditRow).toHaveTextContent('- $10.00'); + }); + it('renders free trial details during confirmation stage', async () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ email_addresses: ['test@clerk.com'] }); diff --git a/packages/clerk-js/src/utils/billing.ts b/packages/clerk-js/src/utils/billing.ts index a72868a859d..8c42f1a86fa 100644 --- a/packages/clerk-js/src/utils/billing.ts +++ b/packages/clerk-js/src/utils/billing.ts @@ -1,6 +1,8 @@ import type { BillingCheckoutTotals, BillingCheckoutTotalsJSON, + BillingCredits, + BillingCreditsJSON, BillingMoneyAmount, BillingMoneyAmountJSON, BillingStatementTotals, @@ -16,6 +18,26 @@ export const billingMoneyAmountFromJSON = (data: BillingMoneyAmountJSON): Billin }; }; +const billingCreditsFromJSON = (data: BillingCreditsJSON): BillingCredits => { + return { + proration: data.proration + ? { + amount: billingMoneyAmountFromJSON(data.proration.amount), + cycleDaysRemaining: data.proration.cycle_days_remaining, + cycleDaysTotal: data.proration.cycle_days_total, + cycleRemainingPercent: data.proration.cycle_remaining_percent, + } + : null, + payer: data.payer + ? { + remainingBalance: billingMoneyAmountFromJSON(data.payer.remaining_balance), + appliedAmount: billingMoneyAmountFromJSON(data.payer.applied_amount), + } + : null, + total: billingMoneyAmountFromJSON(data.total), + }; +}; + export const billingTotalsFromJSON = ( data: T, ): T extends { total_due_now: BillingMoneyAmountJSON } ? BillingCheckoutTotals : BillingStatementTotals => { @@ -31,7 +53,9 @@ export const billingTotalsFromJSON = { totalDueNow: { amount: 1000, amountFormatted: '$10.00', currency: 'usd', currencySymbol: '$' }, totalDueAfterFreeTrial: null, credit: { amount: 0, amountFormatted: '$0.00', currency: 'usd', currencySymbol: '$' }, + credits: { + proration: null, + payer: null, + total: { amount: 0, amountFormatted: '$0.00', currency: 'usd', currencySymbol: '$' }, + }, pastDue: { amount: 0, amountFormatted: '$0.00', currency: 'usd', currencySymbol: '$' }, }, status: 'needs_confirmation' as const, diff --git a/packages/shared/src/types/billing.ts b/packages/shared/src/types/billing.ts index 26f11f7e4ea..a7ba45ae532 100644 --- a/packages/shared/src/types/billing.ts +++ b/packages/shared/src/types/billing.ts @@ -645,6 +645,24 @@ export interface BillingMoneyAmount { currencySymbol: string; } +export interface BillingProrationCreditDetail { + amount: BillingMoneyAmount; + cycleDaysRemaining: number; + cycleDaysTotal: number; + cycleRemainingPercent: number; +} + +export interface BillingPayerCredit { + remainingBalance: BillingMoneyAmount; + appliedAmount: BillingMoneyAmount; +} + +export interface BillingCredits { + proration: BillingProrationCreditDetail | null; + payer: BillingPayerCredit | null; + total: BillingMoneyAmount; +} + /** * The `BillingCheckoutTotals` type represents the total costs, taxes, and other pricing details for a checkout session. * @@ -671,6 +689,7 @@ export interface BillingCheckoutTotals { * Any credits (like account balance or promo credits) that are being applied to the checkout. */ credit: BillingMoneyAmount | null; + credits: BillingCredits | null; /** * Any outstanding amount from previous unpaid invoices that is being collected as part of the checkout. */ diff --git a/packages/shared/src/types/json.ts b/packages/shared/src/types/json.ts index e24e426cca2..783395c5fa9 100644 --- a/packages/shared/src/types/json.ts +++ b/packages/shared/src/types/json.ts @@ -730,6 +730,7 @@ export interface BillingSubscriptionItemJSON extends ClerkResourceJSON { credit?: { amount: BillingMoneyAmountJSON; }; + credits?: BillingCreditsJSON; plan: BillingPlanJSON; plan_period: BillingSubscriptionPlanPeriod; status: BillingSubscriptionStatus; @@ -779,6 +780,33 @@ export interface BillingMoneyAmountJSON { currency_symbol: string; } +/** + * Contains proration credit details including billing cycle information. + */ +export interface BillingProrationCreditDetailJSON { + amount: BillingMoneyAmountJSON; + cycle_days_remaining: number; + cycle_days_total: number; + cycle_remaining_percent: number; +} + +/** + * Contains payer credit details including the available balance and the amount applied to this checkout. + */ +export interface BillingPayerCreditJSON { + remaining_balance: BillingMoneyAmountJSON; + applied_amount: BillingMoneyAmountJSON; +} + +/** + * Unified credits breakdown for checkout totals. Can be used instead of `credit` field. + */ +export interface BillingCreditsJSON { + proration: BillingProrationCreditDetailJSON | null; + payer: BillingPayerCreditJSON | null; + total: BillingMoneyAmountJSON; +} + /** * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes. */ @@ -788,6 +816,8 @@ export interface BillingCheckoutTotalsJSON { tax_total: BillingMoneyAmountJSON; total_due_now: BillingMoneyAmountJSON; credit: BillingMoneyAmountJSON | null; + credits: BillingCreditsJSON | null; + account_credit: BillingMoneyAmountJSON | null; past_due: BillingMoneyAmountJSON | null; total_due_after_free_trial: BillingMoneyAmountJSON | null; } diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 7c3b5ae0fc0..b7eb936734a 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -207,6 +207,7 @@ export type __internal_LocalizationResource = { subtotal: LocalizationValue; credit: LocalizationValue; creditRemainder: LocalizationValue; + payerCreditRemainder: LocalizationValue; totalDue: LocalizationValue; totalDueToday: LocalizationValue; pastDue: LocalizationValue; From 71bd53c67a5018bd7aa589c3baced2038123c228 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 18 Feb 2026 11:42:13 +0200 Subject: [PATCH 106/123] feat(clerk-js): Introduce setup MFA session task Core 2 port (#7851) --- .changeset/cold-clowns-fix.md | 9 + integration/presets/envs.ts | 7 + integration/presets/longRunningApps.ts | 1 + .../tests/session-tasks-setup-mfa.test.ts | 207 ++++ packages/clerk-js/bundlewatch.config.json | 2 +- packages/clerk-js/src/core/clerk.ts | 21 + .../src/core/resources/UserSettings.ts | 3 + packages/clerk-js/src/core/sessionTasks.ts | 1 + packages/clerk-js/src/test/fixture-helpers.ts | 5 + packages/clerk-js/src/test/fixtures.ts | 3 + packages/clerk-js/src/ui/common/Wizard.tsx | 7 +- .../src/ui/components/SessionTasks/index.tsx | 79 +- .../TaskSetupMfa/SetupMfaStartScreen.tsx | 109 +++ .../tasks/TaskSetupMfa/SmsCodeFlowScreen.tsx | 435 +++++++++ .../tasks/TaskSetupMfa/TOTPCodeFlowScreen.tsx | 285 ++++++ .../__tests__/TaskSetupMfa.test.tsx | 918 ++++++++++++++++++ .../tasks/TaskSetupMfa/constants.ts | 4 + .../SessionTasks/tasks/TaskSetupMfa/index.tsx | 107 ++ .../tasks/TaskSetupMfa/shared.tsx | 56 ++ .../SessionTasks/tasks/shared/index.ts | 1 + .../tasks/shared/withTaskGuardOnlyOnMount.tsx | 67 ++ .../ui/components/UserProfile/MfaSection.tsx | 103 +- .../UserProfile/__tests__/MfaPage.test.tsx | 190 ++++ .../src/ui/components/UserProfile/utils.ts | 40 +- .../ui/contexts/ClerkUIComponentsContext.tsx | 10 + .../ui/contexts/components/SessionTasks.ts | 14 +- .../ui/customizables/elementDescriptors.ts | 6 + .../src/ui/elements/FormContainer.tsx | 4 +- packages/clerk-js/src/ui/elements/Header.tsx | 21 +- .../clerk-js/src/ui/elements/SuccessPage.tsx | 19 +- .../src/ui/elements/VerificationCodeCard.tsx | 123 ++- .../src/ui/elements/contexts/index.tsx | 6 +- .../clerk-js/src/ui/lazyModules/components.ts | 6 + packages/clerk-js/src/ui/types.ts | 13 +- packages/clerk-js/src/ui/utils/mfa.ts | 32 + packages/localizations/src/en-US.ts | 70 ++ .../src/client-boundary/uiComponents.tsx | 1 + packages/nextjs/src/index.ts | 1 + .../__snapshots__/exports.test.ts.snap | 1 + packages/react/src/components/index.ts | 1 + .../react/src/components/uiComponents.tsx | 29 + packages/react/src/isomorphicClerk.ts | 22 + .../__snapshots__/exports.test.ts.snap | 1 + packages/shared/src/types/appearance.ts | 11 + packages/shared/src/types/clerk.ts | 25 + packages/shared/src/types/localization.ts | 63 ++ packages/shared/src/types/session.ts | 2 +- packages/shared/src/types/userSettings.ts | 3 + .../__snapshots__/exports.test.ts.snap | 1 + 49 files changed, 2954 insertions(+), 191 deletions(-) create mode 100644 .changeset/cold-clowns-fix.md create mode 100644 integration/tests/session-tasks-setup-mfa.test.ts create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SetupMfaStartScreen.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SmsCodeFlowScreen.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/TOTPCodeFlowScreen.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/__tests__/TaskSetupMfa.test.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/constants.ts create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/index.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/shared.tsx create mode 100644 packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/withTaskGuardOnlyOnMount.tsx create mode 100644 packages/clerk-js/src/ui/utils/mfa.ts diff --git a/.changeset/cold-clowns-fix.md b/.changeset/cold-clowns-fix.md new file mode 100644 index 00000000000..98658a7e261 --- /dev/null +++ b/.changeset/cold-clowns-fix.md @@ -0,0 +1,9 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/nextjs': minor +'@clerk/clerk-react': minor +'@clerk/shared': minor +--- + +Introduces MFA setup session task for handling require MFA after sign-in and sign-up diff --git a/integration/presets/envs.ts b/integration/presets/envs.ts index 844b91663d6..0629ca25514 100644 --- a/integration/presets/envs.ts +++ b/integration/presets/envs.ts @@ -157,6 +157,12 @@ const withSessionTasksResetPassword = base .setEnvVariable('private', 'CLERK_SECRET_KEY', instanceKeys.get('with-session-tasks-reset-password').sk) .setEnvVariable('public', 'CLERK_PUBLISHABLE_KEY', instanceKeys.get('with-session-tasks-reset-password').pk); +const withSessionTasksSetupMfa = base + .clone() + .setId('withSessionTasksSetupMfa') + .setEnvVariable('private', 'CLERK_SECRET_KEY', instanceKeys.get('with-session-tasks-setup-mfa').sk) + .setEnvVariable('public', 'CLERK_PUBLISHABLE_KEY', instanceKeys.get('with-session-tasks-setup-mfa').pk); + const withBillingJwtV2 = base .clone() .setId('withBillingJwtV2') @@ -210,6 +216,7 @@ export const envs = { withReverification, withSessionTasks, withSessionTasksResetPassword, + withSessionTasksSetupMfa, withSignInOrUpEmailLinksFlow, withSignInOrUpFlow, withSignInOrUpwithRestrictedModeFlow, diff --git a/integration/presets/longRunningApps.ts b/integration/presets/longRunningApps.ts index a5acc533fc6..f3d9a8739a5 100644 --- a/integration/presets/longRunningApps.ts +++ b/integration/presets/longRunningApps.ts @@ -32,6 +32,7 @@ export const createLongRunningApps = () => { { id: 'next.appRouter.withSignInOrUpEmailLinksFlow', config: next.appRouter, env: envs.withSignInOrUpEmailLinksFlow }, { id: 'next.appRouter.withSessionTasks', config: next.appRouter, env: envs.withSessionTasks }, { id: 'next.appRouter.withSessionTasksResetPassword', config: next.appRouter, env: envs.withSessionTasksResetPassword }, + { id: 'next.appRouter.withSessionTasksSetupMfa', config: next.appRouter, env: envs.withSessionTasksSetupMfa }, { id: 'next.appRouter.withLegalConsent', config: next.appRouter, env: envs.withLegalConsent }, /** diff --git a/integration/tests/session-tasks-setup-mfa.test.ts b/integration/tests/session-tasks-setup-mfa.test.ts new file mode 100644 index 00000000000..1bdb3c1e8f7 --- /dev/null +++ b/integration/tests/session-tasks-setup-mfa.test.ts @@ -0,0 +1,207 @@ +import { expect, test } from '@playwright/test'; + +import { appConfigs } from '../presets'; +import { createTestUtils, testAgainstRunningApps } from '../testUtils'; +import { stringPhoneNumber } from '../testUtils/phoneUtils'; +import { fakerPhoneNumber } from '../testUtils/usersService'; + +testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksSetupMfa] })( + 'session tasks setup-mfa flow @nextjs', + ({ app }) => { + test.describe.configure({ mode: 'parallel' }); + + test.afterAll(async () => { + await app.teardown(); + }); + + test.afterEach(async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + await u.page.signOut(); + await u.page.context().clearCookies(); + }); + + test('setup MFA with new phone number - happy path', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + const user = u.services.users.createFakeUser({ + fictionalEmail: true, + withPassword: true, + }); + await u.services.users.createBapiUser(user); + + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: user.email, password: user.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative('/page-protected'); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + + await u.page.getByRole('button', { name: /sms code/i }).click(); + + const testPhoneNumber = fakerPhoneNumber(); + await u.po.signIn.getPhoneNumberInput().fill(testPhoneNumber); + await u.page.getByRole('button', { name: /continue/i }).click(); + + await u.po.signIn.enterTestOtpCode(); + + await u.page.getByText(/save these backup codes/i).waitFor({ state: 'visible', timeout: 10000 }); + + await u.po.signIn.continue(); + + await u.page.waitForAppUrl('/page-protected'); + await u.po.expect.toBeSignedIn(); + + await user.deleteIfExists(); + }); + + test('setup MFA with existing phone number - happy path', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + const user = u.services.users.createFakeUser({ + fictionalEmail: true, + withPhoneNumber: true, + withPassword: true, + }); + await u.services.users.createBapiUser(user); + + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: user.email, password: user.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative('/page-protected'); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + + await u.page.getByRole('button', { name: /sms code/i }).click(); + + const formattedPhoneNumber = stringPhoneNumber(user.phoneNumber); + await u.page + .getByRole('button', { + name: formattedPhoneNumber, + }) + .click(); + + await u.page.getByText(/save these backup codes/i).waitFor({ state: 'visible', timeout: 10000 }); + + await u.po.signIn.continue(); + + await u.page.waitForAppUrl('/page-protected'); + await u.po.expect.toBeSignedIn(); + + await user.deleteIfExists(); + }); + + test('setup MFA with invalid phone number - error handling', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + const user = u.services.users.createFakeUser({ + fictionalEmail: true, + withPassword: true, + }); + await u.services.users.createBapiUser(user); + + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: user.email, password: user.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative('/page-protected'); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + + await u.page.getByRole('button', { name: /sms code/i }).click(); + + const invalidPhoneNumber = '123091293193091311'; + await u.po.signIn.getPhoneNumberInput().fill(invalidPhoneNumber); + await u.po.signIn.continue(); + // we need to improve this error message + await expect(u.page.getByTestId('form-feedback-error')).toBeVisible(); + + const validPhoneNumber = fakerPhoneNumber(); + await u.po.signIn.getPhoneNumberInput().fill(validPhoneNumber); + await u.po.signIn.continue(); + + await u.po.signIn.enterTestOtpCode(); + + await u.page.getByText(/save these backup codes/i).waitFor({ state: 'visible', timeout: 10000 }); + + await u.po.signIn.continue(); + + await u.page.waitForAppUrl('/page-protected'); + await u.po.expect.toBeSignedIn(); + + await user.deleteIfExists(); + }); + + test('setup MFA with invalid verification code - error handling', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + const user = u.services.users.createFakeUser({ + fictionalEmail: true, + withPassword: true, + }); + await u.services.users.createBapiUser(user); + + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: user.email, password: user.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative('/page-protected'); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + + await u.page.getByRole('button', { name: /sms code/i }).click(); + + const testPhoneNumber = fakerPhoneNumber(); + await u.po.signIn.getPhoneNumberInput().fill(testPhoneNumber); + await u.po.signIn.continue(); + + await u.po.signIn.enterOtpCode('111111', { + awaitPrepare: true, + awaitAttempt: true, + }); + + await expect(u.page.getByTestId('form-feedback-error')).toBeVisible(); + + await user.deleteIfExists(); + }); + + test('can navigate back during MFA setup', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + const user = u.services.users.createFakeUser({ + fictionalEmail: true, + withPhoneNumber: true, + withPassword: true, + }); + await u.services.users.createBapiUser(user); + + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: user.email, password: user.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative('/page-protected'); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + + await u.page.getByRole('button', { name: /sms code/i }).click(); + + const formattedPhoneNumber = stringPhoneNumber(user.phoneNumber); + await u.page + .getByRole('button', { + name: formattedPhoneNumber, + }) + .waitFor({ state: 'visible' }); + + await u.page + .getByRole('button', { name: /cancel/i }) + .first() + .click(); + + await u.page.getByText(/set up two-step verification/i).waitFor({ state: 'visible' }); + await u.page.getByRole('button', { name: /sms code/i }).waitFor({ state: 'visible' }); + + await user.deleteIfExists(); + }); + }, +); diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 9ed455d99ca..8739f42128a 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,6 +1,6 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "928KB" }, + { "path": "./dist/clerk.js", "maxSize": "929KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "67KB" }, diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 620ac91d190..b4bb6b183ff 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -87,6 +87,7 @@ import type { SignUpResource, TaskChooseOrganizationProps, TaskResetPasswordProps, + TaskSetupMFAProps, TasksRedirectOptions, UnsubscribeCallback, UserAvatarProps, @@ -1447,6 +1448,26 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.unmountComponent({ node })); }; + public mountTaskSetupMFA = (node: HTMLDivElement, props?: TaskSetupMFAProps) => { + this.assertComponentsReady(this.#componentControls); + + void this.#componentControls.ensureMounted({ preloadHint: 'TaskSetupMFA' }).then(controls => + controls.mountComponent({ + name: 'TaskSetupMFA', + appearanceKey: 'taskSetupMfa', + node, + props, + }), + ); + + this.telemetry?.record(eventPrebuiltComponentMounted('TaskSetupMFA', props)); + }; + + public unmountTaskSetupMFA = (node: HTMLDivElement) => { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls.ensureMounted().then(controls => controls.unmountComponent({ node })); + }; + /** * `setActive` can be used to set the active session and/or organization. */ diff --git a/packages/clerk-js/src/core/resources/UserSettings.ts b/packages/clerk-js/src/core/resources/UserSettings.ts index ed5951b7037..2c60f7e3445 100644 --- a/packages/clerk-js/src/core/resources/UserSettings.ts +++ b/packages/clerk-js/src/core/resources/UserSettings.ts @@ -127,6 +127,9 @@ export class UserSettings extends BaseResource implements UserSettingsResource { legal_consent_enabled: false, mode: 'public', progressive: true, + mfa: { + required: false, + }, }; social: OAuthProviders = {} as OAuthProviders; usernameSettings: UsernameSettingsData = {} as UsernameSettingsData; diff --git a/packages/clerk-js/src/core/sessionTasks.ts b/packages/clerk-js/src/core/sessionTasks.ts index 7c775022840..effa11659ef 100644 --- a/packages/clerk-js/src/core/sessionTasks.ts +++ b/packages/clerk-js/src/core/sessionTasks.ts @@ -9,6 +9,7 @@ import { buildURL, forwardClerkQueryParams } from '../utils'; export const INTERNAL_SESSION_TASK_ROUTE_BY_KEY: Record = { 'choose-organization': 'choose-organization', 'reset-password': 'reset-password', + 'setup-mfa': 'setup-mfa', } as const; /** diff --git a/packages/clerk-js/src/test/fixture-helpers.ts b/packages/clerk-js/src/test/fixture-helpers.ts index c22a879cb3b..133a63e5e40 100644 --- a/packages/clerk-js/src/test/fixture-helpers.ts +++ b/packages/clerk-js/src/test/fixture-helpers.ts @@ -586,6 +586,10 @@ const createUserSettingsFixtureHelpers = (environment: EnvironmentJSON) => { us.sign_up.mode = SIGN_UP_MODES.WAITLIST; }; + const withMfaRequired = (required: boolean = true) => { + us.sign_up.mfa = { required }; + }; + // TODO: Add the rest, consult pkg/generate/auth_config.go return { @@ -606,5 +610,6 @@ const createUserSettingsFixtureHelpers = (environment: EnvironmentJSON) => { withRestrictedMode, withLegalConsent, withWaitlistMode, + withMfaRequired, }; }; diff --git a/packages/clerk-js/src/test/fixtures.ts b/packages/clerk-js/src/test/fixtures.ts index ada0f9775cd..49df934b769 100644 --- a/packages/clerk-js/src/test/fixtures.ts +++ b/packages/clerk-js/src/test/fixtures.ts @@ -208,6 +208,9 @@ const createBaseUserSettings = (): UserSettingsJSON => { captcha_enabled: false, disable_hibp: false, mode: 'public', + mfa: { + required: false, + }, }, restrictions: { allowlist: { diff --git a/packages/clerk-js/src/ui/common/Wizard.tsx b/packages/clerk-js/src/ui/common/Wizard.tsx index 77bd735452a..aee4cd4d8a4 100644 --- a/packages/clerk-js/src/ui/common/Wizard.tsx +++ b/packages/clerk-js/src/ui/common/Wizard.tsx @@ -4,6 +4,7 @@ import { Animated } from '../elements/Animated'; type WizardProps = React.PropsWithChildren<{ step: number; + animate?: boolean; }>; type UseWizardProps = { @@ -26,7 +27,11 @@ export const useWizard = (params: UseWizardProps = {}) => { }; export const Wizard = (props: WizardProps) => { - const { step, children } = props; + const { step, children, animate = true } = props; + + if (!animate) { + return React.Children.toArray(children)[step]; + } return {React.Children.toArray(children)[step]}; }; diff --git a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx index dc728a60c26..ba27873fcf0 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx @@ -12,11 +12,13 @@ import { SessionTasksContext, TaskChooseOrganizationContext, TaskResetPasswordContext, + TaskSetupMFAContext, useSessionTasksContext, } from '../../contexts/components/SessionTasks'; import { Route, Switch, useRouter } from '../../router'; import { TaskChooseOrganization } from './tasks/TaskChooseOrganization'; import { TaskResetPassword } from './tasks/TaskResetPassword'; +import { TaskSetupMFA } from './tasks/TaskSetupMfa'; const SessionTasksStart = () => { const clerk = useClerk(); @@ -50,6 +52,37 @@ const SessionTasksStart = () => { function SessionTasksRoutes(): JSX.Element { const ctx = useSessionTasksContext(); + const clerk = useClerk(); + const { navigate, currentPath } = useRouter(); + + // If there are no pending tasks, navigate away from the tasks flow. + // This handles cases where a user with an active session returns to the tasks URL, + // for example by using browser back navigation. Since there are no pending tasks, + // we redirect them to their intended destination. + useEffect(() => { + // Tasks can only exist on pending sessions, but we check both conditions + // here to be defensive and ensure proper redirection + const task = clerk.session?.currentTask; + if (!task || clerk.session?.status === 'active') { + if (ctx.redirectOnActiveSession?.current) { + void navigate(ctx.redirectUrlComplete); + } + return; + } + + clerk.telemetry?.record(eventComponentMounted('SessionTask', { task: task.key })); + }, [clerk, currentPath, navigate, ctx.redirectUrlComplete, ctx.redirectOnActiveSession]); + + if (!clerk.session?.currentTask && ctx.redirectOnActiveSession?.current) { + return ( + + ({ flex: 1 })}> + + + + + ); + } return ( @@ -68,6 +101,13 @@ function SessionTasksRoutes(): JSX.Element {
+ + + + + @@ -84,44 +124,9 @@ type SessionTasksProps = { * @internal */ export const SessionTasks = withCardStateProvider(({ redirectUrlComplete }: SessionTasksProps) => { - const clerk = useClerk(); - const { navigate } = useRouter(); - - const currentTaskContainer = useRef(null); - - // If there are no pending tasks, navigate away from the tasks flow. - // This handles cases where a user with an active session returns to the tasks URL, - // for example by using browser back navigation. Since there are no pending tasks, - // we redirect them to their intended destination. - useEffect(() => { - // Tasks can only exist on pending sessions, but we check both conditions - // here to be defensive and ensure proper redirection - const task = clerk.session?.currentTask; - if (!task || clerk.session?.status === 'active') { - void navigate(redirectUrlComplete); - return; - } - - clerk.telemetry?.record(eventComponentMounted('SessionTask', { task: task.key })); - }, [clerk, navigate, redirectUrlComplete]); - - if (!clerk.session?.currentTask) { - return ( - ({ - minHeight: currentTaskContainer ? currentTaskContainer.current?.offsetHeight : undefined, - })} - > - ({ flex: 1 })}> - - - - - ); - } - + const redirectOnActiveSessionRef = useRef(true); return ( - + ); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SetupMfaStartScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SetupMfaStartScreen.tsx new file mode 100644 index 00000000000..b133b027c51 --- /dev/null +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SetupMfaStartScreen.tsx @@ -0,0 +1,109 @@ +import type { VerificationStrategy } from '@clerk/shared/types'; + +import { descriptors, Flex, Icon, type LocalizationKey, localizationKeys, Text } from '@/ui/customizables'; +import { Actions } from '@/ui/elements/Actions'; +import { Card } from '@/ui/elements/Card'; +import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Header } from '@/ui/elements/Header'; +import { PreviewButton } from '@/ui/elements/PreviewButton'; +import { AuthApp, Mobile } from '@/ui/icons'; + +import { MFA_METHODS_TO_STEP } from './constants'; +import { SharedFooterActionForSignOut } from './shared'; + +type SetupMfaStartScreenProps = { + availableMethods: VerificationStrategy[]; + goToStep: (step: number) => void; +}; + +const METHOD_CONFIG: Record<'totp' | 'phone_code', { icon: JSX.Element; label: LocalizationKey }> = { + totp: { + icon: , + label: localizationKeys('taskSetupMfa.start.methodSelection.totp'), + }, + phone_code: { + icon: , + label: localizationKeys('taskSetupMfa.start.methodSelection.phoneCode'), + }, +}; + +export const SetupMfaStartScreen = withCardStateProvider((props: SetupMfaStartScreenProps) => { + const { availableMethods, goToStep } = props; + const card = useCardState(); + + return ( + + ({ padding: t.space.$none })}> + ({ + paddingTop: t.space.$8, + paddingLeft: t.space.$8, + paddingRight: t.space.$8, + })} + > + + + + {card.error && ( + ({ paddingInline: t.space.$8 })}> + {card.error} + + )} + ({ + borderTopWidth: t.borderWidths.$normal, + borderTopStyle: t.borderStyles.$solid, + borderTopColor: t.colors.$borderAlpha100, + })} + > + {availableMethods.map(method => { + const methodConfig = METHOD_CONFIG[method as keyof typeof METHOD_CONFIG] ?? null; + + if (!methodConfig) { + return null; + } + + return ( + { + goToStep(MFA_METHODS_TO_STEP[method as keyof typeof MFA_METHODS_TO_STEP]); + }} + > + ({ gap: t.space.$2, alignItems: 'center' })}> + ({ + borderRadius: t.radii.$circle, + borderWidth: t.borderWidths.$normal, + borderStyle: t.borderStyles.$solid, + borderColor: t.colors.$avatarBorder, + padding: t.space.$2, + backgroundColor: t.colors.$neutralAlpha50, + })} + > + {methodConfig.icon} + + + + + ); + })} + + + + + + + + ); +}); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SmsCodeFlowScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SmsCodeFlowScreen.tsx new file mode 100644 index 00000000000..25c09f08fd4 --- /dev/null +++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/SmsCodeFlowScreen.tsx @@ -0,0 +1,435 @@ +import { useReverification, useUser } from '@clerk/shared/react'; +import type { PhoneNumberResource, UserResource } from '@clerk/shared/types'; +import React, { useMemo, useRef } from 'react'; + +import { useWizard, Wizard } from '@/ui/common'; +import { MfaBackupCodeList } from '@/ui/components/UserProfile/MfaBackupCodeList'; +import { Button, Col, descriptors, Flex, Flow, localizationKeys, Text } from '@/ui/customizables'; +import { Action, Actions } from '@/ui/elements/Actions'; +import { Card } from '@/ui/elements/Card'; +import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Form } from '@/ui/elements/Form'; +import { FormButtonContainer } from '@/ui/elements/FormButtons'; +import { Header } from '@/ui/elements/Header'; +import { PreviewButton } from '@/ui/elements/PreviewButton'; +import { SuccessPage } from '@/ui/elements/SuccessPage'; +import { type VerificationCodeCardProps, VerificationCodeContent } from '@/ui/elements/VerificationCodeCard'; +import { Add } from '@/ui/icons'; +import { handleError } from '@/ui/utils/errorHandler'; +import { getFlagEmojiFromCountryIso, parsePhoneString, stringToFormattedPhoneString } from '@/ui/utils/phoneUtils'; +import { useFormControl } from '@/ui/utils/useFormControl'; + +import { SharedFooterActionForSignOut } from './shared'; + +type MFAVerifyPhoneForSessionTasksProps = { + resourceRef: React.MutableRefObject; + onSuccess: () => void; + onReset: () => void; +}; + +export const getAvailablePhonesFromUser = (user: UserResource | undefined | null) => { + return ( + user?.phoneNumbers.filter(phoneNumber => { + const hasOtherIdentifications = + user?.primaryEmailAddress !== null || + user?.primaryWeb3Wallet !== null || + user?.passkeys.length > 0 || + user?.externalAccounts.length > 0 || + user?.enterpriseAccounts.length > 0 || + user?.username !== null; + + if (phoneNumber.id === user?.primaryPhoneNumber?.id && !hasOtherIdentifications) { + return false; + } + return !phoneNumber.reservedForSecondFactor; + }) || [] + ); +}; + +const MFAVerifyPhoneForSessionTasks = withCardStateProvider((props: MFAVerifyPhoneForSessionTasksProps) => { + const { onSuccess, resourceRef, onReset } = props; + const card = useCardState(); + const phone = resourceRef.current; + const setReservedForSecondFactor = useReverification(() => phone?.setReservedForSecondFactor({ reserved: true })); + + const prepare = () => { + return resourceRef.current?.prepareVerification?.()?.catch(err => handleError(err, [], card.setError)); + }; + + const enableMfa = async () => { + card.setLoading(phone?.id); + try { + const result = await setReservedForSecondFactor(); + resourceRef.current = result; + onSuccess(); + } catch (err) { + handleError(err as Error, [], card.setError); + } finally { + card.setIdle(); + } + }; + + React.useEffect(() => { + void prepare(); + }, []); + + const action: VerificationCodeCardProps['onCodeEntryFinishedAction'] = (code, resolve, reject) => { + void resourceRef.current + ?.attemptVerification({ code: code }) + .then(async () => { + await resolve(); + await enableMfa(); + }) + .catch(reject); + }; + + return ( + + void prepare()} + onIdentityPreviewEditClicked={() => onReset()} + onBackLinkClicked={() => onReset()} + backLinkLabel={localizationKeys('taskSetupMfa.smsCode.cancel')} + /> + + ); +}); + +type AddPhoneForSessionTasksProps = { + resourceRef: React.MutableRefObject; + onSuccess: () => void; + onReset: () => void; +}; + +const AddPhoneForSessionTasks = withCardStateProvider((props: AddPhoneForSessionTasksProps) => { + const { resourceRef, onSuccess, onReset } = props; + const card = useCardState(); + const { user } = useUser(); + const createPhoneNumber = useReverification( + (user: UserResource, opt: Parameters[0]) => user.createPhoneNumber(opt), + ); + + const phoneField = useFormControl('phoneNumber', '', { + type: 'tel', + label: localizationKeys('formFieldLabel__phoneNumber'), + isRequired: true, + }); + + const canSubmit = phoneField.value.length > 1 && user?.username !== phoneField.value; + + const addPhone = async (e: React.FormEvent) => { + e.preventDefault(); + if (!user) { + return; + } + await card.runAsync(async () => { + try { + const res = await createPhoneNumber(user, { phoneNumber: phoneField.value }); + resourceRef.current = res; + onSuccess(); + } catch (e) { + handleError(e as Error, [phoneField], card.setError); + } + }); + }; + + return ( + + + + + + {card.error} + + + + + ({ + flexDirection: 'column', + gap: theme.space.$4, + })} + > + + + + + + ); +}); + +type SuccessScreenProps = { + resourceRef: React.MutableRefObject; + onFinish: () => void; +}; + +const SuccessScreen = withCardStateProvider((props: SuccessScreenProps) => { + const { resourceRef, onFinish } = props; + + return ( + + + } + finishLabel={localizationKeys('taskSetupMfa.smsCode.success.finishButton')} + finishButtonProps={{ + block: true, + hasArrow: true, + }} + /> + + ); +}); + +type PhoneItemProps = { + phone: PhoneNumberResource; + onSuccess: () => void; + onUnverifiedPhoneClick: (phone: PhoneNumberResource) => void; + resourceRef: React.MutableRefObject; +}; + +const PhoneItem = ({ phone, onSuccess, onUnverifiedPhoneClick, resourceRef }: PhoneItemProps) => { + const card = useCardState(); + const setReservedForSecondFactor = useReverification(() => phone.setReservedForSecondFactor({ reserved: true })); + + const { iso } = parsePhoneString(phone.phoneNumber); + const flag = getFlagEmojiFromCountryIso(iso); + const formattedPhone = stringToFormattedPhoneString(phone.phoneNumber); + + const handleSelect = async () => { + if (phone.verification.status !== 'verified') { + return onUnverifiedPhoneClick(phone); + } + + card.setLoading(phone.id); + try { + const result = await setReservedForSecondFactor(); + resourceRef.current = result; + onSuccess(); + } catch (err) { + handleError(err as Error, [], card.setError); + } finally { + card.setIdle(); + } + }; + + return ( + ({ + padding: `${t.space.$4} ${t.space.$6}`, + })} + onClick={() => void handleSelect()} + > + ({ gap: t.space.$4, alignItems: 'center' })}> + ({ fontSize: t.fontSizes.$lg })}>{flag} + {formattedPhone} + + + ); +}; + +type SmsCodeScreenProps = { + onSuccess: () => void; + onReset: () => void; + onAddPhoneClick: () => void; + onUnverifiedPhoneClick: (phone: PhoneNumberResource) => void; + resourceRef: React.MutableRefObject; + availablePhones: PhoneNumberResource[]; +}; + +const SmsCodeScreen = withCardStateProvider((props: SmsCodeScreenProps) => { + const { onSuccess, onReset, onAddPhoneClick, onUnverifiedPhoneClick, resourceRef } = props; + const { user } = useUser(); + const card = useCardState(); + + if (!user) { + return null; + } + + const availablePhones = getAvailablePhonesFromUser(user); + + return ( + + ({ padding: t.space.$none })}> + ({ + paddingTop: t.space.$8, + paddingInline: t.space.$8, + })} + > + + + + {card.error && ( + ({ paddingInline: t.space.$8 })}> + {card.error} + + )} + + ({ + borderTopWidth: t.borderWidths.$normal, + borderTopStyle: t.borderStyles.$solid, + borderTopColor: t.colors.$borderAlpha100, + })} + > + {availablePhones?.map(phone => ( + + ))} + ({ + borderTopWidth: t.borderWidths.$normal, + borderTopStyle: t.borderStyles.$solid, + borderTopColor: t.colors.$borderAlpha100, + padding: `${t.space.$4} ${t.space.$4}`, + gap: t.space.$2, + })} + iconSx={t => ({ + width: t.sizes.$8, + height: t.sizes.$6, + })} + /> + + ({ + borderTopWidth: t.borderWidths.$normal, + borderTopStyle: t.borderStyles.$solid, + borderTopColor: t.colors.$borderAlpha100, + padding: t.space.$4, + })} + > +