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 ? (
+ ({ 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={
- ({ 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={
+ ({ 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,
+ })}
+ >
+
+
+ }
+ >
+
+
+
+
+
+
+ );
+};
diff --git a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
index f302c79941b..c5d7ed6583a 100644
--- a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
+++ b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
@@ -516,13 +516,13 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
'enterpriseConnectionButton',
'enterpriseConnectionButtonText',
- 'web3WalletButtonsRoot',
- 'web3WalletButtons',
- 'web3WalletButtonsIconButton',
- 'web3WalletButtonsBlockButton',
- 'web3WalletButtonsBlockButtonText',
- 'web3WalletButtonsWalletIcon',
- 'web3WalletButtonsWalletInitialIcon',
+ 'web3SolanaWalletButtonsRoot',
+ 'web3SolanaWalletButtons',
+ 'web3SolanaWalletButtonsIconButton',
+ 'web3SolanaWalletButtonsBlockButton',
+ 'web3SolanaWalletButtonsBlockButtonText',
+ 'web3SolanaWalletButtonsWalletIcon',
+ 'web3SolanaWalletButtonsWalletInitialIcon',
'walletIcon',
'walletInitialIcon',
diff --git a/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx
index 4ca1f61e226..ecb0a143fe5 100644
--- a/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx
+++ b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx
@@ -75,7 +75,7 @@ const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsPro
{strategyRows.map((row, rowIndex) => (
({
justifyContent: 'center',
@@ -127,16 +127,16 @@ const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsPro
{row.map(w => {
const shouldShowPreText = installedWallets.length === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD;
const label = shouldShowPreText
- ? localizationKeys('web3WalletButtons.continue', { walletName: w.name })
+ ? localizationKeys('web3SolanaWalletButtons.continue', { walletName: w.name })
: w.name;
const imageOrInitial = w.icon ? (
({ width: theme.sizes.$4, height: 'auto', maxWidth: '100%' })}
/>
) : (
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index ffc17b22900..47cd02a20dd 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -748,8 +748,8 @@ export const arSA: LocalizationResource = {
title: 'نظام التحقق بخطوتين',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'حدد محفظة أدناه لتسجيل الدخول',
+ title: 'تسجيل الدخول باستخدام Solana',
},
},
signInEnterPasswordTitle: 'إدخل كلمة المرور',
@@ -842,8 +842,8 @@ export const arSA: LocalizationResource = {
titleCombined: 'أنشاء حساب جديد',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'حدد محفظة أدناه للتسجيل',
+ title: 'التسجيل باستخدام Solana',
},
},
socialButtonsBlockButton: 'للمتابعة مع {{provider|titleize}}',
@@ -949,8 +949,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,
+ web3_signature_request_rejected: 'لقد رفضت طلب التوقيع. يرجى المحاولة مرة أخرى للمتابعة.',
+ web3_solana_signature_generation_failed: 'حدث خطأ أثناء إنشاء التوقيع. يرجى المحاولة مرة أخرى للمتابعة.',
zxcvbn: {
couldBeStronger: 'كلمة مرورك سليمة من الأفضل ان تكون اقوى. الرجاء أضافة حروف أكثر',
goodPassword: 'كلمة مرورك طابقت جميع المتطلبات الازمة',
@@ -1315,6 +1315,10 @@ export const arSA: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'محافظ Web3',
title: 'محافظ Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'حدد محفظة Solana للاتصال بحسابك.',
+ title: 'إضافة محفظة Solana',
+ },
},
},
usernamePage: {
@@ -1350,9 +1354,10 @@ export const arSA: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'الاتصال باستخدام {{walletName}}',
+ continue: 'المتابعة باستخدام {{walletName}}',
+ noneAvailable:
+ 'لم يتم اكتشاف محافظ Solana Web3. يرجى تثبيت {{ solanaWalletsLink || link("wallet extension") }} مدعوم بـ Web3.',
},
} as const;
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index 734af8b1fc8..bb7b57765ea 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -754,8 +754,8 @@ export const beBY: LocalizationResource = {
title: 'Двухфактарная верыфікацыя',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Выберыце кашалёк ніжэй, каб увайсці',
+ title: 'Увайсці з Solana',
},
},
signInEnterPasswordTitle: undefined,
@@ -850,8 +850,8 @@ export const beBY: LocalizationResource = {
titleCombined: 'Стварыце Ваш акаўнт',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Выберыце кашалёк ніжэй, каб зарэгістравацца',
+ title: 'Зарэгістравацца з Solana',
},
},
socialButtonsBlockButton: 'Працягнуць з дапамогай {{provider|titleize}}',
@@ -959,8 +959,9 @@ export const beBY: LocalizationResource = {
phone_number_exists: 'Гэты нумар тэлефона ўжо заняты. Калі ласка, паспрабуйце іншы.',
session_exists: 'Вы ўжо ўвайшлі.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected: 'Вы адхілілі запыт на подпіс. Калі ласка, паспрабуйце яшчэ раз, каб працягнуць.',
+ web3_solana_signature_generation_failed:
+ 'Адбылася памылка пры стварэнні подпісу. Калі ласка, паспрабуйце яшчэ раз, каб працягнуць.',
zxcvbn: {
couldBeStronger: 'Ваш пароль падыходзіць, але мог бы быць надзейнейшым. Паспрабуйце дадаць больш сімвалаў.',
goodPassword: 'Добрая праца. Гэта выдатны пароль.',
@@ -1333,6 +1334,10 @@ export const beBY: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 кашалькі',
title: 'Web3 кашалькі',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Выберыце кашалёк Solana для падключэння да вашага акаўнта.',
+ title: 'Дадаць кашалёк Solana',
+ },
},
},
usernamePage: {
@@ -1368,9 +1373,10 @@ export const beBY: LocalizationResource = {
title: 'Вы ў чакальным спісе',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Падключыцца з {{walletName}}',
+ continue: 'Працягнуць з {{walletName}}',
+ noneAvailable:
+ 'Кашалькі Solana Web3 не выяўлены. Калі ласка, усталюйце {{ solanaWalletsLink || link("wallet extension") }} з падтрымкай Web3.',
},
} as const;
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index 17e5e80b117..9ef316b5c81 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -751,8 +751,8 @@ export const bgBG: LocalizationResource = {
title: 'Двустепенна верификация',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Изберете портфейл по-долу, за да влезете',
+ title: 'Вход със Solana',
},
},
signInEnterPasswordTitle: 'Въведете вашата парола',
@@ -846,8 +846,8 @@ export const bgBG: LocalizationResource = {
titleCombined: 'Създайте своя акаунт',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Изберете портфейл по-долу, за да се регистрирате',
+ title: 'Регистрация със Solana',
},
},
socialButtonsBlockButton: 'Продължи с {{provider|titleize}}',
@@ -952,8 +952,9 @@ export const bgBG: LocalizationResource = {
phone_number_exists: 'Този телефонен номер е зает. Моля, опитайте с друг.',
session_exists: 'Вече сте влезнали.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected: 'Отхвърлихте заявката за подпис. Моля, опитайте отново, за да продължите.',
+ web3_solana_signature_generation_failed:
+ 'Възникна грешка при генерирането на подписа. Моля, опитайте отново, за да продължите.',
zxcvbn: {
couldBeStronger: 'Вашата парола работи, но може да бъде по-сигурна. Опитайте да добавите повече символи.',
goodPassword: 'Вашата парола отговаря на всички необходими изисквания.',
@@ -1324,6 +1325,10 @@ export const bgBG: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 портфейли',
title: 'Web3 портфейли',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Изберете Solana портфейл, който да свържете с акаунта си.',
+ title: 'Добавяне на Solana портфейл',
+ },
},
},
usernamePage: {
@@ -1359,9 +1364,10 @@ export const bgBG: LocalizationResource = {
title: 'Waitlist successful',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Свързване с {{walletName}}',
+ continue: 'Продължаване с {{walletName}}',
+ noneAvailable:
+ 'Не са открити Solana Web3 портфейли. Моля, инсталирайте {{ solanaWalletsLink || link("wallet extension") }} с поддръжка на Web3.',
},
} as const;
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index 46af11fcc37..e5cbf0a14d8 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -754,8 +754,8 @@ export const bnIN: LocalizationResource = {
title: 'দুই-ধাপ যাচাইকরণ',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'সাইন ইন করতে নিচে একটি ওয়ালেট নির্বাচন করুন',
+ title: 'Solana দিয়ে সাইন ইন করুন',
},
},
signInEnterPasswordTitle: 'আপনার পাসওয়ার্ড লিখুন',
@@ -850,8 +850,8 @@ export const bnIN: LocalizationResource = {
titleCombined: 'আপনার অ্যাকাউন্ট তৈরি করুন',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'সাইন আপ করতে নিচে একটি ওয়ালেট নির্বাচন করুন',
+ title: 'Solana দিয়ে সাইন আপ করুন',
},
},
socialButtonsBlockButton: '{{provider|titleize}} দিয়ে চালিয়ে যান',
@@ -962,8 +962,10 @@ 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,
+ web3_signature_request_rejected:
+ 'আপনি সিগনেচার অনুরোধটি প্রত্যাখ্যান করেছেন। চালিয়ে যেতে অনুগ্রহ করে আবার চেষ্টা করুন।',
+ web3_solana_signature_generation_failed:
+ 'সিগনেচার তৈরি করার সময় একটি ত্রুটি ঘটেছে। চালিয়ে যেতে অনুগ্রহ করে আবার চেষ্টা করুন।',
zxcvbn: {
couldBeStronger: 'আপনার পাসওয়ার্ড কাজ করে, কিন্তু আরও শক্তিশালী হতে পারে। আরও অক্ষর যোগ করার চেষ্টা করুন।',
goodPassword: 'আপনার পাসওয়ার্ড সমস্ত প্রয়োজনীয় শর্ত পূরণ করে।',
@@ -1334,6 +1336,10 @@ export const bnIN: LocalizationResource = {
detailsAction__nonPrimary: 'প্রাথমিক হিসাবে সেট করুন',
primaryButton: 'ওয়ালেট সংযুক্ত করুন',
title: 'Web3 ওয়ালেট',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'আপনার অ্যাকাউন্টের সাথে সংযুক্ত করতে একটি Solana ওয়ালেট নির্বাচন করুন।',
+ title: 'একটি Solana ওয়ালেট যোগ করুন',
+ },
},
},
usernamePage: {
@@ -1369,9 +1375,10 @@ export const bnIN: LocalizationResource = {
title: 'ওয়েটলিস্টে যোগ দেওয়ার জন্য ধন্যবাদ!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} দিয়ে সংযুক্ত করুন',
+ continue: '{{walletName}} দিয়ে চালিয়ে যান',
+ noneAvailable:
+ 'কোনো Solana Web3 ওয়ালেট শনাক্ত হয়নি। অনুগ্রহ করে Web3 সমর্থিত {{ solanaWalletsLink || link("wallet extension") }} ইনস্টল করুন।',
},
} as const;
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index e828a51065c..0691b95a19a 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -751,8 +751,8 @@ export const caES: LocalizationResource = {
title: 'Verificació de dos passos',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una cartera a continuació per iniciar la sessió',
+ title: 'Inicia la sessió amb Solana',
},
},
signInEnterPasswordTitle: 'Introdueix la teva contrasenya',
@@ -845,8 +845,8 @@ export const caES: LocalizationResource = {
titleCombined: 'Crea el teu compte',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una cartera a continuació per registrar-te',
+ title: "Registra't amb Solana",
},
},
socialButtonsBlockButton: 'Continua amb {{provider|titleize}}',
@@ -954,8 +954,9 @@ 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,
+ web3_signature_request_rejected: 'Has rebutjat la sol·licitud de signatura. Torna-ho a provar per continuar.',
+ web3_solana_signature_generation_failed:
+ "S'ha produït un error en generar la signatura. Torna-ho a provar per continuar.",
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.',
@@ -1330,6 +1331,10 @@ export const caES: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Carteres Web3',
title: 'Carteres Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecciona una cartera de Solana per connectar-la al teu compte.',
+ title: 'Afegeix una cartera de Solana',
+ },
},
},
usernamePage: {
@@ -1365,9 +1370,10 @@ export const caES: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Connecta amb {{walletName}}',
+ continue: 'Continua amb {{walletName}}',
+ noneAvailable:
+ 'No s\'han detectat carteres Web3 de Solana. Instal·la una {{ solanaWalletsLink || link("wallet extension") }} compatible amb Web3.',
},
} as const;
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index 055b9aadc0c..ec49dcdde01 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -758,8 +758,8 @@ export const csCZ: LocalizationResource = {
title: 'Dvoufázové ověření',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vyberte níže peněženku pro přihlášení',
+ title: 'Přihlásit se pomocí Solana',
},
},
signInEnterPasswordTitle: 'Zadejte své heslo',
@@ -856,8 +856,8 @@ export const csCZ: LocalizationResource = {
titleCombined: 'Vytvořte si účet',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vyberte níže peněženku pro registraci',
+ title: 'Zaregistrovat se pomocí Solana',
},
},
socialButtonsBlockButton: 'Pokračovat s {{provider|titleize}}',
@@ -964,8 +964,9 @@ 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,
+ web3_signature_request_rejected: 'Odmítli jste žádost o podpis. Chcete-li pokračovat, zkuste to prosím znovu.',
+ web3_solana_signature_generation_failed:
+ 'Při generování podpisu došlo k chybě. Chcete-li pokračovat, zkuste to prosím znovu.',
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.',
@@ -1337,6 +1338,10 @@ export const csCZ: LocalizationResource = {
detailsAction__nonPrimary: 'Nastavit jako primární',
primaryButton: 'Připojit peněženku',
title: 'Web3 peněženky',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Vyberte Solana peněženku, kterou chcete připojit ke svému účtu.',
+ title: 'Přidat Solana peněženku',
+ },
},
},
usernamePage: {
@@ -1372,9 +1377,10 @@ export const csCZ: LocalizationResource = {
title: 'Děkujeme za připojení k čekací listině!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Připojit pomocí {{walletName}}',
+ continue: 'Pokračovat pomocí {{walletName}}',
+ noneAvailable:
+ 'Nebyla zjištěna žádná Solana Web3 peněženka. Nainstalujte si prosím {{ solanaWalletsLink || link("wallet extension") }} s podporou Web3.',
},
} as const;
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index fb7bd5fa591..3d13d35847d 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -749,8 +749,8 @@ export const daDK: LocalizationResource = {
title: 'Totrinsbekræftelse',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vælg en wallet nedenfor for at logge ind',
+ title: 'Log ind med Solana',
},
},
signInEnterPasswordTitle: 'Indtast din adgangskode',
@@ -843,8 +843,8 @@ export const daDK: LocalizationResource = {
titleCombined: 'Opret din konto',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vælg en wallet nedenfor for at tilmelde dig',
+ title: 'Tilmeld dig med Solana',
},
},
socialButtonsBlockButton: 'Forsæt med {{provider|titleize}}',
@@ -950,8 +950,9 @@ 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,
+ web3_signature_request_rejected: 'Du har afvist signaturanmodningen. Prøv igen for at fortsætte.',
+ web3_solana_signature_generation_failed:
+ 'Der opstod en fejl under generering af signaturen. Prøv igen for at fortsætte.',
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.',
@@ -1321,6 +1322,10 @@ export const daDK: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Tilføj Web3 tegnebøger',
title: 'Web3 tegnebøger',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Vælg en Solana-wallet for at forbinde den til din konto.',
+ title: 'Tilføj en Solana-wallet',
+ },
},
},
usernamePage: {
@@ -1356,9 +1361,10 @@ export const daDK: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Forbind med {{walletName}}',
+ continue: 'Fortsæt med {{walletName}}',
+ noneAvailable:
+ 'Ingen Solana Web3-wallets fundet. Installer venligst en Web3-understøttet {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index 031959e4316..a5b4e5915af 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -765,8 +765,8 @@ export const deDE: LocalizationResource = {
title: 'Bestätigung in zwei Schritten',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Wähle unten eine Wallet aus, um dich anzumelden',
+ title: 'Mit Solana anmelden',
},
},
signInEnterPasswordTitle: 'Geben Sie Ihr Passwort ein',
@@ -860,8 +860,8 @@ export const deDE: LocalizationResource = {
titleCombined: 'Erstellen Sie Ihr Konto',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Wähle unten eine Wallet aus, um dich zu registrieren',
+ title: 'Mit Solana registrieren',
},
},
socialButtonsBlockButton: 'Weiter mit {{provider|titleize}}',
@@ -980,8 +980,10 @@ 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,
+ web3_signature_request_rejected:
+ 'Du hast die Signaturanfrage abgelehnt. Bitte versuche es erneut, um fortzufahren.',
+ web3_solana_signature_generation_failed:
+ 'Beim Erstellen der Signatur ist ein Fehler aufgetreten. Bitte versuche es erneut, um fortzufahren.',
zxcvbn: {
couldBeStronger: 'Ihr Passwort funktioniert, könnte aber besser sein. Versuchen Sie, mehr Zeichen hinzuzufügen.',
goodPassword: 'Ihr Passwort erfüllt alle notwendigen Anforderungen.',
@@ -1357,6 +1359,10 @@ export const deDE: LocalizationResource = {
detailsAction__nonPrimary: 'Als primär festlegen',
primaryButton: 'Web3-Wallets',
title: 'Web3-Wallets',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Wähle eine Solana-Wallet aus, um sie mit deinem Konto zu verbinden.',
+ title: 'Solana-Wallet hinzufügen',
+ },
},
},
usernamePage: {
@@ -1393,9 +1399,10 @@ export const deDE: LocalizationResource = {
title: 'Erfolgreich auf die Warteliste gesetzt',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Mit {{walletName}} verbinden',
+ continue: 'Weiter mit {{walletName}}',
+ noneAvailable:
+ 'Keine Solana-Web3-Wallets erkannt. Bitte installiere eine Web3-unterstützte {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index 681ffd69b16..c9520cbb5fe 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -752,8 +752,8 @@ export const elGR: LocalizationResource = {
title: 'Aυθεντικοποίηση δύο βημάτων',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Επιλέξτε ένα πορτοφόλι παρακάτω για να συνδεθείτε',
+ title: 'Σύνδεση με Solana',
},
},
signInEnterPasswordTitle: 'Εισαγωγή κωδικού πρόσβασης',
@@ -847,8 +847,8 @@ export const elGR: LocalizationResource = {
titleCombined: 'Δημιουργήστε τον λογαριασμό σας',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Επιλέξτε ένα πορτοφόλι παρακάτω για να εγγραφείτε',
+ title: 'Εγγραφή με Solana',
},
},
socialButtonsBlockButton: 'Συνέχεια με {{provider|titleize}}',
@@ -956,8 +956,9 @@ export const elGR: LocalizationResource = {
phone_number_exists: 'Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη. Δοκιμάστε έναν άλλο.',
session_exists: 'Έχετε ήδη συνδεθεί.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected: 'Απορρίψατε το αίτημα υπογραφής. Δοκιμάστε ξανά για να συνεχίσετε.',
+ web3_solana_signature_generation_failed:
+ 'Παρουσιάστηκε σφάλμα κατά τη δημιουργία της υπογραφής. Δοκιμάστε ξανά για να συνεχίσετε.',
zxcvbn: {
couldBeStronger:
'Ο κωδικός πρόσβασής σας είναι αρκετός, αλλά θα μπορούσε να είναι πιο ισχυρός. Δοκιμάστε να προσθέσετε περισσότερους χαρακτήρες.',
@@ -1333,6 +1334,10 @@ export const elGR: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Πορτοφόλια Web3',
title: 'Πορτοφόλια Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Επιλέξτε ένα πορτοφόλι Solana για σύνδεση με τον λογαριασμό σας.',
+ title: 'Προσθήκη πορτοφολιού Solana',
+ },
},
},
usernamePage: {
@@ -1368,9 +1373,10 @@ export const elGR: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Σύνδεση με {{walletName}}',
+ continue: 'Συνέχεια με {{walletName}}',
+ noneAvailable:
+ 'Δεν εντοπίστηκαν πορτοφόλια Solana Web3. Εγκαταστήστε ένα {{ solanaWalletsLink || link("wallet extension") }} με υποστήριξη Web3.',
},
} as const;
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index 6e817a811f0..f0c4414ee86 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -751,8 +751,8 @@ export const enGB: LocalizationResource = {
title: 'Two-step verification',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Select a wallet below to sign in',
+ title: 'Sign in with Solana',
},
},
signInEnterPasswordTitle: 'Enter your password',
@@ -847,8 +847,8 @@ export const enGB: LocalizationResource = {
titleCombined: 'Create your account',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Select a wallet below to sign up',
+ title: 'Sign up with Solana',
},
},
socialButtonsBlockButton: 'Continue with {{provider|titleize}}',
@@ -957,8 +957,9 @@ 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,
+ 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.',
@@ -1328,6 +1329,10 @@ export const enGB: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Connect wallet',
title: 'Web3 wallets',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Select a Solana wallet to connect to your account.',
+ title: 'Add a Solana wallet',
+ },
},
},
usernamePage: {
@@ -1363,9 +1368,10 @@ export const enGB: LocalizationResource = {
title: 'Thanks for joining the waitlist!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ 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/en-US.ts b/packages/localizations/src/en-US.ts
index 069a26ca67a..b56df01c941 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -1324,6 +1324,10 @@ export const enUS: LocalizationResource = {
detailsAction__nonPrimary: 'Set as primary',
primaryButton: 'Connect wallet',
title: 'Web3 wallets',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Select a Solana wallet to connect to your account.',
+ title: 'Add a Solana wallet',
+ },
},
},
usernamePage: {
@@ -1359,7 +1363,7 @@ export const enUS: LocalizationResource = {
title: 'Thanks for joining the waitlist!',
},
},
- web3WalletButtons: {
+ web3SolanaWalletButtons: {
connect: 'Connect with {{walletName}}',
continue: 'Continue with {{walletName}}',
noneAvailable:
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index bdc5826cbf9..9afc723c559 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -756,8 +756,8 @@ export const esCR: LocalizationResource = {
title: 'Verificación de dos pasos',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para iniciar sesión',
+ title: 'Iniciar sesión con Solana',
},
},
signInEnterPasswordTitle: 'Ingresa tu contraseña',
@@ -852,8 +852,8 @@ export const esCR: LocalizationResource = {
titleCombined: 'Crea tu cuenta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para registrarte',
+ title: 'Registrarse con Solana',
},
},
socialButtonsBlockButton: 'Continuar con {{provider|titleize}}',
@@ -963,8 +963,9 @@ 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,
+ web3_signature_request_rejected: 'Has rechazado la solicitud de firma. Inténtalo de nuevo para continuar.',
+ web3_solana_signature_generation_failed:
+ 'Se produjo un error al generar la firma. Inténtalo de nuevo para continuar.',
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.',
@@ -1337,6 +1338,10 @@ export const esCR: LocalizationResource = {
detailsAction__nonPrimary: 'Establecer como primaria',
primaryButton: 'Conectar billetera',
title: 'Billeteras Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecciona una billetera de Solana para conectarla a tu cuenta.',
+ title: 'Agregar una billetera de Solana',
+ },
},
},
usernamePage: {
@@ -1372,9 +1377,10 @@ export const esCR: LocalizationResource = {
title: '¡Gracias por unirte a la lista de espera!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar con {{walletName}}',
+ continue: 'Continuar con {{walletName}}',
+ noneAvailable:
+ 'No se detectaron billeteras Web3 de Solana. Instala una {{ solanaWalletsLink || link("wallet extension") }} compatible con Web3.',
},
} as const;
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index 81cc2daebe8..5c7c776ed63 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -751,8 +751,8 @@ export const esES: LocalizationResource = {
title: 'Verificación de dos pasos',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una cartera abajo para iniciar sesión',
+ title: 'Iniciar sesión con Solana',
},
},
signInEnterPasswordTitle: 'Ingresa tu contraseña',
@@ -846,8 +846,8 @@ export const esES: LocalizationResource = {
titleCombined: 'Crea tu cuenta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una cartera abajo para registrarte',
+ title: 'Registrarse con Solana',
},
},
socialButtonsBlockButton: 'Continuar con {{provider|titleize}}',
@@ -957,8 +957,9 @@ 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,
+ web3_signature_request_rejected: 'Has rechazado la solicitud de firma. Inténtalo de nuevo para continuar.',
+ web3_solana_signature_generation_failed:
+ 'Se produjo un error al generar la firma. Inténtalo de nuevo para continuar.',
zxcvbn: {
couldBeStronger: undefined,
goodPassword: undefined,
@@ -1330,6 +1331,10 @@ export const esES: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Agregar cartera Web3',
title: 'Cartera Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecciona una cartera de Solana para conectarla a tu cuenta.',
+ title: 'Añadir una cartera de Solana',
+ },
},
},
usernamePage: {
@@ -1366,9 +1371,10 @@ export const esES: LocalizationResource = {
title: '¡Te has unido a la lista de espera!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar con {{walletName}}',
+ continue: 'Continuar con {{walletName}}',
+ noneAvailable:
+ 'No se detectaron carteras Solana Web3. Instala una {{ solanaWalletsLink || link("wallet extension") }} compatible con Web3.',
},
} as const;
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 29e6fe807c4..6baf269e3f0 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -757,8 +757,8 @@ export const esMX: LocalizationResource = {
title: 'Verificación de dos pasos',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para iniciar sesión',
+ title: 'Iniciar sesión con Solana',
},
},
signInEnterPasswordTitle: 'Ingresa tu contraseña',
@@ -853,8 +853,8 @@ export const esMX: LocalizationResource = {
titleCombined: 'Crea tu cuenta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para registrarte',
+ title: 'Registrarse con Solana',
},
},
socialButtonsBlockButton: 'Continuar con {{provider|titleize}}',
@@ -964,8 +964,9 @@ 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,
+ web3_signature_request_rejected: 'Has rechazado la solicitud de firma. Inténtalo de nuevo para continuar.',
+ web3_solana_signature_generation_failed:
+ 'Se produjo un error al generar la firma. Inténtalo de nuevo para continuar.',
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.',
@@ -1338,6 +1339,10 @@ export const esMX: LocalizationResource = {
detailsAction__nonPrimary: 'Establecer como primaria',
primaryButton: 'Conectar billetera',
title: 'Billeteras Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecciona una billetera de Solana para conectarla a tu cuenta.',
+ title: 'Agregar una billetera de Solana',
+ },
},
},
usernamePage: {
@@ -1373,9 +1378,10 @@ export const esMX: LocalizationResource = {
title: '¡Gracias por unirte a la lista de espera!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar con {{walletName}}',
+ continue: 'Continuar con {{walletName}}',
+ noneAvailable:
+ 'No se detectaron billeteras Web3 de Solana. Instala una {{ solanaWalletsLink || link("wallet extension") }} compatible con Web3.',
},
} as const;
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index afc8d3f8bf1..99ef00a8566 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -754,8 +754,8 @@ export const esUY: LocalizationResource = {
title: 'Verificación en dos pasos',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para iniciar sesión',
+ title: 'Iniciar sesión con Solana',
},
},
signInEnterPasswordTitle: 'Ingresá tu contraseña',
@@ -852,8 +852,8 @@ export const esUY: LocalizationResource = {
titleCombined: 'Creá tu cuenta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecciona una billetera abajo para registrarte',
+ title: 'Registrarse con Solana',
},
},
socialButtonsBlockButton: 'Continuar con {{provider|titleize}}',
@@ -965,8 +965,9 @@ 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,
+ web3_signature_request_rejected: 'Has rechazado la solicitud de firma. Inténtalo de nuevo para continuar.',
+ web3_solana_signature_generation_failed:
+ 'Se produjo un error al generar la firma. Inténtalo de nuevo para continuar.',
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.',
@@ -1337,6 +1338,10 @@ export const esUY: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Conectar cartera',
title: 'Carteras Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecciona una billetera de Solana para conectarla a tu cuenta.',
+ title: 'Agregar una billetera de Solana',
+ },
},
},
usernamePage: {
@@ -1372,9 +1377,10 @@ export const esUY: LocalizationResource = {
title: '¡Gracias por unirte a la lista de espera!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar con {{walletName}}',
+ continue: 'Continuar con {{walletName}}',
+ noneAvailable:
+ 'No se detectaron billeteras Web3 de Solana. Instala una {{ solanaWalletsLink || link("wallet extension") }} compatible con Web3.',
},
} as const;
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index cdc7b5f7f53..4258c7d0665 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -759,8 +759,8 @@ export const faIR: LocalizationResource = {
title: 'تأیید دو مرحلهای',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'برای ورود، یک کیف پول را در زیر انتخاب کنید',
+ title: 'ورود با Solana',
},
},
signInEnterPasswordTitle: 'رمز عبور خود را وارد کنید',
@@ -856,8 +856,8 @@ export const faIR: LocalizationResource = {
titleCombined: 'حساب کاربری خود را ایجاد کنید',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'برای ثبتنام، یک کیف پول را در زیر انتخاب کنید',
+ title: 'ثبتنام با Solana',
},
},
socialButtonsBlockButton: 'ادامه با {{provider|titleize}}',
@@ -962,8 +962,8 @@ export const faIR: LocalizationResource = {
phone_number_exists: 'این شماره تلفن قبلاً استفاده شده است.',
session_exists: 'جلسه از قبل وجود دارد.',
web3_missing_identifier: 'افزونهی کیف پول وب۳ پیدا نشد. برای ادامه، لطفاً یکی نصب کنید.',
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected: 'درخواست امضا را رد کردهاید. برای ادامه دوباره تلاش کنید.',
+ web3_solana_signature_generation_failed: 'هنگام ایجاد امضا خطایی رخ داد. برای ادامه دوباره تلاش کنید.',
zxcvbn: {
couldBeStronger: 'رمز عبور شما کار میکند، اما میتوانست قویتر باشد. سعی کنید کاراکترهای بیشتری اضافه کنید.',
goodPassword: 'رمز عبور شما تمام شرایط لازم را برآورده میکند.',
@@ -1333,6 +1333,10 @@ export const faIR: LocalizationResource = {
detailsAction__nonPrimary: 'به عنوان اصلی تنظیم کنید',
primaryButton: 'اتصال کیف پول',
title: 'کیف پول های Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'یک کیف پول Solana را برای اتصال به حساب خود انتخاب کنید.',
+ title: 'افزودن کیف پول Solana',
+ },
},
},
usernamePage: {
@@ -1368,9 +1372,10 @@ export const faIR: LocalizationResource = {
title: 'ممنون که به لیست انتظار پیوستید!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'اتصال با {{walletName}}',
+ continue: 'ادامه با {{walletName}}',
+ noneAvailable:
+ 'هیچ کیف پول Solana Web3 شناسایی نشد. لطفاً یک {{ solanaWalletsLink || link("wallet extension") }} پشتیبانیشده از Web3 نصب کنید.',
},
} as const;
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 5120484776b..2848a5621ca 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -751,8 +751,8 @@ export const fiFI: LocalizationResource = {
title: 'Kaksivaiheinen todennus',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Valitse alta lompakko kirjautumista varten',
+ title: 'Kirjaudu sisään Solanalla',
},
},
signInEnterPasswordTitle: 'Syötä salasanasi',
@@ -846,8 +846,8 @@ export const fiFI: LocalizationResource = {
titleCombined: 'Luo tili',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Valitse alta lompakko rekisteröitymistä varten',
+ title: 'Rekisteröidy Solanalla',
},
},
socialButtonsBlockButton: 'Jatka palvelun {{provider|titleize}} avulla',
@@ -953,8 +953,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,
+ web3_signature_request_rejected: 'Hylkäsit allekirjoituspyynnön. Yritä uudelleen jatkaaksesi.',
+ web3_solana_signature_generation_failed: 'Allekirjoitusta luotaessa tapahtui virhe. Yritä uudelleen jatkaaksesi.',
zxcvbn: {
couldBeStronger: 'Salasanasi toimii, mutta se voisi olla vahvempi. Kokeile lisätä erikoismerkkejä tai numeroita.',
goodPassword: 'Salasanasi täyttää kaikki tarvittavat vaatimukset.',
@@ -1326,6 +1326,10 @@ export const fiFI: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3-lompakot',
title: 'Web3-lompakot',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Valitse Solana-lompakko yhdistettäväksi tiliisi.',
+ title: 'Lisää Solana-lompakko',
+ },
},
},
usernamePage: {
@@ -1361,9 +1365,10 @@ export const fiFI: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Yhdistä {{walletName}}',
+ continue: 'Jatka {{walletName}}',
+ noneAvailable:
+ 'Solana Web3 -lompakoita ei havaittu. Asenna Web3-yhteensopiva {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index d9a0354f8ca..d275b94a111 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -765,8 +765,8 @@ export const frFR: LocalizationResource = {
title: 'Vérification en deux étapes',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Sélectionnez un portefeuille ci-dessous pour vous connecter',
+ title: 'Se connecter avec Solana',
},
},
signInEnterPasswordTitle: 'Tapez votre mot de passe',
@@ -861,8 +861,8 @@ export const frFR: LocalizationResource = {
titleCombined: 'Créez votre compte',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Sélectionnez un portefeuille ci-dessous pour vous inscrire',
+ title: "S'inscrire avec Solana",
},
},
socialButtonsBlockButton: 'Continuer avec {{provider|titleize}}',
@@ -973,8 +973,9 @@ 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,
+ web3_signature_request_rejected: 'Vous avez refusé la demande de signature. Veuillez réessayer pour continuer.',
+ web3_solana_signature_generation_failed:
+ "Une erreur s'est produite lors de la génération de la signature. Veuillez réessayer pour continuer.",
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.",
@@ -1348,6 +1349,10 @@ export const frFR: LocalizationResource = {
detailsAction__nonPrimary: 'Définir comme principal',
primaryButton: 'Portefeuilles Web3',
title: 'Portefeuilles Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Sélectionnez un portefeuille Solana à connecter à votre compte.',
+ title: 'Ajouter un portefeuille Solana',
+ },
},
},
usernamePage: {
@@ -1383,9 +1388,10 @@ export const frFR: LocalizationResource = {
title: 'Inscription réussie',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Se connecter avec {{walletName}}',
+ continue: 'Continuer avec {{walletName}}',
+ noneAvailable:
+ 'Aucun portefeuille Solana Web3 détecté. Veuillez installer une {{ solanaWalletsLink || link("wallet extension") }} compatible Web3.',
},
} as const;
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index bdedef60375..57de830f564 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -742,8 +742,8 @@ export const heIL: LocalizationResource = {
title: 'אימות שני שלבים',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'בחר/י ארנק למטה כדי להתחבר',
+ title: 'התחברות עם Solana',
},
},
signInEnterPasswordTitle: 'הזן את הסיסמה שלך',
@@ -836,8 +836,8 @@ export const heIL: LocalizationResource = {
titleCombined: 'צור את החשבון שלך',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'בחר/י ארנק למטה כדי להירשם',
+ title: 'הרשמה עם Solana',
},
},
socialButtonsBlockButton: 'המשך עם {{provider|titleize}}',
@@ -941,8 +941,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,
+ web3_signature_request_rejected: 'דחית את בקשת החתימה. נסה/י שוב כדי להמשיך.',
+ web3_solana_signature_generation_failed: 'אירעה שגיאה בעת יצירת החתימה. נסה/י שוב כדי להמשיך.',
zxcvbn: {
couldBeStronger: 'הסיסמה שלך תקפה, אך יכולה להיות חזקה יותר. נסה להוסיף יותר תווים.',
goodPassword: 'עבודה טובה. זו סיסמה מצוינת.',
@@ -1301,6 +1301,10 @@ export const heIL: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'ארנקי Web3',
title: 'ארנקי Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'בחר/י ארנק Solana כדי לחבר לחשבון שלך.',
+ title: 'הוסף/י ארנק Solana',
+ },
},
},
usernamePage: {
@@ -1336,9 +1340,10 @@ export const heIL: LocalizationResource = {
title: 'תודה שהצטרפת לרשימת ההמתנה!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'התחבר/י עם {{walletName}}',
+ continue: 'המשך/י עם {{walletName}}',
+ noneAvailable:
+ 'לא זוהו ארנקי Solana Web3. נא להתקין {{ solanaWalletsLink || link("wallet extension") }} התומך ב‑Web3.',
},
} as const;
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index 8306e00511a..6adb8416635 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -753,8 +753,8 @@ export const hiIN: LocalizationResource = {
title: 'दो-चरण सत्यापन',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'साइन इन करने के लिए नीचे एक वॉलेट चुनें',
+ title: 'Solana के साथ साइन इन करें',
},
},
signInEnterPasswordTitle: 'अपना पासवर्ड दर्ज करें',
@@ -850,8 +850,8 @@ export const hiIN: LocalizationResource = {
titleCombined: 'अपना खाता बनाएं',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'साइन अप करने के लिए नीचे एक वॉलेट चुनें',
+ title: 'Solana के साथ साइन अप करें',
},
},
socialButtonsBlockButton: '{{provider|titleize}} के साथ जारी रखें',
@@ -963,8 +963,10 @@ 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,
+ web3_signature_request_rejected:
+ 'आपने सिग्नेचर अनुरोध अस्वीकार कर दिया है। जारी रखने के लिए कृपया फिर से प्रयास करें।',
+ web3_solana_signature_generation_failed:
+ 'सिग्नेचर बनाते समय एक त्रुटि हुई। जारी रखने के लिए कृपया फिर से प्रयास करें।',
zxcvbn: {
couldBeStronger: 'आपका पासवर्ड काम करता है, लेकिन मजबूत हो सकता है। अधिक अक्षर जोड़ने का प्रयास करें।',
goodPassword: 'आपका पासवर्ड सभी आवश्यक आवश्यकताओं को पूरा करता है।',
@@ -1334,6 +1336,10 @@ export const hiIN: LocalizationResource = {
detailsAction__nonPrimary: 'प्राथमिक के रूप में सेट करें',
primaryButton: 'वॉलेट कनेक्ट करें',
title: 'Web3 वॉलेट',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'अपने खाते से कनेक्ट करने के लिए एक Solana वॉलेट चुनें।',
+ title: 'Solana वॉलेट जोड़ें',
+ },
},
},
usernamePage: {
@@ -1369,9 +1375,10 @@ export const hiIN: LocalizationResource = {
title: 'प्रतीक्षा सूची में शामिल होने के लिए धन्यवाद!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} के साथ कनेक्ट करें',
+ continue: '{{walletName}} के साथ जारी रखें',
+ noneAvailable:
+ 'कोई Solana Web3 वॉलेट नहीं मिला। कृपया Web3 समर्थित {{ solanaWalletsLink || link("wallet extension") }} इंस्टॉल करें।',
},
} as const;
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index 8456a871826..79fc0c2839e 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -751,8 +751,8 @@ export const hrHR: LocalizationResource = {
title: 'Dvostupanjska verifikacija',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Odaberite novčanik u nastavku za prijavu',
+ title: 'Prijava putem Solane',
},
},
signInEnterPasswordTitle: 'Unesite svoju lozinku',
@@ -847,8 +847,8 @@ export const hrHR: LocalizationResource = {
titleCombined: 'Kreirajte svoj račun',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Odaberite novčanik u nastavku za registraciju',
+ title: 'Registracija putem Solane',
},
},
socialButtonsBlockButton: 'Nastavite s {{provider|titleize}}',
@@ -959,8 +959,9 @@ 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,
+ web3_signature_request_rejected: 'Odbili ste zahtjev za potpis. Pokušajte ponovno za nastavak.',
+ web3_solana_signature_generation_failed:
+ 'Došlo je do pogreške pri generiranju potpisa. Pokušajte ponovno za nastavak.',
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.',
@@ -1329,6 +1330,10 @@ export const hrHR: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Poveži novčanik',
title: 'Web3 novčanici',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Odaberite Solana novčanik za povezivanje s vašim računom.',
+ title: 'Dodaj Solana novčanik',
+ },
},
},
usernamePage: {
@@ -1364,9 +1369,10 @@ export const hrHR: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Poveži se s {{walletName}}',
+ continue: 'Nastavi s {{walletName}}',
+ noneAvailable:
+ 'Nisu otkrivene Solana Web3 novčanike. Instalirajte {{ solanaWalletsLink || link("wallet extension") }} s podrškom za Web3.',
},
} as const;
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index d436b117311..54926326584 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -750,8 +750,8 @@ export const huHU: LocalizationResource = {
title: 'Két lépécsős azonosítás',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Válasszon alább egy tárcát a bejelentkezéshez',
+ title: 'Bejelentkezés Solanával',
},
},
signInEnterPasswordTitle: 'Írd be a jelszavad',
@@ -844,8 +844,8 @@ export const huHU: LocalizationResource = {
titleCombined: 'Fiók létrehozása',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Válasszon alább egy tárcát a regisztrációhoz',
+ title: 'Regisztráció Solanával',
},
},
socialButtonsBlockButton: 'Folytatás {{provider|titleize}} segítségével',
@@ -953,8 +953,9 @@ 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,
+ web3_signature_request_rejected: 'Elutasította az aláírási kérelmet. Kérjük, próbálja meg újra a folytatáshoz.',
+ web3_solana_signature_generation_failed:
+ 'Hiba történt az aláírás létrehozása közben. Kérjük, próbálja meg újra a folytatáshoz.',
zxcvbn: {
couldBeStronger: 'A jelszavad, jó, de lehetne erősebb. Adj hozzá több karaktert.',
goodPassword: 'A jelszavad megfelel az elvárásoknak.',
@@ -1326,6 +1327,10 @@ export const huHU: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 tárcák',
title: 'Web3 tárcák',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Válasszon egy Solana tárcát a fiókjához való csatlakozáshoz.',
+ title: 'Solana tárca hozzáadása',
+ },
},
},
usernamePage: {
@@ -1361,9 +1366,10 @@ export const huHU: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Csatlakozás: {{walletName}}',
+ continue: 'Folytatás: {{walletName}}',
+ noneAvailable:
+ 'Nem észlelhető Solana Web3 tárca. Kérjük, telepítsen egy Web3-kompatibilis {{ solanaWalletsLink || link("wallet extension") }}-t.',
},
} as const;
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index eac152700a3..77001ca63fd 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -753,8 +753,8 @@ export const idID: LocalizationResource = {
title: 'Verifikasi dua langkah',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Pilih dompet di bawah untuk masuk',
+ title: 'Masuk dengan Solana',
},
},
signInEnterPasswordTitle: 'Masukkan kata sandi Anda',
@@ -851,8 +851,8 @@ export const idID: LocalizationResource = {
titleCombined: 'Buat akun Anda',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Pilih dompet di bawah untuk mendaftar',
+ title: 'Daftar dengan Solana',
},
},
socialButtonsBlockButton: 'Lanjutkan dengan {{provider|titleize}}',
@@ -961,8 +961,9 @@ 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,
+ web3_signature_request_rejected: 'Anda menolak permintaan tanda tangan. Silakan coba lagi untuk melanjutkan.',
+ web3_solana_signature_generation_failed:
+ 'Terjadi kesalahan saat membuat tanda tangan. Silakan coba lagi untuk melanjutkan.',
zxcvbn: {
couldBeStronger: 'Kata sandi Anda berfungsi, tapi bisa lebih kuat. Coba tambahkan lebih banyak karakter.',
goodPassword: 'Kata sandi Anda memenuhi semua persyaratan yang diperlukan.',
@@ -1322,6 +1323,10 @@ export const idID: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: undefined,
title: undefined,
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Pilih dompet Solana untuk dihubungkan ke akun Anda.',
+ title: 'Tambahkan dompet Solana',
+ },
},
},
usernamePage: {
@@ -1357,9 +1362,10 @@ export const idID: LocalizationResource = {
title: 'Terima kasih telah bergabung dengan daftar tunggu!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Hubungkan dengan {{walletName}}',
+ continue: 'Lanjutkan dengan {{walletName}}',
+ noneAvailable:
+ 'Tidak ada dompet Solana Web3 yang terdeteksi. Silakan instal {{ solanaWalletsLink || link("wallet extension") }} yang mendukung Web3.',
},
} as const;
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index 7c09ea1da76..ecd37bf16fb 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -752,8 +752,8 @@ export const isIS: LocalizationResource = {
title: 'Tveggja þrepa auðkenning',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Veldu veski hér að neðan til að skrá þig inn',
+ title: 'Skrá inn með Solana',
},
},
signInEnterPasswordTitle: 'Sláðu inn lykilorðið þitt',
@@ -847,8 +847,8 @@ export const isIS: LocalizationResource = {
titleCombined: 'Stofna reikning',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Veldu veski hér að neðan til að skrá þig',
+ title: 'Skráðu þig með Solana',
},
},
socialButtonsBlockButton: 'Halda áfram með {{provider|titleize}}',
@@ -956,8 +956,9 @@ 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,
+ web3_signature_request_rejected: 'Þú hafðir hafnað beiðni um undirritun. Reyndu aftur til að halda áfram.',
+ web3_solana_signature_generation_failed:
+ 'Villa kom upp við að búa til undirritun. Reyndu aftur til að halda áfram.',
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.',
@@ -1329,6 +1330,10 @@ export const isIS: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 veski',
title: 'Web3 veski',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Veldu Solana-veski til að tengja við aðganginn þinn.',
+ title: 'Bæta við Solana-veski',
+ },
},
},
usernamePage: {
@@ -1364,9 +1369,10 @@ export const isIS: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Tengjast með {{walletName}}',
+ continue: 'Halda áfram með {{walletName}}',
+ noneAvailable:
+ 'Engin Solana Web3 veski fundust. Vinsamlegast settu upp Web3-stutt {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index 2accdf761a6..ad8cfdc8c17 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -757,8 +757,8 @@ export const itIT: LocalizationResource = {
title: 'Verifica in due passaggi',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Seleziona un wallet qui sotto per accedere',
+ title: 'Accedi con Solana',
},
},
signInEnterPasswordTitle: 'Inserisci la tua password',
@@ -853,8 +853,8 @@ export const itIT: LocalizationResource = {
titleCombined: 'Crea il tuo account',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Seleziona un wallet qui sotto per registrarti',
+ title: 'Registrati con Solana',
},
},
socialButtonsBlockButton: 'Continua con {{provider|titleize}}',
@@ -960,8 +960,9 @@ 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,
+ web3_signature_request_rejected: 'Hai rifiutato la richiesta di firma. Riprova per continuare.',
+ web3_solana_signature_generation_failed:
+ 'Si è verificato un errore durante la generazione della firma. Riprova per continuare.',
zxcvbn: {
couldBeStronger: undefined,
goodPassword: undefined,
@@ -1334,6 +1335,10 @@ export const itIT: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 wallets',
title: 'Web3 wallets',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Seleziona un wallet Solana da collegare al tuo account.',
+ title: 'Aggiungi un wallet Solana',
+ },
},
},
usernamePage: {
@@ -1369,9 +1374,10 @@ export const itIT: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Connetti con {{walletName}}',
+ continue: 'Continua con {{walletName}}',
+ noneAvailable:
+ 'Nessun wallet Solana Web3 rilevato. Installa un {{ solanaWalletsLink || link("wallet extension") }} compatibile con Web3.',
},
} as const;
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index ad78d071164..f8964128335 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -760,8 +760,8 @@ export const jaJP: LocalizationResource = {
title: '二段階認証',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'サインインするには下のウォレットを選択してください',
+ title: 'Solana でサインイン',
},
},
signInEnterPasswordTitle: 'パスワードを入力してください',
@@ -857,8 +857,8 @@ export const jaJP: LocalizationResource = {
titleCombined: 'アカウントを作成',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'サインアップするには下のウォレットを選択してください',
+ title: 'Solana でサインアップ',
},
},
socialButtonsBlockButton: '{{provider|titleize}}で続ける',
@@ -966,8 +966,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,
+ web3_signature_request_rejected: '署名リクエストを拒否しました。続行するにはもう一度お試しください。',
+ web3_solana_signature_generation_failed: '署名の生成中にエラーが発生しました。続行するにはもう一度お試しください。',
zxcvbn: {
couldBeStronger: 'パスワードは有効ですが、もう少し強化できます。文字を追加してみてください。',
goodPassword: 'パスワードはすべての要件を満たしています。',
@@ -1334,6 +1334,10 @@ export const jaJP: LocalizationResource = {
detailsAction__nonPrimary: 'プライマリに設定する',
primaryButton: 'ウォレットを接続',
title: 'Web3ウォレット',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'アカウントに接続する Solana ウォレットを選択してください。',
+ title: 'Solana ウォレットを追加',
+ },
},
},
usernamePage: {
@@ -1369,9 +1373,10 @@ export const jaJP: LocalizationResource = {
title: '待機リストへの参加ありがとうございます!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} で接続',
+ continue: '{{walletName}} で続行',
+ noneAvailable:
+ 'Solana Web3 ウォレットが検出されませんでした。Web3 に対応した {{ solanaWalletsLink || link("wallet extension") }} をインストールしてください。',
},
} as const;
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index f0cf044c371..ddca4b1ef35 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -742,8 +742,8 @@ export const kkKZ: LocalizationResource = {
title: 'Екі қадамды растау',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Кіру үшін төменде әмиянды таңдаңыз',
+ title: 'Solana арқылы кіру',
},
},
signInEnterPasswordTitle: 'Құпия сөзді енгізіңіз',
@@ -837,8 +837,8 @@ export const kkKZ: LocalizationResource = {
titleCombined: 'Есептік жазбаны құру',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Тіркелу үшін төменде әмиянды таңдаңыз',
+ title: 'Solana арқылы тіркелу',
},
},
socialButtonsBlockButton: '{{provider|titleize}} арқылы жалғастыру',
@@ -942,8 +942,9 @@ 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,
+ web3_signature_request_rejected: 'Сіз қолтаңба сұрауын қабылдамадыңыз. Жалғастыру үшін қайтадан көріңіз.',
+ web3_solana_signature_generation_failed:
+ 'Қолтаңбаны жасау кезінде қате орын алды. Жалғастыру үшін қайтадан көріңіз.',
zxcvbn: {
couldBeStronger: 'Құпия сөз әлсіз. Таңбалар санын көбейтіңіз.',
goodPassword: 'Құпия сөз талаптарға сай.',
@@ -1302,6 +1303,10 @@ export const kkKZ: LocalizationResource = {
detailsAction__nonPrimary: 'Негізгі ретінде орнату',
primaryButton: 'Әптәпқалманы қосу',
title: 'Web3 әптәпқалмалары',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Есептік жазбаңызға қосу үшін Solana әмиянын таңдаңыз.',
+ title: 'Solana әмиянын қосу',
+ },
},
},
usernamePage: {
@@ -1337,9 +1342,10 @@ export const kkKZ: LocalizationResource = {
title: 'Күту тізіміне қосылғаныңыз үшін рақмет!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} арқылы қосылу',
+ continue: '{{walletName}} арқылы жалғастыру',
+ noneAvailable:
+ 'Solana Web3 әмияндары табылмады. Web3 қолдайтын {{ solanaWalletsLink || link("wallet extension") }} орнатыңыз.',
},
} as const;
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index 9ded1c68f28..eaf8541a33d 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -744,8 +744,8 @@ export const koKR: LocalizationResource = {
title: '2단계 인증',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '로그인하려면 아래에서 지갑을 선택하세요',
+ title: 'Solana로 로그인',
},
},
signInEnterPasswordTitle: '비밀번호를 입력하세요',
@@ -838,8 +838,8 @@ export const koKR: LocalizationResource = {
titleCombined: '계정 만들기',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '가입하려면 아래에서 지갑을 선택하세요',
+ title: 'Solana로 가입',
},
},
socialButtonsBlockButton: '{{provider|titleize}}로 계속하기',
@@ -945,8 +945,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,
+ web3_signature_request_rejected: '서명 요청을 거부했습니다. 계속하려면 다시 시도해 주세요.',
+ web3_solana_signature_generation_failed: '서명을 생성하는 동안 오류가 발생했습니다. 계속하려면 다시 시도해 주세요.',
zxcvbn: {
couldBeStronger: '비밀번호는 작동하지만 더 강력할 수 있습니다. 문자를 더 추가해 보세요.',
goodPassword: '수고하셨습니다. 훌륭한 비밀번호입니다.',
@@ -1308,6 +1308,10 @@ export const koKR: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 지갑',
title: 'Web3 지갑',
+ web3SelectSolanaWalletScreen: {
+ subtitle: '계정에 연결할 Solana 지갑을 선택하세요.',
+ title: 'Solana 지갑 추가',
+ },
},
},
usernamePage: {
@@ -1343,9 +1347,10 @@ export const koKR: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}}(으)로 연결',
+ continue: '{{walletName}}(으)로 계속',
+ noneAvailable:
+ 'Solana Web3 지갑을 찾을 수 없습니다. Web3를 지원하는 {{ solanaWalletsLink || link("wallet extension") }}을(를) 설치해 주세요.',
},
} as const;
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index f1dc6826445..c48d505669e 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -751,8 +751,8 @@ export const mnMN: LocalizationResource = {
title: 'Two-step баталгаажуулалт',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Нэвтрэхийн тулд доороос түрийвч сонгоно уу',
+ title: 'Solana-аар нэвтрэх',
},
},
signInEnterPasswordTitle: 'Нууц үгээ оруулна уу',
@@ -845,8 +845,8 @@ export const mnMN: LocalizationResource = {
titleCombined: 'Бүртгэл үүсгэх',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Бүртгүүлэхийн тулд доороос түрийвч сонгоно уу',
+ title: 'Solana-аар бүртгүүлэх',
},
},
socialButtonsBlockButton: '{{provider|titleize}}-р үргэлжлүүлэх',
@@ -953,8 +953,10 @@ export const mnMN: LocalizationResource = {
phone_number_exists: 'Энэ утасны дугаарыг авсан. Өөр оролдоно уу.',
session_exists: 'Та аль хэдийн нэвтэрсэн байна.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected:
+ 'Та гарын үсгийн хүсэлтийг цуцалсан байна. Үргэлжлүүлэхийн тулд дахин оролдоно уу.',
+ web3_solana_signature_generation_failed:
+ 'Гарын үсэг үүсгэх үед алдаа гарлаа. Үргэлжлүүлэхийн тулд дахин оролдоно уу.',
zxcvbn: {
couldBeStronger: 'Таны нууц үг ажилладаг, гэхдээ илүү хүчтэй байж болно. Илүү олон тэмдэгт нэмж үзээрэй.',
goodPassword: 'Таны нууц үг шаардлагатай бүх шаардлагыг хангаж байна.',
@@ -1324,6 +1326,10 @@ export const mnMN: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 wallets',
title: 'Web3 wallets',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Өөрийн бүртгэлтэй холбох Solana түрийвч сонгоно уу.',
+ title: 'Solana түрийвч нэмэх',
+ },
},
},
usernamePage: {
@@ -1359,9 +1365,10 @@ export const mnMN: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}}-аар холбох',
+ continue: '{{walletName}}-аар үргэлжлүүлэх',
+ noneAvailable:
+ 'Solana Web3 түрийвч илрээгүй. Web3-ийг дэмждэг {{ solanaWalletsLink || link("wallet extension") }} суулгана уу.',
},
} as const;
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index 13e3c18ad20..de27e227c26 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -755,8 +755,8 @@ export const msMY: LocalizationResource = {
title: 'Pengesahan dua langkah',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Pilih dompet di bawah untuk log masuk',
+ title: 'Log masuk dengan Solana',
},
},
signInEnterPasswordTitle: 'Masukkan kata laluan anda',
@@ -853,8 +853,8 @@ export const msMY: LocalizationResource = {
titleCombined: 'Cipta akaun anda',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Pilih dompet di bawah untuk mendaftar',
+ title: 'Daftar dengan Solana',
},
},
socialButtonsBlockButton: 'Teruskan dengan {{provider|titleize}}',
@@ -968,8 +968,9 @@ 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,
+ web3_signature_request_rejected: 'Anda telah menolak permintaan tandatangan. Sila cuba lagi untuk meneruskan.',
+ web3_solana_signature_generation_failed:
+ 'Ralat berlaku semasa menjana tandatangan. Sila cuba lagi untuk meneruskan.',
zxcvbn: {
couldBeStronger: 'Kata laluan anda berfungsi, tetapi boleh lebih kuat. Cuba tambah lebih banyak aksara.',
goodPassword: 'Kata laluan anda memenuhi semua keperluan yang diperlukan.',
@@ -1342,6 +1343,10 @@ export const msMY: LocalizationResource = {
detailsAction__nonPrimary: 'Tetapkan sebagai utama',
primaryButton: 'Sambung dompet',
title: 'Dompet web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Pilih dompet Solana untuk disambungkan ke akaun anda.',
+ title: 'Tambah dompet Solana',
+ },
},
},
usernamePage: {
@@ -1377,9 +1382,10 @@ export const msMY: LocalizationResource = {
title: 'Terima kasih kerana menyertai senarai menunggu!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Sambung dengan {{walletName}}',
+ continue: 'Teruskan dengan {{walletName}}',
+ noneAvailable:
+ 'Tiada dompet Solana Web3 dikesan. Sila pasang {{ solanaWalletsLink || link("wallet extension") }} yang menyokong Web3.',
},
} as const;
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 41c239013ac..c3e37d4c4eb 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -750,8 +750,8 @@ export const nbNO: LocalizationResource = {
title: 'To-trinns verifisering',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Velg en lommebok nedenfor for å logge inn',
+ title: 'Logg inn med Solana',
},
},
signInEnterPasswordTitle: 'Skriv inn passordet ditt',
@@ -844,8 +844,8 @@ export const nbNO: LocalizationResource = {
titleCombined: 'Opprett kontoen din',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Velg en lommebok nedenfor for å registrere deg',
+ title: 'Registrer deg med Solana',
},
},
socialButtonsBlockButton: 'Fortsett med {{provider|titleize}}',
@@ -952,8 +952,9 @@ 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,
+ web3_signature_request_rejected: 'Du avviste signaturforespørselen. Prøv igjen for å fortsette.',
+ web3_solana_signature_generation_failed:
+ 'Det oppstod en feil under generering av signaturen. Prøv igjen for å fortsette.',
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.',
@@ -1323,6 +1324,10 @@ export const nbNO: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3-lommebøker',
title: 'Web3-lommebøker',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Velg en Solana-lommebok for å koble den til kontoen din.',
+ title: 'Legg til en Solana-lommebok',
+ },
},
},
usernamePage: {
@@ -1358,9 +1363,10 @@ export const nbNO: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Koble til med {{walletName}}',
+ continue: 'Fortsett med {{walletName}}',
+ noneAvailable:
+ 'Ingen Solana Web3-lommebøker ble funnet. Installer en Web3-støttet {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index 0e24ba0af9a..22a5d24dab5 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -750,8 +750,8 @@ export const nlBE: LocalizationResource = {
title: 'Tweestapsverificatie',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecteer hieronder een wallet om in te loggen',
+ title: 'Inloggen met Solana',
},
},
signInEnterPasswordTitle: 'Vul je wachtwoord in',
@@ -845,8 +845,8 @@ export const nlBE: LocalizationResource = {
titleCombined: 'Maak je account aan',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecteer hieronder een wallet om je te registreren',
+ title: 'Registreren met Solana',
},
},
socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}',
@@ -952,8 +952,10 @@ 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,
+ web3_signature_request_rejected:
+ 'Je hebt het handtekeningverzoek afgewezen. Probeer het opnieuw om verder te gaan.',
+ web3_solana_signature_generation_failed:
+ 'Er is een fout opgetreden bij het genereren van de handtekening. Probeer het opnieuw om verder te gaan.',
zxcvbn: {
couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.',
goodPassword: 'Je wachtwoord voldoet aan alle vereisten.',
@@ -1321,6 +1323,10 @@ export const nlBE: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 portefeuilles',
title: 'Web3 portefeuilles',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecteer een Solana-wallet om aan je account te koppelen.',
+ title: 'Solana-wallet toevoegen',
+ },
},
},
usernamePage: {
@@ -1356,9 +1362,10 @@ export const nlBE: LocalizationResource = {
title: 'Succes!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Verbinden met {{walletName}}',
+ continue: 'Doorgaan met {{walletName}}',
+ noneAvailable:
+ 'Geen Solana Web3-wallets gedetecteerd. Installeer een Web3-ondersteunde {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index 273cb71cd1a..508ee6443b7 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -750,8 +750,8 @@ export const nlNL: LocalizationResource = {
title: 'Tweestapsverificatie',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecteer hieronder een wallet om in te loggen',
+ title: 'Inloggen met Solana',
},
},
signInEnterPasswordTitle: 'Vul je wachtwoord in',
@@ -845,8 +845,8 @@ export const nlNL: LocalizationResource = {
titleCombined: 'Maak je account aan',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecteer hieronder een wallet om je te registreren',
+ title: 'Registreren met Solana',
},
},
socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}',
@@ -952,8 +952,10 @@ 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,
+ web3_signature_request_rejected:
+ 'Je hebt het handtekeningverzoek afgewezen. Probeer het opnieuw om verder te gaan.',
+ web3_solana_signature_generation_failed:
+ 'Er is een fout opgetreden bij het genereren van de handtekening. Probeer het opnieuw om verder te gaan.',
zxcvbn: {
couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.',
goodPassword: 'Je wachtwoord voldoet aan alle vereisten.',
@@ -1321,6 +1323,10 @@ export const nlNL: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 portefeuilles',
title: 'Web3 portefeuilles',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecteer een Solana-wallet om aan je account te koppelen.',
+ title: 'Solana-wallet toevoegen',
+ },
},
},
usernamePage: {
@@ -1356,9 +1362,10 @@ export const nlNL: LocalizationResource = {
title: 'Succes!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Verbinden met {{walletName}}',
+ continue: 'Doorgaan met {{walletName}}',
+ noneAvailable:
+ 'Geen Solana Web3-wallets gedetecteerd. Installeer een Web3-ondersteunde {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index 76a7bafda05..71cc2dd7f0b 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -752,8 +752,8 @@ export const plPL: LocalizationResource = {
title: 'Weryfikacja dwustopniowa',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Wybierz poniżej portfel, aby się zalogować',
+ title: 'Zaloguj się przez Solana',
},
},
signInEnterPasswordTitle: 'Wprowadź swoje hasło',
@@ -850,8 +850,8 @@ export const plPL: LocalizationResource = {
titleCombined: 'Utwórz swoje konto',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Wybierz poniżej portfel, aby się zarejestrować',
+ title: 'Zarejestruj się przez Solana',
},
},
socialButtonsBlockButton: 'Kontynuuj z {{provider|titleize}}',
@@ -961,8 +961,9 @@ 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,
+ web3_signature_request_rejected: 'Odrzuciłeś prośbę o podpis. Spróbuj ponownie, aby kontynuować.',
+ web3_solana_signature_generation_failed:
+ 'Wystąpił błąd podczas generowania podpisu. Spróbuj ponownie, aby kontynuować.',
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.',
@@ -1333,6 +1334,10 @@ export const plPL: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Portfele Web3',
title: 'Portfele Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Wybierz portfel Solana, aby połączyć go z kontem.',
+ title: 'Dodaj portfel Solana',
+ },
},
},
usernamePage: {
@@ -1368,9 +1373,10 @@ export const plPL: LocalizationResource = {
title: 'Dziękujemy za dołączenie do listy oczekujących!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Połącz z {{walletName}}',
+ continue: 'Kontynuuj z {{walletName}}',
+ noneAvailable:
+ 'Nie wykryto portfeli Solana Web3. Zainstaluj {{ solanaWalletsLink || link("wallet extension") }} obsługujący Web3.',
},
} as const;
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index 9a43513dbc7..a36057fcf84 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -759,8 +759,8 @@ export const ptBR: LocalizationResource = {
title: 'Verificação em duas etapas',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecione uma carteira abaixo para entrar',
+ title: 'Entrar com Solana',
},
},
signInEnterPasswordTitle: 'Insira sua senha',
@@ -857,8 +857,8 @@ export const ptBR: LocalizationResource = {
titleCombined: 'Criar sua conta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecione uma carteira abaixo para se cadastrar',
+ title: 'Cadastrar-se com Solana',
},
},
socialButtonsBlockButton: 'Continuar com {{provider|titleize}}',
@@ -969,8 +969,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,
+ web3_signature_request_rejected: 'Você rejeitou a solicitação de assinatura. Tente novamente para continuar.',
+ web3_solana_signature_generation_failed: 'Ocorreu um erro ao gerar a assinatura. Tente novamente para continuar.',
zxcvbn: {
couldBeStronger: 'Sua senha funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.',
goodPassword: 'Sua senha atende a todos os requisitos necessários.',
@@ -1343,6 +1343,10 @@ export const ptBR: LocalizationResource = {
detailsAction__nonPrimary: 'Definir como principal',
primaryButton: 'Carteiras Web3',
title: 'Carteiras Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecione uma carteira Solana para conectar à sua conta.',
+ title: 'Adicionar uma carteira Solana',
+ },
},
},
usernamePage: {
@@ -1378,9 +1382,10 @@ export const ptBR: LocalizationResource = {
title: 'Obrigado por entrar na lista de espera!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar com {{walletName}}',
+ continue: 'Continuar com {{walletName}}',
+ noneAvailable:
+ 'Nenhuma carteira Solana Web3 foi detectada. Instale uma {{ solanaWalletsLink || link("wallet extension") }} compatível com Web3.',
},
} as const;
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index 766cde5466d..f283a5c8f25 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -748,8 +748,8 @@ export const ptPT: LocalizationResource = {
title: 'Verificação de duas etapas',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecione uma carteira abaixo para iniciar sessão',
+ title: 'Iniciar sessão com Solana',
},
},
signInEnterPasswordTitle: 'Insira a sua palavra-passe',
@@ -843,8 +843,8 @@ export const ptPT: LocalizationResource = {
titleCombined: 'Criar a sua conta',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selecione uma carteira abaixo para se registar',
+ title: 'Registar-se com Solana',
},
},
socialButtonsBlockButton: 'Continuar com {{provider|titleize}}',
@@ -953,8 +953,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,
+ web3_signature_request_rejected: 'Rejeitou o pedido de assinatura. Tente novamente para continuar.',
+ web3_solana_signature_generation_failed: 'Ocorreu um erro ao gerar a assinatura. Tente novamente para continuar.',
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.',
@@ -1323,6 +1323,10 @@ export const ptPT: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Carteiras Web3',
title: 'Carteiras Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selecione uma carteira Solana para ligar à sua conta.',
+ title: 'Adicionar uma carteira Solana',
+ },
},
},
usernamePage: {
@@ -1358,9 +1362,10 @@ export const ptPT: LocalizationResource = {
title: 'Inscrição bem-sucedida na lista de espera',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectar com {{walletName}}',
+ continue: 'Continuar com {{walletName}}',
+ noneAvailable:
+ 'Não foram detetadas carteiras Solana Web3. Instale uma {{ solanaWalletsLink || link("wallet extension") }} com suporte Web3.',
},
} as const;
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index 0cc29a124c7..72879869659 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -761,8 +761,8 @@ export const roRO: LocalizationResource = {
title: 'Verificare în doi pași',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selectați un portofel mai jos pentru a vă conecta',
+ title: 'Conectare cu Solana',
},
},
signInEnterPasswordTitle: 'Introdu parola',
@@ -858,8 +858,8 @@ export const roRO: LocalizationResource = {
titleCombined: 'Creează-ți contul',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Selectați un portofel mai jos pentru a vă înregistra',
+ title: 'Înregistrare cu Solana',
},
},
socialButtonsBlockButton: 'Continuă cu {{provider|titleize}}',
@@ -970,8 +970,9 @@ 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,
+ web3_signature_request_rejected: 'Ați respins solicitarea de semnătură. Încercați din nou pentru a continua.',
+ web3_solana_signature_generation_failed:
+ 'A apărut o eroare la generarea semnăturii. Încercați din nou pentru a continua.',
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.',
@@ -1340,6 +1341,10 @@ export const roRO: LocalizationResource = {
detailsAction__nonPrimary: 'Setează ca principal',
primaryButton: 'Conectează portofel',
title: 'Portofele Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Selectați un portofel Solana pentru a-l conecta la contul dvs.',
+ title: 'Adăugați un portofel Solana',
+ },
},
},
usernamePage: {
@@ -1375,9 +1380,10 @@ export const roRO: LocalizationResource = {
title: 'Mulțumim pentru înscriere!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Conectează cu {{walletName}}',
+ continue: 'Continuă cu {{walletName}}',
+ noneAvailable:
+ 'Nu s-au detectat portofele Solana Web3. Instalați un {{ solanaWalletsLink || link("wallet extension") }} compatibil cu Web3.',
},
} as const;
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index a968facb8e7..4a688b923b8 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -759,8 +759,8 @@ export const ruRU: LocalizationResource = {
title: 'Двухфакторная верификация',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Выберите кошелёк ниже, чтобы войти',
+ title: 'Войти через Solana',
},
},
signInEnterPasswordTitle: 'Введите Ваш пароль',
@@ -857,8 +857,8 @@ export const ruRU: LocalizationResource = {
titleCombined: 'Создайте Вашу учетную запись',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Выберите кошелёк ниже, чтобы зарегистрироваться',
+ title: 'Зарегистрироваться через Solana',
},
},
socialButtonsBlockButton: 'Продолжить с помощью {{provider|titleize}}',
@@ -969,8 +969,10 @@ export const ruRU: LocalizationResource = {
phone_number_exists: 'Этот номер телефона уже занят. Пожалуйста, попробуйте другой.',
session_exists: 'Вы уже вошли в систему.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected:
+ 'Вы отклонили запрос на подпись. Пожалуйста, попробуйте ещё раз, чтобы продолжить.',
+ web3_solana_signature_generation_failed:
+ 'Произошла ошибка при создании подписи. Пожалуйста, попробуйте ещё раз, чтобы продолжить.',
zxcvbn: {
couldBeStronger: 'Ваш пароль подходит, но мог бы быть надежнее. Попробуйте добавить больше символов.',
goodPassword: 'Хорошая работа. Это отличный пароль.',
@@ -1345,6 +1347,10 @@ export const ruRU: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 кошельки',
title: 'Web3 кошельки',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Выберите кошелёк Solana для подключения к вашему аккаунту.',
+ title: 'Добавить кошелёк Solana',
+ },
},
},
usernamePage: {
@@ -1380,9 +1386,10 @@ export const ruRU: LocalizationResource = {
title: 'Спасибо за присоединение к списку ожидания!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Подключиться через {{walletName}}',
+ continue: 'Продолжить через {{walletName}}',
+ noneAvailable:
+ 'Кошельки Solana Web3 не обнаружены. Установите {{ solanaWalletsLink || link("wallet extension") }} с поддержкой Web3.',
},
} as const;
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index 7df1c60ce41..619486e38d7 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -752,8 +752,8 @@ export const skSK: LocalizationResource = {
title: 'Dvojfaktorové overenie',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vyberte nižšie peňaženku na prihlásenie',
+ title: 'Prihlásiť sa cez Solana',
},
},
signInEnterPasswordTitle: 'Zadajte svoje heslo',
@@ -850,8 +850,8 @@ export const skSK: LocalizationResource = {
titleCombined: 'Vytvorte si účet',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Vyberte nižšie peňaženku na registráciu',
+ title: 'Zaregistrovať sa cez Solana',
},
},
socialButtonsBlockButton: 'Pokračovať s {{provider|titleize}}',
@@ -960,8 +960,9 @@ 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,
+ web3_signature_request_rejected: 'Odmietli ste žiadosť o podpis. Skúste to znova, aby ste mohli pokračovať.',
+ web3_solana_signature_generation_failed:
+ 'Pri generovaní podpisu sa vyskytla chyba. Skúste to znova, aby ste mohli pokračovať.',
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.',
@@ -1330,6 +1331,10 @@ export const skSK: LocalizationResource = {
detailsAction__nonPrimary: 'Nastaiť ako hlavnú',
primaryButton: 'Web3 peňaženky',
title: 'Web3 peňaženky',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Vyberte Solana peňaženku na pripojenie k vášmu účtu.',
+ title: 'Pridať Solana peňaženku',
+ },
},
},
usernamePage: {
@@ -1365,9 +1370,10 @@ export const skSK: LocalizationResource = {
title: 'Ďakujeme, že ste sa pridali na waitlist!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Pripojiť pomocou {{walletName}}',
+ continue: 'Pokračovať pomocou {{walletName}}',
+ noneAvailable:
+ 'Neboli zistené žiadne Solana Web3 peňaženky. Nainštalujte si {{ solanaWalletsLink || link("wallet extension") }} s podporou Web3.',
},
} as const;
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 45a20964aa2..3876a118a13 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -749,8 +749,8 @@ export const srRS: LocalizationResource = {
title: 'Dvostepena verifikacija',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Izaberi novčanik ispod da se prijaviš',
+ title: 'Prijavi se sa Solana',
},
},
signInEnterPasswordTitle: 'Unesi svoju lozinku',
@@ -843,8 +843,8 @@ export const srRS: LocalizationResource = {
titleCombined: 'Kreiraj svoj nalog',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Izaberi novčanik ispod da se registruješ',
+ title: 'Registruj se sa Solana',
},
},
socialButtonsBlockButton: 'Nastavi sa {{provider|titleize}}',
@@ -952,8 +952,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,
+ web3_signature_request_rejected: 'Odbio/la si zahtev za potpis. Pokušaj ponovo da nastaviš.',
+ web3_solana_signature_generation_failed: 'Došlo je do greške pri generisanju potpisa. Pokušaj ponovo da nastaviš.',
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.',
@@ -1322,6 +1322,10 @@ export const srRS: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 novčanici',
title: 'Web3 novčanici',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Izaberi Solana novčanik da ga povežeš sa svojim nalogom.',
+ title: 'Dodaj Solana novčanik',
+ },
},
},
usernamePage: {
@@ -1357,9 +1361,10 @@ export const srRS: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Poveži se sa {{walletName}}',
+ continue: 'Nastavi sa {{walletName}}',
+ noneAvailable:
+ 'Nisu detektovani Solana Web3 novčanici. Instaliraj {{ solanaWalletsLink || link("wallet extension") }} koji podržava Web3.',
},
} as const;
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index 0a033b03a1f..92ec67fd616 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -752,8 +752,8 @@ export const svSE: LocalizationResource = {
title: 'Tvåstegsverifiering',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Välj en plånbok nedan för att logga in',
+ title: 'Logga in med Solana',
},
},
signInEnterPasswordTitle: 'Ange ditt lösenord',
@@ -848,8 +848,8 @@ export const svSE: LocalizationResource = {
titleCombined: 'Skapa ditt konto',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Välj en plånbok nedan för att registrera dig',
+ title: 'Registrera dig med Solana',
},
},
socialButtonsBlockButton: 'Fortsätt med {{provider|titleize}}',
@@ -955,8 +955,9 @@ 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,
+ web3_signature_request_rejected: 'Du avvisade signaturbegäran. Försök igen för att fortsätta.',
+ web3_solana_signature_generation_failed:
+ 'Ett fel uppstod när signaturen skulle genereras. Försök igen för att fortsätta.',
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.',
@@ -1325,6 +1326,10 @@ export const svSE: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 plånböcker',
title: 'Web3 plånböcker',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Välj en Solana-plånbok för att ansluta den till ditt konto.',
+ title: 'Lägg till en Solana-plånbok',
+ },
},
},
usernamePage: {
@@ -1360,9 +1365,10 @@ export const svSE: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Anslut med {{walletName}}',
+ continue: 'Fortsätt med {{walletName}}',
+ noneAvailable:
+ 'Inga Solana Web3-plånböcker upptäcktes. Installera en Web3-stödd {{ solanaWalletsLink || link("wallet extension") }}.',
},
} as const;
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index 1875a367553..b3b71f7db63 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -755,8 +755,8 @@ export const taIN: LocalizationResource = {
title: 'இரண்டு-படி சரிபார்ப்பு',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'உள்நுழைய கீழே ஒரு வாலெட்டைத் தேர்ந்தெடுக்கவும்',
+ title: 'Solana மூலம் உள்நுழையவும்',
},
},
signInEnterPasswordTitle: 'உங்கள் கடவுச்சொல்லை உள்ளிடவும்',
@@ -852,8 +852,8 @@ export const taIN: LocalizationResource = {
titleCombined: 'உங்கள் கணக்கை உருவாக்கவும்',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'பதிவு செய்ய கீழே ஒரு வாலெட்டைத் தேர்ந்தெடுக்கவும்',
+ title: 'Solana மூலம் பதிவு செய்யவும்',
},
},
socialButtonsBlockButton: '{{provider|titleize}} மூலம் தொடரவும்',
@@ -967,8 +967,9 @@ 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,
+ web3_signature_request_rejected: 'நீங்கள் கையொப்ப கோரிக்கையை நிராகரித்துவிட்டீர்கள். தொடர மீண்டும் முயற்சிக்கவும்.',
+ web3_solana_signature_generation_failed:
+ 'கையொப்பத்தை உருவாக்கும் போது பிழை ஏற்பட்டது. தொடர மீண்டும் முயற்சிக்கவும்.',
zxcvbn: {
couldBeStronger:
'உங்கள் கடவுச்சொல் செயல்படுகிறது, ஆனால் மேலும் வலுவாக இருக்கலாம். மேலும் எழுத்துகளைச் சேர்க்க முயற்சிக்கவும்.',
@@ -1340,6 +1341,10 @@ export const taIN: LocalizationResource = {
detailsAction__nonPrimary: 'முதன்மையாக அமைக்கவும்',
primaryButton: 'வாலட்டை இணைக்கவும்',
title: 'Web3 வாலட்டுகள்',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'உங்கள் கணக்குடன் இணைக்க Solana வாலெட்டைத் தேர்ந்தெடுக்கவும்.',
+ title: 'Solana வாலெட்டை சேர்க்கவும்',
+ },
},
},
usernamePage: {
@@ -1375,9 +1380,10 @@ export const taIN: LocalizationResource = {
title: 'காத்திருப்பில் சேர்ந்ததற்கு நன்றி!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} மூலம் இணைக்கவும்',
+ continue: '{{walletName}} மூலம் தொடரவும்',
+ noneAvailable:
+ 'Solana Web3 வாலெட்டுகள் எதுவும் கண்டறியப்படவில்லை. Web3 ஆதரிக்கும் {{ solanaWalletsLink || link("wallet extension") }} ஐ நிறுவவும்.',
},
} as const;
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index 82710f7f1c0..6583d783572 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -755,8 +755,8 @@ export const teIN: LocalizationResource = {
title: 'రెండు-దశల ధృవీకరణ',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'సైన్ ఇన్ చేయడానికి క్రింద వాలెట్ను ఎంచుకోండి',
+ title: 'Solana తో సైన్ ఇన్ చేయండి',
},
},
signInEnterPasswordTitle: 'మీ పాస్వర్డ్ను నమోదు చేయండి',
@@ -852,8 +852,8 @@ export const teIN: LocalizationResource = {
titleCombined: 'మీ ఖాతాను సృష్టించండి',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'సైన్ అప్ చేయడానికి క్రింద వాలెట్ను ఎంచుకోండి',
+ title: 'Solana తో సైన్ అప్ చేయండి',
},
},
socialButtonsBlockButton: '{{provider|titleize}}తో కొనసాగించండి',
@@ -963,8 +963,9 @@ 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,
+ web3_signature_request_rejected: 'మీరు సంతకం అభ్యర్థనను తిరస్కరించారు. కొనసాగేందుకు దయచేసి మళ్లీ ప్రయత్నించండి.',
+ web3_solana_signature_generation_failed:
+ 'సంతకం తయారు చేసే సమయంలో లోపం జరిగింది. కొనసాగేందుకు దయచేసి మళ్లీ ప్రయత్నించండి.',
zxcvbn: {
couldBeStronger:
'మీ పాస్వర్డ్ పనిచేస్తుంది, కానీ మరింత బలంగా ఉండవచ్చు. మరిన్ని అక్షరాలను జోడించడానికి ప్రయత్నించండి.',
@@ -1336,6 +1337,10 @@ export const teIN: LocalizationResource = {
detailsAction__nonPrimary: 'ప్రాథమికంగా సెట్ చేయండి',
primaryButton: 'వాలెట్ను కనెక్ట్ చేయండి',
title: 'Web3 వాలెట్లు',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'మీ ఖాతాతో కనెక్ట్ చేయడానికి Solana వాలెట్ను ఎంచుకోండి.',
+ title: 'Solana వాలెట్ను జోడించండి',
+ },
},
},
usernamePage: {
@@ -1371,9 +1376,10 @@ export const teIN: LocalizationResource = {
title: 'వెయిట్లిస్ట్లో చేరినందుకు ధన్యవాదాలు!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} తో కనెక్ట్ అవ్వండి',
+ continue: '{{walletName}} తో కొనసాగించండి',
+ noneAvailable:
+ 'Solana Web3 వాలెట్లు ఏవీ గుర్తించబడలేదు. Web3 కి మద్దతు ఉన్న {{ solanaWalletsLink || link("wallet extension") }} ను ఇన్స్టాల్ చేయండి.',
},
} as const;
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index b3d5de3ea16..2db58cbf7e8 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -751,8 +751,8 @@ export const thTH: LocalizationResource = {
title: 'การยืนยันตัวตนสองขั้นตอน',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'เลือกกระเป๋าเงินด้านล่างเพื่อเข้าสู่ระบบ',
+ title: 'เข้าสู่ระบบด้วย Solana',
},
},
signInEnterPasswordTitle: 'ใส่รหัสผ่านของคุณ',
@@ -846,8 +846,8 @@ export const thTH: LocalizationResource = {
titleCombined: 'สร้างบัญชีของคุณ',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'เลือกกระเป๋าเงินด้านล่างเพื่อสมัครใช้งาน',
+ title: 'สมัครใช้งานด้วย Solana',
},
},
socialButtonsBlockButton: 'ดำเนินการต่อด้วย {{provider|titleize}}',
@@ -951,8 +951,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,
+ web3_signature_request_rejected: 'คุณได้ปฏิเสธคำขอการลงลายเซ็น โปรดลองอีกครั้งเพื่อดำเนินการต่อ',
+ web3_solana_signature_generation_failed: 'เกิดข้อผิดพลาดขณะสร้างลายเซ็น โปรดลองอีกครั้งเพื่อดำเนินการต่อ',
zxcvbn: {
couldBeStronger: 'รหัสผ่านของคุณใช้ได้ แต่อาจแข็งแกร่งกว่านี้ ลองเพิ่มตัวอักษรเพิ่มเติม',
goodPassword: 'รหัสผ่านของคุณตรงตามข้อกำหนดที่จำเป็นทั้งหมด',
@@ -1316,6 +1316,10 @@ export const thTH: LocalizationResource = {
detailsAction__nonPrimary: 'ตั้งเป็นหลัก',
primaryButton: 'เชื่อมต่อวอลเล็ต',
title: 'วอลเล็ต Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'เลือกกระเป๋าเงิน Solana เพื่อเชื่อมต่อกับบัญชีของคุณ',
+ title: 'เพิ่มกระเป๋าเงิน Solana',
+ },
},
},
usernamePage: {
@@ -1351,9 +1355,10 @@ export const thTH: LocalizationResource = {
title: 'ขอบคุณที่เข้าร่วม Waitlist!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'เชื่อมต่อด้วย {{walletName}}',
+ continue: 'ดำเนินการต่อด้วย {{walletName}}',
+ noneAvailable:
+ 'ไม่พบกระเป๋าเงิน Solana Web3 โปรดติดตั้ง {{ solanaWalletsLink || link("wallet extension") }} ที่รองรับ Web3',
},
} as const;
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index 5c20b0c5993..19d0c28b9c8 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -751,8 +751,8 @@ export const trTR: LocalizationResource = {
title: 'İki aşamalı doğrulama',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Giriş yapmak için aşağıdan bir cüzdan seçin',
+ title: 'Solana ile giriş yap',
},
},
signInEnterPasswordTitle: 'Şifrenizi girin',
@@ -846,8 +846,8 @@ export const trTR: LocalizationResource = {
titleCombined: 'Hesap oluştur',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Kaydolmak için aşağıdan bir cüzdan seçin',
+ title: 'Solana ile kaydol',
},
},
socialButtonsBlockButton: '{{provider|titleize}} ile giriş yapın',
@@ -956,8 +956,9 @@ 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,
+ web3_signature_request_rejected: 'İmza isteğini reddettiniz. Devam etmek için lütfen tekrar deneyin.',
+ web3_solana_signature_generation_failed:
+ 'İmza oluşturulurken bir hata oluştu. Devam etmek için lütfen tekrar deneyin.',
zxcvbn: {
couldBeStronger:
'Şifreniz kriterleri karşılıyor; fakat birkaç karakter daha ekleyerek daha güçlü bir şifre oluşturabilirsiniz.',
@@ -1327,6 +1328,10 @@ export const trTR: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 cüzdanları',
title: 'Web3 cüzdanları',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Hesabınıza bağlamak için bir Solana cüzdanı seçin.',
+ title: 'Bir Solana cüzdanı ekle',
+ },
},
},
usernamePage: {
@@ -1362,9 +1367,10 @@ export const trTR: LocalizationResource = {
title: 'Bekleme Listesine Katıldınız',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '{{walletName}} ile bağlan',
+ continue: '{{walletName}} ile devam et',
+ noneAvailable:
+ 'Solana Web3 cüzdanı tespit edilmedi. Lütfen Web3 destekli {{ solanaWalletsLink || link("wallet extension") }} kurun.',
},
} as const;
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 77c697a527a..5eaefd3199d 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -748,8 +748,8 @@ export const ukUA: LocalizationResource = {
title: 'Двоетапна перевірка',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Виберіть гаманець нижче, щоб увійти',
+ title: 'Увійти через Solana',
},
},
signInEnterPasswordTitle: 'Введіть Ваш пароль',
@@ -842,8 +842,8 @@ export const ukUA: LocalizationResource = {
titleCombined: 'Створіть Ваш акаунт',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Виберіть гаманець нижче, щоб зареєструватися',
+ title: 'Зареєструватися через Solana',
},
},
socialButtonsBlockButton: 'Продовжити за допомогою {{provider|titleize}}',
@@ -950,8 +950,9 @@ export const ukUA: LocalizationResource = {
phone_number_exists: 'Цей номер телефону вже використовується. Спробуйте інший.',
session_exists: 'Ви вже увійшли в систему.',
web3_missing_identifier: undefined,
- web3_signature_request_rejected: undefined,
- web3_solana_signature_generation_failed: undefined,
+ web3_signature_request_rejected: 'Ви відхилили запит на підпис. Будь ласка, спробуйте ще раз, щоб продовжити.',
+ web3_solana_signature_generation_failed:
+ 'Під час створення підпису сталася помилка. Будь ласка, спробуйте ще раз, щоб продовжити.',
zxcvbn: {
couldBeStronger: 'Ваш пароль підходить, але міг би бути надійнішим. Спробуйте додати більше символів.',
goodPassword: 'Хороша робота. Це відмінний пароль.',
@@ -1321,6 +1322,10 @@ export const ukUA: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 гаманці',
title: 'Web3 гаманці',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Виберіть гаманець Solana, щоб підключити його до свого облікового запису.',
+ title: 'Додати гаманець Solana',
+ },
},
},
usernamePage: {
@@ -1356,9 +1361,10 @@ export const ukUA: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Підключитися через {{walletName}}',
+ continue: 'Продовжити через {{walletName}}',
+ noneAvailable:
+ 'Гаманці Solana Web3 не виявлено. Установіть {{ solanaWalletsLink || link("wallet extension") }} з підтримкою Web3.',
},
} as const;
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index b0da0a9dc37..732a2e815fc 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -757,8 +757,8 @@ export const viVN: LocalizationResource = {
title: 'Xác thực hai bước',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Chọn ví bên dưới để đăng nhập',
+ title: 'Đăng nhập với Solana',
},
},
signInEnterPasswordTitle: 'Nhập mật khẩu',
@@ -853,8 +853,8 @@ export const viVN: LocalizationResource = {
titleCombined: 'Tạo tài khoản của bạn',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: 'Chọn ví bên dưới để đăng ký',
+ title: 'Đăng ký với Solana',
},
},
socialButtonsBlockButton: 'Tiếp tục với {{provider|titleize}}',
@@ -959,8 +959,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,
+ web3_signature_request_rejected: 'Bạn đã từ chối yêu cầu ký. Vui lòng thử lại để tiếp tục.',
+ web3_solana_signature_generation_failed: 'Đã xảy ra lỗi khi tạo chữ ký. Vui lòng thử lại để tiếp tục.',
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.',
@@ -1332,6 +1332,10 @@ export const viVN: LocalizationResource = {
detailsAction__nonPrimary: 'Đặt làm chính',
primaryButton: 'Kết nối ví',
title: 'Ví Web3',
+ web3SelectSolanaWalletScreen: {
+ subtitle: 'Chọn một ví Solana để kết nối với tài khoản của bạn.',
+ title: 'Thêm ví Solana',
+ },
},
},
usernamePage: {
@@ -1367,9 +1371,10 @@ export const viVN: LocalizationResource = {
title: 'Cảm ơn bạn đã tham gia danh sách chờ!',
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: 'Kết nối với {{walletName}}',
+ continue: 'Tiếp tục với {{walletName}}',
+ noneAvailable:
+ 'Không phát hiện ví Solana Web3 nào. Vui lòng cài đặt {{ solanaWalletsLink || link("wallet extension") }} hỗ trợ Web3.',
},
} as const;
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 84c3abf358e..0c70c85c79c 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -738,8 +738,8 @@ export const zhCN: LocalizationResource = {
title: '两步验证',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '请选择下方的钱包进行登录',
+ title: '使用 Solana 登录',
},
},
signInEnterPasswordTitle: '输入您的密码',
@@ -832,8 +832,8 @@ export const zhCN: LocalizationResource = {
titleCombined: '创建您的账户',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '请选择下方的钱包进行注册',
+ title: '使用 Solana 注册',
},
},
socialButtonsBlockButton: '使用 {{provider|titleize}} 登录',
@@ -934,8 +934,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,
+ web3_signature_request_rejected: '您已拒绝签名请求。请重试以继续。',
+ web3_solana_signature_generation_failed: '生成签名时发生错误。请重试以继续。',
zxcvbn: {
couldBeStronger: '您的密码可以用,但可以更强。试着添加更多字符。',
goodPassword: '做得好。这是一个优秀的密码。',
@@ -1290,6 +1290,10 @@ export const zhCN: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: 'Web3 钱包',
title: 'Web3 钱包',
+ web3SelectSolanaWalletScreen: {
+ subtitle: '选择一个 Solana 钱包以连接到您的账户。',
+ title: '添加 Solana 钱包',
+ },
},
},
usernamePage: {
@@ -1325,9 +1329,10 @@ export const zhCN: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '使用 {{walletName}} 连接',
+ continue: '使用 {{walletName}} 继续',
+ noneAvailable:
+ '未检测到 Solana Web3 钱包。请安装支持 Web3 的 {{ solanaWalletsLink || link("wallet extension") }}。',
},
} as const;
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index 96328ff3d36..af69a01b98a 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -738,8 +738,8 @@ export const zhTW: LocalizationResource = {
title: '兩步驟驗證',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '請選擇下方錢包以登入',
+ title: '使用 Solana 登入',
},
},
signInEnterPasswordTitle: '輸入您的密碼',
@@ -833,8 +833,8 @@ export const zhTW: LocalizationResource = {
titleCombined: '建立您的帳戶',
},
web3Solana: {
- subtitle: undefined,
- title: undefined,
+ subtitle: '請選擇下方錢包以註冊',
+ title: '使用 Solana 註冊',
},
},
socialButtonsBlockButton: '以 {{provider|titleize}} 帳戶登入',
@@ -934,8 +934,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,
+ web3_signature_request_rejected: '您已拒絕簽名請求。請再試一次以繼續。',
+ web3_solana_signature_generation_failed: '產生簽名時發生錯誤。請再試一次以繼續。',
zxcvbn: {
couldBeStronger: '您的密碼強度尚可,但可以更安全。請嘗試增加長度或複雜度。',
goodPassword: '密碼強度良好。',
@@ -1288,6 +1288,10 @@ export const zhTW: LocalizationResource = {
detailsAction__nonPrimary: undefined,
primaryButton: '新增 Web3 錢包',
title: 'Web3 錢包',
+ web3SelectSolanaWalletScreen: {
+ subtitle: '選擇一個 Solana 錢包以連線到您的帳戶。',
+ title: '新增 Solana 錢包',
+ },
},
},
usernamePage: {
@@ -1323,9 +1327,10 @@ export const zhTW: LocalizationResource = {
title: undefined,
},
},
- web3WalletButtons: {
- connect: undefined,
- continue: undefined,
- noneAvailable: undefined,
+ web3SolanaWalletButtons: {
+ connect: '使用 {{walletName}} 連線',
+ continue: '使用 {{walletName}} 繼續',
+ noneAvailable:
+ '未偵測到 Solana Web3 錢包。請安裝支援 Web3 的 {{ solanaWalletsLink || link("wallet extension") }}。',
},
} as const;
diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts
index 739ecd36fe7..19598760418 100644
--- a/packages/shared/src/types/appearance.ts
+++ b/packages/shared/src/types/appearance.ts
@@ -651,13 +651,13 @@ export type ElementsConfig = {
enterpriseConnectionButton: WithOptions;
enterpriseConnectionButtonText: WithOptions;
- web3WalletButtonsRoot: WithOptions;
- web3WalletButtons: WithOptions;
- web3WalletButtonsIconButton: WithOptions;
- web3WalletButtonsBlockButton: WithOptions;
- web3WalletButtonsBlockButtonText: WithOptions;
- web3WalletButtonsWalletIcon: WithOptions;
- web3WalletButtonsWalletInitialIcon: WithOptions;
+ web3SolanaWalletButtonsRoot: WithOptions;
+ web3SolanaWalletButtons: WithOptions;
+ web3SolanaWalletButtonsIconButton: WithOptions;
+ web3SolanaWalletButtonsBlockButton: WithOptions;
+ web3SolanaWalletButtonsBlockButtonText: WithOptions;
+ web3SolanaWalletButtonsWalletIcon: WithOptions;
+ web3SolanaWalletButtonsWalletInitialIcon: WithOptions;
walletIcon: WithOptions;
walletInitialIcon: WithOptions;
diff --git a/packages/shared/src/types/elementIds.ts b/packages/shared/src/types/elementIds.ts
index 8ba40eb431c..77f71404daa 100644
--- a/packages/shared/src/types/elementIds.ts
+++ b/packages/shared/src/types/elementIds.ts
@@ -25,7 +25,8 @@ export type FieldId =
| 'apiKeyDescription'
| 'apiKeyExpirationDate'
| 'apiKeyRevokeConfirmation'
- | 'apiKeySecret';
+ | 'apiKeySecret'
+ | 'web3WalletName';
export type ProfileSectionId =
| 'profile'
| 'username'
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index 3e8cefd8959..7458fee5ad1 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -718,6 +718,10 @@ export type __internal_LocalizationResource = {
primaryButton: LocalizationValue;
destructiveAction: LocalizationValue;
detailsAction__nonPrimary: LocalizationValue;
+ web3SelectSolanaWalletScreen: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ };
};
dangerSection: {
title: LocalizationValue;
@@ -1309,7 +1313,7 @@ export type __internal_LocalizationResource = {
};
formButtonPrimary: LocalizationValue;
};
- web3WalletButtons: {
+ web3SolanaWalletButtons: {
connect: LocalizationValue<'walletName'>;
continue: LocalizationValue<'walletName'>;
noneAvailable: LocalizationValue<'solanaWalletsLink'>;
From f1885e0b5f32ea7ade66a32c206cf631cd4b82ca Mon Sep 17 00:00:00 2001
From: Robert Soriano
Date: Fri, 12 Dec 2025 11:21:47 -0800
Subject: [PATCH 014/123] fix(nextjs): Comply with Server Actions async
requirement (#7445)
---
.changeset/pretty-crabs-scream.md | 5 +++++
.../__tests__/keyless-custom-headers.test.ts | 18 +++++++++---------
.../src/server/keyless-custom-headers.ts | 4 ++--
3 files changed, 16 insertions(+), 11 deletions(-)
create mode 100644 .changeset/pretty-crabs-scream.md
diff --git a/.changeset/pretty-crabs-scream.md b/.changeset/pretty-crabs-scream.md
new file mode 100644
index 00000000000..530fa380c76
--- /dev/null
+++ b/.changeset/pretty-crabs-scream.md
@@ -0,0 +1,5 @@
+---
+"@clerk/nextjs": patch
+---
+
+Mark internal keyless header function async to comply with Server Actions async requirements
diff --git a/packages/nextjs/src/__tests__/keyless-custom-headers.test.ts b/packages/nextjs/src/__tests__/keyless-custom-headers.test.ts
index 48cc8cb896e..7be75419d7a 100644
--- a/packages/nextjs/src/__tests__/keyless-custom-headers.test.ts
+++ b/packages/nextjs/src/__tests__/keyless-custom-headers.test.ts
@@ -166,7 +166,7 @@ describe('keyless-custom-headers', () => {
});
describe('formatMetadataHeaders', () => {
- it('should format complete metadata object with all fields present', () => {
+ it('should format complete metadata object with all fields present', async () => {
const metadata = {
nodeVersion: 'v18.17.0',
nextVersion: 'next-server (v15.4.5)',
@@ -181,7 +181,7 @@ describe('keyless-custom-headers', () => {
isCI: false,
};
- const result = formatMetadataHeaders(metadata);
+ const result = await formatMetadataHeaders(metadata);
// Test exact header casing and values
expect(result.get('Clerk-Node-Version')).toBe('v18.17.0');
@@ -196,7 +196,7 @@ describe('keyless-custom-headers', () => {
expect(result.get('Clerk-Auth-Status')).toBe('signed-out');
});
- it('should handle missing optional fields gracefully', () => {
+ it('should handle missing optional fields gracefully', async () => {
const metadata = {
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)',
host: 'localhost:3000',
@@ -208,7 +208,7 @@ describe('keyless-custom-headers', () => {
// Missing: nodeVersion, nextVersion, npmConfigUserAgent, port
};
- const result = formatMetadataHeaders(metadata);
+ const result = await formatMetadataHeaders(metadata);
// Test that only present fields are set
expect(result.get('Clerk-Client-User-Agent')).toBe('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)');
@@ -225,7 +225,7 @@ describe('keyless-custom-headers', () => {
expect(result.get('Clerk-Node-Port')).toBeNull();
});
- it('should handle undefined values for optional fields', () => {
+ it('should handle undefined values for optional fields', async () => {
const metadata = {
nodeVersion: undefined,
nextVersion: undefined,
@@ -240,7 +240,7 @@ describe('keyless-custom-headers', () => {
isCI: false,
};
- const result = formatMetadataHeaders(metadata);
+ const result = await formatMetadataHeaders(metadata);
// Test that undefined fields are not set
expect(result.get('Clerk-Node-Version')).toBeNull();
@@ -257,7 +257,7 @@ describe('keyless-custom-headers', () => {
expect(result.get('Clerk-Auth-Status')).toBe('test-auth-status');
});
- it('should handle empty string values', () => {
+ it('should handle empty string values', async () => {
const metadata = {
nodeVersion: '',
nextVersion: '',
@@ -272,7 +272,7 @@ describe('keyless-custom-headers', () => {
isCI: false,
};
- const result = formatMetadataHeaders(metadata);
+ const result = await formatMetadataHeaders(metadata);
// Empty strings should not be set as headers
expect(result.get('Clerk-Node-Version')).toBeNull();
@@ -513,7 +513,7 @@ describe('keyless-custom-headers', () => {
// Collect metadata and format headers
const metadata = await collectKeylessMetadata();
- const headers = formatMetadataHeaders(metadata);
+ const headers = await formatMetadataHeaders(metadata);
// Verify the full pipeline works correctly
expect(headers.get('Clerk-Client-User-Agent')).toBe('Integration-Test-Agent');
diff --git a/packages/nextjs/src/server/keyless-custom-headers.ts b/packages/nextjs/src/server/keyless-custom-headers.ts
index 5e216933843..73ca03837b6 100644
--- a/packages/nextjs/src/server/keyless-custom-headers.ts
+++ b/packages/nextjs/src/server/keyless-custom-headers.ts
@@ -20,7 +20,7 @@ interface MetadataHeaders {
* Collects metadata from the environment and request headers
*/
export async function collectKeylessMetadata(): Promise {
- const headerStore = await headers(); // eslint-disable-line
+ const headerStore = await headers();
return {
nodeVersion: process.version,
@@ -99,7 +99,7 @@ function getNextVersion(): string | undefined {
/**
* Converts metadata to HTTP headers
*/
-export function formatMetadataHeaders(metadata: MetadataHeaders): Headers {
+export async function formatMetadataHeaders(metadata: MetadataHeaders): Promise {
const headers = new Headers();
if (metadata.nodeVersion) {
From 28c56ca4fe9a329c4f3db5d14274ff19c107c5b1 Mon Sep 17 00:00:00 2001
From: Vaggelis Yfantis
Date: Mon, 15 Dec 2025 12:30:46 +0200
Subject: [PATCH 015/123] fix(clerk-js): Await the navigation on password
sign-in completion (#7459)
---
.changeset/green-books-lick.md | 5 +++++
.../src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 .changeset/green-books-lick.md
diff --git a/.changeset/green-books-lick.md b/.changeset/green-books-lick.md
new file mode 100644
index 00000000000..98a093196ca
--- /dev/null
+++ b/.changeset/green-books-lick.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix navigation that was not awaited when attempting to set the session active on password sign-in
diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
index 92605902273..1780bd11e41 100644
--- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
@@ -79,7 +79,7 @@ export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps)
return setActive({
session: res.createdSessionId,
navigate: ({ session }) => {
- void navigateOnSetActive({ session, redirectUrl: afterSignInUrl });
+ return navigateOnSetActive({ session, redirectUrl: afterSignInUrl });
},
});
case 'needs_second_factor':
From a2cc94eb008601d6d75cafed568fea1fb2634234 Mon Sep 17 00:00:00 2001
From: Jacek Radko
Date: Mon, 15 Dec 2025 09:12:32 -0600
Subject: [PATCH 016/123] chore(repo): Backport Danish translations (#7457)
(#7462)
Co-authored-by: Andy Graulund
---
.changeset/quick-chairs-fall.md | 5 +++++
packages/localizations/src/da-DK.ts | 12 ++++++------
2 files changed, 11 insertions(+), 6 deletions(-)
create mode 100644 .changeset/quick-chairs-fall.md
diff --git a/.changeset/quick-chairs-fall.md b/.changeset/quick-chairs-fall.md
new file mode 100644
index 00000000000..d7a72936ee4
--- /dev/null
+++ b/.changeset/quick-chairs-fall.md
@@ -0,0 +1,5 @@
+---
+'@clerk/localizations': patch
+---
+
+Fixed incorrect word in `da-DK` localization
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index 3d13d35847d..5dcecf705aa 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -738,7 +738,7 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
- subtitle: 'Forsæt til {{applicationName}}',
+ subtitle: 'Fortsæt til {{applicationName}}',
subtitleCombined: undefined,
title: 'Log ind',
titleCombined: undefined,
@@ -763,7 +763,7 @@ export const daDK: LocalizationResource = {
continue: {
actionLink: 'Log ind',
actionText: 'Har du en konto?',
- subtitle: 'Forsæt til {{applicationName}}',
+ subtitle: 'Fortsæt til {{applicationName}}',
title: 'Udfyld manglende felter',
},
emailCode: {
@@ -784,7 +784,7 @@ export const daDK: LocalizationResource = {
title: 'Tilmelding...',
},
resendButton: 'Send link igen',
- subtitle: 'Forsæt til {{applicationName}}',
+ subtitle: 'Fortsæt til {{applicationName}}',
title: 'Bekræft din email',
verified: {
title: 'Vellykket tilmelding',
@@ -837,8 +837,8 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
- subtitle: 'Forsæt til {{applicationName}}',
- subtitleCombined: 'Forsæt til {{applicationName}}',
+ subtitle: 'Fortsæt til {{applicationName}}',
+ subtitleCombined: 'Fortsæt til {{applicationName}}',
title: 'Opret din konto',
titleCombined: 'Opret din konto',
},
@@ -847,7 +847,7 @@ export const daDK: LocalizationResource = {
title: 'Tilmeld dig med Solana',
},
},
- socialButtonsBlockButton: 'Forsæt med {{provider|titleize}}',
+ socialButtonsBlockButton: 'Fortsæt med {{provider|titleize}}',
socialButtonsBlockButtonManyInView: undefined,
taskChooseOrganization: {
chooseOrganization: {
From 1282de27f63940f9ea564465414e58af9e11d158 Mon Sep 17 00:00:00 2001
From: Kenton Duprey
Date: Mon, 15 Dec 2025 14:37:25 -0500
Subject: [PATCH 017/123] fix(testing): Skip reset password tasks in session
sign-in integration tests (#7471)
Signed-off-by: Kenton Duprey
---
.changeset/tiny-phones-open.md | 2 ++
integration/README.md | 2 +-
.../tests/session-tasks-sign-in-reset-password.test.ts | 7 +++++--
3 files changed, 8 insertions(+), 3 deletions(-)
create mode 100644 .changeset/tiny-phones-open.md
diff --git a/.changeset/tiny-phones-open.md b/.changeset/tiny-phones-open.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/tiny-phones-open.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/integration/README.md b/integration/README.md
index e6165c54dd8..edbe148964c 100644
--- a/integration/README.md
+++ b/integration/README.md
@@ -63,7 +63,7 @@ Additionally, you can use two flags to configure how Playwright runs:
For example:
```shell
-pnpm test:integration:base -- --ui email.link.test.ts
+pnpm test:integration:base --ui -- email.link.test.ts
```
> [!TIP]
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 ac303f19473..3835312a728 100644
--- a/integration/tests/session-tasks-sign-in-reset-password.test.ts
+++ b/integration/tests/session-tasks-sign-in-reset-password.test.ts
@@ -13,7 +13,10 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
await app.teardown();
});
- test('resolve both reset password and organization selection tasks after sign-in', async ({ page, context }) => {
+ test.skip('resolve both reset password and organization selection tasks after sign-in', async ({
+ page,
+ context,
+ }) => {
const u = createTestUtils({ app, page, context });
const user = u.services.users.createFakeUser();
@@ -61,7 +64,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
await u.services.organizations.deleteAll();
});
- test('sign-in with email and resolve the reset password task', async ({ page, context }) => {
+ test.skip('sign-in with email and resolve the reset password task', async ({ page, context }) => {
const u = createTestUtils({ app, page, context });
const user = u.services.users.createFakeUser();
const createdUser = await u.services.users.createBapiUser(user);
From cbe5cdc02f44bcbc826a8b153145b1f6e219b9ab Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Mon, 15 Dec 2025 15:19:17 -0500
Subject: [PATCH 018/123] ci(repo): Version packages (Core 2) (#7428)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/afraid-apes-cough.md | 7 -------
.changeset/blue-walls-promise.md | 6 ------
.changeset/five-numbers-scream.md | 5 -----
.changeset/green-books-lick.md | 5 -----
.changeset/legal-jokes-beg.md | 9 ---------
.changeset/pretty-crabs-scream.md | 5 -----
.changeset/quick-chairs-fall.md | 5 -----
.changeset/tiny-phones-open.md | 2 --
.changeset/unlucky-beans-check.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 | 10 ++++++++++
packages/backend/package.json | 2 +-
packages/chrome-extension/CHANGELOG.md | 9 +++++++++
packages/chrome-extension/package.json | 2 +-
packages/clerk-js/CHANGELOG.md | 16 ++++++++++++++++
packages/clerk-js/package.json | 2 +-
packages/elements/CHANGELOG.md | 13 +++++++++++++
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 | 19 +++++++++++++++++++
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 | 11 +++++++++++
packages/react/package.json | 2 +-
packages/remix/CHANGELOG.md | 10 ++++++++++
packages/remix/package.json | 2 +-
packages/shared/CHANGELOG.md | 14 ++++++++++++++
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 +-
53 files changed, 250 insertions(+), 72 deletions(-)
delete mode 100644 .changeset/afraid-apes-cough.md
delete mode 100644 .changeset/blue-walls-promise.md
delete mode 100644 .changeset/five-numbers-scream.md
delete mode 100644 .changeset/green-books-lick.md
delete mode 100644 .changeset/legal-jokes-beg.md
delete mode 100644 .changeset/pretty-crabs-scream.md
delete mode 100644 .changeset/quick-chairs-fall.md
delete mode 100644 .changeset/tiny-phones-open.md
delete mode 100644 .changeset/unlucky-beans-check.md
diff --git a/.changeset/afraid-apes-cough.md b/.changeset/afraid-apes-cough.md
deleted file mode 100644
index d56bab12231..00000000000
--- a/.changeset/afraid-apes-cough.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@clerk/localizations': minor
-'@clerk/clerk-js': minor
-'@clerk/shared': minor
----
-
-Add Web3 Solana support to ``
diff --git a/.changeset/blue-walls-promise.md b/.changeset/blue-walls-promise.md
deleted file mode 100644
index 3309217fb25..00000000000
--- a/.changeset/blue-walls-promise.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@clerk/localizations": patch
-"@clerk/shared": patch
----
-
-Added temporary email services support error localization key.
diff --git a/.changeset/five-numbers-scream.md b/.changeset/five-numbers-scream.md
deleted file mode 100644
index 9f17f73733f..00000000000
--- a/.changeset/five-numbers-scream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@clerk/backend": patch
----
-
-Fixed an issue where TanStack React Start middleware fails to properly handle requests.
diff --git a/.changeset/green-books-lick.md b/.changeset/green-books-lick.md
deleted file mode 100644
index 98a093196ca..00000000000
--- a/.changeset/green-books-lick.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix navigation that was not awaited when attempting to set the session active on password sign-in
diff --git a/.changeset/legal-jokes-beg.md b/.changeset/legal-jokes-beg.md
deleted file mode 100644
index 981ea036ecc..00000000000
--- a/.changeset/legal-jokes-beg.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@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/.changeset/pretty-crabs-scream.md b/.changeset/pretty-crabs-scream.md
deleted file mode 100644
index 530fa380c76..00000000000
--- a/.changeset/pretty-crabs-scream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@clerk/nextjs": patch
----
-
-Mark internal keyless header function async to comply with Server Actions async requirements
diff --git a/.changeset/quick-chairs-fall.md b/.changeset/quick-chairs-fall.md
deleted file mode 100644
index d7a72936ee4..00000000000
--- a/.changeset/quick-chairs-fall.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/localizations': patch
----
-
-Fixed incorrect word in `da-DK` localization
diff --git a/.changeset/tiny-phones-open.md b/.changeset/tiny-phones-open.md
deleted file mode 100644
index a845151cc84..00000000000
--- a/.changeset/tiny-phones-open.md
+++ /dev/null
@@ -1,2 +0,0 @@
----
----
diff --git a/.changeset/unlucky-beans-check.md b/.changeset/unlucky-beans-check.md
deleted file mode 100644
index ad0c6bcc65d..00000000000
--- a/.changeset/unlucky-beans-check.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@clerk/localizations": patch
-"@clerk/shared": patch
----
-
-Added missing password or identifier incorrect error localization.
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index a3cfb6edf80..f91f558dbc4 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+
## 0.2.9
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 3214906a70f..9c970792f50 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.9",
+ "version": "0.2.10",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 412b655f8b3..c94753cf91b 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.16.8
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+
## 2.16.7
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 5ec3495ab60..b78f29cbe32 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.16.7",
+ "version": "2.16.8",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 6612a23cd4d..257c3e0ab5c 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.27.1
+
+### Patch Changes
+
+- Fixed an issue where TanStack React Start middleware fails to properly handle requests. ([#7431](https://github.com/clerk/javascript/pull/7431)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/types@4.101.7
+
## 2.27.0
### Minor Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index ac28c5fc5c4..83f30ee4d11 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.27.0",
+ "version": "2.27.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 82c8e9865d7..f3458634721 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.8.12
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`28c56ca`](https://github.com/clerk/javascript/commit/28c56ca4fe9a329c4f3db5d14274ff19c107c5b1), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/clerk-js@5.115.0
+ - @clerk/shared@3.40.0
+ - @clerk/clerk-react@5.59.0
+
## 2.8.11
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index df2f68e0d10..b351d55e713 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.11",
+ "version": "2.8.12",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 4bca6735f23..52a2998a8e3 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,21 @@
# Change Log
+## 5.115.0
+
+### Minor Changes
+
+- Add Web3 Solana support to `` ([#7435](https://github.com/clerk/javascript/pull/7435)) by [@kduprey](https://github.com/kduprey)
+
+- Add support for Sign in with Solana. ([#7293](https://github.com/clerk/javascript/pull/7293)) by [@kduprey](https://github.com/kduprey)
+
+### Patch Changes
+
+- Fix navigation that was not awaited when attempting to set the session active on password sign-in ([#7459](https://github.com/clerk/javascript/pull/7459)) by [@octoper](https://github.com/octoper)
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`a2cc94e`](https://github.com/clerk/javascript/commit/a2cc94eb008601d6d75cafed568fea1fb2634234), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/localizations@3.31.0
+ - @clerk/shared@3.40.0
+
## 5.114.1
### Patch Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 07a34f016e0..93647928c40 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.114.1",
+ "version": "5.115.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index d9ae77c15c7..976ae76a0db 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,18 @@
# @clerk/elements
+## 0.24.0
+
+### Minor Changes
+
+- Add support for Sign in with Solana. ([#7293](https://github.com/clerk/javascript/pull/7293)) by [@kduprey](https://github.com/kduprey)
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 0.23.89
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index e0eb6c765aa..4f7165ce95e 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.23.89",
+ "version": "0.24.0",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index 342da0bf22c..b6164581e49 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.26
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+
## 0.4.25
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index f04aaa72c71..85a763e95db 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.25",
+ "version": "0.4.26",
"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 ac8b417a5bf..52936045ff4 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.12
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`28c56ca`](https://github.com/clerk/javascript/commit/28c56ca4fe9a329c4f3db5d14274ff19c107c5b1), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/clerk-js@5.115.0
+ - @clerk/shared@3.40.0
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 2.19.11
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index ea95ce2d576..06bbb7991a0 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.11",
+ "version": "2.19.12",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 23b45eee9f6..db565c081f2 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.58
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+
## 1.7.57
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index c52453680f4..e5ecc825d6c 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.57",
+ "version": "1.7.58",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index bc9eaabfcbe..a0a0b59cc4d 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.10
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+
## 2.6.9
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index f8304a2fd9c..56761e72a22 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.9",
+ "version": "2.6.10",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index 110befa6f90..4942cccac53 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,24 @@
# Change Log
+## 3.31.0
+
+### Minor Changes
+
+- Add Web3 Solana support to `` ([#7435](https://github.com/clerk/javascript/pull/7435)) by [@kduprey](https://github.com/kduprey)
+
+- Add support for Sign in with Solana. ([#7293](https://github.com/clerk/javascript/pull/7293)) by [@kduprey](https://github.com/kduprey)
+
+### Patch Changes
+
+- Added temporary email services support error localization key. ([#7436](https://github.com/clerk/javascript/pull/7436)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Fixed incorrect word in `da-DK` localization ([#7462](https://github.com/clerk/javascript/pull/7462)) by [@jacekradko](https://github.com/jacekradko)
+
+- Added missing password or identifier incorrect error localization. ([#7437](https://github.com/clerk/javascript/pull/7437)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Updated dependencies []:
+ - @clerk/types@4.101.7
+
## 3.30.1
### Patch Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index 51831dbe54a..b6c9a3ee765 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.30.1",
+ "version": "3.31.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index c704054d7ae..21b6dbc1a76 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 6.36.3
+
+### Patch Changes
+
+- Mark internal keyless header function async to comply with Server Actions async requirements ([#7445](https://github.com/clerk/javascript/pull/7445)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 6.36.2
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 89f5ede4d26..e9dc41424bd 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.36.2",
+ "version": "6.36.3",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index 6e0667887c8..32625dfbdc2 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.8
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+ - @clerk/vue@1.17.4
+
## 1.13.7
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index b3198b60b3f..4ad70ee47f3 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.7",
+ "version": "1.13.8",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index e05776e4949..58430c4dc2e 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.3.5
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 2.3.4
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index e18955f082f..d741be97758 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.3.4",
+ "version": "2.3.5",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index eaf8804fe54..a9669f8e917 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,16 @@
# Change Log
+## 5.59.0
+
+### Minor Changes
+
+- Add support for Sign in with Solana. ([#7293](https://github.com/clerk/javascript/pull/7293)) by [@kduprey](https://github.com/kduprey)
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+
## 5.58.1
### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index e2937e752fd..77f4a734905 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.58.1",
+ "version": "5.59.0",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index b06f53a74bb..9ecc64e6506 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.25
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 4.13.24
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 7b1b7621871..d51e8f86b28 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.24",
+ "version": "4.13.25",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 053c5bcc0b8..60f96bdd43c 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,19 @@
# Change Log
+## 3.40.0
+
+### Minor Changes
+
+- Add Web3 Solana support to `` ([#7435](https://github.com/clerk/javascript/pull/7435)) by [@kduprey](https://github.com/kduprey)
+
+- Add support for Sign in with Solana. ([#7293](https://github.com/clerk/javascript/pull/7293)) by [@kduprey](https://github.com/kduprey)
+
+### Patch Changes
+
+- Added temporary email services support error localization key. ([#7436](https://github.com/clerk/javascript/pull/7436)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Added missing password or identifier incorrect error localization. ([#7437](https://github.com/clerk/javascript/pull/7437)) by [@wobsoriano](https://github.com/wobsoriano)
+
## 3.39.0
### Minor Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index f8d6cd49a2c..c99f9f09389 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.39.0",
+ "version": "3.40.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 dc9fa445243..deeaaed929b 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.10
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/clerk-react@5.59.0
+ - @clerk/types@4.101.7
+
## 0.27.9
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 4c13607d1f4..1e15c441373 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.9",
+ "version": "0.27.10",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index 5ed27cf1a7b..b68dc82305a 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.13.24
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`43d3c3e`](https://github.com/clerk/javascript/commit/43d3c3eaff767054ef74fd3655e632caffeaaf33), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/backend@2.27.1
+ - @clerk/types@4.101.7
+
## 1.13.23
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index eca5c4a5555..b13ff095765 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.23",
+ "version": "1.13.24",
"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 e01387a8ed3..fd5cbc15995 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.44
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+
## 2.4.43
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 046ec53a99c..f1cf7d067c7 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.43",
+ "version": "2.4.44",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index ec6d729b58d..6062d61f779 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.7
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+
## 4.101.6
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index a0cf06c8b3b..d02fa2324f6 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.6",
+ "version": "4.101.7",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 9bc25c544ed..06b096bf975 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.4
+
+### Patch Changes
+
+- Updated dependencies [[`375a32d`](https://github.com/clerk/javascript/commit/375a32d0f44933605ffb513ff28f522ac5e851d6), [`175883b`](https://github.com/clerk/javascript/commit/175883b05228138c9ff55d0871cc1041bd68d7fe), [`f626046`](https://github.com/clerk/javascript/commit/f626046c589956022b1e1ac70382c986822f4733), [`14342d2`](https://github.com/clerk/javascript/commit/14342d2b34fe0882f7676195aefaaa17f034af70)]:
+ - @clerk/shared@3.40.0
+ - @clerk/types@4.101.7
+
## 1.17.3
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index ef19a868cb7..f6404ffe835 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.3",
+ "version": "1.17.4",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From 54cd476625852983053725ec3eb42abc3ba370df Mon Sep 17 00:00:00 2001
From: Robert Soriano
Date: Tue, 16 Dec 2025 13:01:56 -0800
Subject: [PATCH 019/123] feat(localizations): Add waitlist translations
(#7483)
Co-authored-by: valentinogagliardi
---
.changeset/hungry-icons-compete.md | 5 +++++
packages/localizations/src/ar-SA.ts | 16 ++++++++--------
packages/localizations/src/ca-ES.ts | 16 ++++++++--------
packages/localizations/src/da-DK.ts | 16 ++++++++--------
packages/localizations/src/el-GR.ts | 17 +++++++++--------
packages/localizations/src/fi-FI.ts | 16 ++++++++--------
packages/localizations/src/hr-HR.ts | 16 ++++++++--------
packages/localizations/src/hu-HU.ts | 16 ++++++++--------
packages/localizations/src/is-IS.ts | 16 ++++++++--------
packages/localizations/src/it-IT.ts | 16 ++++++++--------
packages/localizations/src/ko-KR.ts | 16 ++++++++--------
packages/localizations/src/mn-MN.ts | 16 ++++++++--------
packages/localizations/src/nb-NO.ts | 16 ++++++++--------
packages/localizations/src/sr-RS.ts | 16 ++++++++--------
packages/localizations/src/sv-SE.ts | 16 ++++++++--------
packages/localizations/src/uk-UA.ts | 16 ++++++++--------
packages/localizations/src/zh-CN.ts | 16 ++++++++--------
packages/localizations/src/zh-TW.ts | 16 ++++++++--------
18 files changed, 142 insertions(+), 136 deletions(-)
create mode 100644 .changeset/hungry-icons-compete.md
diff --git a/.changeset/hungry-icons-compete.md b/.changeset/hungry-icons-compete.md
new file mode 100644
index 00000000000..c2eb499433e
--- /dev/null
+++ b/.changeset/hungry-icons-compete.md
@@ -0,0 +1,5 @@
+---
+"@clerk/localizations": patch
+---
+
+Added waitlist translations.
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index 47cd02a20dd..d255dbde3a9 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -1342,16 +1342,16 @@ export const arSA: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'تسجيل الدخول',
+ actionText: 'هل لديك وصول بالفعل؟',
+ formButton: 'الانضمام إلى قائمة الانتظار',
+ subtitle: 'أدخل عنوان بريدك الإلكتروني وسنخبرك عندما يكون مكانك جاهزًا',
+ title: 'الانضمام إلى قائمة الانتظار',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'سيتم إعادة توجيهك قريبًا...',
+ subtitle: 'سنكون على اتصال عندما يكون مكانك جاهزًا',
+ title: 'شكرًا للانضمام إلى قائمة الانتظار!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index 0691b95a19a..20b4e868aeb 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -1358,16 +1358,16 @@ export const caES: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Iniciar sessió',
+ actionText: 'Ja tens accés?',
+ formButton: "Unir-se a la llista d'espera",
+ subtitle: "Introdueix la teva adreça de correu electrònic i t'avisarem quan el teu lloc estigui llest",
+ title: "Unir-se a la llista d'espera",
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: "Se't redirigirà aviat...",
+ subtitle: "T'enviarem un missatge quan el teu lloc estigui llest",
+ title: "Gràcies per unir-te a la llista d'espera!",
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index 5dcecf705aa..cb52af210b9 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -1349,16 +1349,16 @@ export const daDK: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Log ind',
+ actionText: 'Har du allerede adgang?',
+ formButton: 'Tilmeld dig ventelisten',
+ subtitle: 'Indtast din e-mailadresse, så giver vi dig besked, når din plads er klar',
+ title: 'Tilmeld dig ventelisten',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Du vil blive omdirigeret snart...',
+ subtitle: 'Vi kontakter dig, når din plads er klar',
+ title: 'Tak fordi du tilmeldte dig ventelisten!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index c9520cbb5fe..a39eb505b63 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -1361,16 +1361,17 @@ export const elGR: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Σύνδεση',
+ actionText: 'Έχετε ήδη πρόσβαση;',
+ formButton: 'Εγγραφή στη λίστα αναμονής',
+ subtitle:
+ 'Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας και θα σας ενημερώσουμε όταν η θέση σας είναι έτοιμη',
+ title: 'Εγγραφή στη λίστα αναμονής',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Θα ανακατευθυνθείτε σύντομα...',
+ subtitle: 'Θα επικοινωνήσουμε μαζί σας όταν η θέση σας είναι έτοιμη',
+ title: 'Ευχαριστούμε που εγγραφήκατε στη λίστα αναμονής!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 2848a5621ca..b326c9dedf1 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -1353,16 +1353,16 @@ export const fiFI: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Kirjaudu sisään',
+ actionText: 'Onko sinulla jo pääsy?',
+ formButton: 'Liity jonoon',
+ subtitle: 'Syötä sähköpostiosoitteesi ja ilmoitamme sinulle, kun paikkasi on valmis',
+ title: 'Liity jonoon',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Sinut ohjataan pian...',
+ subtitle: 'Olemme yhteydessä, kun paikkasi on valmis',
+ title: 'Kiitos liittymisestä jonoon!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index 79fc0c2839e..5cbb39b5ac8 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -1357,16 +1357,16 @@ export const hrHR: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Prijavi se',
+ actionText: 'Već imaš pristup?',
+ formButton: 'Pridruži se listi čekanja',
+ subtitle: 'Unesi svoju e-mail adresu i obavijestit ćemo te kada tvoje mjesto bude spremno',
+ title: 'Pridruži se listi čekanja',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Uskoro ćeš biti preusmjeren...',
+ subtitle: 'Javit ćemo ti se kada tvoje mjesto bude spremno',
+ title: 'Hvala što si se pridružio/la listi čekanja!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index 54926326584..8eec65fff94 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -1354,16 +1354,16 @@ export const huHU: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Bejelentkezés',
+ actionText: 'Már van hozzáférésed?',
+ formButton: 'Csatlakozás a várólistához',
+ subtitle: 'Add meg az e-mail címedet, és értesítünk, amikor a helyed elkészül',
+ title: 'Csatlakozás a várólistához',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Hamarosan átirányítunk...',
+ subtitle: 'Visszajelzünk, amikor a helyed elkészül',
+ title: 'Köszönjük, hogy csatlakoztál a várólistához!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index ecd37bf16fb..5043c414ad8 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -1357,16 +1357,16 @@ export const isIS: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Skrá inn',
+ actionText: 'Áttu nú þegar aðgang?',
+ formButton: 'Skrá sig á biðlista',
+ subtitle: 'Sláðu inn netfangið þitt og við látum þig vita þegar staða þín er tilbúin',
+ title: 'Skrá sig á biðlista',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Þú verður áframsendur fljótlega...',
+ subtitle: 'Við höfum samband þegar staða þín er tilbúin',
+ title: 'Takk fyrir að skrá sig á biðlistann!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index ad8cfdc8c17..b277907a0a3 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -1362,16 +1362,16 @@ export const itIT: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Accedi',
+ actionText: 'Hai già accesso?',
+ formButton: "Unisciti alla lista d'attesa",
+ subtitle: 'Inserisci il tuo indirizzo email e ti avviseremo quando il tuo posto sarà pronto',
+ title: "Unisciti alla lista d'attesa",
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Verrai reindirizzato a breve...',
+ subtitle: 'Ti contatteremo quando il tuo posto sarà pronto',
+ title: "Grazie per esserti unito alla lista d'attesa!",
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index eaf8541a33d..8fedd5fd27a 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -1335,16 +1335,16 @@ export const koKR: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: '로그인',
+ actionText: '이미 액세스 권한이 있으신가요?',
+ formButton: '대기 목록에 가입',
+ subtitle: '이메일 주소를 입력하시면 준비되면 알려드리겠습니다',
+ title: '대기 목록에 가입',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: '곧 리디렉션됩니다...',
+ subtitle: '준비되면 연락드리겠습니다',
+ title: '대기 목록에 가입해 주셔서 감사합니다!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index c48d505669e..266f70c00b0 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -1353,16 +1353,16 @@ export const mnMN: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Нэвтрэх',
+ actionText: 'Та аль хэдийн нэвтрэх эрхтэй юу?',
+ formButton: 'Хүлээлгийн жагсаалтад нэгдэх',
+ subtitle: 'Имэйл хаягаа оруулаад таны байр бэлэн болоход мэдэгдэх болно',
+ title: 'Хүлээлгийн жагсаалтад нэгдэх',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Удахгүй дахин чиглүүлэх болно...',
+ subtitle: 'Таны байр бэлэн болоход бид холбогдох болно',
+ title: 'Хүлээлгийн жагсаалтад нэгдсэнд баярлалаа!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index c3e37d4c4eb..8211ae928e3 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -1351,16 +1351,16 @@ export const nbNO: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Logg inn',
+ actionText: 'Har du allerede tilgang?',
+ formButton: 'Bli med på ventelisten',
+ subtitle: 'Skriv inn e-postadressen din, så gir vi deg beskjed når plassen din er klar',
+ title: 'Bli med på ventelisten',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Du vil bli omdirigert snart...',
+ subtitle: 'Vi tar kontakt når plassen din er klar',
+ title: 'Takk for at du ble med på ventelisten!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 3876a118a13..8763f4b97d5 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -1349,16 +1349,16 @@ export const srRS: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Пријави се',
+ actionText: 'Већ имаш приступ?',
+ formButton: 'Придружи се листи чекања',
+ subtitle: 'Унеси своју е-пошту и обавестићемо те када твоје место буде спремно',
+ title: 'Придружи се листи чекања',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Ускоро ћеш бити преусмерен...',
+ subtitle: 'Јавићемо ти се када твоје место буде спремно',
+ title: 'Хвала што си се придружио/ла листи чекања!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index 92ec67fd616..a1dda22204a 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -1353,16 +1353,16 @@ export const svSE: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Logga in',
+ actionText: 'Har du redan åtkomst?',
+ formButton: 'Gå med i väntelistan',
+ subtitle: 'Ange din e-postadress så meddelar vi dig när din plats är redo',
+ title: 'Gå med i väntelistan',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Du kommer att omdirigeras snart...',
+ subtitle: 'Vi hör av oss när din plats är redo',
+ title: 'Tack för att du gick med i väntelistan!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 5eaefd3199d..fedf768c71e 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -1349,16 +1349,16 @@ export const ukUA: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: 'Увійти',
+ actionText: 'Вже маєте доступ?',
+ formButton: 'Приєднатися до списку очікування',
+ subtitle: 'Введіть свою електронну адресу, і ми повідомимо вас, коли ваше місце буде готове',
+ title: 'Приєднатися до списку очікування',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: 'Ви будете перенаправлені незабаром...',
+ subtitle: "Ми зв'яжемося з вами, коли ваше місце буде готове",
+ title: 'Дякуємо за приєднання до списку очікування!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 0c70c85c79c..2de02d8e562 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -1317,16 +1317,16 @@ export const zhCN: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: '登录',
+ actionText: '已有访问权限?',
+ formButton: '加入候补名单',
+ subtitle: '输入您的电子邮件地址,我们会在您的位置准备好时通知您',
+ title: '加入候补名单',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: '您将很快被重定向...',
+ subtitle: '当您的位置准备好时,我们会与您联系',
+ title: '感谢您加入候补名单!',
},
},
web3SolanaWalletButtons: {
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index af69a01b98a..17ee124966d 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -1315,16 +1315,16 @@ export const zhTW: LocalizationResource = {
},
waitlist: {
start: {
- actionLink: undefined,
- actionText: undefined,
- formButton: undefined,
- subtitle: undefined,
- title: undefined,
+ actionLink: '登入',
+ actionText: '已有存取權限?',
+ formButton: '加入候補名單',
+ subtitle: '輸入您的電子郵件地址,我們會在您的位置準備好時通知您',
+ title: '加入候補名單',
},
success: {
- message: undefined,
- subtitle: undefined,
- title: undefined,
+ message: '您將很快被重新導向...',
+ subtitle: '當您的位置準備好時,我們會與您聯繫',
+ title: '感謝您加入候補名單!',
},
},
web3SolanaWalletButtons: {
From 5d250277ea389695e82ec9471f1eadadf7cbc4c3 Mon Sep 17 00:00:00 2001
From: Vaggelis Yfantis
Date: Wed, 17 Dec 2025 11:24:26 +0200
Subject: [PATCH 020/123] fix(backend): Rename password compromised action and
introduces unsetting a compromised password (#7477)
---
.changeset/evil-points-fly.md | 5 ++++
integration/testUtils/usersService.ts | 4 +--
...ssion-tasks-sign-in-reset-password.test.ts | 4 +--
packages/backend/src/api/endpoints/UserApi.ts | 25 +++++++++++++++----
4 files changed, 29 insertions(+), 9 deletions(-)
create mode 100644 .changeset/evil-points-fly.md
diff --git a/.changeset/evil-points-fly.md b/.changeset/evil-points-fly.md
new file mode 100644
index 00000000000..da0737489da
--- /dev/null
+++ b/.changeset/evil-points-fly.md
@@ -0,0 +1,5 @@
+---
+'@clerk/backend': patch
+---
+
+Renaming `__experimental_passwordCompromised` to `__experimental_setPasswordCompromised` and introducing `__experimental_unsetPasswordCompromised`
diff --git a/integration/testUtils/usersService.ts b/integration/testUtils/usersService.ts
index 2e7b184af45..2d28af6cfa7 100644
--- a/integration/testUtils/usersService.ts
+++ b/integration/testUtils/usersService.ts
@@ -76,7 +76,7 @@ export type UserService = {
createFakeOrganization: (userId: string) => Promise;
getUser: (opts: { id?: string; email?: string }) => Promise;
createFakeAPIKey: (userId: string) => Promise;
- passwordCompromised: (userId: string) => Promise;
+ setPasswordCompromised: (userId: string) => Promise;
};
/**
@@ -212,7 +212,7 @@ export const createUserService = (clerkClient: ClerkClient) => {
clerkClient.apiKeys.revoke({ apiKeyId: apiKey.id, revocationReason: reason }),
} satisfies FakeAPIKey;
},
- passwordCompromised: async (userId: string) => {
+ setPasswordCompromised: async (userId: string) => {
await clerkClient.users.__experimental_passwordCompromised(userId);
},
};
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 3835312a728..53f032d80b4 100644
--- a/integration/tests/session-tasks-sign-in-reset-password.test.ts
+++ b/integration/tests/session-tasks-sign-in-reset-password.test.ts
@@ -22,7 +22,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
const user = u.services.users.createFakeUser();
const createdUser = await u.services.users.createBapiUser(user);
- await u.services.users.passwordCompromised(createdUser.id);
+ await u.services.users.setPasswordCompromised(createdUser.id);
// Performs sign-in
await u.po.signIn.goTo();
@@ -69,7 +69,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
const user = u.services.users.createFakeUser();
const createdUser = await u.services.users.createBapiUser(user);
- await u.services.users.passwordCompromised(createdUser.id);
+ await u.services.users.setPasswordCompromised(createdUser.id);
const fakeOrganization = u.services.organizations.createFakeOrganization();
await u.services.organizations.createBapiOrganization({
name: fakeOrganization.name,
diff --git a/packages/backend/src/api/endpoints/UserApi.ts b/packages/backend/src/api/endpoints/UserApi.ts
index d1408f9e5c5..41803ef3f60 100644
--- a/packages/backend/src/api/endpoints/UserApi.ts
+++ b/packages/backend/src/api/endpoints/UserApi.ts
@@ -199,6 +199,10 @@ type DeleteUserExternalAccountParams = {
externalAccountId: string;
};
+type SetPasswordCompromisedParams = {
+ revokeAllSessions?: boolean;
+};
+
type UserID = {
userId: string;
};
@@ -448,14 +452,25 @@ export class UserAPI extends AbstractAPI {
});
}
- public async __experimental_passwordCompromised(userId: string) {
+ public async __experimental_setPasswordCompromised(
+ userId: string,
+ params: SetPasswordCompromisedParams = {
+ revokeAllSessions: false,
+ },
+ ) {
+ this.requireId(userId);
+ return this.request({
+ method: 'POST',
+ path: joinPaths(basePath, userId, 'password', 'set_compromised'),
+ bodyParams: params,
+ });
+ }
+
+ public async __experimental_unsetPasswordCompromised(userId: string) {
this.requireId(userId);
return this.request({
method: 'POST',
- path: joinPaths(basePath, userId, 'password_compromised'),
- bodyParams: {
- revokeAllSessions: false,
- },
+ path: joinPaths(basePath, userId, 'password', 'unset_compromised'),
});
}
}
From a7c395ed6a11eef1e6f862b19ab473aa454de74c Mon Sep 17 00:00:00 2001
From: Vaggelis Yfantis
Date: Wed, 17 Dec 2025 13:41:47 +0200
Subject: [PATCH 021/123] chore(e2e): Bring back the skipped session task reset
password tests (#7484)
---
.changeset/swift-dolphins-thank.md | 4 ++++
integration/presets/envs.ts | 1 -
integration/testUtils/usersService.ts | 2 +-
.../tests/session-tasks-sign-in-reset-password.test.ts | 7 ++-----
4 files changed, 7 insertions(+), 7 deletions(-)
create mode 100644 .changeset/swift-dolphins-thank.md
diff --git a/.changeset/swift-dolphins-thank.md b/.changeset/swift-dolphins-thank.md
new file mode 100644
index 00000000000..7390094ae06
--- /dev/null
+++ b/.changeset/swift-dolphins-thank.md
@@ -0,0 +1,4 @@
+---
+
+---
+
diff --git a/integration/presets/envs.ts b/integration/presets/envs.ts
index d9a617739b3..844b91663d6 100644
--- a/integration/presets/envs.ts
+++ b/integration/presets/envs.ts
@@ -154,7 +154,6 @@ const withSessionTasks = base
const withSessionTasksResetPassword = base
.clone()
.setId('withSessionTasksResetPassword')
- .setEnvVariable('private', 'CLERK_API_URL', 'https://api.clerkstage.dev')
.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);
diff --git a/integration/testUtils/usersService.ts b/integration/testUtils/usersService.ts
index 2d28af6cfa7..8c95b000720 100644
--- a/integration/testUtils/usersService.ts
+++ b/integration/testUtils/usersService.ts
@@ -213,7 +213,7 @@ export const createUserService = (clerkClient: ClerkClient) => {
} satisfies FakeAPIKey;
},
setPasswordCompromised: async (userId: string) => {
- await clerkClient.users.__experimental_passwordCompromised(userId);
+ await clerkClient.users.__experimental_setPasswordCompromised(userId);
},
};
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 53f032d80b4..2a61c446581 100644
--- a/integration/tests/session-tasks-sign-in-reset-password.test.ts
+++ b/integration/tests/session-tasks-sign-in-reset-password.test.ts
@@ -13,10 +13,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
await app.teardown();
});
- test.skip('resolve both reset password and organization selection tasks after sign-in', async ({
- page,
- context,
- }) => {
+ test('resolve both reset password and organization selection tasks after sign-in', async ({ page, context }) => {
const u = createTestUtils({ app, page, context });
const user = u.services.users.createFakeUser();
@@ -64,7 +61,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasksResetPassword
await u.services.organizations.deleteAll();
});
- test.skip('sign-in with email and resolve the reset password task', async ({ page, context }) => {
+ test('sign-in with email and resolve the reset password task', async ({ page, context }) => {
const u = createTestUtils({ app, page, context });
const user = u.services.users.createFakeUser();
const createdUser = await u.services.users.createBapiUser(user);
From 0f4c27ec05401aaba3fde525f561fea79f83f1b5 Mon Sep 17 00:00:00 2001
From: Alex Carpenter
Date: Wed, 17 Dec 2025 15:05:55 -0500
Subject: [PATCH 022/123] fix(clerk-js): RolesListItem hover and focus states
(#7497)
---
.changeset/every-ties-help.md | 5 +++++
.../ui/components/OrganizationProfile/MemberListTable.tsx | 6 ++++++
2 files changed, 11 insertions(+)
create mode 100644 .changeset/every-ties-help.md
diff --git a/.changeset/every-ties-help.md b/.changeset/every-ties-help.md
new file mode 100644
index 00000000000..6f796a8fd46
--- /dev/null
+++ b/.changeset/every-ties-help.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Add missing selected and hover states to `RolesListItem` option.
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/MemberListTable.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/MemberListTable.tsx
index c47c185581a..9eb9592e108 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/MemberListTable.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/MemberListTable.tsx
@@ -242,6 +242,12 @@ const RolesListItem = memo((props: RolesListItemProps) => {
width: '100%',
padding: `${theme.space.$2} ${theme.space.$4}`,
borderRadius: theme.radii.$md,
+ '&:hover': {
+ backgroundColor: theme.colors.$neutralAlpha100,
+ },
+ '&[data-focused="true"]': {
+ backgroundColor: theme.colors.$neutralAlpha150,
+ },
}),
sx,
]}
From 79eb5afd91d7b002faafd2980850d944acb37917 Mon Sep 17 00:00:00 2001
From: Alex Carpenter
Date: Wed, 17 Dec 2025 15:23:29 -0500
Subject: [PATCH 023/123] fix(shared): Ensure localizations fallback to english
locale when key is undefined (#7494)
---
.changeset/dirty-cougars-ask.md | 5 ++
.../__tests__/parseLocalization.test.tsx | 61 +++++++++++++++++++
packages/shared/src/utils/fastDeepMerge.ts | 2 +-
3 files changed, 67 insertions(+), 1 deletion(-)
create mode 100644 .changeset/dirty-cougars-ask.md
diff --git a/.changeset/dirty-cougars-ask.md b/.changeset/dirty-cougars-ask.md
new file mode 100644
index 00000000000..3d1fbf351b8
--- /dev/null
+++ b/.changeset/dirty-cougars-ask.md
@@ -0,0 +1,5 @@
+---
+'@clerk/shared': patch
+---
+
+Fix locale fallback logic to render English values when localization keys are `undefined`.
diff --git a/packages/clerk-js/src/ui/localization/__tests__/parseLocalization.test.tsx b/packages/clerk-js/src/ui/localization/__tests__/parseLocalization.test.tsx
index 1843c2eb41e..bb0da39f4ad 100644
--- a/packages/clerk-js/src/ui/localization/__tests__/parseLocalization.test.tsx
+++ b/packages/clerk-js/src/ui/localization/__tests__/parseLocalization.test.tsx
@@ -37,4 +37,65 @@ describe('Localization parsing and replacing', () => {
const localizedValue = result.current.t(localizationKeys('backButton'));
expect(localizedValue).toBe('test');
});
+
+ it('falls back to English when user locale has undefined value for a key', async () => {
+ const { wrapper: Wrapper } = await createFixtures();
+ const wrapperBefore = ({ children }) => (
+
+
+ {children}
+
+
+ );
+
+ const { result } = renderHook(() => useLocalizations(), { wrapper: wrapperBefore });
+
+ // undefined value should fall back to English
+ const backButtonValue = result.current.t(localizationKeys('backButton'));
+ expect(backButtonValue).toBe(defaultResource.backButton);
+
+ // Non-undefined value should use the translation
+ const formButtonValue = result.current.t(localizationKeys('formButtonPrimary'));
+ expect(formButtonValue).toBe('Translated');
+ });
+
+ it('falls back to English for nested keys with undefined values', async () => {
+ const { wrapper: Wrapper } = await createFixtures();
+ const wrapperBefore = ({ children }) => (
+
+
+ {children}
+
+
+ );
+
+ const { result } = renderHook(() => useLocalizations(), { wrapper: wrapperBefore });
+
+ // undefined nested value should fall back to English (tokens get replaced by t())
+ const titleValue = result.current.t(localizationKeys('signIn.start.title'));
+ // The English default is 'Sign in to {{applicationName}}', tokens get replaced
+ expect(titleValue).toContain('Sign in to');
+
+ // Non-undefined nested value should use the translation
+ const subtitleValue = result.current.t(localizationKeys('signIn.start.subtitle'));
+ expect(subtitleValue).toBe('Custom subtitle');
+ });
});
diff --git a/packages/shared/src/utils/fastDeepMerge.ts b/packages/shared/src/utils/fastDeepMerge.ts
index 1aa08d7e0d9..617f097df3c 100644
--- a/packages/shared/src/utils/fastDeepMerge.ts
+++ b/packages/shared/src/utils/fastDeepMerge.ts
@@ -17,7 +17,7 @@ export const fastDeepMergeAndReplace = (
target[key] = new (Object.getPrototypeOf(source[key]).constructor)();
}
fastDeepMergeAndReplace(source[key], target[key]);
- } else if (Object.prototype.hasOwnProperty.call(source, key)) {
+ } else if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== undefined) {
target[key] = source[key];
}
}
From 85fea1dfda0b9b2526f52abf44e57d0b9a4790da Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Wed, 17 Dec 2025 18:35:35 -0300
Subject: [PATCH 024/123] chore(clerk-js): Introduce radio group for
`EnableOrganizationsPrompt` (#7501)
---
.changeset/tall-shoes-listen.md | 5 +
packages/clerk-js/bundlewatch.config.json | 2 +-
.../EnableOrganizationsPrompt/index.tsx | 389 +++++++++++-------
3 files changed, 240 insertions(+), 156 deletions(-)
create mode 100644 .changeset/tall-shoes-listen.md
diff --git a/.changeset/tall-shoes-listen.md b/.changeset/tall-shoes-listen.md
new file mode 100644
index 00000000000..0b362bf72ae
--- /dev/null
+++ b/.changeset/tall-shoes-listen.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Introduce radio group for `EnableOrganizationsPrompt`
diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json
index 562644e636a..aea3cd9128a 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.6KB" },
+ { "path": "./dist/clerk.js", "maxSize": "924KB" },
{ "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/components/devPrompts/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
index b9f69180db2..3d9fc28615f 100644
--- a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
+++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
@@ -1,17 +1,17 @@
-import { useClerk } from '@clerk/shared/react';
+import { createContextAndHook, useClerk } from '@clerk/shared/react';
import type { __internal_EnableOrganizationsPromptProps, EnableEnvironmentSettingParams } from '@clerk/shared/types';
// eslint-disable-next-line no-restricted-imports
import type { SerializedStyles } from '@emotion/react';
// eslint-disable-next-line no-restricted-imports
-import { css, type Theme } from '@emotion/react';
-import { forwardRef, useId, useLayoutEffect, useRef, useState } from 'react';
+import { css } from '@emotion/react';
+import React, { forwardRef, useId, useLayoutEffect, useRef, useState } from 'react';
import { useEnvironment } from '@/ui/contexts';
import { Modal } from '@/ui/elements/Modal';
-import { common, InternalThemeProvider } from '@/ui/styledSystem';
+import { InternalThemeProvider } from '@/ui/styledSystem';
import { DevTools } from '../../../../core/resources/DevTools';
-import { Box, Flex, Span } from '../../../customizables';
+import { Flex } from '../../../customizables';
import { Portal } from '../../../elements/Portal';
import { basePromptElementStyles, ClerkLogoIcon, PromptContainer, PromptSuccessIcon } from '../shared';
@@ -21,7 +21,7 @@ const EnableOrganizationsPromptInternal = ({
caller,
onSuccess,
onClose,
-}: __internal_EnableOrganizationsPromptProps) => {
+}: __internal_EnableOrganizationsPromptProps): JSX.Element => {
const clerk = useClerk();
const [isLoading, setIsLoading] = useState(false);
const [isEnabled, setIsEnabled] = useState(false);
@@ -29,6 +29,7 @@ const EnableOrganizationsPromptInternal = ({
const initialFocusRef = useRef(null);
const environment = useEnvironment();
+ const radioGroupLabelId = useId();
const isComponent = !caller.startsWith('use');
@@ -141,6 +142,7 @@ const EnableOrganizationsPromptInternal = ({
) : (
<>
- {hasPersonalAccountsEnabled && (
- ({
- display: 'grid',
- gridTemplateRows: isEnabled ? '0fr' : '1fr',
- transition: `grid-template-rows ${t.transitionDuration.$slower} ${t.transitionTiming.$slowBezier}`,
- marginInline: '-0.5rem',
- overflow: 'hidden',
- })}
- {...(isEnabled && { inert: '' })}
+ {hasPersonalAccountsEnabled && !isEnabled && (
+ ({ marginTop: t.sizes.$2 })}
+ direction='col'
>
- ({
- minHeight: 0,
- paddingInline: '0.5rem',
- opacity: isEnabled ? 0 : 1,
- transition: `opacity ${t.transitionDuration.$slower} ${t.transitionTiming.$slowBezier}`,
- })}
+ setAllowPersonalAccount(value === 'optional')}
+ labelledBy={radioGroupLabelId}
>
- ({ marginTop: t.sizes.$2 })}>
- setAllowPersonalAccount(prev => !prev)}
- />
-
-
-
+ ({ columnGap: t.sizes.$2, rowGap: t.sizes.$1 })}
+ >
+ Membership required
+ Standard
+
+ }
+ description={
+ <>
+ Users need to belong to at least one organization.
+ Common for most B2B SaaS applications
+ >
+ }
+ />
+
+
+
)}
@@ -275,7 +283,7 @@ const EnableOrganizationsPromptInternal = ({
* A prompt that allows the user to enable the Organizations feature for their development instance
* @internal
*/
-export const EnableOrganizationsPrompt = (props: __internal_EnableOrganizationsPromptProps) => {
+export const EnableOrganizationsPrompt = (props: __internal_EnableOrganizationsPromptProps): JSX.Element => {
return (
@@ -369,136 +377,207 @@ const PromptButton = forwardRef(({ variant
);
});
-type SwitchProps = React.ComponentProps<'input'> & {
- label: string;
- description?: string;
+type PromptBadgeProps = {
+ children: React.ReactNode;
};
-const TRACK_PADDING = '2px';
-const TRACK_INNER_WIDTH = (t: Theme) => t.sizes.$6;
-const TRACK_HEIGHT = (t: Theme) => t.sizes.$4;
-const THUMB_WIDTH = (t: Theme) => t.sizes.$3;
+const PromptBadge = ({ children }: PromptBadgeProps): JSX.Element => {
+ return (
+
+ {children}
+
+ );
+};
-const Switch = forwardRef(
- ({ label, description, checked: controlledChecked, defaultChecked, onChange, ...props }, ref) => {
- const descriptionId = useId();
+type RadioGroupContextValue = {
+ name: string;
+ value: string;
+ onChange: (value: string) => void;
+};
- const isControlled = controlledChecked !== undefined;
- const [internalChecked, setInternalChecked] = useState(!!defaultChecked);
- const checked = isControlled ? controlledChecked : internalChecked;
+const [RadioGroupContext, useRadioGroup] = createContextAndHook('RadioGroupContext');
- const handleChange = (e: React.ChangeEvent) => {
- if (!isControlled) {
- setInternalChecked(e.target.checked);
- }
- onChange?.(e);
- };
+type RadioGroupProps = {
+ value: string;
+ onChange: (value: string) => void;
+ children: React.ReactNode;
+ labelledBy?: string;
+};
- return (
+const RadioGroup = ({ value, onChange, children, labelledBy }: RadioGroupProps): JSX.Element => {
+ const name = useId();
+ const contextValue = React.useMemo(() => ({ value: { name, value, onChange } }), [name, value, onChange]);
+
+ return (
+
- input + span': {
- outline: '2px solid white',
- outlineOffset: '2px',
- },
- '&:has(input:disabled) > input + span': {
- opacity: 0.6,
- cursor: 'not-allowed',
- pointerEvents: 'none',
- },
- }}
- >
-
- {
- const trackWidth = `calc(${TRACK_INNER_WIDTH(t)} + ${TRACK_PADDING} + ${TRACK_PADDING})`;
- const trackHeight = `calc(${TRACK_HEIGHT(t)} + ${TRACK_PADDING})`;
- return {
- display: 'flex',
- alignItems: 'center',
- paddingInline: TRACK_PADDING,
- width: trackWidth,
- height: trackHeight,
- border: '1px solid rgba(255, 255, 255, 0.2)',
- backgroundColor: checked ? '#6C47FF' : 'rgba(0, 0, 0, 0.2)',
- borderRadius: 999,
- transition: 'background-color 0.2s ease-in-out',
- };
- }}
- >
- {
- const size = THUMB_WIDTH(t);
- const maxTranslateX = `calc(${TRACK_INNER_WIDTH(t)} - ${size} - ${TRACK_PADDING})`;
- return {
- width: size,
- height: size,
- borderRadius: 9999,
- backgroundColor: 'white',
- boxShadow: '0px 0px 0px 1px rgba(0, 0, 0, 0.1)',
- transform: `translateX(${checked ? maxTranslateX : '0'})`,
- transition: 'transform 0.2s ease-in-out',
- '@media (prefers-reduced-motion: reduce)': {
- transition: 'none',
- },
- };
- }}
- />
-
-
- {label}
-
-
- {description ? (
- [
- basePromptElementStyles,
- {
- display: 'block',
- paddingInlineStart: `calc(${TRACK_INNER_WIDTH(t)} + ${TRACK_PADDING} + ${TRACK_PADDING} + ${t.sizes.$2})`,
- fontSize: '0.75rem',
- lineHeight: '1.3333333333',
- color: '#c3c3c6',
- textWrap: 'pretty',
- },
- ]}
- >
- {description}
-
- ) : null}
+ {children}
- );
- },
-);
+
+ );
+};
+
+type RadioGroupItemProps = {
+ value: string;
+ label: React.ReactNode;
+ description?: React.ReactNode;
+};
+
+const RADIO_INDICATOR_SIZE = '1rem';
+const RADIO_GAP = '0.5rem';
+
+const RadioGroupItem = ({ value, label, description }: RadioGroupItemProps): JSX.Element => {
+ const { name, value: selectedValue, onChange } = useRadioGroup();
+ const descriptionId = useId();
+ const checked = value === selectedValue;
+
+ return (
+
+
+
+ {description && (
+
+ {description}
+
+ )}
+
+ );
+};
const Link = forwardRef & { css?: SerializedStyles }>(
({ children, css: cssProp, ...props }, ref) => {
@@ -525,7 +604,7 @@ const Link = forwardRef & { css?: S
},
);
-const CoinFlip = ({ isEnabled }: { isEnabled: boolean }) => {
+const CoinFlip = ({ isEnabled }: { isEnabled: boolean }): JSX.Element => {
const [rotation, setRotation] = useState(0);
useLayoutEffect(() => {
From 4f90ce0e1cd15aa6a03d68d2bdffe0018a3b9bee Mon Sep 17 00:00:00 2001
From: Kenton Duprey
Date: Wed, 17 Dec 2025 17:37:11 -0500
Subject: [PATCH 025/123] fix(clerk-js): Implement fixes from core-3 merge of
Solana feature (#7500)
Signed-off-by: Kenton Duprey
---
.changeset/tame-icons-know.md | 2 ++
.../clerk-js/src/core/resources/SignIn.ts | 23 ++++++++++---
.../clerk-js/src/core/resources/SignUp.ts | 34 +++++++++++++++----
.../SignInFactorOneSolanaWalletsCard.tsx | 4 +--
.../SignUp/SignUpStartSolanaWalletsCard.tsx | 4 +--
.../Web3SelectSolanaWalletScreen.tsx | 17 +++++++---
.../ui/elements/Web3SolanaWalletButtons.tsx | 1 +
.../src/utils/injectedWeb3SolanaProviders.ts | 5 +++
8 files changed, 72 insertions(+), 18 deletions(-)
create mode 100644 .changeset/tame-icons-know.md
diff --git a/.changeset/tame-icons-know.md b/.changeset/tame-icons-know.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/tame-icons-know.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts
index 9074b69ed93..fdf8b728506 100644
--- a/packages/clerk-js/src/core/resources/SignIn.ts
+++ b/packages/clerk-js/src/core/resources/SignIn.ts
@@ -469,13 +469,28 @@ export class SignIn extends BaseResource implements SignInResource {
});
};
- public authenticateWithSolana = async (params: SignInAuthenticateWithSolanaParams): Promise => {
- const identifier = await getSolanaIdentifier(params.walletName);
+ /**
+ * Authenticates a user using a Solana Web3 wallet during sign-in.
+ *
+ * @param params - Configuration for Solana authentication
+ * @param params.walletName - The name of the Solana wallet to use for authentication
+ * @returns A promise that resolves to the updated SignIn resource
+ * @throws {ClerkRuntimeError} If walletName is not provided or wallet connection fails
+ *
+ * @example
+ * ```typescript
+ * await signIn.authenticateWithSolana({ walletName: 'phantom' });
+ * ```
+ */
+ public authenticateWithSolana = async ({
+ walletName,
+ }: SignInAuthenticateWithSolanaParams): Promise => {
+ const identifier = await getSolanaIdentifier(walletName);
return this.authenticateWithWeb3({
identifier,
- generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }),
+ generateSignature: p => generateSignatureWithSolana({ ...p, walletName }),
strategy: 'web3_solana_signature',
- walletName: params.walletName,
+ walletName,
});
};
diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts
index 0d9a3ba57b6..8421ecd70f3 100644
--- a/packages/clerk-js/src/core/resources/SignUp.ts
+++ b/packages/clerk-js/src/core/resources/SignUp.ts
@@ -366,15 +366,37 @@ export class SignUp extends BaseResource implements SignUpResource {
});
};
- public authenticateWithSolana = async (params: SignUpAuthenticateWithSolanaParams): Promise => {
- const identifier = await getSolanaIdentifier(params.walletName);
+ /**
+ * Authenticates a user using a Solana Web3 wallet during sign-up.
+ *
+ * @param params - Configuration for Solana authentication
+ * @param params.walletName - The name of the Solana wallet to use (e.g., 'phantom')
+ * @param params.unsafeMetadata - Optional unsafe metadata to attach to the user
+ * @param params.legalAccepted - Optional flag indicating legal terms acceptance
+ * @returns A promise that resolves to the updated SignUp resource
+ * @throws {ClerkRuntimeError} If wallet connection fails
+ *
+ * @example
+ * ```typescript
+ * await signUp.authenticateWithSolana({
+ * walletName: 'phantom',
+ * legalAccepted: true
+ * });
+ * ```
+ */
+ public authenticateWithSolana = async ({
+ walletName,
+ unsafeMetadata,
+ legalAccepted,
+ }: SignUpAuthenticateWithSolanaParams): Promise => {
+ const identifier = await getSolanaIdentifier(walletName);
return this.authenticateWithWeb3({
identifier,
- generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }),
- unsafeMetadata: params?.unsafeMetadata,
+ generateSignature: p => generateSignatureWithSolana({ ...p, walletName }),
+ unsafeMetadata,
strategy: 'web3_solana_signature',
- legalAccepted: params?.legalAccepted,
- walletName: params.walletName,
+ legalAccepted,
+ walletName,
});
};
diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx
index aa4674a24e7..4a94a0350b9 100644
--- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx
@@ -10,7 +10,7 @@ import { Header } from '@/ui/elements/Header';
import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler';
const Web3SolanaWalletButtons = lazy(() =>
- import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
+ import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
default: m.Web3SolanaWalletButtons,
})),
);
@@ -67,7 +67,7 @@ const SignInFactorOneSolanaWalletsCardInner = () => {
customNavigate: router.navigate,
redirectUrl: ctx.afterSignInUrl || '/',
secondFactorUrl: 'factor-two',
- signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl,
+ signUpContinueUrl: ctx.isCombinedFlow ? 'create/continue' : ctx.signUpContinueUrl,
strategy: 'web3_solana_signature',
walletName,
})
diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx
index ed00e6e3e69..e8d6bc3196f 100644
--- a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx
@@ -10,7 +10,7 @@ import { Header } from '@/ui/elements/Header';
import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler';
const Web3SolanaWalletButtons = lazy(() =>
- import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
+ import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
default: m.Web3SolanaWalletButtons,
})),
);
@@ -66,7 +66,7 @@ const SignUpStartSolanaWalletsCardInner = () => {
.authenticateWithWeb3({
customNavigate: router.navigate,
redirectUrl: ctx.afterSignUpUrl || '/',
- signUpContinueUrl: '../continue',
+ signUpContinueUrl: 'continue',
strategy: 'web3_solana_signature',
unsafeMetadata: ctx.unsafeMetadata,
walletName,
diff --git a/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx
index 707b591f056..cdc2791badb 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Web3SelectSolanaWalletScreen.tsx
@@ -1,3 +1,4 @@
+import { ClerkRuntimeError } from '@clerk/shared/error';
import type { Web3Strategy } from '@clerk/shared/types';
import { lazy, Suspense } from 'react';
@@ -6,11 +7,12 @@ 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 { handleError } from '@/ui/utils/errorHandler';
import { Button, descriptors, Flex, localizationKeys, Spinner } from '../../customizables';
const Web3SolanaWalletButtons = lazy(() =>
- import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
+ import(/* webpackChunkName: "web3-solana-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({
default: m.Web3SolanaWalletButtons,
})),
);
@@ -30,9 +32,15 @@ export const Web3SelectSolanaWalletScreen = ({ onConnect }: Web3SelectWalletProp
card.setIdle();
} catch (err) {
card.setIdle();
- console.error(err);
- } finally {
- close();
+ if (err instanceof Error) {
+ handleError(err, [], card.setError);
+ } else {
+ const error = new ClerkRuntimeError('An error occurred while generating the Solana signature.', {
+ code: 'web3_solana_signature_generation_failed',
+ cause: err instanceof Error ? err : undefined,
+ });
+ handleError(error, [], card.setError);
+ }
}
};
@@ -65,6 +73,7 @@ export const Web3SelectSolanaWalletScreen = ({ onConnect }: Web3SelectWalletProp
-
+
@@ -115,7 +118,7 @@ export const Web3Section = withCardStateProvider(
},
);
-const Web3WalletMenu = ({ walletId }: { walletId: string }) => {
+const Web3WalletMenu = ({ walletId, isVerified }: { walletId: string; isVerified: boolean }) => {
const card = useCardState();
const { open } = useActionContext();
const { user } = useUser();
@@ -126,7 +129,8 @@ const Web3WalletMenu = ({ walletId }: { walletId: string }) => {
const actions = (
[
- !isPrimary
+ // Only allow setting as primary if the wallet is verified and not already primary
+ !isPrimary && isVerified
? {
label: localizationKeys('userProfile.start.web3WalletsSection.detailsAction__nonPrimary'),
onClick: () => {
diff --git a/packages/clerk-js/src/ui/components/UserProfile/__tests__/PasswordSection.test.tsx b/packages/clerk-js/src/ui/components/UserProfile/__tests__/PasswordSection.test.tsx
index bfe8e96d82c..ce8e9c7fd0a 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/__tests__/PasswordSection.test.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/__tests__/PasswordSection.test.tsx
@@ -139,6 +139,7 @@ describe('PasswordSection', () => {
updated_at: 123,
logo_public_url: null,
protocol: 'saml',
+ enterprise_connection_id: 'ent_123',
},
verification: {
status: 'verified',
@@ -155,6 +156,8 @@ describe('PasswordSection', () => {
object: 'verification',
},
id: 'eac_123',
+ last_authenticated_at: 123,
+ enterprise_connection_id: 'ent_123',
},
],
});
@@ -212,6 +215,7 @@ describe('PasswordSection', () => {
updated_at: 123,
logo_public_url: null,
protocol: 'saml',
+ enterprise_connection_id: null,
},
verification: {
status: 'verified',
@@ -228,6 +232,8 @@ describe('PasswordSection', () => {
object: 'verification',
},
id: 'eac_123',
+ last_authenticated_at: null,
+ enterprise_connection_id: null,
},
],
});
@@ -378,6 +384,7 @@ describe('PasswordSection', () => {
updated_at: 123,
logo_public_url: null,
protocol: 'saml',
+ enterprise_connection_id: null,
},
verification: {
status: 'verified',
@@ -394,6 +401,8 @@ describe('PasswordSection', () => {
object: 'verification',
},
id: 'eac_123',
+ last_authenticated_at: null,
+ enterprise_connection_id: null,
},
],
});
@@ -452,6 +461,7 @@ describe('PasswordSection', () => {
updated_at: 123,
logo_public_url: null,
protocol: 'saml',
+ enterprise_connection_id: null,
},
verification: {
status: 'verified',
@@ -468,6 +478,8 @@ describe('PasswordSection', () => {
object: 'verification',
},
id: 'eac_123',
+ last_authenticated_at: null,
+ enterprise_connection_id: null,
},
],
});
From b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Wed, 17 Dec 2025 20:09:01 -0300
Subject: [PATCH 027/123] feat(clerk-js,shared): Show message in
`TaskChooseOrganization` on org creation disabled (#7502)
---
.changeset/nice-loops-fail.md | 7 +
.../tasks/TaskChooseOrganization/index.tsx | 123 ++++++++++++------
.../src/ui/elements/contexts/index.tsx | 1 +
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/localization.ts | 4 +
53 files changed, 293 insertions(+), 38 deletions(-)
create mode 100644 .changeset/nice-loops-fail.md
diff --git a/.changeset/nice-loops-fail.md b/.changeset/nice-loops-fail.md
new file mode 100644
index 00000000000..f559d572371
--- /dev/null
+++ b/.changeset/nice-loops-fail.md
@@ -0,0 +1,7 @@
+---
+'@clerk/localizations': minor
+'@clerk/clerk-js': minor
+'@clerk/shared': minor
+---
+
+Display message in `TaskChooseOrganization` when user is not allowed to create organizations
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 4d8135592c2..c42c6f6ef91 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,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
-import { useState } from 'react';
+import { type ComponentType, useState } from 'react';
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 { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';
@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';
const TaskChooseOrganizationInternal = () => {
- const { signOut } = useClerk();
- const { user } = useUser();
- const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
- const { otherSessions } = useMultipleSessions({ user });
- const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();
-
- const handleSignOut = () => {
- if (otherSessions.length === 0) {
- return signOut(navigateAfterSignOut);
- }
-
- return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
- };
const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
- const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;
return (
@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
-
- ({ width: '100%' })}
- >
- {identifier && (
-
- )}
- ({ flexShrink: 0 })}
- onClick={handleSignOut}
- localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
- />
-
-
+
);
};
+const TaskChooseOrganizationCardFooter = () => {
+ const { signOut } = useClerk();
+ const { user } = useUser();
+ const { session } = useSession();
+ const { otherSessions } = useMultipleSessions({ user });
+ const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();
+
+ const handleSignOut = () => {
+ if (otherSessions.length === 0) {
+ return signOut(navigateAfterSignOut);
+ }
+
+ return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
+ };
+
+ const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;
+
+ return (
+
+ ({ width: '100%' })}
+ >
+ {identifier && (
+
+ )}
+ ({ flexShrink: 0 })}
+ onClick={handleSignOut}
+ localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
+ />
+
+
+ );
+};
+
type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return setCurrentFlow('create')} />;
});
+export const withOrganizationCreationEnabledGuard = (Component: ComponentType) => {
+ return (props: T) => {
+ const { user } = useUser();
+
+ if (!user?.createOrganizationEnabled) {
+ return ;
+ }
+
+ return ;
+ };
+};
+
+function OrganizationCreationDisabledScreen() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
export const TaskChooseOrganization = withCoreSessionSwitchGuard(
- withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
+ withTaskGuard(
+ withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
+ 'choose-organization',
+ ),
);
diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx
index 1a719083777..c61a5fe7d37 100644
--- a/packages/clerk-js/src/ui/elements/contexts/index.tsx
+++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx
@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
+ | 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index d255dbde3a9..8219352bd45 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'يجب أن تنتمي إلى منظمة',
+ subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index bb7b57765ea..fad84fc092d 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Вы павінны належаць да арганізацыі',
+ subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index 9ef316b5c81..73d77460986 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Трябва да принадлежите към организация',
+ subtitle: 'Свържете се с администратора на вашата организация за покана.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index e5cbf0a14d8..8964e3de11c 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
+ subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index 20b4e868aeb..1c420ebf6d7 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Heu de pertànyer a una organització',
+ subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index ec49dcdde01..af4ec4d21b2 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Musíte patřit do organizace',
+ subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index cb52af210b9..8735a5df6d4 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Du skal tilhøre en organisation',
+ subtitle: 'Kontakt din organisationsadministrator for en invitation.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index a5b4e5915af..69e01764480 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
+ organizationCreationDisabled: {
+ title: 'Sie müssen einer Organisation angehören',
+ subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
+ },
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index a39eb505b63..4ba594ab96c 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
+ subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index f0c4414ee86..57e2a3ed202 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'You must belong to an organisation',
+ subtitle: 'Contact your organisation admin for an invitation.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index b56df01c941..ab3a3a11c24 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
+ organizationCreationDisabled: {
+ title: 'You must belong to an organization',
+ subtitle: 'Contact your organization admin for an invitation.',
+ },
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index 9afc723c559..1d4a2766065 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Debe pertenecer a una organización',
+ subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index 5c7c776ed63..c0eb4e51ab3 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Debe pertenecer a una organización',
+ subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 6baf269e3f0..9c2ddc6945e 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Debe pertenecer a una organización',
+ subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index 99ef00a8566..8c23b39578f 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Debés pertenecer a una organización',
+ subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index 4258c7d0665..70aa713cea0 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
+ organizationCreationDisabled: {
+ title: 'شما باید عضو یک سازمان باشید',
+ subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
+ },
signOut: {
actionLink: 'خروج از همه حسابها',
actionText: 'میخواهید خارج شوید؟',
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index b326c9dedf1..1fd6d7c3b4a 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Sinun täytyy kuulua organisaatioon',
+ subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index d275b94a111..68783d6c650 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
+ organizationCreationDisabled: {
+ title: 'Vous devez appartenir à une organisation',
+ subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
+ },
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index 57de830f564..656df81db94 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'עליך להשתייך לארגון',
+ subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index 6adb8416635..834cae04381 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'आपको किसी संगठन से संबंधित होना चाहिए',
+ subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index 5cbb39b5ac8..33d08de6c9a 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -872,6 +872,10 @@ export const hrHR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Morate pripadati organizaciji',
+ subtitle: 'Kontaktirajte administratora svoje organizacije za pozivnicu.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index 8eec65fff94..f2c37364a6c 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -869,6 +869,10 @@ export const huHU: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Egy szervezethez kell tartoznia',
+ subtitle: 'Kérjen meghívót a szervezet adminisztrátorától.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index 77001ca63fd..be17526be27 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -876,6 +876,10 @@ export const idID: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Anda harus menjadi anggota organisasi',
+ subtitle: 'Hubungi admin organisasi Anda untuk mendapatkan undangan.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index 5043c414ad8..8b4d4dbb689 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -872,6 +872,10 @@ export const isIS: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Þú verður að tilheyra samtökum',
+ subtitle: 'Hafðu samband við stjórnanda samtakanna til að fá boð.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index b277907a0a3..5ae69b5abf0 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -878,6 +878,10 @@ export const itIT: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: "Devi appartenere a un'organizzazione",
+ subtitle: "Contatta l'amministratore della tua organizzazione per un invito.",
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index f8964128335..688db95ed37 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -882,6 +882,10 @@ export const jaJP: LocalizationResource = {
subtitle: '続行するには組織の詳細を入力してください',
title: '組織をセットアップ',
},
+ organizationCreationDisabled: {
+ title: '組織に所属する必要があります',
+ subtitle: '招待を受けるには組織の管理者にお問い合わせください。',
+ },
signOut: {
actionLink: 'サインアウト',
actionText: '{{identifier}} としてサインイン中',
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index ddca4b1ef35..6d6962a51bc 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -862,6 +862,10 @@ export const kkKZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Сіз ұйымға тиесілі болуыңыз керек',
+ subtitle: 'Шақыру алу үшін ұйымыңыздың әкімшісіне хабарласыңыз.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index 8fedd5fd27a..a23c0947d99 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -863,6 +863,10 @@ export const koKR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: '조직에 소속되어야 합니다',
+ subtitle: '초대를 받으려면 조직 관리자에게 문의하세요.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index 266f70c00b0..75f5036e6b6 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -870,6 +870,10 @@ export const mnMN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Та байгууллагад харьяалагдах ёстой',
+ subtitle: 'Урилга авахын тулд байгууллагын админтай холбогдоно уу.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index de27e227c26..c8a7b0567f8 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -878,6 +878,10 @@ export const msMY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Anda mesti menjadi ahli organisasi',
+ subtitle: 'Hubungi pentadbir organisasi anda untuk jemputan.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 8211ae928e3..04090d716b8 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -869,6 +869,10 @@ export const nbNO: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Du må tilhøre en organisasjon',
+ subtitle: 'Kontakt organisasjonsadministratoren din for en invitasjon.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index 22a5d24dab5..b16b7e84c84 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -870,6 +870,10 @@ export const nlBE: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Je moet tot een organisatie behoren',
+ subtitle: 'Neem contact op met de beheerder van je organisatie voor een uitnodiging.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index 508ee6443b7..261104f23a7 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -870,6 +870,10 @@ export const nlNL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Je moet tot een organisatie behoren',
+ subtitle: 'Neem contact op met de beheerder van je organisatie voor een uitnodiging.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index 71cc2dd7f0b..76c4579f659 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -875,6 +875,10 @@ export const plPL: LocalizationResource = {
subtitle: 'Wprowadź szczegóły swojej organizacji',
title: 'Utwórz swoją organizację',
},
+ organizationCreationDisabled: {
+ title: 'Musisz należeć do organizacji',
+ subtitle: 'Skontaktuj się z administratorem swojej organizacji, aby uzyskać zaproszenie.',
+ },
signOut: {
actionLink: 'Wyloguj',
actionText: 'Zalogowano jako {{identifier}}',
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index a36057fcf84..219efe09126 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -882,6 +882,10 @@ export const ptBR: LocalizationResource = {
subtitle: 'Conte-nos um pouco sobre sua organização',
title: 'Configure sua conta',
},
+ organizationCreationDisabled: {
+ title: 'Você deve pertencer a uma organização',
+ subtitle: 'Entre em contato com o administrador da sua organização para obter um convite.',
+ },
signOut: {
actionLink: 'Sair',
actionText: 'Conectado como {{identifier}}',
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index f283a5c8f25..71ee25db9fb 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -868,6 +868,10 @@ export const ptPT: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Deve pertencer a uma organização',
+ subtitle: 'Contacte o administrador da sua organização para obter um convite.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index 72879869659..45dc8ea5ee3 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -883,6 +883,10 @@ export const roRO: LocalizationResource = {
subtitle: 'Introdu detaliile organizației pentru a continua',
title: 'Configurează-ți organizația',
},
+ organizationCreationDisabled: {
+ title: 'Trebuie să aparții unei organizații',
+ subtitle: 'Contactează administratorul organizației tale pentru o invitație.',
+ },
signOut: {
actionLink: 'Deconectează-te',
actionText: 'Autentificat ca {{identifier}}',
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index 4a688b923b8..ec888bae6d9 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -882,6 +882,10 @@ export const ruRU: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Вы должны принадлежать к организации',
+ subtitle: 'Свяжитесь с администратором вашей организации для получения приглашения.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index 619486e38d7..67ad6b556e8 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -875,6 +875,10 @@ export const skSK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Musíte patriť do organizácie',
+ subtitle: 'Kontaktujte administrátora vašej organizácie pre pozvánku.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 8763f4b97d5..27657268b6d 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -868,6 +868,10 @@ export const srRS: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Morate pripadati organizaciji',
+ subtitle: 'Kontaktirajte administratora svoje organizacije za pozivnicu.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index a1dda22204a..cc1dacd089d 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -873,6 +873,10 @@ export const svSE: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Du måste tillhöra en organisation',
+ subtitle: 'Kontakta din organisationsadministratör för en inbjudan.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index b3b71f7db63..c88a85443e8 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -877,6 +877,10 @@ export const taIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'நீங்கள் ஒரு அமைப்பில் உறுப்பினராக இருக்க வேண்டும்',
+ subtitle: 'அழைப்புக்கு உங்கள் அமைப்பின் நிர்வாகியைத் தொடர்பு கொள்ளவும்.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index 6583d783572..e6c0d4bc09b 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -877,6 +877,10 @@ export const teIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'మీరు ఒక సంస్థకు చెంది ఉండాలి',
+ subtitle: 'ఆహ్వానం కోసం మీ సంస్థ నిర్వాహకుడిని సంప్రదించండి.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index 2db58cbf7e8..4cc588927ac 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -871,6 +871,10 @@ export const thTH: LocalizationResource = {
subtitle: 'ใส่รายละเอียดองค์กรของคุณเพื่อดำเนินการต่อ',
title: 'ตั้งค่าองค์กรของคุณ',
},
+ organizationCreationDisabled: {
+ title: 'คุณต้องเป็นสมาชิกขององค์กร',
+ subtitle: 'ติดต่อผู้ดูแลระบบขององค์กรของคุณเพื่อขอคำเชิญ',
+ },
signOut: {
actionLink: 'ออกจากระบบ',
actionText: 'เข้าสู่ระบบในนาม {{identifier}}',
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index 19d0c28b9c8..68fa90e72c7 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -871,6 +871,10 @@ export const trTR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Bir organizasyona ait olmalısınız',
+ subtitle: 'Davet için organizasyon yöneticinizle iletişime geçin.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index fedf768c71e..18d9f87cea1 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -867,6 +867,10 @@ export const ukUA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Ви повинні належати до організації',
+ subtitle: 'Зверніться до адміністратора вашої організації для отримання запрошення.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index 732a2e815fc..dfb230cd6bc 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -878,6 +878,10 @@ export const viVN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: 'Bạn phải thuộc về một tổ chức',
+ subtitle: 'Liên hệ với quản trị viên tổ chức của bạn để nhận lời mời.',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 2de02d8e562..17668e096ef 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -857,6 +857,10 @@ export const zhCN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: '您必须属于一个组织',
+ subtitle: '请联系您的组织管理员获取邀请。',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index 17ee124966d..faa7a024fda 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -858,6 +858,10 @@ export const zhTW: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
+ organizationCreationDisabled: {
+ title: '您必須屬於一個組織',
+ subtitle: '請聯繫您的組織管理員以獲取邀請。',
+ },
signOut: {
actionLink: undefined,
actionText: undefined,
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index 7458fee5ad1..a8f3f980653 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -1303,6 +1303,10 @@ export type __internal_LocalizationResource = {
action__createOrganization: LocalizationValue;
action__invitationAccept: LocalizationValue;
};
+ organizationCreationDisabled: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ };
};
taskResetPassword: {
title: LocalizationValue;
From 2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630 Mon Sep 17 00:00:00 2001
From: Kenton Duprey
Date: Thu, 18 Dec 2025 05:53:46 -0500
Subject: [PATCH 028/123] refactor(shared): Update exported error typeguard
functions from error.ts, align error class naming (#7490)
---
.changeset/sweet-singers-beg.md | 5 +++
packages/shared/src/error.ts | 10 +++---
packages/shared/src/errors/clerkApiError.ts | 9 +++---
.../src/errors/clerkApiResponseError.ts | 8 ++---
packages/shared/src/errors/globalHookError.ts | 4 +--
packages/shared/src/errors/helpers.ts | 31 ++-----------------
6 files changed, 22 insertions(+), 45 deletions(-)
create mode 100644 .changeset/sweet-singers-beg.md
diff --git a/.changeset/sweet-singers-beg.md b/.changeset/sweet-singers-beg.md
new file mode 100644
index 00000000000..61b5eb99954
--- /dev/null
+++ b/.changeset/sweet-singers-beg.md
@@ -0,0 +1,5 @@
+---
+'@clerk/shared': patch
+---
+
+Refactor internal Clerk error handling functions
diff --git a/packages/shared/src/error.ts b/packages/shared/src/error.ts
index ad8cea5ce3b..3f034067234 100644
--- a/packages/shared/src/error.ts
+++ b/packages/shared/src/error.ts
@@ -1,8 +1,8 @@
export { errorToJSON, parseError, parseErrors } from './errors/parseError';
-export { ClerkAPIError } from './errors/clerkApiError';
-export { ClerkAPIResponseError } from './errors/clerkApiResponseError';
-export { ClerkError } from './errors/clerkError';
+export { ClerkAPIError, isClerkAPIError } from './errors/clerkApiError';
+export { ClerkAPIResponseError, isClerkAPIResponseError } from './errors/clerkApiResponseError';
+export { ClerkError, isClerkError } from './errors/clerkError';
export { buildErrorThrower, type ErrorThrower, type ErrorThrowerOptions } from './errors/errorThrower';
@@ -10,15 +10,13 @@ export { EmailLinkError, EmailLinkErrorCode, EmailLinkErrorCodeStatus } from './
export type { MetamaskError } from './errors/metamaskError';
-export { ClerkRuntimeError } from './errors/clerkRuntimeError';
+export { ClerkRuntimeError, isClerkRuntimeError } from './errors/clerkRuntimeError';
export { ClerkWebAuthnError } from './errors/webAuthNError';
export {
is4xxError,
isCaptchaError,
- isClerkAPIResponseError,
- isClerkRuntimeError,
isEmailLinkError,
isKnownError,
isMetamaskError,
diff --git a/packages/shared/src/errors/clerkApiError.ts b/packages/shared/src/errors/clerkApiError.ts
index 42fc43183ee..f06339df7c7 100644
--- a/packages/shared/src/errors/clerkApiError.ts
+++ b/packages/shared/src/errors/clerkApiError.ts
@@ -1,12 +1,13 @@
import type { ClerkAPIError as ClerkAPIErrorInterface, ClerkAPIErrorJSON } from '../types';
import { createErrorTypeGuard } from './createErrorTypeGuard';
-export type ClerkApiErrorMeta = Record;
+export type ClerkAPIErrorMeta = Record;
/**
* This error contains the specific error message, code, and any additional metadata that was returned by the Clerk API.
*/
-export class ClerkAPIError implements ClerkAPIErrorInterface {
+export class ClerkAPIError implements ClerkAPIErrorInterface {
+ // TODO: Update kind to match class name in Core 3
static kind = 'ClerkApiError';
readonly code: string;
readonly message: string;
@@ -36,6 +37,6 @@ export class ClerkAPIError implements Cler
}
/**
- * Type guard to check if a value is a ClerkApiError instance.
+ * Type guard to check if a value is a ClerkAPIError instance.
*/
-export const isClerkApiError = createErrorTypeGuard(ClerkAPIError);
+export const isClerkAPIError = createErrorTypeGuard(ClerkAPIError);
diff --git a/packages/shared/src/errors/clerkApiResponseError.ts b/packages/shared/src/errors/clerkApiResponseError.ts
index 671c41bef5c..edf9dc04407 100644
--- a/packages/shared/src/errors/clerkApiResponseError.ts
+++ b/packages/shared/src/errors/clerkApiResponseError.ts
@@ -47,14 +47,14 @@ export class ClerkAPIResponseError extends ClerkError implements ClerkAPIRespons
}
/**
- * Type guard to check if an error is a ClerkApiResponseError.
+ * Type guard to check if an error is a ClerkAPIResponseError.
* Can be called as a standalone function or as a method on an error object.
*
* @example
* // As a standalone function
- * if (isClerkApiResponseError(error)) { ... }
+ * if (isClerkAPIResponseError(error)) { ... }
*
* // As a method (when attached to error object)
- * if (error.isClerkApiResponseError()) { ... }
+ * if (error.isClerkAPIResponseError()) { ... }
*/
-export const isClerkApiResponseError = createErrorTypeGuard(ClerkAPIResponseError);
+export const isClerkAPIResponseError = createErrorTypeGuard(ClerkAPIResponseError);
diff --git a/packages/shared/src/errors/globalHookError.ts b/packages/shared/src/errors/globalHookError.ts
index c4615e16234..c02c813b443 100644
--- a/packages/shared/src/errors/globalHookError.ts
+++ b/packages/shared/src/errors/globalHookError.ts
@@ -1,4 +1,4 @@
-import { isClerkApiResponseError } from './clerkApiResponseError';
+import { isClerkAPIResponseError } from './clerkApiResponseError';
import type { ClerkError } from './clerkError';
import { isClerkRuntimeError } from './clerkRuntimeError';
@@ -9,7 +9,7 @@ import { isClerkRuntimeError } from './clerkRuntimeError';
*/
export function createClerkGlobalHookError(error: ClerkError) {
const predicates = {
- isClerkApiResponseError,
+ isClerkAPIResponseError,
isClerkRuntimeError,
} as const;
diff --git a/packages/shared/src/errors/helpers.ts b/packages/shared/src/errors/helpers.ts
index 5d28681e836..b95f55d5a8c 100644
--- a/packages/shared/src/errors/helpers.ts
+++ b/packages/shared/src/errors/helpers.ts
@@ -1,5 +1,7 @@
import type { ClerkAPIResponseError } from './clerkApiResponseError';
+import { isClerkAPIResponseError } from './clerkApiResponseError';
import type { ClerkRuntimeError } from './clerkRuntimeError';
+import { isClerkRuntimeError } from './clerkRuntimeError';
import type { EmailLinkError } from './emailLinkError';
import type { MetamaskError } from './metamaskError';
@@ -55,35 +57,6 @@ export function isKnownError(error: any): error is ClerkAPIResponseError | Clerk
return isClerkAPIResponseError(error) || isMetamaskError(error) || isClerkRuntimeError(error);
}
-/**
- * Checks if the provided error is a ClerkAPIResponseError.
- *
- * @internal
- */
-export function isClerkAPIResponseError(err: any): err is ClerkAPIResponseError {
- return err && 'clerkError' in err;
-}
-
-/**
- * Checks if the provided error object is an instance of ClerkRuntimeError.
- *
- * @param err - The error object to check.
- * @returns True if the error is a ClerkRuntimeError, false otherwise.
- *
- * @example
- * const error = new ClerkRuntimeError('An error occurred');
- * if (isClerkRuntimeError(error)) {
- * // Handle ClerkRuntimeError
- * console.error('ClerkRuntimeError:', error.message);
- * } else {
- * // Handle other errors
- * console.error('Other error:', error.message);
- * }
- */
-export function isClerkRuntimeError(err: any): err is ClerkRuntimeError {
- return 'clerkRuntimeError' in err;
-}
-
/**
* Checks if the provided error is a Clerk runtime error indicating a reverification was cancelled.
*
From d4e2739422bdeea44f240c9d7637f564dce5320f Mon Sep 17 00:00:00 2001
From: Vaggelis Yfantis
Date: Thu, 18 Dec 2025 16:49:00 +0200
Subject: [PATCH 029/123] feat(backend): Mark `setPasswordCompromised` and
`unsetPasswordCompromised` as stable (#7503)
---
.changeset/tasty-eyes-take.md | 5 +++++
integration/testUtils/usersService.ts | 2 +-
packages/backend/src/api/endpoints/UserApi.ts | 4 ++--
3 files changed, 8 insertions(+), 3 deletions(-)
create mode 100644 .changeset/tasty-eyes-take.md
diff --git a/.changeset/tasty-eyes-take.md b/.changeset/tasty-eyes-take.md
new file mode 100644
index 00000000000..8ab7f8684b6
--- /dev/null
+++ b/.changeset/tasty-eyes-take.md
@@ -0,0 +1,5 @@
+---
+'@clerk/backend': minor
+---
+
+Dropping the `__experimental_` prefix from `setPasswordCompromised` and `unsetPasswordCompromised` and marking them as stable
diff --git a/integration/testUtils/usersService.ts b/integration/testUtils/usersService.ts
index 8c95b000720..cb9abc22da3 100644
--- a/integration/testUtils/usersService.ts
+++ b/integration/testUtils/usersService.ts
@@ -213,7 +213,7 @@ export const createUserService = (clerkClient: ClerkClient) => {
} satisfies FakeAPIKey;
},
setPasswordCompromised: async (userId: string) => {
- await clerkClient.users.__experimental_setPasswordCompromised(userId);
+ await clerkClient.users.setPasswordCompromised(userId);
},
};
diff --git a/packages/backend/src/api/endpoints/UserApi.ts b/packages/backend/src/api/endpoints/UserApi.ts
index 41803ef3f60..4422ed1a298 100644
--- a/packages/backend/src/api/endpoints/UserApi.ts
+++ b/packages/backend/src/api/endpoints/UserApi.ts
@@ -452,7 +452,7 @@ export class UserAPI extends AbstractAPI {
});
}
- public async __experimental_setPasswordCompromised(
+ public async setPasswordCompromised(
userId: string,
params: SetPasswordCompromisedParams = {
revokeAllSessions: false,
@@ -466,7 +466,7 @@ export class UserAPI extends AbstractAPI {
});
}
- public async __experimental_unsetPasswordCompromised(userId: string) {
+ public async unsetPasswordCompromised(userId: string) {
this.requireId(userId);
return this.request({
method: 'POST',
From 7b3024a71e6e45e926d83f1a9e887216e7c14424 Mon Sep 17 00:00:00 2001
From: Alex Carpenter
Date: Thu, 18 Dec 2025 17:08:49 -0500
Subject: [PATCH 030/123] fix(shared,elements): Configure release/core-2 branch
for production releases (#7507)
---
.changeset/silly-things-stand.md | 5 +++++
.changeset/stale-ducks-visit.md | 5 +++++
integration/tests/elements/otp.test.ts | 4 ++++
packages/shared/src/errors/createErrorTypeGuard.ts | 8 ++++++++
4 files changed, 22 insertions(+)
create mode 100644 .changeset/silly-things-stand.md
create mode 100644 .changeset/stale-ducks-visit.md
diff --git a/.changeset/silly-things-stand.md b/.changeset/silly-things-stand.md
new file mode 100644
index 00000000000..be8fadba564
--- /dev/null
+++ b/.changeset/silly-things-stand.md
@@ -0,0 +1,5 @@
+---
+'@clerk/elements': patch
+---
+
+Fix elements otp test interactions
diff --git a/.changeset/stale-ducks-visit.md b/.changeset/stale-ducks-visit.md
new file mode 100644
index 00000000000..df33b7042bd
--- /dev/null
+++ b/.changeset/stale-ducks-visit.md
@@ -0,0 +1,5 @@
+---
+'@clerk/shared': patch
+---
+
+Fix is known error issues due to cross-bundle scenarios where instanceof fails due to different class instances.
diff --git a/integration/tests/elements/otp.test.ts b/integration/tests/elements/otp.test.ts
index 59f63f3414f..ea9e5690a72 100644
--- a/integration/tests/elements/otp.test.ts
+++ b/integration/tests/elements/otp.test.ts
@@ -138,6 +138,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })('OTP @elem
await otp.pressSequentially('12');
await otp.press('ArrowLeft');
+ await expect(page.getByTestId('segmented-otp-1')).toHaveAttribute('data-status', 'selected');
await otp.pressSequentially('1');
await expect(otp).toHaveValue('11');
});
@@ -200,10 +201,13 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })('OTP @elem
await otp.press('ArrowLeft');
await otp.press('ArrowLeft');
+ // Wait for selection to update - cursor should be on index 2 (selecting "3")
+ await expect(page.getByTestId('segmented-otp-2')).toHaveAttribute('data-status', 'selected');
await otp.press('Delete');
await expect(otp).toHaveValue('124');
await otp.press('ArrowRight');
+ await expect(page.getByTestId('segmented-otp-2')).toHaveAttribute('data-status', 'selected');
await otp.press('Delete');
await expect(otp).toHaveValue('12');
});
diff --git a/packages/shared/src/errors/createErrorTypeGuard.ts b/packages/shared/src/errors/createErrorTypeGuard.ts
index aa6afe5d96d..fecb601a922 100644
--- a/packages/shared/src/errors/createErrorTypeGuard.ts
+++ b/packages/shared/src/errors/createErrorTypeGuard.ts
@@ -29,6 +29,14 @@ export function createErrorTypeGuard Value>(
if (!target) {
throw new TypeError(`${ErrorClass.kind || ErrorClass.name} type guard requires an error object`);
}
+ // Use duck-typing with 'kind' property to handle cross-bundle scenarios
+ // where instanceof fails due to different class instances
+ if (ErrorClass.kind && typeof target === 'object' && target !== null && 'constructor' in target) {
+ const targetConstructor = (target as { constructor?: { kind?: string } }).constructor;
+ if (targetConstructor?.kind === ErrorClass.kind) {
+ return true;
+ }
+ }
return target instanceof ErrorClass;
}
From 83e96f90b326018dee0d2da8b5787585121bc5c0 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Thu, 18 Dec 2025 17:38:58 -0500
Subject: [PATCH 031/123] ci(repo): Version packages (Core 2) (#7485)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/busy-frogs-type.md | 5 -----
.changeset/dirty-cougars-ask.md | 5 -----
.changeset/every-ties-help.md | 5 -----
.changeset/evil-points-fly.md | 5 -----
.changeset/hungry-icons-compete.md | 5 -----
.changeset/nice-loops-fail.md | 7 -------
.changeset/silly-things-stand.md | 5 -----
.changeset/stale-ducks-visit.md | 5 -----
.changeset/sweet-singers-beg.md | 5 -----
.changeset/swift-dolphins-thank.md | 4 ----
.changeset/tall-shoes-listen.md | 5 -----
.changeset/tame-icons-know.md | 2 --
.changeset/tasty-eyes-take.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 | 14 ++++++++++++++
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 | 11 +++++++++++
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 | 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 | 14 ++++++++++++++
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 +-
57 files changed, 242 insertions(+), 85 deletions(-)
delete mode 100644 .changeset/busy-frogs-type.md
delete mode 100644 .changeset/dirty-cougars-ask.md
delete mode 100644 .changeset/every-ties-help.md
delete mode 100644 .changeset/evil-points-fly.md
delete mode 100644 .changeset/hungry-icons-compete.md
delete mode 100644 .changeset/nice-loops-fail.md
delete mode 100644 .changeset/silly-things-stand.md
delete mode 100644 .changeset/stale-ducks-visit.md
delete mode 100644 .changeset/sweet-singers-beg.md
delete mode 100644 .changeset/swift-dolphins-thank.md
delete mode 100644 .changeset/tall-shoes-listen.md
delete mode 100644 .changeset/tame-icons-know.md
delete mode 100644 .changeset/tasty-eyes-take.md
diff --git a/.changeset/busy-frogs-type.md b/.changeset/busy-frogs-type.md
deleted file mode 100644
index e7dd1713db6..00000000000
--- a/.changeset/busy-frogs-type.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix Web3 connection error handling in ``
diff --git a/.changeset/dirty-cougars-ask.md b/.changeset/dirty-cougars-ask.md
deleted file mode 100644
index 3d1fbf351b8..00000000000
--- a/.changeset/dirty-cougars-ask.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/shared': patch
----
-
-Fix locale fallback logic to render English values when localization keys are `undefined`.
diff --git a/.changeset/every-ties-help.md b/.changeset/every-ties-help.md
deleted file mode 100644
index 6f796a8fd46..00000000000
--- a/.changeset/every-ties-help.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Add missing selected and hover states to `RolesListItem` option.
diff --git a/.changeset/evil-points-fly.md b/.changeset/evil-points-fly.md
deleted file mode 100644
index da0737489da..00000000000
--- a/.changeset/evil-points-fly.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/backend': patch
----
-
-Renaming `__experimental_passwordCompromised` to `__experimental_setPasswordCompromised` and introducing `__experimental_unsetPasswordCompromised`
diff --git a/.changeset/hungry-icons-compete.md b/.changeset/hungry-icons-compete.md
deleted file mode 100644
index c2eb499433e..00000000000
--- a/.changeset/hungry-icons-compete.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@clerk/localizations": patch
----
-
-Added waitlist translations.
diff --git a/.changeset/nice-loops-fail.md b/.changeset/nice-loops-fail.md
deleted file mode 100644
index f559d572371..00000000000
--- a/.changeset/nice-loops-fail.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@clerk/localizations': minor
-'@clerk/clerk-js': minor
-'@clerk/shared': minor
----
-
-Display message in `TaskChooseOrganization` when user is not allowed to create organizations
diff --git a/.changeset/silly-things-stand.md b/.changeset/silly-things-stand.md
deleted file mode 100644
index be8fadba564..00000000000
--- a/.changeset/silly-things-stand.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/elements': patch
----
-
-Fix elements otp test interactions
diff --git a/.changeset/stale-ducks-visit.md b/.changeset/stale-ducks-visit.md
deleted file mode 100644
index df33b7042bd..00000000000
--- a/.changeset/stale-ducks-visit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/shared': patch
----
-
-Fix is known error issues due to cross-bundle scenarios where instanceof fails due to different class instances.
diff --git a/.changeset/sweet-singers-beg.md b/.changeset/sweet-singers-beg.md
deleted file mode 100644
index 61b5eb99954..00000000000
--- a/.changeset/sweet-singers-beg.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/shared': patch
----
-
-Refactor internal Clerk error handling functions
diff --git a/.changeset/swift-dolphins-thank.md b/.changeset/swift-dolphins-thank.md
deleted file mode 100644
index 7390094ae06..00000000000
--- a/.changeset/swift-dolphins-thank.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-
----
-
diff --git a/.changeset/tall-shoes-listen.md b/.changeset/tall-shoes-listen.md
deleted file mode 100644
index 0b362bf72ae..00000000000
--- a/.changeset/tall-shoes-listen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Introduce radio group for `EnableOrganizationsPrompt`
diff --git a/.changeset/tame-icons-know.md b/.changeset/tame-icons-know.md
deleted file mode 100644
index a845151cc84..00000000000
--- a/.changeset/tame-icons-know.md
+++ /dev/null
@@ -1,2 +0,0 @@
----
----
diff --git a/.changeset/tasty-eyes-take.md b/.changeset/tasty-eyes-take.md
deleted file mode 100644
index 8ab7f8684b6..00000000000
--- a/.changeset/tasty-eyes-take.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/backend': minor
----
-
-Dropping the `__experimental_` prefix from `setPasswordCompromised` and `unsetPasswordCompromised` and marking them as stable
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index f91f558dbc4..728359a0287 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.11
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+
## 0.2.10
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 9c970792f50..b16e8f36f46 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.10",
+ "version": "0.2.11",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index c94753cf91b..ad25a36b8f9 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.16.9
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+
## 2.16.8
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index b78f29cbe32..be6585da239 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.16.8",
+ "version": "2.16.9",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 257c3e0ab5c..95529bcb8d8 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# Change Log
+## 2.28.0
+
+### Minor Changes
+
+- Dropping the `__experimental_` prefix from `setPasswordCompromised` and `unsetPasswordCompromised` and marking them as stable ([#7503](https://github.com/clerk/javascript/pull/7503)) by [@octoper](https://github.com/octoper)
+
+### Patch Changes
+
+- Renaming `__experimental_passwordCompromised` to `__experimental_setPasswordCompromised` and introducing `__experimental_unsetPasswordCompromised` ([#7477](https://github.com/clerk/javascript/pull/7477)) by [@octoper](https://github.com/octoper)
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+ - @clerk/types@4.101.8
+
## 2.27.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 83f30ee4d11..be3ced649a5 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.27.1",
+ "version": "2.28.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 f3458634721..7a0d52d999a 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.8.13
+
+### Patch Changes
+
+- Updated dependencies [[`4bcc8b6`](https://github.com/clerk/javascript/commit/4bcc8b62fcbaf2d4bdc516fe3ba3db6c93eb5a05), [`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`0f4c27e`](https://github.com/clerk/javascript/commit/0f4c27ec05401aaba3fde525f561fea79f83f1b5), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`85fea1d`](https://github.com/clerk/javascript/commit/85fea1dfda0b9b2526f52abf44e57d0b9a4790da)]:
+ - @clerk/clerk-js@5.116.0
+ - @clerk/shared@3.41.0
+ - @clerk/clerk-react@5.59.1
+
## 2.8.12
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index b351d55e713..5f5e259f784 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.12",
+ "version": "2.8.13",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 52a2998a8e3..bda50a29a6e 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,23 @@
# Change Log
+## 5.116.0
+
+### Minor Changes
+
+- Display message in `TaskChooseOrganization` when user is not allowed to create organizations ([#7502](https://github.com/clerk/javascript/pull/7502)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+### Patch Changes
+
+- Fix Web3 connection error handling in `` ([#7489](https://github.com/clerk/javascript/pull/7489)) by [@kduprey](https://github.com/kduprey)
+
+- Add missing selected and hover states to `RolesListItem` option. ([#7497](https://github.com/clerk/javascript/pull/7497)) by [@alexcarpenter](https://github.com/alexcarpenter)
+
+- Introduce radio group for `EnableOrganizationsPrompt` ([#7501](https://github.com/clerk/javascript/pull/7501)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`54cd476`](https://github.com/clerk/javascript/commit/54cd476625852983053725ec3eb42abc3ba370df), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+ - @clerk/localizations@3.32.0
+
## 5.115.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 93647928c40..4f75ae71b2e 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.115.0",
+ "version": "5.116.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index 976ae76a0db..e4c67b10be4 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,16 @@
# @clerk/elements
+## 0.24.1
+
+### Patch Changes
+
+- Fix elements otp test interactions ([#7507](https://github.com/clerk/javascript/pull/7507)) by [@alexcarpenter](https://github.com/alexcarpenter)
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 0.24.0
### Minor Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index 4f7165ce95e..d2f1a41f022 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.0",
+ "version": "0.24.1",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index b6164581e49..d9ea2baefc8 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.27
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+
## 0.4.26
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index 85a763e95db..3e21623551e 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.26",
+ "version": "0.4.27",
"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 52936045ff4..969b3bd98da 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.13
+
+### Patch Changes
+
+- Updated dependencies [[`4bcc8b6`](https://github.com/clerk/javascript/commit/4bcc8b62fcbaf2d4bdc516fe3ba3db6c93eb5a05), [`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`0f4c27e`](https://github.com/clerk/javascript/commit/0f4c27ec05401aaba3fde525f561fea79f83f1b5), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`85fea1d`](https://github.com/clerk/javascript/commit/85fea1dfda0b9b2526f52abf44e57d0b9a4790da)]:
+ - @clerk/clerk-js@5.116.0
+ - @clerk/shared@3.41.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 2.19.12
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 06bbb7991a0..9bcfc69d26c 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.12",
+ "version": "2.19.13",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index db565c081f2..b353935fda8 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.59
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+
## 1.7.58
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index e5ecc825d6c..9eff1018c70 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.58",
+ "version": "1.7.59",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index a0a0b59cc4d..64305740427 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.11
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+
## 2.6.10
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index 56761e72a22..b2d166ed8c6 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.10",
+ "version": "2.6.11",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index 4942cccac53..9f0e6fb4909 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,18 @@
# Change Log
+## 3.32.0
+
+### Minor Changes
+
+- Display message in `TaskChooseOrganization` when user is not allowed to create organizations ([#7502](https://github.com/clerk/javascript/pull/7502)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+### Patch Changes
+
+- Added waitlist translations. ([#7483](https://github.com/clerk/javascript/pull/7483)) by [@wobsoriano](https://github.com/wobsoriano)
+
+- Updated dependencies []:
+ - @clerk/types@4.101.8
+
## 3.31.0
### Minor Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index b6c9a3ee765..9dfdb378ae9 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.31.0",
+ "version": "3.32.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 21b6dbc1a76..05df2d2f895 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 6.36.4
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 6.36.3
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index e9dc41424bd..88f7e84891f 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.36.3",
+ "version": "6.36.4",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index 32625dfbdc2..3b866c36eb4 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.9
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+ - @clerk/vue@1.17.5
+
## 1.13.8
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 4ad70ee47f3..18dc914075f 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.8",
+ "version": "1.13.9",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 58430c4dc2e..6b1fd9db0c3 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.3.6
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 2.3.5
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index d741be97758..ff8edcedcfe 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.3.5",
+ "version": "2.3.6",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index a9669f8e917..e387447cf5a 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 5.59.1
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+
## 5.59.0
### Minor Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 77f4a734905..07fc0be5333 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.59.0",
+ "version": "5.59.1",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 9ecc64e6506..fe5868cdb5a 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.26
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 4.13.25
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index d51e8f86b28..d70fcb361c9 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.25",
+ "version": "4.13.26",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 60f96bdd43c..d28e18e2c39 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,19 @@
# Change Log
+## 3.41.0
+
+### Minor Changes
+
+- Display message in `TaskChooseOrganization` when user is not allowed to create organizations ([#7502](https://github.com/clerk/javascript/pull/7502)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+### Patch Changes
+
+- Fix locale fallback logic to render English values when localization keys are `undefined`. ([#7494](https://github.com/clerk/javascript/pull/7494)) by [@alexcarpenter](https://github.com/alexcarpenter)
+
+- Fix is known error issues due to cross-bundle scenarios where instanceof fails due to different class instances. ([#7507](https://github.com/clerk/javascript/pull/7507)) by [@alexcarpenter](https://github.com/alexcarpenter)
+
+- Refactor internal Clerk error handling functions ([#7490](https://github.com/clerk/javascript/pull/7490)) by [@kduprey](https://github.com/kduprey)
+
## 3.40.0
### Minor Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index c99f9f09389..91e78cbd32c 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.40.0",
+ "version": "3.41.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 deeaaed929b..034af6fb41e 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.11
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/clerk-react@5.59.1
+ - @clerk/types@4.101.8
+
## 0.27.10
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 1e15c441373..d4ccaca0983 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.10",
+ "version": "0.27.11",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index b68dc82305a..9e42105eb5c 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.13.25
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`5d25027`](https://github.com/clerk/javascript/commit/5d250277ea389695e82ec9471f1eadadf7cbc4c3), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630), [`d4e2739`](https://github.com/clerk/javascript/commit/d4e2739422bdeea44f240c9d7637f564dce5320f)]:
+ - @clerk/shared@3.41.0
+ - @clerk/backend@2.28.0
+ - @clerk/types@4.101.8
+
## 1.13.24
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index b13ff095765..45496c48458 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.24",
+ "version": "1.13.25",
"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 fd5cbc15995..cc195311d84 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.45
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+
## 2.4.44
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index f1cf7d067c7..3a9727b7e68 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.44",
+ "version": "2.4.45",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index 6062d61f779..d33f143347e 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.8
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+
## 4.101.7
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index d02fa2324f6..7488d6a0ae1 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.7",
+ "version": "4.101.8",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 06b096bf975..a5adf0ad120 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.5
+
+### Patch Changes
+
+- Updated dependencies [[`79eb5af`](https://github.com/clerk/javascript/commit/79eb5afd91d7b002faafd2980850d944acb37917), [`b3b02b4`](https://github.com/clerk/javascript/commit/b3b02b46dfa6d194ed12d2e6b9e332796ee73c4a), [`7b3024a`](https://github.com/clerk/javascript/commit/7b3024a71e6e45e926d83f1a9e887216e7c14424), [`2cd4da9`](https://github.com/clerk/javascript/commit/2cd4da9c72bc7385c0c7c71e2a7ca856d79ce630)]:
+ - @clerk/shared@3.41.0
+ - @clerk/types@4.101.8
+
## 1.17.4
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index f6404ffe835..c15c40da6c0 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.4",
+ "version": "1.17.5",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From 7c7713ff57ea3391d2e08378cee5046c9c3c357f Mon Sep 17 00:00:00 2001
From: Alexis Aguilar <98043211+alexisintech@users.noreply.github.com>
Date: Fri, 19 Dec 2025 00:02:10 -0500
Subject: [PATCH 032/123] chore(shared): Update reference link in typedoc
comment (#7514)
---
packages/shared/src/types/user.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/shared/src/types/user.ts b/packages/shared/src/types/user.ts
index 54b949411d3..87057004105 100644
--- a/packages/shared/src/types/user.ts
+++ b/packages/shared/src/types/user.ts
@@ -59,7 +59,7 @@ declare global {
/**
* The `User` object holds all of the information for a single user of your application and provides a set of methods to manage their account.
*
- * A user can be contacted at their primary email address or primary phone number. They can have more than one registered email address, but only one of them will be their primary email address. This goes for phone numbers as well; a user can have more than one, but only one phone number will be their primary. At the same time, a user can also have one or more external accounts by connecting to [social providers](https://clerk.com/docs/guides/configure/auth-strategies/social-connections/all-providers) such as Google, Apple, Facebook, and many more.
+ * A user can be contacted at their primary email address or primary phone number. They can have more than one registered email address, but only one of them will be their primary email address. This goes for phone numbers as well; a user can have more than one, but only one phone number will be their primary. At the same time, a user can also have one or more external accounts by connecting to [social providers](https://clerk.com/docs/guides/configure/auth-strategies/social-connections/overview) such as Google, Apple, Facebook, and many more.
*
* Finally, a `User` object holds profile data like the user's name, profile picture, and a set of [metadata](/docs/guides/users/extending) that can be used internally to store arbitrary information. The metadata are split into `publicMetadata` and `privateMetadata`. Both types are set from the [Backend API](https://clerk.com/docs/reference/backend-api){{ target: '_blank' }}, but public metadata can also be accessed from the [Frontend API](https://clerk.com/docs/reference/frontend-api){{ target: '_blank' }}.
*
From 03dd37458eedf59198dc3574e12030b217efcb41 Mon Sep 17 00:00:00 2001
From: Jacek Radko
Date: Fri, 19 Dec 2025 09:54:46 -0600
Subject: [PATCH 033/123] fix(repo): Use ~ instead of ^ for react peers (#7512)
(#7513)
---
.changeset/fix-react-peer-dependency-ranges.md | 12 ++++++++++++
pnpm-lock.yaml | 1 +
pnpm-workspace.yaml | 4 ++--
3 files changed, 15 insertions(+), 2 deletions(-)
create mode 100644 .changeset/fix-react-peer-dependency-ranges.md
diff --git a/.changeset/fix-react-peer-dependency-ranges.md b/.changeset/fix-react-peer-dependency-ranges.md
new file mode 100644
index 00000000000..31104eec55c
--- /dev/null
+++ b/.changeset/fix-react-peer-dependency-ranges.md
@@ -0,0 +1,12 @@
+---
+'@clerk/chrome-extension': patch
+'@clerk/clerk-expo': patch
+'@clerk/expo-passkeys': patch
+'@clerk/nextjs': patch
+'@clerk/clerk-react': patch
+'@clerk/react-router': patch
+'@clerk/shared': patch
+'@clerk/tanstack-react-start': patch
+---
+
+Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints.
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1828d41b6ec..e71b7745003 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11493,6 +11493,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
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 39b6bb4fc0d..1b25706c688 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -15,8 +15,8 @@ catalogs:
# Can be referenced through "catalog:peer-react"
peer-react:
- react: ^18.0.0 || ^19.0.0 || ^19.0.0-0
- react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0
+ react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0
+ react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0
# Can be referenced through "catalog:repo"
repo:
From ede3e2a326c9cbbd4ab09375f4bb291483681892 Mon Sep 17 00:00:00 2001
From: Alex Bratsos
Date: Fri, 19 Dec 2025 22:11:57 +0100
Subject: [PATCH 034/123] feat(backend, clerk-js): Support origin outage mode
on Core 2 (#7516)
---
.changeset/chatty-tigers-see.md | 6 +
packages/backend/src/constants.ts | 1 +
.../src/tokens/__tests__/handshake.test.ts | 34 ++++
packages/backend/src/tokens/handshake.ts | 4 +
.../clerk-js/src/core/resources/Session.ts | 11 +-
packages/clerk-js/src/core/resources/Token.ts | 6 +-
.../core/resources/__tests__/Session.test.ts | 148 ++++++++++++++++++
.../core/resources/__tests__/Token.test.ts | 45 +++++-
packages/shared/src/error.ts | 1 +
.../src/errors/missingExpiredTokenError.ts | 45 ++++++
10 files changed, 292 insertions(+), 9 deletions(-)
create mode 100644 .changeset/chatty-tigers-see.md
create mode 100644 packages/shared/src/errors/missingExpiredTokenError.ts
diff --git a/.changeset/chatty-tigers-see.md b/.changeset/chatty-tigers-see.md
new file mode 100644
index 00000000000..2b2976a03b1
--- /dev/null
+++ b/.changeset/chatty-tigers-see.md
@@ -0,0 +1,6 @@
+---
+'@clerk/clerk-js': minor
+'@clerk/backend': minor
+---
+
+Improves resilience by keeping users logged in when Clerk's origin is temporarily unavailable using edge-based token generation
diff --git a/packages/backend/src/constants.ts b/packages/backend/src/constants.ts
index c79d0b340d3..ceaa1721d37 100644
--- a/packages/backend/src/constants.ts
+++ b/packages/backend/src/constants.ts
@@ -36,6 +36,7 @@ const QueryParameters = {
HandshakeReason: '__clerk_hs_reason',
HandshakeNonce: Cookies.HandshakeNonce,
HandshakeFormat: 'format',
+ Session: '__session',
} as const;
const Headers = {
diff --git a/packages/backend/src/tokens/__tests__/handshake.test.ts b/packages/backend/src/tokens/__tests__/handshake.test.ts
index f570867edba..4ee06f80a7b 100644
--- a/packages/backend/src/tokens/__tests__/handshake.test.ts
+++ b/packages/backend/src/tokens/__tests__/handshake.test.ts
@@ -431,6 +431,40 @@ describe('HandshakeService', () => {
expect(url.searchParams.get(constants.QueryParameters.SuffixedCookies)).toMatch(/^(true|false)$/);
expect(url.searchParams.get(constants.QueryParameters.HandshakeReason)).toBe('test-reason');
});
+
+ it('should include session token in handshake URL when session token is present', () => {
+ const contextWithSession = {
+ ...mockAuthenticateContext,
+ sessionToken: 'test_session_token_123',
+ } as AuthenticateContext;
+ const serviceWithSession = new HandshakeService(contextWithSession, mockOptions, mockOrganizationMatcher);
+
+ const headers = serviceWithSession.buildRedirectToHandshake('test-reason');
+ const location = headers.get(constants.Headers.Location);
+ if (!location) {
+ throw new Error('Location header is missing');
+ }
+ const url = new URL(location);
+
+ expect(url.searchParams.get(constants.Cookies.Session)).toBe('test_session_token_123');
+ });
+
+ it('should not include session token in handshake URL when session token is absent', () => {
+ const contextWithoutSession = {
+ ...mockAuthenticateContext,
+ sessionToken: undefined,
+ } as AuthenticateContext;
+ const serviceWithoutSession = new HandshakeService(contextWithoutSession, mockOptions, mockOrganizationMatcher);
+
+ const headers = serviceWithoutSession.buildRedirectToHandshake('test-reason');
+ const location = headers.get(constants.Headers.Location);
+ if (!location) {
+ throw new Error('Location header is missing');
+ }
+ const url = new URL(location);
+
+ expect(url.searchParams.get(constants.Cookies.Session)).toBeNull();
+ });
});
describe('handleTokenVerificationErrorInDevelopment', () => {
diff --git a/packages/backend/src/tokens/handshake.ts b/packages/backend/src/tokens/handshake.ts
index c19267e0506..8b0b79ee0b0 100644
--- a/packages/backend/src/tokens/handshake.ts
+++ b/packages/backend/src/tokens/handshake.ts
@@ -149,6 +149,10 @@ export class HandshakeService {
url.searchParams.append(constants.QueryParameters.HandshakeReason, reason);
url.searchParams.append(constants.QueryParameters.HandshakeFormat, 'nonce');
+ if (this.authenticateContext.sessionToken) {
+ url.searchParams.append(constants.QueryParameters.Session, this.authenticateContext.sessionToken);
+ }
+
if (this.authenticateContext.instanceType === 'development' && this.authenticateContext.devBrowserToken) {
url.searchParams.append(constants.QueryParameters.DevBrowser, this.authenticateContext.devBrowserToken);
}
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index ee5df2c43a1..aeec7d47914 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -1,5 +1,5 @@
import { createCheckAuthorization } from '@clerk/shared/authorization';
-import { ClerkWebAuthnError, is4xxError } from '@clerk/shared/error';
+import { ClerkWebAuthnError, is4xxError, MissingExpiredTokenError } from '@clerk/shared/error';
import { retry } from '@clerk/shared/retry';
import type {
ActClaim,
@@ -399,9 +399,14 @@ export class Session extends BaseResource implements SessionResource {
// TODO: update template endpoint to accept organizationId
const params: Record = template ? {} : { organizationId };
- const tokenResolver = Token.create(path, params, skipCache);
+ const lastActiveToken = this.lastActiveToken?.getRawString();
- // Cache the promise immediately to prevent concurrent calls from triggering duplicate requests
+ const tokenResolver = Token.create(path, params, skipCache ? { debug: 'skip_cache' } : undefined).catch(e => {
+ if (MissingExpiredTokenError.is(e) && lastActiveToken) {
+ return Token.create(path, { ...params }, { expired_token: lastActiveToken });
+ }
+ throw e;
+ });
SessionTokenCache.set({ tokenId, tokenResolver });
return tokenResolver.then(token => {
diff --git a/packages/clerk-js/src/core/resources/Token.ts b/packages/clerk-js/src/core/resources/Token.ts
index 2b75d8b3c52..dcdf885fe6c 100644
--- a/packages/clerk-js/src/core/resources/Token.ts
+++ b/packages/clerk-js/src/core/resources/Token.ts
@@ -9,13 +9,11 @@ export class Token extends BaseResource implements TokenResource {
jwt?: JWT;
- static async create(path: string, body: any = {}, skipCache = false): Promise {
- const search = skipCache ? `debug=skip_cache` : undefined;
-
+ static async create(path: string, body: any = {}, search: Record = {}): Promise {
const json = (await BaseResource._fetch({
- body,
method: 'POST',
path,
+ body,
search,
})) as unknown as TokenJSON;
diff --git a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
index 4de20208046..eb51257191d 100644
--- a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
+++ b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
@@ -1,3 +1,4 @@
+import { ClerkAPIResponseError } from '@clerk/shared/error';
import type { InstanceType, OrganizationJSON, SessionJSON } from '@clerk/shared/types';
import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest';
@@ -1085,4 +1086,151 @@ describe('Session', () => {
expect(isAuthorized).toBe(true);
});
});
+
+ describe('origin outage mode fallback', () => {
+ let dispatchSpy: ReturnType;
+ let fetchSpy: ReturnType;
+
+ beforeEach(() => {
+ SessionTokenCache.clear();
+ dispatchSpy = vi.spyOn(eventBus, 'emit');
+ fetchSpy = vi.spyOn(BaseResource, '_fetch' as any);
+ BaseResource.clerk = clerkMock() as any;
+ });
+
+ afterEach(() => {
+ dispatchSpy?.mockRestore();
+ fetchSpy?.mockRestore();
+ BaseResource.clerk = null as any;
+ });
+
+ it('should retry with expired token when API returns 422 with missing_expired_token error', async () => {
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ last_active_token: { object: 'token', jwt: mockJwt },
+ actor: null,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as SessionJSON);
+
+ SessionTokenCache.clear();
+
+ const errorResponse = new ClerkAPIResponseError('Missing expired token', {
+ data: [
+ { code: 'missing_expired_token', message: 'Missing expired token', long_message: 'Missing expired token' },
+ ],
+ status: 422,
+ });
+ fetchSpy.mockRejectedValueOnce(errorResponse);
+
+ fetchSpy.mockResolvedValueOnce({ object: 'token', jwt: mockJwt });
+
+ await session.getToken();
+
+ expect(fetchSpy).toHaveBeenCalledTimes(2);
+
+ expect(fetchSpy.mock.calls[0][0]).toMatchObject({
+ path: '/client/sessions/session_1/tokens',
+ method: 'POST',
+ body: { organizationId: null },
+ });
+
+ expect(fetchSpy.mock.calls[1][0]).toMatchObject({
+ path: '/client/sessions/session_1/tokens',
+ method: 'POST',
+ body: { organizationId: null },
+ search: { expired_token: mockJwt },
+ });
+ });
+
+ it('should not retry with expired token when lastActiveToken is not available', async () => {
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ last_active_token: null,
+ actor: null,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as unknown as SessionJSON);
+
+ SessionTokenCache.clear();
+
+ const errorResponse = new ClerkAPIResponseError('Missing expired token', {
+ data: [
+ { code: 'missing_expired_token', message: 'Missing expired token', long_message: 'Missing expired token' },
+ ],
+ status: 422,
+ });
+ fetchSpy.mockRejectedValue(errorResponse);
+
+ await expect(session.getToken()).rejects.toMatchObject({
+ status: 422,
+ errors: [{ code: 'missing_expired_token' }],
+ });
+
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it('should not retry with expired token for non-422 errors', async () => {
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ last_active_token: { object: 'token', jwt: mockJwt },
+ actor: null,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as SessionJSON);
+
+ SessionTokenCache.clear();
+
+ const errorResponse = new ClerkAPIResponseError('Bad request', {
+ data: [{ code: 'bad_request', message: 'Bad request', long_message: 'Bad request' }],
+ status: 400,
+ });
+ fetchSpy.mockRejectedValueOnce(errorResponse);
+
+ await expect(session.getToken()).rejects.toThrow(ClerkAPIResponseError);
+
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it('should not retry with expired token when error code is different', async () => {
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ last_active_token: { object: 'token', jwt: mockJwt },
+ actor: null,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as unknown as SessionJSON);
+
+ SessionTokenCache.clear();
+
+ const errorResponse = new ClerkAPIResponseError('Validation failed', {
+ data: [{ code: 'validation_error', message: 'Validation failed', long_message: 'Validation failed' }],
+ status: 422,
+ });
+ fetchSpy.mockRejectedValue(errorResponse);
+
+ await expect(session.getToken()).rejects.toMatchObject({
+ status: 422,
+ errors: [{ code: 'validation_error' }],
+ });
+
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
+ });
+ });
});
diff --git a/packages/clerk-js/src/core/resources/__tests__/Token.test.ts b/packages/clerk-js/src/core/resources/__tests__/Token.test.ts
index bd1830cb4e5..d4738734267 100644
--- a/packages/clerk-js/src/core/resources/__tests__/Token.test.ts
+++ b/packages/clerk-js/src/core/resources/__tests__/Token.test.ts
@@ -137,7 +137,7 @@ describe('Token', () => {
mockFetch(true, 200, { jwt: mockJwt });
BaseResource.clerk = { getFapiClient: () => createFapiClient(baseFapiClientOptions) } as any;
- await Token.create('/path/to/tokens', {}, true);
+ await Token.create('/path/to/tokens', {}, { debug: 'skip_cache' });
const [url] = (global.fetch as Mock).mock.calls[0];
expect(url.toString()).toContain('debug=skip_cache');
@@ -147,10 +147,51 @@ describe('Token', () => {
mockFetch(true, 200, { jwt: mockJwt });
BaseResource.clerk = { getFapiClient: () => createFapiClient(baseFapiClientOptions) } as any;
- await Token.create('/path/to/tokens', {}, false);
+ await Token.create('/path/to/tokens', {});
const [url] = (global.fetch as Mock).mock.calls[0];
expect(url.toString()).not.toContain('debug=skip_cache');
});
});
+
+ describe('create with search parameters', () => {
+ afterEach(() => {
+ (global.fetch as Mock)?.mockClear();
+ BaseResource.clerk = null as any;
+ });
+
+ it('should include search parameters in the API request', async () => {
+ mockFetch(true, 200, { object: 'token', jwt: mockJwt });
+ BaseResource.clerk = { getFapiClient: () => createFapiClient(baseFapiClientOptions) } as any;
+
+ await Token.create('/path/to/tokens', {}, { expired_token: 'some_expired_token' });
+
+ expect(global.fetch).toHaveBeenCalledTimes(1);
+ const [url, options] = (global.fetch as Mock).mock.calls[0];
+ expect(url.toString()).toContain('https://clerk.example.com/v1/path/to/tokens');
+ expect(url.toString()).toContain('expired_token=some_expired_token');
+ expect(options).toMatchObject({
+ method: 'POST',
+ credentials: 'include',
+ headers: expect.any(Headers),
+ });
+ });
+
+ it('should work without search parameters (backward compatibility)', async () => {
+ mockFetch(true, 200, { object: 'token', jwt: mockJwt });
+ BaseResource.clerk = { getFapiClient: () => createFapiClient(baseFapiClientOptions) } as any;
+
+ await Token.create('/path/to/tokens');
+
+ expect(global.fetch).toHaveBeenCalledTimes(1);
+ const [url, options] = (global.fetch as Mock).mock.calls[0];
+ expect(url.toString()).toContain('https://clerk.example.com/v1/path/to/tokens');
+ expect(options).toMatchObject({
+ method: 'POST',
+ body: '',
+ credentials: 'include',
+ headers: expect.any(Headers),
+ });
+ });
+ });
});
diff --git a/packages/shared/src/error.ts b/packages/shared/src/error.ts
index 3f034067234..328a363015e 100644
--- a/packages/shared/src/error.ts
+++ b/packages/shared/src/error.ts
@@ -3,6 +3,7 @@ export { errorToJSON, parseError, parseErrors } from './errors/parseError';
export { ClerkAPIError, isClerkAPIError } from './errors/clerkApiError';
export { ClerkAPIResponseError, isClerkAPIResponseError } from './errors/clerkApiResponseError';
export { ClerkError, isClerkError } from './errors/clerkError';
+export { MissingExpiredTokenError } from './errors/missingExpiredTokenError';
export { buildErrorThrower, type ErrorThrower, type ErrorThrowerOptions } from './errors/errorThrower';
diff --git a/packages/shared/src/errors/missingExpiredTokenError.ts b/packages/shared/src/errors/missingExpiredTokenError.ts
new file mode 100644
index 00000000000..2b3d15396e0
--- /dev/null
+++ b/packages/shared/src/errors/missingExpiredTokenError.ts
@@ -0,0 +1,45 @@
+import { ClerkAPIResponseError, isClerkAPIResponseError } from './clerkApiResponseError';
+
+/**
+ * Error class representing a missing expired token error from the API.
+ * This error occurs when the server requires an expired token to mint a new session token.
+ *
+ * Use the static `is` method to check if a ClerkAPIResponseError matches this error type.
+ *
+ * @example
+ * ```typescript
+ * if (MissingExpiredTokenError.is(error)) {
+ * // Handle the missing expired token error
+ * }
+ * ```
+ */
+export class MissingExpiredTokenError extends ClerkAPIResponseError {
+ static kind = 'MissingExpiredTokenError';
+ static readonly ERROR_CODE = 'missing_expired_token' as const;
+ static readonly STATUS = 422 as const;
+
+ /**
+ * Type guard to check if an error is a MissingExpiredTokenError.
+ * This checks the error's properties (status and error code) rather than instanceof,
+ * allowing it to work with ClerkAPIResponseError instances thrown from the API layer.
+ *
+ * @example
+ * ```typescript
+ * try {
+ * await someApiCall();
+ * } catch (e) {
+ * if (MissingExpiredTokenError.is(e)) {
+ * // e is typed as ClerkAPIResponseError with the specific error properties
+ * }
+ * }
+ * ```
+ */
+ static is(err: unknown): err is ClerkAPIResponseError {
+ return (
+ isClerkAPIResponseError(err) &&
+ err.status === MissingExpiredTokenError.STATUS &&
+ err.errors.length > 0 &&
+ err.errors[0].code === MissingExpiredTokenError.ERROR_CODE
+ );
+ }
+}
From 491444205c807291edf9d0cfc2b844c846c3bb94 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Fri, 19 Dec 2025 21:34:15 +0000
Subject: [PATCH 035/123] ci(repo): Version packages (Core 2) (#7515)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/chatty-tigers-see.md | 6 ------
.changeset/fix-react-peer-dependency-ranges.md | 12 ------------
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 | 12 ++++++++++++
packages/backend/package.json | 2 +-
packages/chrome-extension/CHANGELOG.md | 11 +++++++++++
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 | 9 +++++++++
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 | 7 +++++++
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 | 12 ++++++++++++
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 | 12 ++++++++++++
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 +-
46 files changed, 232 insertions(+), 40 deletions(-)
delete mode 100644 .changeset/chatty-tigers-see.md
delete mode 100644 .changeset/fix-react-peer-dependency-ranges.md
diff --git a/.changeset/chatty-tigers-see.md b/.changeset/chatty-tigers-see.md
deleted file mode 100644
index 2b2976a03b1..00000000000
--- a/.changeset/chatty-tigers-see.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@clerk/clerk-js': minor
-'@clerk/backend': minor
----
-
-Improves resilience by keeping users logged in when Clerk's origin is temporarily unavailable using edge-based token generation
diff --git a/.changeset/fix-react-peer-dependency-ranges.md b/.changeset/fix-react-peer-dependency-ranges.md
deleted file mode 100644
index 31104eec55c..00000000000
--- a/.changeset/fix-react-peer-dependency-ranges.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@clerk/chrome-extension': patch
-'@clerk/clerk-expo': patch
-'@clerk/expo-passkeys': patch
-'@clerk/nextjs': patch
-'@clerk/clerk-react': patch
-'@clerk/react-router': patch
-'@clerk/shared': patch
-'@clerk/tanstack-react-start': patch
----
-
-Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints.
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 728359a0287..9b7f758311f 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.12
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 0.2.11
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index b16e8f36f46..516b44ede90 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.11",
+ "version": "0.2.12",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index ad25a36b8f9..f18e9460050 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.16.10
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 2.16.9
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index be6585da239..7e69a8391ad 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.16.9",
+ "version": "2.16.10",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 95529bcb8d8..5b7494c229f 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 2.29.0
+
+### Minor Changes
+
+- Improves resilience by keeping users logged in when Clerk's origin is temporarily unavailable using edge-based token generation ([#7516](https://github.com/clerk/javascript/pull/7516)) by [@bratsos](https://github.com/bratsos)
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 2.28.0
### Minor Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index be3ced649a5..a2d0543f834 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.28.0",
+ "version": "2.29.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 7a0d52d999a..6de2b913d4c 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,16 @@
# Change Log
+## 2.8.14
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/clerk-js@5.117.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+
## 2.8.13
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 5f5e259f784..a12c002fdfe 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.13",
+ "version": "2.8.14",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index bda50a29a6e..4e5bc7211ac 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 5.117.0
+
+### Minor Changes
+
+- Improves resilience by keeping users logged in when Clerk's origin is temporarily unavailable using edge-based token generation ([#7516](https://github.com/clerk/javascript/pull/7516)) by [@bratsos](https://github.com/bratsos)
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+ - @clerk/localizations@3.32.1
+
## 5.116.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 4f75ae71b2e..3918adba23b 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.116.0",
+ "version": "5.117.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index e4c67b10be4..77f7396fad2 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/elements
+## 0.24.2
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 0.24.1
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index d2f1a41f022..79230863750 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.1",
+ "version": "0.24.2",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index d9ea2baefc8..e3715009645 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/expo-passkeys
+## 0.4.28
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+
## 0.4.27
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index 3e21623551e..eb05903f1d4 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.27",
+ "version": "0.4.28",
"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 969b3bd98da..dc51f1954cd 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 2.19.14
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/clerk-js@5.117.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 2.19.13
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 9bcfc69d26c..4a171834516 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.13",
+ "version": "2.19.14",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index b353935fda8..2ab808b76e0 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.60
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 1.7.59
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index 9eff1018c70..849df12355f 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.59",
+ "version": "1.7.60",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index 64305740427..79e018ff735 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.12
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 2.6.11
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index b2d166ed8c6..bbc38f648b5 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.11",
+ "version": "2.6.12",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index 9f0e6fb4909..e15c822c209 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 3.32.1
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @clerk/types@4.101.9
+
## 3.32.0
### Minor Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index 9dfdb378ae9..3458d28b488 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.32.0",
+ "version": "3.32.1",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 05df2d2f895..a9029d311e6 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 6.36.5
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 6.36.4
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 88f7e84891f..11a0866cdf4 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.36.4",
+ "version": "6.36.5",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index 3b866c36eb4..155a649b9fb 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.10
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+ - @clerk/vue@1.17.6
+
## 1.13.9
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 18dc914075f..47f52562cce 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.9",
+ "version": "1.13.10",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 6b1fd9db0c3..5110aec81d2 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 2.3.7
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 2.3.6
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index ff8edcedcfe..db7e53beda2 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.3.6",
+ "version": "2.3.7",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index e387447cf5a..7d9f37fb51b 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 5.59.2
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+
## 5.59.1
### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 07fc0be5333..f7fde1dccd6 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.59.1",
+ "version": "5.59.2",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index fe5868cdb5a..1423d753835 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.27
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 4.13.26
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index d70fcb361c9..b4f6aba85cd 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.26",
+ "version": "4.13.27",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index d28e18e2c39..4962d310702 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 3.41.1
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
## 3.41.0
### Minor Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 91e78cbd32c..acbbab8c0c9 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.41.0",
+ "version": "3.41.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 034af6fb41e..ad09c6fef32 100644
--- a/packages/tanstack-react-start/CHANGELOG.md
+++ b/packages/tanstack-react-start/CHANGELOG.md
@@ -1,5 +1,17 @@
# @clerk/tanstack-react-start
+## 0.27.12
+
+### Patch Changes
+
+- Fix React peer dependency version ranges to use `~` instead of `^` for React 19 versions, ensuring non-overlapping version constraints. ([#7513](https://github.com/clerk/javascript/pull/7513)) by [@jacekradko](https://github.com/jacekradko)
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/clerk-react@5.59.2
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 0.27.11
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index d4ccaca0983..cbf500b550c 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.11",
+ "version": "0.27.12",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index 9e42105eb5c..49e0d68a87f 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.13.26
+
+### Patch Changes
+
+- Updated dependencies [[`ede3e2a`](https://github.com/clerk/javascript/commit/ede3e2a326c9cbbd4ab09375f4bb291483681892), [`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/backend@2.29.0
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 1.13.25
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index 45496c48458..06e76d590de 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.25",
+ "version": "1.13.26",
"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 cc195311d84..b82682a9a0e 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.46
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+
## 2.4.45
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 3a9727b7e68..5b576dea6b9 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.45",
+ "version": "2.4.46",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index d33f143347e..1fd22e3b890 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.9
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+
## 4.101.8
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index 7488d6a0ae1..a5bae56894c 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.8",
+ "version": "4.101.9",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index a5adf0ad120..0c2af5b3d4c 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.6
+
+### Patch Changes
+
+- Updated dependencies [[`03dd374`](https://github.com/clerk/javascript/commit/03dd37458eedf59198dc3574e12030b217efcb41)]:
+ - @clerk/shared@3.41.1
+ - @clerk/types@4.101.9
+
## 1.17.5
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index c15c40da6c0..694cfbd05cd 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.5",
+ "version": "1.17.6",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From 2eaa829b5ddb1e08c241163c94bf73675170143e Mon Sep 17 00:00:00 2001
From: Alex Carpenter
Date: Mon, 5 Jan 2026 16:36:35 -0500
Subject: [PATCH 036/123] fix(clerk-js): Add data variant and color props to
text component (#7535)
---
.changeset/eleven-bears-end.md | 5 +++++
packages/clerk-js/src/ui/primitives/Text.tsx | 2 ++
2 files changed, 7 insertions(+)
create mode 100644 .changeset/eleven-bears-end.md
diff --git a/.changeset/eleven-bears-end.md b/.changeset/eleven-bears-end.md
new file mode 100644
index 00000000000..ceece87e320
--- /dev/null
+++ b/.changeset/eleven-bears-end.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Add `data-variant` and `data-color` attributes to the Text component.
diff --git a/packages/clerk-js/src/ui/primitives/Text.tsx b/packages/clerk-js/src/ui/primitives/Text.tsx
index 93ec00b736d..a430b165cb3 100644
--- a/packages/clerk-js/src/ui/primitives/Text.tsx
+++ b/packages/clerk-js/src/ui/primitives/Text.tsx
@@ -48,6 +48,8 @@ export const Text = React.forwardRef((props, ref) => {
return (
From a4e693262f734bfd3ab08ffac019168c874c2bd8 Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Wed, 7 Jan 2026 07:29:06 -0300
Subject: [PATCH 037/123] chore(clerk-js,shared,localizations): Display role
sets migration status in `OrganizationProfile` (#7541)
---
.changeset/wicked-wings-lie.md | 7 +
packages/clerk-js/bundlewatch.config.json | 2 +-
.../src/core/resources/Organization.ts | 9 +-
.../OrganizationProfile/ActiveMembersList.tsx | 8 +-
.../OrganizationProfile/InviteMembersForm.tsx | 4 +-
.../OrganizationMembers.tsx | 14 ++
.../__tests__/InviteMembersPage.test.tsx | 52 ++++-
.../__tests__/OrganizationMembers.test.tsx | 211 ++++++++++++++++++
packages/clerk-js/src/ui/elements/Alert.tsx | 10 +-
.../clerk-js/src/ui/hooks/useFetchRoles.ts | 1 +
packages/localizations/src/ar-SA.ts | 6 +
packages/localizations/src/be-BY.ts | 6 +
packages/localizations/src/bg-BG.ts | 6 +
packages/localizations/src/bn-IN.ts | 6 +
packages/localizations/src/ca-ES.ts | 6 +
packages/localizations/src/cs-CZ.ts | 6 +
packages/localizations/src/da-DK.ts | 6 +
packages/localizations/src/de-DE.ts | 7 +
packages/localizations/src/el-GR.ts | 7 +
packages/localizations/src/en-GB.ts | 6 +
packages/localizations/src/en-US.ts | 6 +
packages/localizations/src/es-CR.ts | 7 +
packages/localizations/src/es-ES.ts | 7 +
packages/localizations/src/es-MX.ts | 7 +
packages/localizations/src/es-UY.ts | 7 +
packages/localizations/src/fa-IR.ts | 7 +
packages/localizations/src/fi-FI.ts | 6 +
packages/localizations/src/fr-FR.ts | 7 +
packages/localizations/src/he-IL.ts | 6 +
packages/localizations/src/hi-IN.ts | 7 +
packages/localizations/src/hr-HR.ts | 6 +
packages/localizations/src/hu-HU.ts | 6 +
packages/localizations/src/id-ID.ts | 7 +
packages/localizations/src/is-IS.ts | 6 +
packages/localizations/src/it-IT.ts | 7 +
packages/localizations/src/ja-JP.ts | 6 +
packages/localizations/src/kk-KZ.ts | 6 +
packages/localizations/src/ko-KR.ts | 6 +
packages/localizations/src/mn-MN.ts | 7 +
packages/localizations/src/ms-MY.ts | 7 +
packages/localizations/src/nb-NO.ts | 6 +
packages/localizations/src/nl-BE.ts | 7 +
packages/localizations/src/nl-NL.ts | 7 +
packages/localizations/src/pl-PL.ts | 6 +
packages/localizations/src/pt-BR.ts | 7 +
packages/localizations/src/pt-PT.ts | 7 +
packages/localizations/src/ro-RO.ts | 7 +
packages/localizations/src/ru-RU.ts | 6 +
packages/localizations/src/sk-SK.ts | 6 +
packages/localizations/src/sr-RS.ts | 6 +
packages/localizations/src/sv-SE.ts | 6 +
packages/localizations/src/ta-IN.ts | 7 +
packages/localizations/src/te-IN.ts | 7 +
packages/localizations/src/th-TH.ts | 6 +
packages/localizations/src/tr-TR.ts | 6 +
packages/localizations/src/uk-UA.ts | 6 +
packages/localizations/src/vi-VN.ts | 6 +
packages/localizations/src/zh-CN.ts | 6 +
packages/localizations/src/zh-TW.ts | 6 +
packages/shared/src/types/localization.ts | 6 +
packages/shared/src/types/organization.ts | 6 +-
61 files changed, 631 insertions(+), 13 deletions(-)
create mode 100644 .changeset/wicked-wings-lie.md
diff --git a/.changeset/wicked-wings-lie.md b/.changeset/wicked-wings-lie.md
new file mode 100644
index 00000000000..06b9b696b34
--- /dev/null
+++ b/.changeset/wicked-wings-lie.md
@@ -0,0 +1,7 @@
+---
+'@clerk/localizations': minor
+'@clerk/clerk-js': minor
+'@clerk/shared': minor
+---
+
+Disable role selection in `OrganizationProfile` during role set migration
diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json
index aea3cd9128a..584bbf4d296 100644
--- a/packages/clerk-js/bundlewatch.config.json
+++ b/packages/clerk-js/bundlewatch.config.json
@@ -4,7 +4,7 @@
{ "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*.js", "maxSize": "123KB" },
{ "path": "./dist/ui-common*.legacy.*.js", "maxSize": "123KB" },
{ "path": "./dist/vendors*.js", "maxSize": "50KB" },
{ "path": "./dist/coinbase*.js", "maxSize": "38KB" },
diff --git a/packages/clerk-js/src/core/resources/Organization.ts b/packages/clerk-js/src/core/resources/Organization.ts
index ac2568191bf..875aa0141d6 100644
--- a/packages/clerk-js/src/core/resources/Organization.ts
+++ b/packages/clerk-js/src/core/resources/Organization.ts
@@ -95,11 +95,18 @@ export class Organization extends BaseResource implements OrganizationResource {
forceUpdateClient: true,
},
).then(res => {
- const { data: roles, total_count } = res?.response as unknown as ClerkPaginatedResponse;
+ const {
+ data: roles,
+ total_count,
+ has_role_set_migration,
+ } = res?.response as unknown as ClerkPaginatedResponse & {
+ has_role_set_migration?: boolean;
+ };
return {
total_count,
data: roles.map(role => new Role(role)),
+ has_role_set_migration,
};
});
};
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx
index f4badb83534..acb28b9cfaa 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/ActiveMembersList.tsx
@@ -20,7 +20,7 @@ export const ActiveMembersList = ({ memberships, pageSize }: ActiveMembersListPr
const card = useCardState();
const { organization } = useOrganization();
- const { options, isLoading: loadingRoles } = useFetchRoles();
+ const { options, isLoading: loadingRoles, hasRoleSetMigration } = useFetchRoles();
if (!organization) {
return null;
@@ -61,6 +61,7 @@ export const ActiveMembersList = ({ memberships, pageSize }: ActiveMembersListPr
options={options}
onRoleChange={handleRoleChange(m)}
onRemove={handleRemove(m)}
+ hasRoleSetMigration={hasRoleSetMigration}
/>
))}
/>
@@ -73,8 +74,9 @@ const MemberRow = (props: {
onRemove: () => unknown;
options: Parameters[0]['roles'];
onRoleChange: (role: string) => unknown;
+ hasRoleSetMigration: boolean;
}) => {
- const { membership, onRemove, onRoleChange, options } = props;
+ const { membership, onRemove, onRoleChange, options, hasRoleSetMigration } = props;
const { localizeCustomRole } = useLocalizeCustomRoles();
const card = useCardState();
const { user } = useUser();
@@ -112,7 +114,7 @@ const MemberRow = (props: {
}
>
{
};
const AsyncRoleSelect = (field: ReturnType>) => {
- const { options, isLoading } = useFetchRoles();
+ const { options, isLoading, hasRoleSetMigration } = useFetchRoles();
const { t } = useLocalizations();
@@ -212,7 +212,7 @@ const AsyncRoleSelect = (field: ReturnType>) => {
field.setValue(value)}
triggerSx={t => ({ minWidth: t.sizes.$40, justifyContent: 'space-between', display: 'flex' })}
optionListSx={t => ({ minWidth: t.sizes.$48 })}
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationMembers.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationMembers.tsx
index 57b98fd8e7e..83175235d6c 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationMembers.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationMembers.tsx
@@ -1,11 +1,13 @@
import { useOrganization } from '@clerk/shared/react';
import { useState } from 'react';
+import { Alert } from '@/ui/elements/Alert';
import { Animated } from '@/ui/elements/Animated';
import { Card } from '@/ui/elements/Card';
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { Tab, TabPanel, TabPanels, Tabs, TabsList } from '@/ui/elements/Tabs';
+import { useFetchRoles } from '@/ui/hooks/useFetchRoles';
import { NotificationCountBadge, useProtect } from '../../common';
import { useEnvironment, useOrganizationProfileContext } from '../../contexts';
@@ -24,6 +26,7 @@ export const ACTIVE_MEMBERS_PAGE_SIZE = 10;
export const OrganizationMembers = withCardStateProvider(() => {
const { organizationSettings } = useEnvironment();
const card = useCardState();
+ const { hasRoleSetMigration } = useFetchRoles();
const canManageMemberships = useProtect({ permission: 'org:sys_memberships:manage' });
const canReadMemberships = useProtect({ permission: 'org:sys_memberships:read' });
const isDomainsEnabled = organizationSettings?.domains?.enabled && canManageMemberships;
@@ -142,6 +145,17 @@ export const OrganizationMembers = withCardStateProvider(() => {
/>
}
/>
+ {hasRoleSetMigration && (
+
+ )}
{
clearFetchCache();
});
+ it('disables the role select when role set migration is in progress', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ organization_memberships: [{ name: 'Org1', role: 'admin' }],
+ });
+ });
+
+ fixtures.clerk.organization?.getInvitations.mockRejectedValue(null);
+ fixtures.clerk.organization?.getRoles.mockResolvedValue({
+ total_count: 2,
+ has_role_set_migration: true,
+ data: [
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'member',
+ key: 'member',
+ name: 'member',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'admin',
+ key: 'admin',
+ name: 'Admin',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ],
+ });
+
+ const { getByRole } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await waitFor(() => {
+ expect(getByRole('button', { name: /select role/i })).toBeDisabled();
+ });
+ });
+
it('renders the component', async () => {
const { wrapper, fixtures } = await createFixtures(f => {
f.withOrganizations();
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/OrganizationMembers.test.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/OrganizationMembers.test.tsx
index 1f9596b427e..7a65ad0da98 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/OrganizationMembers.test.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/OrganizationMembers.test.tsx
@@ -561,6 +561,217 @@ describe('OrganizationMembers', () => {
await waitFor(() => expect(getByRole('button', { name: 'Managed Admin' })).toBeDisabled());
});
+ it('disables the role select when role set migration is in progress', async () => {
+ const membersList: OrganizationMembershipResource[] = [
+ createFakeMember({
+ id: '1',
+ orgId: '1',
+ role: 'admin',
+ identifier: 'test_user1',
+ firstName: 'First1',
+ lastName: 'Last1',
+ createdAt: new Date('2022-01-01'),
+ }),
+ createFakeMember({
+ id: '2',
+ orgId: '1',
+ role: 'member',
+ identifier: 'test_user2',
+ firstName: 'First2',
+ lastName: 'Last2',
+ createdAt: new Date('2022-01-01'),
+ }),
+ ];
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ organization_memberships: [{ name: 'Org1', id: '1' }],
+ });
+ });
+
+ fixtures.clerk.organization?.getInvitations.mockRejectedValue(null);
+
+ fixtures.clerk.organization?.getMemberships.mockReturnValue(
+ Promise.resolve({
+ data: membersList,
+ total_count: 2,
+ }),
+ );
+
+ fixtures.clerk.organization?.getRoles.mockResolvedValue({
+ total_count: 2,
+ has_role_set_migration: true,
+ data: [
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'member',
+ key: 'member',
+ name: 'Member',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'admin',
+ key: 'admin',
+ name: 'Admin',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ],
+ });
+
+ const { container, queryAllByRole } = render(, { wrapper });
+
+ await waitForLoadingCompleted(container);
+
+ const adminButtons = queryAllByRole('button', { name: 'Admin' });
+ const memberButtons = queryAllByRole('button', { name: 'Member' });
+
+ adminButtons.forEach(button => expect(button).toBeDisabled());
+ memberButtons.forEach(button => expect(button).toBeDisabled());
+ });
+
+ it('displays a warning alert when role set migration is in progress', async () => {
+ const membersList: OrganizationMembershipResource[] = [
+ createFakeMember({
+ id: '1',
+ orgId: '1',
+ role: 'admin',
+ identifier: 'test_user1',
+ firstName: 'First1',
+ lastName: 'Last1',
+ createdAt: new Date('2022-01-01'),
+ }),
+ ];
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ organization_memberships: [{ name: 'Org1', id: '1' }],
+ });
+ });
+
+ fixtures.clerk.organization?.getInvitations.mockRejectedValue(null);
+
+ fixtures.clerk.organization?.getMemberships.mockReturnValue(
+ Promise.resolve({
+ data: membersList,
+ total_count: 1,
+ }),
+ );
+
+ fixtures.clerk.organization?.getRoles.mockResolvedValue({
+ total_count: 2,
+ has_role_set_migration: true,
+ data: [
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'member',
+ key: 'member',
+ name: 'Member',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'admin',
+ key: 'admin',
+ name: 'Admin',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ],
+ });
+
+ const { container, getByText } = render(, { wrapper });
+
+ await waitForLoadingCompleted(container);
+
+ expect(getByText('Roles are temporarily locked')).toBeInTheDocument();
+ expect(
+ getByText("We are updating the available roles. Once that's done, you'll be able to update roles again."),
+ ).toBeInTheDocument();
+ });
+
+ it('does not display a warning alert when role set migration is not in progress', async () => {
+ const membersList: OrganizationMembershipResource[] = [
+ createFakeMember({
+ id: '1',
+ orgId: '1',
+ role: 'admin',
+ identifier: 'test_user1',
+ firstName: 'First1',
+ lastName: 'Last1',
+ createdAt: new Date('2022-01-01'),
+ }),
+ ];
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ organization_memberships: [{ name: 'Org1', id: '1' }],
+ });
+ });
+
+ fixtures.clerk.organization?.getInvitations.mockRejectedValue(null);
+
+ fixtures.clerk.organization?.getMemberships.mockReturnValue(
+ Promise.resolve({
+ data: membersList,
+ total_count: 1,
+ }),
+ );
+
+ fixtures.clerk.organization?.getRoles.mockResolvedValue({
+ total_count: 2,
+ has_role_set_migration: false,
+ data: [
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'member',
+ key: 'member',
+ name: 'Member',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'admin',
+ key: 'admin',
+ name: 'Admin',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ],
+ });
+
+ const { container, queryByText } = render(, { wrapper });
+
+ await waitForLoadingCompleted(container);
+
+ expect(queryByText('Roles are temporarily locked')).not.toBeInTheDocument();
+ });
+
describe('InviteMembersScreen', () => {
it('shows the invite screen when user clicks on Invite button', async () => {
const { wrapper, fixtures } = await createFixtures(f => {
diff --git a/packages/clerk-js/src/ui/elements/Alert.tsx b/packages/clerk-js/src/ui/elements/Alert.tsx
index b4f8470b116..ce0f13ee5a6 100644
--- a/packages/clerk-js/src/ui/elements/Alert.tsx
+++ b/packages/clerk-js/src/ui/elements/Alert.tsx
@@ -17,6 +17,8 @@ export const Alert = (props: AlertProps): JSX.Element | null => {
return null;
}
+ const textColorScheme = variant === 'danger' ? 'danger' : variant === 'warning' ? 'warning' : 'secondary';
+
return (
{
elementDescriptor={descriptors.alertTextContainer}
elementId={descriptors.alertTextContainer.setId(variant)}
gap={1}
+ sx={{ textAlign: 'left' }}
>
{children}
@@ -52,7 +54,7 @@ export const Alert = (props: AlertProps): JSX.Element | null => {
diff --git a/packages/clerk-js/src/ui/hooks/useFetchRoles.ts b/packages/clerk-js/src/ui/hooks/useFetchRoles.ts
index 4e50dfd4dc8..73aaead6de8 100644
--- a/packages/clerk-js/src/ui/hooks/useFetchRoles.ts
+++ b/packages/clerk-js/src/ui/hooks/useFetchRoles.ts
@@ -30,6 +30,7 @@ export const useFetchRoles = (enabled = true) => {
return {
isLoading,
+ hasRoleSetMigration: !!data?.has_role_set_migration,
options: data?.data?.map(role => ({ value: role.key, label: role.name })),
};
};
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index 8219352bd45..cefa475456c 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -395,6 +395,12 @@ export const arSA: LocalizationResource = {
headerTitle__members: 'الأعضاء',
headerTitle__requests: 'الطلبات',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'الأدوار مقفلة مؤقتًا',
+ subtitle: 'نحن نقوم بتحديث الأدوار المتاحة. بمجرد الانتهاء، ستتمكن من تحديث الأدوار مرة أخرى.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index fad84fc092d..c476e39c547 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -396,6 +396,12 @@ export const beBY: LocalizationResource = {
headerTitle__members: 'Удзельнікі',
headerTitle__requests: 'Заявкі',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Ролі часова заблакіраваны',
+ subtitle: 'Мы абнаўляем даступныя ролі. Калі гэта будзе зроблена, вы зможаце абнавіць ролі зноў.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index 73d77460986..7c52e9ba2a9 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -396,6 +396,12 @@ export const bgBG: LocalizationResource = {
headerTitle__members: 'Членове',
headerTitle__requests: 'Заявки',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Ролите са временно заключени',
+ subtitle: 'Актуализираме наличните роли. Когато това приключи, ще можете отново да актуализирате ролите.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index 8964e3de11c..8872a94a90c 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -397,6 +397,12 @@ export const bnIN: LocalizationResource = {
headerTitle__members: 'সদস্য',
headerTitle__requests: 'অনুরোধ',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'ভূমিকাগুলি সাময়িকভাবে লক করা আছে',
+ subtitle: 'আমরা উপলব্ধ ভূমিকাগুলি আপডেট করছি। এটি সম্পন্ন হলে, আপনি আবার ভূমিকা আপডেট করতে পারবেন।',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index 1c420ebf6d7..c435041f257 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -396,6 +396,12 @@ export const caES: LocalizationResource = {
headerTitle__members: 'Membres',
headerTitle__requests: 'Sol·licituds',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Els rols estan temporalment bloquejats',
+ subtitle: 'Estem actualitzant els rols disponibles. Un cop fet, podreu tornar a actualitzar els rols.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index af4ec4d21b2..d2ed96040fb 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -401,6 +401,12 @@ export const csCZ: LocalizationResource = {
headerTitle__members: 'Členové',
headerTitle__requests: 'Žádosti',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Role jsou dočasně uzamčeny',
+ subtitle: 'Aktualizujeme dostupné role. Jakmile to bude hotové, budete moci role opět aktualizovat.',
+ },
+ },
},
navbar: {
apiKeys: 'API klíče',
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index 8735a5df6d4..f92ca01c05e 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -395,6 +395,12 @@ export const daDK: LocalizationResource = {
headerTitle__members: 'Medlemmer',
headerTitle__requests: 'Anmodninger',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roller er midlertidigt låst',
+ subtitle: 'Vi opdaterer de tilgængelige roller. Når det er gjort, vil du kunne opdatere roller igen.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index 69e01764480..3dc8c7d1302 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -405,6 +405,13 @@ export const deDE: LocalizationResource = {
headerTitle__members: 'Mitglieder',
headerTitle__requests: 'Anfragen',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Rollen sind vorübergehend gesperrt',
+ subtitle:
+ 'Wir aktualisieren die verfügbaren Rollen. Sobald dies abgeschlossen ist, können Sie die Rollen wieder aktualisieren.',
+ },
+ },
},
navbar: {
apiKeys: 'API-Keys',
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index 4ba594ab96c..3d529a88328 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -396,6 +396,13 @@ export const elGR: LocalizationResource = {
headerTitle__members: 'Members',
headerTitle__requests: 'Requests',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Οι ρόλοι είναι προσωρινά κλειδωμένοι',
+ subtitle:
+ 'Ενημερώνουμε τους διαθέσιμους ρόλους. Μόλις ολοκληρωθεί, θα μπορείτε να ενημερώσετε ξανά τους ρόλους.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index 57e2a3ed202..d21fd9f7f27 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -396,6 +396,12 @@ export const enGB: LocalizationResource = {
headerTitle__members: 'Members',
headerTitle__requests: 'Requests',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roles are temporarily locked',
+ subtitle: "We are updating the available roles. Once that's done, you'll be able to update roles again.",
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index ab3a3a11c24..d2890bbdbb1 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -387,6 +387,12 @@ export const enUS: LocalizationResource = {
tableHeader__requested: 'Requested access',
table__emptyRow: 'No requests to display',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roles are temporarily locked',
+ subtitle: "We are updating the available roles. Once that's done, you'll be able to update roles again.",
+ },
+ },
start: {
headerTitle__invitations: 'Invitations',
headerTitle__members: 'Members',
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index 1d4a2766065..9fde4d49c51 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -397,6 +397,13 @@ export const esCR: LocalizationResource = {
headerTitle__members: 'Miembros',
headerTitle__requests: 'Solicitudes',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Los roles están temporalmente bloqueados',
+ subtitle:
+ 'Estamos actualizando los roles disponibles. Una vez hecho esto, podrás actualizar los roles de nuevo.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index c0eb4e51ab3..4bfe2c76da9 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -396,6 +396,13 @@ export const esES: LocalizationResource = {
headerTitle__members: 'Miembros',
headerTitle__requests: 'Solicitudes',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Los roles están temporalmente bloqueados',
+ subtitle:
+ 'Estamos actualizando los roles disponibles. Una vez hecho esto, podrás actualizar los roles de nuevo.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 9c2ddc6945e..41e9502237f 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -398,6 +398,13 @@ export const esMX: LocalizationResource = {
headerTitle__members: 'Miembros',
headerTitle__requests: 'Solicitudes',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Los roles están temporalmente bloqueados',
+ subtitle:
+ 'Estamos actualizando los roles disponibles. Una vez hecho esto, podrás actualizar los roles de nuevo.',
+ },
+ },
},
navbar: {
apiKeys: 'Claves API',
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index 8c23b39578f..58decff52c0 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -397,6 +397,13 @@ export const esUY: LocalizationResource = {
headerTitle__members: 'Miembros',
headerTitle__requests: 'Solicitudes',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Los roles están temporalmente bloqueados',
+ subtitle:
+ 'Estamos actualizando los roles disponibles. Una vez hecho esto, podrás actualizar los roles de nuevo.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index 70aa713cea0..4cc7255f6d4 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -402,6 +402,13 @@ export const faIR: LocalizationResource = {
headerTitle__members: 'اعضا',
headerTitle__requests: 'درخواستها',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'نقشها موقتاً قفل شدهاند',
+ subtitle:
+ 'ما در حال بهروزرسانی نقشهای موجود هستیم. پس از اتمام، میتوانید دوباره نقشها را بهروزرسانی کنید.',
+ },
+ },
},
navbar: {
apiKeys: 'کلیدهای API',
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 1fd6d7c3b4a..113b8743b38 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -396,6 +396,12 @@ export const fiFI: LocalizationResource = {
headerTitle__members: 'Jäsenet',
headerTitle__requests: 'Pyyntöjä',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roolit on tilapäisesti lukittu',
+ subtitle: 'Päivitämme käytettävissä olevia rooleja. Kun se on tehty, voit päivittää rooleja uudelleen.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index 68783d6c650..1744ec79468 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -406,6 +406,13 @@ export const frFR: LocalizationResource = {
headerTitle__members: 'Membres',
headerTitle__requests: 'Demandes',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Les rôles sont temporairement verrouillés',
+ subtitle:
+ 'Nous mettons à jour les rôles disponibles. Une fois terminé, vous pourrez de nouveau modifier les rôles.',
+ },
+ },
},
navbar: {
apiKeys: 'Clés API',
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index 656df81db94..c7be2ce15b3 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -393,6 +393,12 @@ export const heIL: LocalizationResource = {
headerTitle__members: 'חברים',
headerTitle__requests: 'בקשות',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'התפקידים נעולים זמנית',
+ subtitle: 'אנחנו מעדכנים את התפקידים הזמינים. לאחר שזה יסתיים, תוכל לעדכן תפקידים שוב.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index 834cae04381..09ed3790157 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -397,6 +397,13 @@ export const hiIN: LocalizationResource = {
headerTitle__members: 'सदस्य',
headerTitle__requests: 'अनुरोध',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'भूमिकाएं अस्थायी रूप से लॉक हैं',
+ subtitle:
+ 'हम उपलब्ध भूमिकाओं को अपडेट कर रहे हैं। एक बार यह हो जाने के बाद, आप फिर से भूमिकाएं अपडेट कर सकेंगे।',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index 33d08de6c9a..e22e1620b37 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -395,6 +395,12 @@ export const hrHR: LocalizationResource = {
headerTitle__members: 'Članovi',
headerTitle__requests: 'Zahtjevi',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Uloge su privremeno zaključane',
+ subtitle: 'Ažuriramo dostupne uloge. Kada to završimo, moći ćete ponovno ažurirati uloge.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index f2c37364a6c..a3d50826cb7 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -395,6 +395,12 @@ export const huHU: LocalizationResource = {
headerTitle__members: 'Tagok',
headerTitle__requests: 'Kérések',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'A szerepkörök ideiglenesen zárolva vannak',
+ subtitle: 'Frissítjük az elérhető szerepköröket. Ha ez befejeződött, újra frissítheti a szerepköröket.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index be17526be27..49cd92a729a 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -396,6 +396,13 @@ export const idID: LocalizationResource = {
headerTitle__members: 'Anggota',
headerTitle__requests: 'Permintaan',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Peran untuk sementara terkunci',
+ subtitle:
+ 'Kami sedang memperbarui peran yang tersedia. Setelah selesai, Anda akan dapat memperbarui peran lagi.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index 8b4d4dbb689..68d03bfe6a7 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -396,6 +396,12 @@ export const isIS: LocalizationResource = {
headerTitle__members: 'Meðlimir',
headerTitle__requests: 'Beiðnir',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Hlutverk eru tímabundið læst',
+ subtitle: 'Við erum að uppfæra tiltæk hlutverk. Þegar því er lokið geturðu uppfært hlutverk aftur.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index 5ae69b5abf0..f80973e313e 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -403,6 +403,13 @@ export const itIT: LocalizationResource = {
headerTitle__members: 'Membri',
headerTitle__requests: 'Richieste',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'I ruoli sono temporaneamente bloccati',
+ subtitle:
+ 'Stiamo aggiornando i ruoli disponibili. Una volta completato, potrai aggiornare nuovamente i ruoli.',
+ },
+ },
},
navbar: {
apiKeys: 'Chiavi API',
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index 688db95ed37..7a1204b8b38 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -403,6 +403,12 @@ export const jaJP: LocalizationResource = {
headerTitle__members: 'メンバー',
headerTitle__requests: 'リクエスト',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'ロールは一時的にロックされています',
+ subtitle: '利用可能なロールを更新しています。完了次第、ロールを再度更新できるようになります。',
+ },
+ },
},
navbar: {
apiKeys: 'APIキー',
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index 6d6962a51bc..2407c54455e 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -392,6 +392,12 @@ export const kkKZ: LocalizationResource = {
headerTitle__members: 'Мүшелер',
headerTitle__requests: 'Сұраулар',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Рөлдер уақытша құлыпталған',
+ subtitle: 'Қолжетімді рөлдерді жаңартып жатырмыз. Бұл аяқталғаннан кейін рөлдерді қайта жаңарта аласыз.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index a23c0947d99..6c72224f218 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -395,6 +395,12 @@ export const koKR: LocalizationResource = {
headerTitle__members: 'Members',
headerTitle__requests: 'Requests',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: '역할이 일시적으로 잠겨 있습니다',
+ subtitle: '사용 가능한 역할을 업데이트하고 있습니다. 완료되면 다시 역할을 업데이트할 수 있습니다.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index 75f5036e6b6..6837c413d76 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -396,6 +396,13 @@ export const mnMN: LocalizationResource = {
headerTitle__members: 'Гишүүд',
headerTitle__requests: 'Хүсэлтүүд',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Дүрүүд түр хугацаанд түгжигдсэн байна',
+ subtitle:
+ 'Бид боломжтой дүрүүдийг шинэчилж байна. Дууссаны дараа та дүрүүдийг дахин шинэчлэх боломжтой болно.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index c8a7b0567f8..8d075694b63 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -397,6 +397,13 @@ export const msMY: LocalizationResource = {
headerTitle__members: 'Ahli',
headerTitle__requests: 'Permintaan',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Peranan dikunci buat sementara waktu',
+ subtitle:
+ 'Kami sedang mengemas kini peranan yang tersedia. Setelah selesai, anda akan dapat mengemas kini peranan semula.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 04090d716b8..154129c29f7 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -395,6 +395,12 @@ export const nbNO: LocalizationResource = {
headerTitle__members: 'Medlemmer',
headerTitle__requests: 'Forespørsler',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roller er midlertidig låst',
+ subtitle: 'Vi oppdaterer tilgjengelige roller. Når det er gjort, vil du kunne oppdatere roller igjen.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index b16b7e84c84..dd07a867645 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -395,6 +395,13 @@ export const nlBE: LocalizationResource = {
headerTitle__members: 'Leden',
headerTitle__requests: 'Verzoeken',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Rollen zijn tijdelijk vergrendeld',
+ subtitle:
+ 'We zijn de beschikbare rollen aan het bijwerken. Zodra dit klaar is, kunt u de rollen opnieuw bijwerken.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index 261104f23a7..03ad74e51e9 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -395,6 +395,13 @@ export const nlNL: LocalizationResource = {
headerTitle__members: 'Leden',
headerTitle__requests: 'Verzoeken',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Rollen zijn tijdelijk vergrendeld',
+ subtitle:
+ 'We zijn de beschikbare rollen aan het bijwerken. Zodra dit klaar is, kunt u de rollen opnieuw bijwerken.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index 76c4579f659..d68af4cce6a 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -395,6 +395,12 @@ export const plPL: LocalizationResource = {
headerTitle__members: 'Członkowie',
headerTitle__requests: 'Prośby',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Role są tymczasowo zablokowane',
+ subtitle: 'Aktualizujemy dostępne role. Po zakończeniu będziesz mógł ponownie aktualizować role.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index 219efe09126..161b854621d 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -403,6 +403,13 @@ export const ptBR: LocalizationResource = {
headerTitle__members: 'Membros',
headerTitle__requests: 'Solicitações',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'As funções estão temporariamente bloqueadas',
+ subtitle:
+ 'Estamos atualizando as funções disponíveis. Assim que isso for concluído, você poderá atualizar as funções novamente.',
+ },
+ },
},
navbar: {
apiKeys: 'Chaves de API',
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index 71ee25db9fb..f9986a65ff4 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -394,6 +394,13 @@ export const ptPT: LocalizationResource = {
headerTitle__members: 'Membros',
headerTitle__requests: 'Pedidos',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'As funções estão temporariamente bloqueadas',
+ subtitle:
+ 'Estamos a atualizar as funções disponíveis. Assim que terminar, poderá atualizar as funções novamente.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index 45dc8ea5ee3..f01fc26ac51 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -403,6 +403,13 @@ export const roRO: LocalizationResource = {
headerTitle__members: 'Membri',
headerTitle__requests: 'Ceri de acces',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Rolurile sunt temporar blocate',
+ subtitle:
+ 'Actualizăm rolurile disponibile. Odată ce acest lucru este finalizat, veți putea actualiza din nou rolurile.',
+ },
+ },
},
navbar: {
apiKeys: 'Chei API',
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index ec888bae6d9..bdf68f7412c 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -399,6 +399,12 @@ export const ruRU: LocalizationResource = {
headerTitle__members: 'Участники',
headerTitle__requests: 'Заявки',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Роли временно заблокированы',
+ subtitle: 'Мы обновляем доступные роли. Как только это будет сделано, вы сможете снова обновлять роли.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index 67ad6b556e8..9f063d921e2 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -395,6 +395,12 @@ export const skSK: LocalizationResource = {
headerTitle__members: 'Členovia',
headerTitle__requests: 'Požiadavky',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Úlohy sú dočasne uzamknuté',
+ subtitle: 'Aktualizujeme dostupné úlohy. Po dokončení budete môcť úlohy opäť aktualizovať.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 27657268b6d..5de49fb787e 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -395,6 +395,12 @@ export const srRS: LocalizationResource = {
headerTitle__members: 'Članovi',
headerTitle__requests: 'Zahtevi',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Uloge su privremeno zaključane',
+ subtitle: 'Ažuriramo dostupne uloge. Kada to bude završeno, moći ćete ponovo da ažurirate uloge.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index cc1dacd089d..aeec07f2ae4 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -395,6 +395,12 @@ export const svSE: LocalizationResource = {
headerTitle__members: 'Medlemmar',
headerTitle__requests: 'Förfrågningar',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roller är tillfälligt låsta',
+ subtitle: 'Vi uppdaterar tillgängliga roller. När det är klart kommer du att kunna uppdatera roller igen.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index c88a85443e8..681dacc6608 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -398,6 +398,13 @@ export const taIN: LocalizationResource = {
headerTitle__members: 'உறுப்பினர்கள்',
headerTitle__requests: 'கோரிக்கைகள்',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'பாத்திரங்கள் தற்காலிகமாக பூட்டப்பட்டுள்ளன',
+ subtitle:
+ 'கிடைக்கக்கூடிய பாத்திரங்களை நாங்கள் புதுப்பிக்கிறோம். இது முடிந்ததும், நீங்கள் மீண்டும் பாத்திரங்களை புதுப்பிக்க முடியும்.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index e6c0d4bc09b..fa9a240d203 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -397,6 +397,13 @@ export const teIN: LocalizationResource = {
headerTitle__members: 'సభ్యులు',
headerTitle__requests: 'అభ్యర్థనలు',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'పాత్రలు తాత్కాలికంగా లాక్ చేయబడ్డాయి',
+ subtitle:
+ 'మేము అందుబాటులో ఉన్న పాత్రలను అప్డేట్ చేస్తున్నాము. అది పూర్తయిన తర్వాత, మీరు మళ్ళీ పాత్రలను అప్డేట్ చేయగలరు.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index 4cc588927ac..b8d0bd34b32 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -399,6 +399,12 @@ export const thTH: LocalizationResource = {
headerTitle__members: 'สมาชิก',
headerTitle__requests: 'คำขอ',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'บทบาทถูกล็อคชั่วคราว',
+ subtitle: 'เรากำลังอัปเดตบทบาทที่มีอยู่ เมื่อเสร็จแล้ว คุณจะสามารถอัปเดตบทบาทได้อีกครั้ง',
+ },
+ },
},
navbar: {
apiKeys: 'คีย์ API',
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index 68fa90e72c7..27a653f3aff 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -395,6 +395,12 @@ export const trTR: LocalizationResource = {
headerTitle__members: 'Üyeler',
headerTitle__requests: 'İstekler',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Roller geçici olarak kilitlendi',
+ subtitle: 'Mevcut rolleri güncelliyoruz. Bu tamamlandığında rolleri tekrar güncelleyebileceksiniz.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 18d9f87cea1..7c99c1ada83 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -395,6 +395,12 @@ export const ukUA: LocalizationResource = {
headerTitle__members: 'Members',
headerTitle__requests: 'Requests',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Ролі тимчасово заблоковані',
+ subtitle: 'Ми оновлюємо доступні ролі. Коли це буде зроблено, ви зможете знову оновлювати ролі.',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index dfb230cd6bc..71e95786f9d 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -401,6 +401,12 @@ export const viVN: LocalizationResource = {
headerTitle__members: 'Thành viên',
headerTitle__requests: 'Yêu cầu',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: 'Các vai trò tạm thời bị khóa',
+ subtitle: 'Chúng tôi đang cập nhật các vai trò có sẵn. Sau khi hoàn tất, bạn sẽ có thể cập nhật vai trò lại.',
+ },
+ },
},
navbar: {
apiKeys: 'Khoá API',
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 17668e096ef..07b0b060af7 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -391,6 +391,12 @@ export const zhCN: LocalizationResource = {
headerTitle__members: '成员',
headerTitle__requests: '请求',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: '角色暂时被锁定',
+ subtitle: '我们正在更新可用角色。完成后,您将能够再次更新角色。',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index faa7a024fda..4ed15697262 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -391,6 +391,12 @@ export const zhTW: LocalizationResource = {
headerTitle__members: '成員',
headerTitle__requests: '請求',
},
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: '角色暫時被鎖定',
+ subtitle: '我們正在更新可用角色。完成後,您將能夠再次更新角色。',
+ },
+ },
},
navbar: {
apiKeys: undefined,
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index a8f3f980653..9e789d9c8fa 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -1128,6 +1128,12 @@ export type __internal_LocalizationResource = {
primaryButton: LocalizationValue;
};
};
+ alerts: {
+ roleSetMigrationInProgress: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ };
+ };
};
billingPage: {
title: LocalizationValue;
diff --git a/packages/shared/src/types/organization.ts b/packages/shared/src/types/organization.ts
index 28114128076..98ced75e217 100644
--- a/packages/shared/src/types/organization.ts
+++ b/packages/shared/src/types/organization.ts
@@ -51,7 +51,7 @@ export interface OrganizationResource extends ClerkResource, BillingPayerMethods
update: (params: UpdateOrganizationParams) => Promise;
getMemberships: GetMemberships;
getInvitations: (params?: GetInvitationsParams) => Promise>;
- getRoles: (params?: GetRolesParams) => Promise>;
+ getRoles: (params?: GetRolesParams) => Promise;
getDomains: (params?: GetDomainsParams) => Promise>;
getMembershipRequests: (
params?: GetMembershipRequestParams,
@@ -70,6 +70,10 @@ export interface OrganizationResource extends ClerkResource, BillingPayerMethods
export type GetRolesParams = ClerkPaginationParams;
+export interface GetRolesResponse extends ClerkPaginatedResponse {
+ has_role_set_migration?: boolean;
+}
+
export type GetMembersParams = ClerkPaginationParams<{
role?: OrganizationCustomRoleKey[];
query?: string;
From 9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea Mon Sep 17 00:00:00 2001
From: Nikos Douvlis
Date: Wed, 7 Jan 2026 14:09:16 +0200
Subject: [PATCH 038/123] fix(backend): bundle cookie package to fix cjs/esm
issues (#7545)
---
.changeset/rotten-months-repair.md | 6 ++++++
packages/backend/package.json | 2 +-
packages/backend/tsup.config.ts | 2 +-
pnpm-lock.yaml | 9 +++++----
4 files changed, 13 insertions(+), 6 deletions(-)
create mode 100644 .changeset/rotten-months-repair.md
diff --git a/.changeset/rotten-months-repair.md b/.changeset/rotten-months-repair.md
new file mode 100644
index 00000000000..eec944008d8
--- /dev/null
+++ b/.changeset/rotten-months-repair.md
@@ -0,0 +1,6 @@
+---
+"@clerk/backend": patch
+---
+
+Move cookie to devDependencies and bundle it within @clerk/backend to fix module compatibility problems in TanStack Start apps.
+
diff --git a/packages/backend/package.json b/packages/backend/package.json
index a2d0543f834..f3642df9004 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -111,12 +111,12 @@
"dependencies": {
"@clerk/shared": "workspace:^",
"@clerk/types": "workspace:^",
- "cookie": "1.0.2",
"standardwebhooks": "^1.0.0",
"tslib": "catalog:repo"
},
"devDependencies": {
"@edge-runtime/vm": "5.0.0",
+ "cookie": "1.0.2",
"msw": "2.11.6",
"npm-run-all": "^4.1.5",
"snakecase-keys": "9.0.2",
diff --git a/packages/backend/tsup.config.ts b/packages/backend/tsup.config.ts
index 70ad241fe25..a501053eb06 100644
--- a/packages/backend/tsup.config.ts
+++ b/packages/backend/tsup.config.ts
@@ -21,7 +21,7 @@ export default defineConfig(overrideOptions => {
bundle: true,
clean: true,
minify: false,
- noExternal: ['snakecase-keys'],
+ noExternal: ['snakecase-keys', 'cookie'],
};
const esm: Options = {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e71b7745003..0e18b9953f2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -366,9 +366,6 @@ importers:
'@clerk/types':
specifier: workspace:^
version: link:../types
- cookie:
- specifier: 1.0.2
- version: 1.0.2
standardwebhooks:
specifier: ^1.0.0
version: 1.0.0
@@ -379,6 +376,9 @@ importers:
'@edge-runtime/vm':
specifier: 5.0.0
version: 5.0.0
+ cookie:
+ specifier: 1.0.2
+ version: 1.0.2
msw:
specifier: 2.11.6
version: 2.11.6(@types/node@24.7.2)(typescript@5.8.3)
@@ -11493,7 +11493,6 @@ 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
@@ -15211,10 +15210,12 @@ packages:
whatwg-encoding@2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
From f880c5ee0407395e08be3a3eb9785611dee9f111 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Wed, 7 Jan 2026 08:08:40 -0500
Subject: [PATCH 039/123] ci(repo): Version packages (Core 2) (#7536)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/eleven-bears-end.md | 5 -----
.changeset/rotten-months-repair.md | 6 ------
.changeset/wicked-wings-lie.md | 7 -------
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 | 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 | 11 +++++++++++
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, 222 insertions(+), 40 deletions(-)
delete mode 100644 .changeset/eleven-bears-end.md
delete mode 100644 .changeset/rotten-months-repair.md
delete mode 100644 .changeset/wicked-wings-lie.md
diff --git a/.changeset/eleven-bears-end.md b/.changeset/eleven-bears-end.md
deleted file mode 100644
index ceece87e320..00000000000
--- a/.changeset/eleven-bears-end.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Add `data-variant` and `data-color` attributes to the Text component.
diff --git a/.changeset/rotten-months-repair.md b/.changeset/rotten-months-repair.md
deleted file mode 100644
index eec944008d8..00000000000
--- a/.changeset/rotten-months-repair.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@clerk/backend": patch
----
-
-Move cookie to devDependencies and bundle it within @clerk/backend to fix module compatibility problems in TanStack Start apps.
-
diff --git a/.changeset/wicked-wings-lie.md b/.changeset/wicked-wings-lie.md
deleted file mode 100644
index 06b9b696b34..00000000000
--- a/.changeset/wicked-wings-lie.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@clerk/localizations': minor
-'@clerk/clerk-js': minor
-'@clerk/shared': minor
----
-
-Disable role selection in `OrganizationProfile` during role set migration
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 9b7f758311f..911a97f7cff 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.13
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 0.2.12
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 516b44ede90..3a498d696ec 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.12",
+ "version": "0.2.13",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index f18e9460050..acdb9646b22 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.16.11
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 2.16.10
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 7e69a8391ad..3767017a6fb 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.16.10",
+ "version": "2.16.11",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 5b7494c229f..1c852d36075 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.29.1
+
+### Patch Changes
+
+- Move cookie to devDependencies and bundle it within @clerk/backend to fix module compatibility problems in TanStack Start apps. ([#7545](https://github.com/clerk/javascript/pull/7545)) by [@nikosdouvlis](https://github.com/nikosdouvlis)
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 2.29.0
### Minor Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index f3642df9004..f180690ed7e 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.29.0",
+ "version": "2.29.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 6de2b913d4c..ba6f4543afa 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.8.15
+
+### Patch Changes
+
+- Updated dependencies [[`2eaa829`](https://github.com/clerk/javascript/commit/2eaa829b5ddb1e08c241163c94bf73675170143e), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/clerk-js@5.118.0
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+
## 2.8.14
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index a12c002fdfe..179bd792496 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.14",
+ "version": "2.8.15",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 4e5bc7211ac..e11e8edbf81 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,19 @@
# Change Log
+## 5.118.0
+
+### Minor Changes
+
+- Disable role selection in `OrganizationProfile` during role set migration ([#7541](https://github.com/clerk/javascript/pull/7541)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+### Patch Changes
+
+- Add `data-variant` and `data-color` attributes to the Text component. ([#7535](https://github.com/clerk/javascript/pull/7535)) by [@alexcarpenter](https://github.com/alexcarpenter)
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/localizations@3.33.0
+ - @clerk/shared@3.42.0
+
## 5.117.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 3918adba23b..444890cd361 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.117.0",
+ "version": "5.118.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index 77f7396fad2..4801cf03979 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/elements
+## 0.24.3
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 0.24.2
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index 79230863750..8f0074744bf 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.2",
+ "version": "0.24.3",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index e3715009645..6f7d4d6ec62 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.29
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+
## 0.4.28
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index eb05903f1d4..a117d7a3756 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.28",
+ "version": "0.4.29",
"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 dc51f1954cd..b493a9a12c7 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.15
+
+### Patch Changes
+
+- Updated dependencies [[`2eaa829`](https://github.com/clerk/javascript/commit/2eaa829b5ddb1e08c241163c94bf73675170143e), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/clerk-js@5.118.0
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 2.19.14
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 4a171834516..d9f0ae89885 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.14",
+ "version": "2.19.15",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 2ab808b76e0..0dd18ed4619 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.61
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 1.7.60
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index 849df12355f..9d0bdbf4f4c 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.60",
+ "version": "1.7.61",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index 79e018ff735..d2a694df9d3 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.13
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 2.6.12
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index bbc38f648b5..204729b8daa 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.12",
+ "version": "2.6.13",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index e15c822c209..ee8baec40d5 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,16 @@
# Change Log
+## 3.33.0
+
+### Minor Changes
+
+- Disable role selection in `OrganizationProfile` during role set migration ([#7541](https://github.com/clerk/javascript/pull/7541)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @clerk/types@4.101.10
+
## 3.32.1
### Patch Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index 3458d28b488..f805aca4ba1 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.32.1",
+ "version": "3.33.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index a9029d311e6..46f67cc013d 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 6.36.6
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 6.36.5
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 11a0866cdf4..de002ef3d50 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.36.5",
+ "version": "6.36.6",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index 155a649b9fb..a32ba8c576d 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.11
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+ - @clerk/vue@1.17.7
+
## 1.13.10
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 47f52562cce..5b984a3a9d4 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.10",
+ "version": "1.13.11",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 5110aec81d2..c533d68d2ab 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.3.8
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 2.3.7
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index db7e53beda2..401825737aa 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.3.7",
+ "version": "2.3.8",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 7d9f37fb51b..6a873f370c9 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 5.59.3
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+
## 5.59.2
### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index f7fde1dccd6..a3dd622e09a 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.59.2",
+ "version": "5.59.3",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 1423d753835..d5d128b9880 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.28
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 4.13.27
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index b4f6aba85cd..f9e4e9e0bfd 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.27",
+ "version": "4.13.28",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 4962d310702..0e9520675c9 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 3.42.0
+
+### Minor Changes
+
+- Disable role selection in `OrganizationProfile` during role set migration ([#7541](https://github.com/clerk/javascript/pull/7541)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
## 3.41.1
### Patch Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index acbbab8c0c9..a566d852757 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.41.1",
+ "version": "3.42.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 ad09c6fef32..97de836df2c 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.13
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/clerk-react@5.59.3
+ - @clerk/types@4.101.10
+
## 0.27.12
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index cbf500b550c..9c3c6cea7e6 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.12",
+ "version": "0.27.13",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index 49e0d68a87f..cf5a0c6e0b3 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.13.27
+
+### Patch Changes
+
+- Updated dependencies [[`9320c4f`](https://github.com/clerk/javascript/commit/9320c4f9dde7d9a4732cdb3a9ca71e8a720a8dea), [`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/backend@2.29.1
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 1.13.26
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index 06e76d590de..d781eb093f0 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.26",
+ "version": "1.13.27",
"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 b82682a9a0e..5091a383dd8 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.47
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+
## 2.4.46
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 5b576dea6b9..b4bb35ada2e 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.46",
+ "version": "2.4.47",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index 1fd22e3b890..f7b5cdbfac6 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.10
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+
## 4.101.9
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index a5bae56894c..249c1375f19 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.9",
+ "version": "4.101.10",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 0c2af5b3d4c..de5e2a64993 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.7
+
+### Patch Changes
+
+- Updated dependencies [[`a4e6932`](https://github.com/clerk/javascript/commit/a4e693262f734bfd3ab08ffac019168c874c2bd8)]:
+ - @clerk/shared@3.42.0
+ - @clerk/types@4.101.10
+
## 1.17.6
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 694cfbd05cd..5cc3b627e27 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.6",
+ "version": "1.17.7",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From b800900d721d36d508881ef48e363791f461e0bf Mon Sep 17 00:00:00 2001
From: Austin Calvelage
Date: Wed, 7 Jan 2026 12:00:27 -0700
Subject: [PATCH 040/123] feat(clerk-js): Ability to set password from user
profile when password is enabled and not required (#7549)
---
.changeset/moody-bugs-film.md | 5 +++++
packages/clerk-js/src/core/resources/UserSettings.ts | 2 +-
.../src/core/resources/__tests__/UserSettings.test.ts | 11 +++++++++++
.../UserProfile/__tests__/SecurityPage.test.tsx | 4 +---
4 files changed, 18 insertions(+), 4 deletions(-)
create mode 100644 .changeset/moody-bugs-film.md
diff --git a/.changeset/moody-bugs-film.md b/.changeset/moody-bugs-film.md
new file mode 100644
index 00000000000..86a399faca8
--- /dev/null
+++ b/.changeset/moody-bugs-film.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': minor
+---
+
+When password is enabled at the instance level, but not required allow users to add a password in the user profile.
diff --git a/packages/clerk-js/src/core/resources/UserSettings.ts b/packages/clerk-js/src/core/resources/UserSettings.ts
index 8af85ab38c8..ed5951b7037 100644
--- a/packages/clerk-js/src/core/resources/UserSettings.ts
+++ b/packages/clerk-js/src/core/resources/UserSettings.ts
@@ -191,7 +191,7 @@ export class UserSettings extends BaseResource implements UserSettingsResource {
}
get instanceIsPasswordBased() {
- return Boolean(this.attributes?.password?.enabled && this.attributes.password?.required);
+ return Boolean(this.attributes?.password?.enabled);
}
get hasValidAuthFactor() {
diff --git a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts
index e3ec7d04cca..e87df8e5028 100644
--- a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts
+++ b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts
@@ -75,6 +75,17 @@ describe('UserSettings', () => {
},
},
} as any as UserSettingsJSON);
+ expect(sut.instanceIsPasswordBased).toEqual(true);
+
+ sut = new UserSettings({
+ attributes: {
+ password: {
+ enabled: false,
+ required: false,
+ },
+ },
+ } as any as UserSettingsJSON);
+
expect(sut.instanceIsPasswordBased).toEqual(false);
});
diff --git a/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx b/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx
index 47f8004c652..d74c50398f5 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx
@@ -33,9 +33,7 @@ describe('SecurityPage', () => {
it('renders the Password section if instance is password based', async () => {
const { wrapper, fixtures } = await createFixtures(f => {
- f.withPassword({
- required: true,
- });
+ f.withPassword();
f.withUser({ email_addresses: ['test@clerk.com'] });
});
fixtures.clerk.user?.getSessions.mockReturnValue(Promise.resolve([]));
From 6b26afcc784f6e8344cf6ff0b1ef69c14019fe66 Mon Sep 17 00:00:00 2001
From: Robert Soriano
Date: Wed, 7 Jan 2026 15:06:14 -0800
Subject: [PATCH 041/123] fix(backend): Handle token type array in
`authenticateRequest` (#7556)
Co-authored-by: Ayush2k02
---
.changeset/lucky-pigs-look.md | 5 +
.../src/tokens/__tests__/request.test.ts | 98 ++++++++++++++++++-
packages/backend/src/tokens/request.ts | 2 +-
3 files changed, 102 insertions(+), 3 deletions(-)
create mode 100644 .changeset/lucky-pigs-look.md
diff --git a/.changeset/lucky-pigs-look.md b/.changeset/lucky-pigs-look.md
new file mode 100644
index 00000000000..9705ee128b9
--- /dev/null
+++ b/.changeset/lucky-pigs-look.md
@@ -0,0 +1,5 @@
+---
+"@clerk/backend": patch
+---
+
+Fixed an issue when using multiple `acceptsToken` values in `authenticateRequest`. When `acceptsToken` is an array containing both session and machine token types (e.g., `['session_token', 'api_key']`), the function now correctly routes to the appropriate authentication handler based on the actual token type, instead of always treating them as machine tokens.
diff --git a/packages/backend/src/tokens/__tests__/request.test.ts b/packages/backend/src/tokens/__tests__/request.test.ts
index 0d140f8b093..450da616de5 100644
--- a/packages/backend/src/tokens/__tests__/request.test.ts
+++ b/packages/backend/src/tokens/__tests__/request.test.ts
@@ -1393,7 +1393,7 @@ describe('tokens.authenticateRequest(options)', () => {
});
describe('Array of Accepted Token Types', () => {
- test('accepts token when it is in the acceptsToken array', async () => {
+ test('accepts machine token when it is in the acceptsToken array', async () => {
server.use(
http.post(mockMachineAuthResponses.api_key.endpoint, () => {
return HttpResponse.json(mockVerificationResults.api_key);
@@ -1409,8 +1409,83 @@ describe('tokens.authenticateRequest(options)', () => {
expect(requestState).toBeMachineAuthenticated();
});
- test('returns unauthenticated state when token type is not in the acceptsToken array', async () => {
+ test('accepts session token in header when session_token is in the acceptsToken array', async () => {
+ server.use(
+ http.get('https://api.clerk.test/v1/jwks', () => {
+ return HttpResponse.json(mockJwks);
+ }),
+ );
+
+ const request = mockRequest({ authorization: `Bearer ${mockJwt}` });
+ const requestState = await authenticateRequest(
+ request,
+ mockOptions({ acceptsToken: ['session_token', 'api_key'] }),
+ );
+
+ expect(requestState).toBeSignedIn();
+ expect(requestState.toAuth()).toBeSignedInToAuth();
+ });
+
+ test('accepts session token in cookie when session_token is in the acceptsToken array', async () => {
+ server.use(
+ http.get('https://api.clerk.test/v1/jwks', () => {
+ return HttpResponse.json(mockJwks);
+ }),
+ );
+
+ const requestState = await authenticateRequest(
+ mockRequestWithCookies(
+ {},
+ {
+ __session: mockJwt,
+ __client_uat: '12345',
+ },
+ ),
+ mockOptions({ acceptsToken: ['session_token', 'api_key'] }),
+ );
+
+ // The key assertion: session token is accepted (not rejected as invalid token)
+ // Cookie-based auth may trigger handshake flow, but should not return TokenTypeMismatch
+ expect(requestState.tokenType).not.toBeNull();
+ expect(requestState.reason).not.toBe(AuthErrorReason.TokenTypeMismatch);
+ });
+
+ test('accepts machine token when acceptsToken array contains mixed token types', async () => {
+ server.use(
+ http.post(mockMachineAuthResponses.m2m_token.endpoint, () => {
+ return HttpResponse.json(mockVerificationResults.m2m_token);
+ }),
+ );
+
const request = mockRequest({ authorization: `Bearer ${mockTokens.m2m_token}` });
+ const requestState = await authenticateRequest(
+ request,
+ mockOptions({ acceptsToken: ['session_token', 'm2m_token'] }),
+ );
+
+ expect(requestState).toBeMachineAuthenticated();
+ });
+
+ test('returns unauthenticated state when machine token type is not in the acceptsToken array', async () => {
+ const request = mockRequest({ authorization: `Bearer ${mockTokens.m2m_token}` });
+ const requestState = await authenticateRequest(
+ request,
+ mockOptions({ acceptsToken: ['api_key', 'oauth_token'] }),
+ );
+
+ expect(requestState).toBeMachineUnauthenticated({
+ tokenType: null,
+ reason: AuthErrorReason.TokenTypeMismatch,
+ message: '',
+ });
+ expect(requestState.toAuth()).toBeMachineUnauthenticatedToAuth({
+ tokenType: null,
+ isAuthenticated: false,
+ });
+ });
+
+ test('returns unauthenticated state when session token is provided but not in the acceptsToken array', async () => {
+ const request = mockRequest({ authorization: `Bearer ${mockJwt}` });
const requestState = await authenticateRequest(
request,
mockOptions({ acceptsToken: ['api_key', 'oauth_token'] }),
@@ -1426,6 +1501,25 @@ describe('tokens.authenticateRequest(options)', () => {
isAuthenticated: false,
});
});
+
+ test('returns unauthenticated state when no token is provided and acceptsToken array contains only machine tokens', async () => {
+ const requestState = await authenticateRequest(
+ mockRequestWithCookies(
+ {},
+ {
+ __session: mockJwt,
+ __client_uat: '12345',
+ },
+ ),
+ mockOptions({ acceptsToken: ['api_key', 'm2m_token'] }),
+ );
+
+ expect(requestState).toBeMachineUnauthenticated({
+ tokenType: null,
+ reason: AuthErrorReason.TokenTypeMismatch,
+ message: '',
+ });
+ });
});
describe('Token Location Validation', () => {
diff --git a/packages/backend/src/tokens/request.ts b/packages/backend/src/tokens/request.ts
index 863afeabaa4..88999fedc0c 100644
--- a/packages/backend/src/tokens/request.ts
+++ b/packages/backend/src/tokens/request.ts
@@ -782,7 +782,7 @@ export const authenticateRequest: AuthenticateRequest = (async (
}
if (authenticateContext.tokenInHeader) {
- if (acceptsToken === 'any') {
+ if (acceptsToken === 'any' || Array.isArray(acceptsToken)) {
return authenticateAnyRequestWithTokenInHeader();
}
if (acceptsToken === TokenType.SessionToken) {
From c4dbcf70ec9d96b74bf31f138e7da357ba89e5e7 Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Thu, 8 Jan 2026 12:18:49 -0300
Subject: [PATCH 042/123] fix(clerk-js): Hide "must belong to org" screen when
org resources exist (#7557)
---
.changeset/fuzzy-hotels-decide.md | 5 ++
.../ChooseOrganizationScreen.tsx | 9 ++-
.../__tests__/TaskChooseOrganization.test.tsx | 76 ++++++++++++++++++-
.../tasks/TaskChooseOrganization/index.tsx | 25 ++----
packages/localizations/src/en-US.ts | 1 +
packages/shared/src/types/localization.ts | 1 +
6 files changed, 98 insertions(+), 19 deletions(-)
create mode 100644 .changeset/fuzzy-hotels-decide.md
diff --git a/.changeset/fuzzy-hotels-decide.md b/.changeset/fuzzy-hotels-decide.md
new file mode 100644
index 00000000000..26e45da6afa
--- /dev/null
+++ b/.changeset/fuzzy-hotels-decide.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix "You must belong to an organization" screen showing when user has existing memberships, invitations or suggestions
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx
index 6942ae08806..c0ac1acc82a 100644
--- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx
@@ -33,6 +33,7 @@ type ChooseOrganizationScreenProps = {
export const ChooseOrganizationScreen = (props: ChooseOrganizationScreenProps) => {
const card = useCardState();
+ const { user } = useUser();
const { ref, userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
@@ -50,7 +51,13 @@ export const ChooseOrganizationScreen = (props: ChooseOrganizationScreenProps) =
sx={t => ({ padding: `${t.space.$none} ${t.space.$8}` })}
>
-
+
({ margin: `${t.space.$none} ${t.space.$8}` })}>{card.error}
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 b0604a57582..f6daf9e1dcd 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
@@ -3,7 +3,10 @@ import { describe, expect, it } from 'vitest';
import { bindCreateFixtures } from '@/test/create-fixtures';
import { render } from '@/test/utils';
-import { createFakeUserOrganizationMembership } from '@/ui/components/OrganizationSwitcher/__tests__/test-utils';
+import {
+ createFakeUserOrganizationMembership,
+ createFakeUserOrganizationSuggestion,
+} from '@/ui/components/OrganizationSwitcher/__tests__/test-utils';
import { TaskChooseOrganization } from '..';
@@ -240,4 +243,75 @@ describe('TaskChooseOrganization', () => {
expect(queryByLabelText(/Slug/i)).toBeInTheDocument();
});
});
+
+ describe('when users are not allowed to create organizations', () => {
+ it('does not display create organization screen', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withForceOrganizationSelection();
+ f.withUser({
+ create_organization_enabled: false,
+ tasks: [{ key: 'choose-organization' }],
+ });
+ });
+
+ const { findByText, queryByText } = render(, { wrapper });
+
+ expect(await findByText(/you must belong to an organization/i)).toBeInTheDocument();
+ expect(await findByText(/contact your organization admin for an invitation/i)).toBeInTheDocument();
+ expect(queryByText(/create new organization/i)).not.toBeInTheDocument();
+ });
+
+ it('with existing memberships or suggestions, displays create organization screen', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withForceOrganizationSelection();
+ f.withUser({
+ create_organization_enabled: false,
+ tasks: [{ key: 'choose-organization' }],
+ });
+ });
+
+ fixtures.clerk.user?.getOrganizationMemberships.mockReturnValueOnce(
+ Promise.resolve({
+ data: [
+ createFakeUserOrganizationMembership({
+ id: '1',
+ organization: {
+ id: '1',
+ name: 'Existing Org',
+ slug: 'org1',
+ membersCount: 1,
+ adminDeleteEnabled: false,
+ maxAllowedMemberships: 1,
+ pendingInvitationsCount: 1,
+ },
+ }),
+ ],
+ total_count: 1,
+ }),
+ );
+
+ fixtures.clerk.user?.getOrganizationSuggestions.mockReturnValueOnce(
+ Promise.resolve({
+ data: [
+ createFakeUserOrganizationSuggestion({
+ id: '2',
+ emailAddress: 'two@clerk.com',
+ publicOrganizationData: {
+ name: 'OrgTwoSuggestion',
+ },
+ }),
+ ],
+ total_count: 1,
+ }),
+ );
+
+ const { findByText, queryByText } = render(, { wrapper });
+
+ expect(await findByText('Join an existing organization')).toBeInTheDocument();
+ expect(await queryByText('Create new organization')).not.toBeInTheDocument();
+ expect(await findByText('Existing Org')).toBeInTheDocument();
+ });
+ });
});
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 c42c6f6ef91..dc3375e0d0b 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,5 +1,5 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
-import { type ComponentType, useState } from 'react';
+import { useState } from 'react';
import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
@@ -14,10 +14,16 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';
const TaskChooseOrganizationInternal = () => {
+ const { user } = useUser();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
+ const isOrganizationCreationDisabled = !isLoading && !user?.createOrganizationEnabled && !hasExistingResources;
+
+ if (isOrganizationCreationDisabled) {
+ return ;
+ }
return (
@@ -113,18 +119,6 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return setCurrentFlow('create')} />;
});
-export const withOrganizationCreationEnabledGuard = (Component: ComponentType) => {
- return (props: T) => {
- const { user } = useUser();
-
- if (!user?.createOrganizationEnabled) {
- return ;
- }
-
- return ;
- };
-};
-
function OrganizationCreationDisabledScreen() {
return (
@@ -149,8 +143,5 @@ function OrganizationCreationDisabledScreen() {
}
export const TaskChooseOrganization = withCoreSessionSwitchGuard(
- withTaskGuard(
- withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
- 'choose-organization',
- ),
+ withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
);
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index d2890bbdbb1..8e9c64c7b33 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -862,6 +862,7 @@ export const enUS: LocalizationResource = {
action__invitationAccept: 'Join',
action__suggestionsAccept: 'Request to join',
subtitle: 'Join an existing organization or create a new one',
+ subtitle__createOrganizationDisabled: 'Join an existing organization',
suggestionsAcceptedLabel: 'Pending approval',
title: 'Choose an organization',
},
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index 9e789d9c8fa..806826143d8 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -1304,6 +1304,7 @@ export type __internal_LocalizationResource = {
chooseOrganization: {
title: LocalizationValue;
subtitle: LocalizationValue;
+ subtitle__createOrganizationDisabled: LocalizationValue;
suggestionsAcceptedLabel: LocalizationValue;
action__suggestionsAccept: LocalizationValue;
action__createOrganization: LocalizationValue;
From 5d3ea6853c2cc724c48881c3d6c754e3083eb85b Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Thu, 8 Jan 2026 12:51:20 -0300
Subject: [PATCH 043/123] fix(localizations): Add
`subtitle__createOrganizationDisabled` across locales (#7562)
---
.changeset/fuzzy-hotels-decide.md | 3 ++-
packages/localizations/src/ar-SA.ts | 1 +
packages/localizations/src/be-BY.ts | 1 +
packages/localizations/src/bg-BG.ts | 1 +
packages/localizations/src/bn-IN.ts | 1 +
packages/localizations/src/ca-ES.ts | 1 +
packages/localizations/src/cs-CZ.ts | 1 +
packages/localizations/src/da-DK.ts | 1 +
packages/localizations/src/de-DE.ts | 1 +
packages/localizations/src/el-GR.ts | 1 +
packages/localizations/src/en-GB.ts | 1 +
packages/localizations/src/es-CR.ts | 1 +
packages/localizations/src/es-ES.ts | 1 +
packages/localizations/src/es-MX.ts | 1 +
packages/localizations/src/es-UY.ts | 1 +
packages/localizations/src/fa-IR.ts | 1 +
packages/localizations/src/fi-FI.ts | 1 +
packages/localizations/src/fr-FR.ts | 1 +
packages/localizations/src/he-IL.ts | 1 +
packages/localizations/src/hi-IN.ts | 1 +
packages/localizations/src/hr-HR.ts | 1 +
packages/localizations/src/hu-HU.ts | 1 +
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 | 1 +
packages/localizations/src/kk-KZ.ts | 1 +
packages/localizations/src/ko-KR.ts | 1 +
packages/localizations/src/mn-MN.ts | 1 +
packages/localizations/src/ms-MY.ts | 1 +
packages/localizations/src/nb-NO.ts | 1 +
packages/localizations/src/nl-BE.ts | 1 +
packages/localizations/src/nl-NL.ts | 1 +
packages/localizations/src/pl-PL.ts | 1 +
packages/localizations/src/pt-BR.ts | 1 +
packages/localizations/src/pt-PT.ts | 1 +
packages/localizations/src/ro-RO.ts | 1 +
packages/localizations/src/ru-RU.ts | 1 +
packages/localizations/src/sk-SK.ts | 1 +
packages/localizations/src/sr-RS.ts | 1 +
packages/localizations/src/sv-SE.ts | 1 +
packages/localizations/src/ta-IN.ts | 1 +
packages/localizations/src/te-IN.ts | 1 +
packages/localizations/src/th-TH.ts | 1 +
packages/localizations/src/tr-TR.ts | 1 +
packages/localizations/src/uk-UA.ts | 1 +
packages/localizations/src/vi-VN.ts | 1 +
packages/localizations/src/zh-CN.ts | 1 +
packages/localizations/src/zh-TW.ts | 1 +
49 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/.changeset/fuzzy-hotels-decide.md b/.changeset/fuzzy-hotels-decide.md
index 26e45da6afa..152b71ad093 100644
--- a/.changeset/fuzzy-hotels-decide.md
+++ b/.changeset/fuzzy-hotels-decide.md
@@ -1,5 +1,6 @@
---
-'@clerk/clerk-js': patch
+'@clerk/clerk-js': minor
+'@clerk/localizations': minor
---
Fix "You must belong to an organization" screen showing when user has existing memberships, invitations or suggestions
diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts
index cefa475456c..b48cf825e52 100644
--- a/packages/localizations/src/ar-SA.ts
+++ b/packages/localizations/src/ar-SA.ts
@@ -860,6 +860,7 @@ export const arSA: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts
index c476e39c547..fd12de02b13 100644
--- a/packages/localizations/src/be-BY.ts
+++ b/packages/localizations/src/be-BY.ts
@@ -868,6 +868,7 @@ export const beBY: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts
index 7c52e9ba2a9..fdcdf32b73d 100644
--- a/packages/localizations/src/bg-BG.ts
+++ b/packages/localizations/src/bg-BG.ts
@@ -864,6 +864,7 @@ export const bgBG: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts
index 8872a94a90c..9c36731c219 100644
--- a/packages/localizations/src/bn-IN.ts
+++ b/packages/localizations/src/bn-IN.ts
@@ -868,6 +868,7 @@ export const bnIN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts
index c435041f257..3cd5d10eeda 100644
--- a/packages/localizations/src/ca-ES.ts
+++ b/packages/localizations/src/ca-ES.ts
@@ -863,6 +863,7 @@ export const caES: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts
index d2ed96040fb..b1cd9e1550e 100644
--- a/packages/localizations/src/cs-CZ.ts
+++ b/packages/localizations/src/cs-CZ.ts
@@ -874,6 +874,7 @@ export const csCZ: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts
index f92ca01c05e..f768668bd98 100644
--- a/packages/localizations/src/da-DK.ts
+++ b/packages/localizations/src/da-DK.ts
@@ -861,6 +861,7 @@ export const daDK: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts
index 3dc8c7d1302..678b136ed1a 100644
--- a/packages/localizations/src/de-DE.ts
+++ b/packages/localizations/src/de-DE.ts
@@ -879,6 +879,7 @@ export const deDE: LocalizationResource = {
action__invitationAccept: 'Beitreten',
action__suggestionsAccept: 'Beitritt beantragen',
subtitle: 'Einer bestehenden Organisation beitreten oder eine neue erstellen',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'Genehmigung ausstehend',
title: 'Organisation auswählen',
},
diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts
index 3d529a88328..df35837d8b4 100644
--- a/packages/localizations/src/el-GR.ts
+++ b/packages/localizations/src/el-GR.ts
@@ -866,6 +866,7 @@ export const elGR: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts
index d21fd9f7f27..0dba831bcf7 100644
--- a/packages/localizations/src/en-GB.ts
+++ b/packages/localizations/src/en-GB.ts
@@ -865,6 +865,7 @@ export const enGB: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts
index 9fde4d49c51..0a131be4671 100644
--- a/packages/localizations/src/es-CR.ts
+++ b/packages/localizations/src/es-CR.ts
@@ -871,6 +871,7 @@ export const esCR: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts
index 4bfe2c76da9..a5c8a3f4c8c 100644
--- a/packages/localizations/src/es-ES.ts
+++ b/packages/localizations/src/es-ES.ts
@@ -865,6 +865,7 @@ export const esES: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts
index 41e9502237f..db594fd6118 100644
--- a/packages/localizations/src/es-MX.ts
+++ b/packages/localizations/src/es-MX.ts
@@ -872,6 +872,7 @@ export const esMX: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts
index 58decff52c0..a4e2c8da910 100644
--- a/packages/localizations/src/es-UY.ts
+++ b/packages/localizations/src/es-UY.ts
@@ -871,6 +871,7 @@ export const esUY: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts
index 4cc7255f6d4..1e0e781849c 100644
--- a/packages/localizations/src/fa-IR.ts
+++ b/packages/localizations/src/fa-IR.ts
@@ -875,6 +875,7 @@ export const faIR: LocalizationResource = {
action__invitationAccept: 'بپیوندید',
action__suggestionsAccept: 'درخواست عضویت',
subtitle: 'برای ادامه، سازمانی را انتخاب کنید',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'در انتظار تایید',
title: 'یک سازمان انتخاب کنید',
},
diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts
index 113b8743b38..eaa48cf81c7 100644
--- a/packages/localizations/src/fi-FI.ts
+++ b/packages/localizations/src/fi-FI.ts
@@ -864,6 +864,7 @@ export const fiFI: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts
index 1744ec79468..9771cfc711e 100644
--- a/packages/localizations/src/fr-FR.ts
+++ b/packages/localizations/src/fr-FR.ts
@@ -880,6 +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,
suggestionsAcceptedLabel: 'En attente d’approbation',
title: 'Choisir une organisation',
},
diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts
index c7be2ce15b3..b26d094b50e 100644
--- a/packages/localizations/src/he-IL.ts
+++ b/packages/localizations/src/he-IL.ts
@@ -854,6 +854,7 @@ export const heIL: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts
index 09ed3790157..64af22f24ca 100644
--- a/packages/localizations/src/hi-IN.ts
+++ b/packages/localizations/src/hi-IN.ts
@@ -869,6 +869,7 @@ export const hiIN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts
index e22e1620b37..89041a9c035 100644
--- a/packages/localizations/src/hr-HR.ts
+++ b/packages/localizations/src/hr-HR.ts
@@ -865,6 +865,7 @@ export const hrHR: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts
index a3d50826cb7..1766a367259 100644
--- a/packages/localizations/src/hu-HU.ts
+++ b/packages/localizations/src/hu-HU.ts
@@ -862,6 +862,7 @@ export const huHU: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts
index 49cd92a729a..314e4df62a4 100644
--- a/packages/localizations/src/id-ID.ts
+++ b/packages/localizations/src/id-ID.ts
@@ -870,6 +870,7 @@ export const idID: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts
index 68d03bfe6a7..e87e68da5ac 100644
--- a/packages/localizations/src/is-IS.ts
+++ b/packages/localizations/src/is-IS.ts
@@ -865,6 +865,7 @@ export const isIS: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts
index f80973e313e..bca7f3064c1 100644
--- a/packages/localizations/src/it-IT.ts
+++ b/packages/localizations/src/it-IT.ts
@@ -872,6 +872,7 @@ export const itIT: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts
index 7a1204b8b38..e686f7d8d3a 100644
--- a/packages/localizations/src/ja-JP.ts
+++ b/packages/localizations/src/ja-JP.ts
@@ -875,6 +875,7 @@ export const jaJP: LocalizationResource = {
action__invitationAccept: '参加する',
action__suggestionsAccept: '参加をリクエストする',
subtitle: '既存の組織に参加するか、新しい組織を作成します',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: '承認待ち',
title: '組織を選択',
},
diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts
index 2407c54455e..212ec89d50f 100644
--- a/packages/localizations/src/kk-KZ.ts
+++ b/packages/localizations/src/kk-KZ.ts
@@ -855,6 +855,7 @@ export const kkKZ: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts
index 6c72224f218..f1a1a71ba3f 100644
--- a/packages/localizations/src/ko-KR.ts
+++ b/packages/localizations/src/ko-KR.ts
@@ -856,6 +856,7 @@ export const koKR: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts
index 6837c413d76..47d7f2f3520 100644
--- a/packages/localizations/src/mn-MN.ts
+++ b/packages/localizations/src/mn-MN.ts
@@ -864,6 +864,7 @@ export const mnMN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts
index 8d075694b63..8c9fc2fe6f5 100644
--- a/packages/localizations/src/ms-MY.ts
+++ b/packages/localizations/src/ms-MY.ts
@@ -872,6 +872,7 @@ export const msMY: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts
index 154129c29f7..eca0b97f88d 100644
--- a/packages/localizations/src/nb-NO.ts
+++ b/packages/localizations/src/nb-NO.ts
@@ -862,6 +862,7 @@ export const nbNO: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts
index dd07a867645..f0bb7d32200 100644
--- a/packages/localizations/src/nl-BE.ts
+++ b/packages/localizations/src/nl-BE.ts
@@ -864,6 +864,7 @@ export const nlBE: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts
index 03ad74e51e9..451d77b41e0 100644
--- a/packages/localizations/src/nl-NL.ts
+++ b/packages/localizations/src/nl-NL.ts
@@ -864,6 +864,7 @@ export const nlNL: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts
index d68af4cce6a..d037d7f4bb4 100644
--- a/packages/localizations/src/pl-PL.ts
+++ b/packages/localizations/src/pl-PL.ts
@@ -868,6 +868,7 @@ export const plPL: LocalizationResource = {
action__invitationAccept: 'Dołącz',
action__suggestionsAccept: 'Poproś o dołączenie',
subtitle: 'Dołącz do istniejącej organizacji lub utwórz nową',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'Oczekiwanie na dołączenie',
title: 'Wybierz organizację',
},
diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts
index 161b854621d..16fd4e32653 100644
--- a/packages/localizations/src/pt-BR.ts
+++ b/packages/localizations/src/pt-BR.ts
@@ -876,6 +876,7 @@ export const ptBR: LocalizationResource = {
action__invitationAccept: 'Participar',
action__suggestionsAccept: 'Solicitar participação',
subtitle: 'Junte-se a uma organização existente ou crie uma nova',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'Aprovação pendente',
title: 'Escolha uma organização',
},
diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts
index f9986a65ff4..3c0a9730ec9 100644
--- a/packages/localizations/src/pt-PT.ts
+++ b/packages/localizations/src/pt-PT.ts
@@ -862,6 +862,7 @@ export const ptPT: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts
index f01fc26ac51..22d78472e27 100644
--- a/packages/localizations/src/ro-RO.ts
+++ b/packages/localizations/src/ro-RO.ts
@@ -877,6 +877,7 @@ export const roRO: LocalizationResource = {
action__invitationAccept: 'Alătură-te',
action__suggestionsAccept: 'Solicită alăturarea',
subtitle: 'Alătură-te unei organizații existente sau creează una nouă',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'În așteptare',
title: 'Alege o organizație',
},
diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts
index bdf68f7412c..293a20d6783 100644
--- a/packages/localizations/src/ru-RU.ts
+++ b/packages/localizations/src/ru-RU.ts
@@ -875,6 +875,7 @@ export const ruRU: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts
index 9f063d921e2..1dd5d44d1b5 100644
--- a/packages/localizations/src/sk-SK.ts
+++ b/packages/localizations/src/sk-SK.ts
@@ -868,6 +868,7 @@ export const skSK: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts
index 5de49fb787e..f81de48bb74 100644
--- a/packages/localizations/src/sr-RS.ts
+++ b/packages/localizations/src/sr-RS.ts
@@ -861,6 +861,7 @@ export const srRS: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts
index aeec07f2ae4..7cc04f52249 100644
--- a/packages/localizations/src/sv-SE.ts
+++ b/packages/localizations/src/sv-SE.ts
@@ -866,6 +866,7 @@ export const svSE: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts
index 681dacc6608..58a2bf94342 100644
--- a/packages/localizations/src/ta-IN.ts
+++ b/packages/localizations/src/ta-IN.ts
@@ -871,6 +871,7 @@ export const taIN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts
index fa9a240d203..311d8825f61 100644
--- a/packages/localizations/src/te-IN.ts
+++ b/packages/localizations/src/te-IN.ts
@@ -871,6 +871,7 @@ export const teIN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts
index b8d0bd34b32..a67cb5afa2b 100644
--- a/packages/localizations/src/th-TH.ts
+++ b/packages/localizations/src/th-TH.ts
@@ -864,6 +864,7 @@ export const thTH: LocalizationResource = {
action__invitationAccept: 'เข้าร่วม',
action__suggestionsAccept: 'ขอเข้าร่วม',
subtitle: 'เข้าร่วมองค์กรที่มีอยู่หรือสร้างใหม่',
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: 'รออนุมัติ',
title: 'เลือกองค์กร',
},
diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts
index 27a653f3aff..573dee4d251 100644
--- a/packages/localizations/src/tr-TR.ts
+++ b/packages/localizations/src/tr-TR.ts
@@ -864,6 +864,7 @@ export const trTR: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts
index 7c99c1ada83..eb1192aa8f8 100644
--- a/packages/localizations/src/uk-UA.ts
+++ b/packages/localizations/src/uk-UA.ts
@@ -860,6 +860,7 @@ export const ukUA: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts
index 71e95786f9d..b60f5ce80dd 100644
--- a/packages/localizations/src/vi-VN.ts
+++ b/packages/localizations/src/vi-VN.ts
@@ -871,6 +871,7 @@ export const viVN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts
index 07b0b060af7..50f6369d08c 100644
--- a/packages/localizations/src/zh-CN.ts
+++ b/packages/localizations/src/zh-CN.ts
@@ -850,6 +850,7 @@ export const zhCN: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts
index 4ed15697262..07c95b8ef1e 100644
--- a/packages/localizations/src/zh-TW.ts
+++ b/packages/localizations/src/zh-TW.ts
@@ -851,6 +851,7 @@ export const zhTW: LocalizationResource = {
action__invitationAccept: undefined,
action__suggestionsAccept: undefined,
subtitle: undefined,
+ subtitle__createOrganizationDisabled: undefined,
suggestionsAcceptedLabel: undefined,
title: undefined,
},
From 1a510b733896a441236a64465f7484278997b379 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Thu, 8 Jan 2026 11:25:29 -0500
Subject: [PATCH 044/123] ci(repo): Version packages (Core 2) (#7552)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/fuzzy-hotels-decide.md | 6 ------
.changeset/lucky-pigs-look.md | 5 -----
.changeset/moody-bugs-film.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 | 8 ++++++++
packages/chrome-extension/package.json | 2 +-
packages/clerk-js/CHANGELOG.md | 13 +++++++++++++
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, 130 insertions(+), 31 deletions(-)
delete mode 100644 .changeset/fuzzy-hotels-decide.md
delete mode 100644 .changeset/lucky-pigs-look.md
delete mode 100644 .changeset/moody-bugs-film.md
diff --git a/.changeset/fuzzy-hotels-decide.md b/.changeset/fuzzy-hotels-decide.md
deleted file mode 100644
index 152b71ad093..00000000000
--- a/.changeset/fuzzy-hotels-decide.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@clerk/clerk-js': minor
-'@clerk/localizations': minor
----
-
-Fix "You must belong to an organization" screen showing when user has existing memberships, invitations or suggestions
diff --git a/.changeset/lucky-pigs-look.md b/.changeset/lucky-pigs-look.md
deleted file mode 100644
index 9705ee128b9..00000000000
--- a/.changeset/lucky-pigs-look.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@clerk/backend": patch
----
-
-Fixed an issue when using multiple `acceptsToken` values in `authenticateRequest`. When `acceptsToken` is an array containing both session and machine token types (e.g., `['session_token', 'api_key']`), the function now correctly routes to the appropriate authentication handler based on the actual token type, instead of always treating them as machine tokens.
diff --git a/.changeset/moody-bugs-film.md b/.changeset/moody-bugs-film.md
deleted file mode 100644
index 86a399faca8..00000000000
--- a/.changeset/moody-bugs-film.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': minor
----
-
-When password is enabled at the instance level, but not required allow users to add a password in the user profile.
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 911a97f7cff..08d0185b71e 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/agent-toolkit
+## 0.2.14
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 0.2.13
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 3a498d696ec..f1066342530 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.13",
+ "version": "0.2.14",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index acdb9646b22..6db5d368ef2 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/astro
+## 2.16.12
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 2.16.11
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 3767017a6fb..1bd5557b617 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.16.11",
+ "version": "2.16.12",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 1c852d36075..abd0273a828 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 2.29.2
+
+### Patch Changes
+
+- Fixed an issue when using multiple `acceptsToken` values in `authenticateRequest`. When `acceptsToken` is an array containing both session and machine token types (e.g., `['session_token', 'api_key']`), the function now correctly routes to the appropriate authentication handler based on the actual token type, instead of always treating them as machine tokens. ([#7556](https://github.com/clerk/javascript/pull/7556)) by [@wobsoriano](https://github.com/wobsoriano)
+
## 2.29.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index f180690ed7e..b99f17899ee 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.29.1",
+ "version": "2.29.2",
"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 ba6f4543afa..591d885c1cb 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 2.8.16
+
+### Patch Changes
+
+- Updated dependencies [[`c4dbcf7`](https://github.com/clerk/javascript/commit/c4dbcf70ec9d96b74bf31f138e7da357ba89e5e7), [`b800900`](https://github.com/clerk/javascript/commit/b800900d721d36d508881ef48e363791f461e0bf)]:
+ - @clerk/clerk-js@5.119.0
+ - @clerk/clerk-react@5.59.3
+
## 2.8.15
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 179bd792496..d21b94490ab 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.15",
+ "version": "2.8.16",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index e11e8edbf81..6571cec7a37 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,18 @@
# Change Log
+## 5.119.0
+
+### Minor Changes
+
+- Fix "You must belong to an organization" screen showing when user has existing memberships, invitations or suggestions ([#7557](https://github.com/clerk/javascript/pull/7557)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
+- When password is enabled at the instance level, but not required allow users to add a password in the user profile. ([#7549](https://github.com/clerk/javascript/pull/7549)) by [@austincalvelage](https://github.com/austincalvelage)
+
+### Patch Changes
+
+- Updated dependencies [[`c4dbcf7`](https://github.com/clerk/javascript/commit/c4dbcf70ec9d96b74bf31f138e7da357ba89e5e7)]:
+ - @clerk/localizations@3.34.0
+
## 5.118.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 444890cd361..1351b00b776 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.118.0",
+ "version": "5.119.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md
index b493a9a12c7..4ff27918c0d 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 2.19.16
+
+### Patch Changes
+
+- Updated dependencies [[`c4dbcf7`](https://github.com/clerk/javascript/commit/c4dbcf70ec9d96b74bf31f138e7da357ba89e5e7), [`b800900`](https://github.com/clerk/javascript/commit/b800900d721d36d508881ef48e363791f461e0bf)]:
+ - @clerk/clerk-js@5.119.0
+ - @clerk/clerk-react@5.59.3
+
## 2.19.15
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index d9f0ae89885..b892ea73bc4 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.15",
+ "version": "2.19.16",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 0dd18ed4619..2c72d00d652 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 1.7.62
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 1.7.61
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index 9d0bdbf4f4c..ee62d5f6c8f 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.61",
+ "version": "1.7.62",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index d2a694df9d3..85086c66e5d 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.6.14
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 2.6.13
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index 204729b8daa..dede8ebdfb3 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.13",
+ "version": "2.6.14",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index ee8baec40d5..30c3560a041 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 3.34.0
+
+### Minor Changes
+
+- Fix "You must belong to an organization" screen showing when user has existing memberships, invitations or suggestions ([#7557](https://github.com/clerk/javascript/pull/7557)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
## 3.33.0
### Minor Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index f805aca4ba1..ea935b02c44 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.33.0",
+ "version": "3.34.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 46f67cc013d..dc7e7ed82b8 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 6.36.7
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+ - @clerk/clerk-react@5.59.3
+
## 6.36.6
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index de002ef3d50..41cc947aa18 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.36.6",
+ "version": "6.36.7",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index a32ba8c576d..72f014367c9 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/nuxt
+## 1.13.12
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 1.13.11
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 5b984a3a9d4..02f515070fc 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.11",
+ "version": "1.13.12",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index c533d68d2ab..aa3d8ad7f81 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 2.3.9
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+ - @clerk/clerk-react@5.59.3
+
## 2.3.8
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 401825737aa..d2d53aead7b 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.3.8",
+ "version": "2.3.9",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index d5d128b9880..d691d62500c 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 4.13.29
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+ - @clerk/clerk-react@5.59.3
+
## 4.13.28
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index f9e4e9e0bfd..8329fc04118 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.28",
+ "version": "4.13.29",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md
index 97de836df2c..e3eda4d9700 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.14
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+ - @clerk/clerk-react@5.59.3
+
## 0.27.13
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 9c3c6cea7e6..b7af01c0d8d 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.13",
+ "version": "0.27.14",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index cf5a0c6e0b3..08308ab1659 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/testing
+## 1.13.28
+
+### Patch Changes
+
+- Updated dependencies [[`6b26afc`](https://github.com/clerk/javascript/commit/6b26afcc784f6e8344cf6ff0b1ef69c14019fe66)]:
+ - @clerk/backend@2.29.2
+
## 1.13.27
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index d781eb093f0..b5965f456ff 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.27",
+ "version": "1.13.28",
"description": "Utilities to help you create E2E test suites for apps using Clerk",
"keywords": [
"auth",
From 68fe8b65eb47e289d22c6481f1eba7747d40a0b1 Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Fri, 9 Jan 2026 11:47:30 -0300
Subject: [PATCH 045/123] fix(clerk-js): Keep role select enabled with default
org role (#7569)
---
.changeset/dry-rings-report.md | 5 ++
.../OrganizationProfile/InviteMembersForm.tsx | 26 +++++----
.../__tests__/InviteMembersPage.test.tsx | 57 ++++++++++++++++++-
3 files changed, 77 insertions(+), 11 deletions(-)
create mode 100644 .changeset/dry-rings-report.md
diff --git a/.changeset/dry-rings-report.md b/.changeset/dry-rings-report.md
new file mode 100644
index 00000000000..8cb3e91b2b3
--- /dev/null
+++ b/.changeset/dry-rings-report.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix role select being disabled on `OrganizationProfile` invite members page when default role is not in roles list
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/InviteMembersForm.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/InviteMembersForm.tsx
index 7f9e848850b..3a8ecc68b8d 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/InviteMembersForm.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/InviteMembersForm.tsx
@@ -48,19 +48,10 @@ export const InviteMembersForm = (props: InviteMembersFormProps) => {
label: localizationKeys('formFieldLabel__emailAddresses'),
});
- const defaultRole = useDefaultRole();
const roleField = useFormControl('role', '', {
label: localizationKeys('formFieldLabel__role'),
});
- useEffect(() => {
- if (roleField.value || !defaultRole) {
- return;
- }
-
- roleField.setValue(defaultRole);
- }, [defaultRole, roleField]);
-
if (!organization) {
return null;
}
@@ -200,8 +191,23 @@ export const InviteMembersForm = (props: InviteMembersFormProps) => {
const AsyncRoleSelect = (field: ReturnType>) => {
const { options, isLoading, hasRoleSetMigration } = useFetchRoles();
-
const { t } = useLocalizations();
+ const defaultRole = useDefaultRole();
+
+ useEffect(() => {
+ if (field.value || !defaultRole) {
+ return;
+ }
+
+ // Skip if the default role from org settings is not in the current role set
+ // This will eventually be returned by the roles endpoint, and `organizationSettings.domains.defaultRole` will be deprecated
+ const defaultRoleExists = options?.some(option => option.value === defaultRole);
+ if (!defaultRoleExists) {
+ return;
+ }
+
+ field.setValue(defaultRole);
+ }, [defaultRole, options, field]);
return (
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/InviteMembersPage.test.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/InviteMembersPage.test.tsx
index 076655f075f..dd13114cff8 100644
--- a/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/InviteMembersPage.test.tsx
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/__tests__/InviteMembersPage.test.tsx
@@ -245,6 +245,59 @@ describe('InviteMembersPage', () => {
await waitFor(() => expect(getByRole('button', { name: /select role/i })).toBeInTheDocument());
});
+ it('enables selecting other options if default role is not available', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withOrganizations();
+ f.withOrganizationDomains(undefined, 'mydefaultrole');
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ organization_memberships: [{ name: 'Org1', role: 'admin' }],
+ });
+ });
+
+ fixtures.clerk.organization?.getInvitations.mockRejectedValue(null);
+ fixtures.clerk.organization?.getRoles.mockResolvedValue({
+ total_count: 1,
+ data: [
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'member',
+ key: 'member',
+ name: 'member',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ {
+ pathRoot: '',
+ reload: vi.fn(),
+ id: 'admin',
+ key: 'admin',
+ name: 'admin',
+ description: '',
+ permissions: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ],
+ });
+
+ fixtures.clerk.organization?.inviteMembers.mockResolvedValueOnce([{}] as OrganizationInvitationResource[]);
+ const { findByText, getByRole, userEvent, getByTestId } = render(
+
+
+ ,
+ { wrapper },
+ );
+ await userEvent.type(getByTestId('tag-input'), 'test+1@clerk.com,');
+ await waitFor(() => expect(getByRole('button', { name: /select role/i })).toBeInTheDocument());
+ await userEvent.click(getByRole('button', { name: /select role/i }));
+ await userEvent.click(await findByText(/admin/i));
+ await waitFor(() => expect(getByRole('button', { name: 'Send invitations' })).not.toBeDisabled());
+ });
+
it('enables send button with default role once email address has been entered', async () => {
const defaultRole = 'mydefaultrole';
@@ -306,7 +359,9 @@ describe('InviteMembersPage', () => {
expect(getByRole('button', { name: 'Send invitations' })).toBeDisabled();
await userEvent.type(getByTestId('tag-input'), 'test+1@clerk.com,');
- expect(getByRole('button', { name: 'Send invitations' })).not.toBeDisabled();
+ await waitFor(() => {
+ expect(getByRole('button', { name: 'Send invitations' })).not.toBeDisabled();
+ });
await userEvent.click(getByRole('button', { name: /mydefaultrole/i }));
});
});
From 54b78e0f8e5cae54a7647e32d7cda12fa2a1cac9 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Fri, 9 Jan 2026 09:28:30 -0600
Subject: [PATCH 046/123] ci(repo): Version packages (Core 2) (#7572)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/dry-rings-report.md | 5 -----
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 +-
7 files changed, 23 insertions(+), 8 deletions(-)
delete mode 100644 .changeset/dry-rings-report.md
diff --git a/.changeset/dry-rings-report.md b/.changeset/dry-rings-report.md
deleted file mode 100644
index 8cb3e91b2b3..00000000000
--- a/.changeset/dry-rings-report.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix role select being disabled on `OrganizationProfile` invite members page when default role is not in roles list
diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md
index 591d885c1cb..1b8ee2b351f 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.8.17
+
+### Patch Changes
+
+- Updated dependencies [[`68fe8b6`](https://github.com/clerk/javascript/commit/68fe8b65eb47e289d22c6481f1eba7747d40a0b1)]:
+ - @clerk/clerk-js@5.119.1
+
## 2.8.16
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index d21b94490ab..2b6ae449f80 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.8.16",
+ "version": "2.8.17",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 6571cec7a37..e48e842d2d0 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 5.119.1
+
+### Patch Changes
+
+- Fix role select being disabled on `OrganizationProfile` invite members page when default role is not in roles list ([#7569](https://github.com/clerk/javascript/pull/7569)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
## 5.119.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 1351b00b776..4afa01043cf 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.119.0",
+ "version": "5.119.1",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md
index 4ff27918c0d..268eb83dba3 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.19.17
+
+### Patch Changes
+
+- Updated dependencies [[`68fe8b6`](https://github.com/clerk/javascript/commit/68fe8b65eb47e289d22c6481f1eba7747d40a0b1)]:
+ - @clerk/clerk-js@5.119.1
+
## 2.19.16
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index b892ea73bc4..3c57e4daae6 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.16",
+ "version": "2.19.17",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
From 4ac7188a797dc1c92ba876a8eee9e54915edd3cd Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Fri, 9 Jan 2026 15:03:02 -0300
Subject: [PATCH 047/123] fix(clerk-js): Remove opacity from `Select`
placeholder (#7575)
---
.changeset/open-doors-flash.md | 5 +++++
packages/clerk-js/src/ui/elements/Select.tsx | 11 +----------
2 files changed, 6 insertions(+), 10 deletions(-)
create mode 100644 .changeset/open-doors-flash.md
diff --git a/.changeset/open-doors-flash.md b/.changeset/open-doors-flash.md
new file mode 100644
index 00000000000..1d4003f8973
--- /dev/null
+++ b/.changeset/open-doors-flash.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Remove opacity from `Select` placeholder
diff --git a/packages/clerk-js/src/ui/elements/Select.tsx b/packages/clerk-js/src/ui/elements/Select.tsx
index 77a76187bca..c0dd8f6635f 100644
--- a/packages/clerk-js/src/ui/elements/Select.tsx
+++ b/packages/clerk-js/src/ui/elements/Select.tsx
@@ -393,16 +393,7 @@ export const SelectButton = (
let show: React.ReactNode = children;
if (!children) {
- show = selectedOption ? (
- buttonRenderOption(selectedOption)
- ) : (
- ({ opacity: t.opacity.$inactive })}
- >
- {placeholder}
-
- );
+ show = selectedOption ? buttonRenderOption(selectedOption) : {placeholder};
}
return (
From 4dad7217674e17a12d336906623476b92b81d840 Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Mon, 12 Jan 2026 14:34:24 -0300
Subject: [PATCH 048/123] chore(clerk-js): Show created org membership in
enable organizations prompt (#7582)
---
.changeset/small-pumas-joke.md | 5 +++++
.../devPrompts/EnableOrganizationsPrompt/index.tsx | 11 ++++++++---
2 files changed, 13 insertions(+), 3 deletions(-)
create mode 100644 .changeset/small-pumas-joke.md
diff --git a/.changeset/small-pumas-joke.md b/.changeset/small-pumas-joke.md
new file mode 100644
index 00000000000..843f9577091
--- /dev/null
+++ b/.changeset/small-pumas-joke.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Display actual organization membership name in in-app enable organization prompt success message
diff --git a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
index 3d9fc28615f..75ac9512c9c 100644
--- a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
+++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx
@@ -25,6 +25,7 @@ const EnableOrganizationsPromptInternal = ({
const clerk = useClerk();
const [isLoading, setIsLoading] = useState(false);
const [isEnabled, setIsEnabled] = useState(false);
+ const [defaultOrganizationName, setDefaultOrganizationName] = useState(null);
const [allowPersonalAccount, setAllowPersonalAccount] = useState(false);
const initialFocusRef = useRef(null);
@@ -50,7 +51,11 @@ const EnableOrganizationsPromptInternal = ({
void new DevTools()
.__internal_enableEnvironmentSetting(params)
- .then(() => {
+ .then(async () => {
+ const memberships = await clerk.user?.getOrganizationMemberships();
+ const defaultOrganizationName = memberships?.data[0]?.organization.name ?? null;
+ setDefaultOrganizationName(defaultOrganizationName);
+
setIsEnabled(true);
setIsLoading(false);
})
@@ -127,8 +132,8 @@ const EnableOrganizationsPromptInternal = ({
`,
]}
>
- {clerk.user
- ? `The Organizations feature has been enabled for your application. A default organization named "My Organization" was created automatically. You can manage or rename it in your`
+ {clerk.user && defaultOrganizationName
+ ? `The Organizations feature has been enabled for your application. A default organization named "${defaultOrganizationName}" was created automatically. You can manage or rename it in your`
: `The Organizations feature has been enabled for your application. You can manage it in your`}{' '}
Date: Tue, 13 Jan 2026 12:45:17 -0800
Subject: [PATCH 049/123] fix(clerk-expo): Resolve Peer Dependency issue for
Expo 54 users (#7591)
---
.changeset/friendly-expo-peer-deps.md | 5 +++++
packages/expo/package.json | 4 ++--
2 files changed, 7 insertions(+), 2 deletions(-)
create mode 100644 .changeset/friendly-expo-peer-deps.md
diff --git a/.changeset/friendly-expo-peer-deps.md b/.changeset/friendly-expo-peer-deps.md
new file mode 100644
index 00000000000..83438f7f08b
--- /dev/null
+++ b/.changeset/friendly-expo-peer-deps.md
@@ -0,0 +1,5 @@
+---
+'@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/packages/expo/package.json b/packages/expo/package.json
index 3c57e4daae6..706d19b8b03 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -110,8 +110,8 @@
"expo-local-authentication": ">=13.5.0",
"expo-secure-store": ">=12.4.0",
"expo-web-browser": ">=12.5.0",
- "react": "catalog:peer-react",
- "react-dom": "catalog:peer-react",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0",
"react-native": ">=0.73"
},
"peerDependenciesMeta": {
From 57ff2fb2ae53f757e48b4dcc5669f62369f90bfc Mon Sep 17 00:00:00 2001
From: Tom Milewski
Date: Tue, 13 Jan 2026 16:21:53 -0500
Subject: [PATCH 050/123] fix(clerk-react): Prevent props from leaking to child
elements in SignUpButton & SignInButton (#7589)
---
.changeset/true-pans-marry.md | 5 ++++
.../react/src/components/SignInButton.tsx | 4 ++-
.../react/src/components/SignUpButton.tsx | 8 ++++--
.../__tests__/SignInButton.test.tsx | 14 +++++++++++
.../__tests__/SignUpButton.test.tsx | 25 +++++++++++++++++++
5 files changed, 53 insertions(+), 3 deletions(-)
create mode 100644 .changeset/true-pans-marry.md
diff --git a/.changeset/true-pans-marry.md b/.changeset/true-pans-marry.md
new file mode 100644
index 00000000000..cad0ca5174d
--- /dev/null
+++ b/.changeset/true-pans-marry.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-react': patch
+---
+
+Prevent props from leaking to child elements in SignUpButton & SignInButton
diff --git a/packages/react/src/components/SignInButton.tsx b/packages/react/src/components/SignInButton.tsx
index fb45e4acbb6..729217fcffd 100644
--- a/packages/react/src/components/SignInButton.tsx
+++ b/packages/react/src/components/SignInButton.tsx
@@ -8,6 +8,8 @@ import { withClerk } from './withClerk';
export const SignInButton = withClerk(
({ clerk, children, ...props }: WithClerkProp>) => {
const {
+ // @ts-expect-error - appearance is a valid prop for SignInProps & SignInButtonPropsModal
+ appearance,
signUpFallbackRedirectUrl,
forceRedirectUrl,
fallbackRedirectUrl,
@@ -33,7 +35,7 @@ export const SignInButton = withClerk(
};
if (mode === 'modal') {
- return clerk.openSignIn({ ...opts, appearance: props.appearance });
+ return clerk.openSignIn({ ...opts, appearance });
}
return clerk.redirectToSignIn({
...opts,
diff --git a/packages/react/src/components/SignUpButton.tsx b/packages/react/src/components/SignUpButton.tsx
index 14cd75d4ac9..8beac5f6360 100644
--- a/packages/react/src/components/SignUpButton.tsx
+++ b/packages/react/src/components/SignUpButton.tsx
@@ -8,6 +8,10 @@ import { withClerk } from './withClerk';
export const SignUpButton = withClerk(
({ clerk, children, ...props }: WithClerkProp>) => {
const {
+ // @ts-expect-error - appearance is a valid prop for SignUpProps & SignUpButtonPropsModal
+ appearance,
+ // @ts-expect-error - unsafeMetadata is a valid prop for SignUpProps & SignUpButtonPropsModal
+ unsafeMetadata,
fallbackRedirectUrl,
forceRedirectUrl,
signInFallbackRedirectUrl,
@@ -34,8 +38,8 @@ export const SignUpButton = withClerk(
if (mode === 'modal') {
return clerk.openSignUp({
...opts,
- appearance: props.appearance,
- unsafeMetadata: props.unsafeMetadata,
+ appearance,
+ unsafeMetadata,
});
}
diff --git a/packages/react/src/components/__tests__/SignInButton.test.tsx b/packages/react/src/components/__tests__/SignInButton.test.tsx
index b9eba07aa57..03523dd2d15 100644
--- a/packages/react/src/components/__tests__/SignInButton.test.tsx
+++ b/packages/react/src/components/__tests__/SignInButton.test.tsx
@@ -105,4 +105,18 @@ describe('', () => {
);
}).toThrow();
});
+
+ it('does not pass appearance prop to child element', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ 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)',
- },
- })}
+
+
+
+
- {success ? (
-
- Your application{' '}
-
- {appName}
- {' '}
- has been claimed. Configure settings from the{' '}
- ({
- color: t.colors.$whiteAlpha600,
- textDecoration: 'underline solid',
- transition: `${t.transitionTiming.$common} ${t.transitionDuration.$fast}`,
- ':hover': {
- color: t.colors.$whiteAlpha800,
- },
- })}
- >
- 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.
-
-
- ) : (
- <>
-
- 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.
-
- >
- )}
+ {resolvedContent.description}
-
-
- {isForcedExpanded &&
- (success ? (
-
{
- await _props.onDismiss?.();
- window.location.reload();
- }}
- css={css`
- ${mainCTAStyles};
-
- &:hover {
- background: #4b4b4b;
- transition: all 120ms ease-in-out;
- }
- `}
- >
- Dismiss
-
- ) : (
-
({
- 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,
+ })}
+ >
+
+
+
+
+
+ );
+});
+
+type SmsCodeFlowProps = {
+ onSuccess: () => void;
+ goToStartStep: () => void;
+};
+
+// This is the order of the steps in the wizard
+const STEPS = {
+ ADD_PHONE: 0,
+ VERIFY_PHONE: 1,
+ SELECT_PHONE: 2,
+ SUCCESS: 3,
+} as const;
+
+export const SmsCodeFlow = (props: SmsCodeFlowProps) => {
+ const { onSuccess, goToStartStep } = props;
+ const { user } = useUser();
+
+ const ref = useRef();
+
+ const availablePhones = useMemo(() => {
+ if (!user) {
+ return [];
+ }
+ return getAvailablePhonesFromUser(user);
+ }, [user]);
+
+ const wizard = useWizard({ defaultStep: availablePhones.length > 0 ? STEPS.SELECT_PHONE : STEPS.ADD_PHONE });
+
+ return (
+
+
+ {/* Step 0: Add new phone (default if no available phones) */}
+ (availablePhones.length > 0 ? wizard.goToStep(STEPS.SELECT_PHONE) : goToStartStep())}
+ />
+ {/* Step 1: Verify phone */}
+ wizard.goToStep(STEPS.SUCCESS)}
+ onReset={() => wizard.goToStep(STEPS.ADD_PHONE)}
+ />
+ {/* Step 2: Phone selection (default if available phones) */}
+ wizard.goToStep(STEPS.ADD_PHONE)}
+ onUnverifiedPhoneClick={(phone: PhoneNumberResource) => {
+ ref.current = phone;
+ wizard.goToStep(STEPS.VERIFY_PHONE);
+ }}
+ resourceRef={ref}
+ />
+ {/* Step 3: Success with backup codes */}
+
+
+
+
+
+
+ );
+};
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/TOTPCodeFlowScreen.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/TOTPCodeFlowScreen.tsx
new file mode 100644
index 00000000000..26306cd7ecc
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/TOTPCodeFlowScreen.tsx
@@ -0,0 +1,285 @@
+import { isClerkRuntimeError } from '@clerk/shared/error';
+import { useReverification, useUser } from '@clerk/shared/react';
+import type { TOTPResource } from '@clerk/shared/types';
+import React, { useRef } from 'react';
+
+import { QRCode, useWizard, Wizard } from '@/ui/common';
+import { MfaBackupCodeList } from '@/ui/components/UserProfile/MfaBackupCodeList';
+import { Button, Col, descriptors, localizationKeys, Text } from '@/ui/customizables';
+import { Card } from '@/ui/elements/Card';
+import { ClipboardInput } from '@/ui/elements/ClipboardInput';
+import { useFieldOTP } from '@/ui/elements/CodeControl';
+import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
+import { Form } from '@/ui/elements/Form';
+import { FormButtonContainer } from '@/ui/elements/FormButtons';
+import { FormContainer } from '@/ui/elements/FormContainer';
+import { FullHeightLoader } from '@/ui/elements/FullHeightLoader';
+import { SuccessPage } from '@/ui/elements/SuccessPage';
+import { Check, ClipboardOutline } from '@/ui/icons';
+import { handleError } from '@/ui/utils/errorHandler';
+
+import { SharedFooterActionForSignOut } from './shared';
+
+type SuccessScreenProps = {
+ resourceRef: React.MutableRefObject;
+ onFinish: () => void;
+};
+
+type VerifyTOTPProps = {
+ onSuccess: () => void;
+ onReset: () => void;
+ resourceRef: React.MutableRefObject;
+};
+
+type AddAuthenticatorAppProps = {
+ onSuccess: () => void;
+ onReset: () => void;
+};
+
+type DisplayFormat = 'qr' | 'uri';
+
+export const AddAuthenticatorApp = withCardStateProvider((props: AddAuthenticatorAppProps) => {
+ const { onSuccess, onReset } = props;
+ const { user } = useUser();
+ const card = useCardState();
+ const createTOTP = useReverification(() => user?.createTOTP());
+ const [totp, setTOTP] = React.useState(undefined);
+ const [displayFormat, setDisplayFormat] = React.useState('qr');
+
+ React.useEffect(() => {
+ if (!user) {
+ return;
+ }
+
+ void createTOTP()
+ .then(totp => setTOTP(totp))
+ .catch(err => {
+ if (isClerkRuntimeError(err) && err.code === 'reverification_cancelled') {
+ return onReset();
+ }
+ return handleError(err, [], card.setError);
+ });
+ }, []);
+
+ return (
+
+ {!totp && }
+
+ {totp && (
+ <>
+
+ {displayFormat === 'qr' && (
+
+ )}
+
+ {displayFormat === 'uri' && (
+ <>
+
+
+
+ >
+ )}
+
+ ({
+ gap: theme.space.$8,
+ })}
+ >
+ {displayFormat === 'qr' && (
+ setDisplayFormat('uri')}
+ localizationKey={localizationKeys(
+ 'taskSetupMfa.totpCode.addAuthenticatorApp.buttonUnableToScan__nonPrimary',
+ )}
+ />
+ )}
+ {displayFormat === 'uri' && (
+ setDisplayFormat('qr')}
+ localizationKey={localizationKeys(
+ 'taskSetupMfa.totpCode.addAuthenticatorApp.buttonAbleToScan__nonPrimary',
+ )}
+ />
+ )}
+ ({
+ flexDirection: 'column',
+ gap: theme.space.$4,
+ })}
+ >
+
+
+
+
+
+ >
+ )}
+
+ );
+});
+
+export const VerifyTOTP = withCardStateProvider((props: VerifyTOTPProps) => {
+ const { onSuccess, onReset, resourceRef } = props;
+ const { user } = useUser();
+
+ const otp = useFieldOTP({
+ onCodeEntryFinished: (code, resolve, reject) => {
+ user
+ ?.verifyTOTP({ code })
+ .then((totp: TOTPResource) => resolve(totp))
+ .catch(reject);
+ },
+ onResolve: a => {
+ resourceRef.current = a;
+ onSuccess();
+ },
+ });
+
+ return (
+
+
+
+
+
+ ({
+ flexDirection: 'column',
+ gap: theme.space.$4,
+ })}
+ >
+ otp.onFakeContinue()}
+ isDisabled={otp.isLoading}
+ hasArrow
+ block
+ localizationKey={localizationKeys('taskSetupMfa.totpCode.verifyTotp.formButtonPrimary')}
+ elementDescriptor={descriptors.formButtonPrimary}
+ />
+ onReset?.()}
+ variant='ghost'
+ block
+ isDisabled={otp.isLoading}
+ localizationKey={localizationKeys('taskSetupMfa.totpCode.verifyTotp.formButtonReset')}
+ elementDescriptor={descriptors.formButtonReset}
+ />
+
+
+ );
+});
+
+const SuccessScreen = withCardStateProvider((props: SuccessScreenProps) => {
+ const { resourceRef, onFinish } = props;
+
+ return (
+
+ }
+ finishLabel={localizationKeys('taskSetupMfa.totpCode.success.finishButton')}
+ finishButtonProps={{
+ block: true,
+ hasArrow: true,
+ }}
+ />
+ );
+});
+
+type TOTPCodeFlowProps = {
+ onSuccess: () => void;
+ goToStartStep: () => void;
+};
+
+export const TOTPCodeFlow = withCardStateProvider((props: TOTPCodeFlowProps) => {
+ const { onSuccess, goToStartStep } = props;
+
+ const ref = useRef();
+ const wizard = useWizard({ defaultStep: 0 });
+
+ return (
+
+
+
+ {/* Step 0: Add new authenticator app (default if no available authenticator apps) */}
+ wizard.goToStep(1)}
+ onReset={goToStartStep}
+ />
+ {/* Step 1: Verify TOTP */}
+ wizard.goToStep(2)}
+ onReset={() => wizard.goToStep(0)}
+ resourceRef={ref}
+ />
+ {/* Step 2: Success with backup codes */}
+
+
+
+
+
+
+
+ );
+});
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/__tests__/TaskSetupMfa.test.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/__tests__/TaskSetupMfa.test.tsx
new file mode 100644
index 00000000000..494a4c7509a
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/__tests__/TaskSetupMfa.test.tsx
@@ -0,0 +1,918 @@
+import { ClerkAPIResponseError } from '@clerk/shared/error';
+import type { PhoneNumberResource, TOTPResource } from '@clerk/shared/types';
+import { describe, expect, it, test, vi } from 'vitest';
+
+import { bindCreateFixtures } from '@/test/create-fixtures';
+import { act, render, screen, waitFor } from '@/test/utils';
+
+import { TaskSetupMFA } from '../index';
+
+const { createFixtures } = bindCreateFixtures('TaskSetupMFA');
+
+describe('TaskSetupMFA', () => {
+ describe('task guard', () => {
+ it('does not render component without existing session task', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ });
+ f.withAuthenticatorApp();
+ });
+
+ const { queryByText, queryByRole } = render(, { wrapper });
+
+ expect(queryByText('Set up two-step verification')).not.toBeInTheDocument();
+ expect(queryByRole('link', { name: /sign out/i })).not.toBeInTheDocument();
+ });
+
+ it('renders component when session task exists', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { queryByText, queryByRole } = render(, { wrapper });
+
+ expect(queryByText('Set up two-step verification')).toBeInTheDocument();
+ expect(queryByRole('link', { name: /sign out/i })).toBeInTheDocument();
+ });
+ });
+
+ describe('main flow', () => {
+ it('should render SMS code and TOTP items on the first screen if both are enabled', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { getByRole } = render(, { wrapper });
+
+ expect(getByRole('button', { name: /authenticator application/i })).toBeInTheDocument();
+ expect(getByRole('button', { name: /sms code/i })).toBeInTheDocument();
+ });
+
+ it('should skip selection screen and go directly to SMS code flow when only SMS code is enabled', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { findByText, queryByText } = render(, { wrapper });
+
+ await findByText(/add phone number/i);
+ expect(queryByText(/set up two-step verification/i)).not.toBeInTheDocument();
+ });
+
+ it('should skip selection screen and go directly to TOTP flow when only TOTP is enabled', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { findByText, queryByText } = render(, { wrapper });
+
+ await findByText(/add authenticator application/i);
+ expect(queryByText(/set up two-step verification/i)).not.toBeInTheDocument();
+ });
+ });
+ describe('authenticator application', () => {
+ it('should render the initial screen with the qr code', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+ await findByText(/scan the following QR code/i);
+ expect(getByRole('button', { name: /can't scan qr code/i })).toBeInTheDocument();
+ });
+
+ test('clicking the "cant scan qr code" button should render the screen with the uri', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { getByRole, findByText, userEvent, queryByText } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /can't scan qr code/i }));
+ });
+
+ await findByText(/Set up a new sign-in method in your authenticator and enter the Key provided below/i);
+ expect(queryByText(/scan the following QR code/i)).not.toBeInTheDocument();
+ expect(getByRole('button', { name: /scan qr code instead/i })).toBeInTheDocument();
+ });
+
+ test('clicking continue button should navigate to the verification screen', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { getByRole, findByText, findByLabelText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ await findByText(/enter verification code generated by your authenticator/i);
+ await findByLabelText(/verification code/i);
+ });
+
+ test('completing TOTP verification should show success screen with backup codes', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withBackupCode();
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ fixtures.clerk.user?.verifyTOTP.mockResolvedValue({
+ backupCodes: ['code1', 'code2', 'code3'],
+ } as TOTPResource);
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ await findByText(/enter verification code generated by your authenticator/i);
+
+ await userEvent.type(screen.getByLabelText(/verification code/i), '123456');
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.verifyTOTP).toHaveBeenCalledWith({ code: '123456' });
+ });
+
+ await findByText(/authenticator application verification enabled/i);
+ await findByText(/save these backup codes/i);
+ });
+
+ test('completing TOTP verification should show simple success screen when backup codes are not enabled', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ fixtures.clerk.user?.verifyTOTP.mockResolvedValue({} as TOTPResource);
+
+ const { getByRole, findByText, queryByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ await findByText(/enter verification code generated by your authenticator/i);
+
+ await userEvent.type(screen.getByLabelText(/verification code/i), '123456');
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.verifyTOTP).toHaveBeenCalledWith({ code: '123456' });
+ });
+
+ await findByText(/authenticator application verification enabled/i);
+ expect(queryByText(/save these backup codes/i)).not.toBeInTheDocument();
+ });
+
+ test('clicking "scan qr code instead" should switch back from URI view to QR code', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { getByRole, findByText, queryByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ // Switch to URI view
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /can't scan qr code/i }));
+ });
+
+ await findByText(/Set up a new sign-in method in your authenticator and enter the Key provided below/i);
+ expect(queryByText(/scan the following QR code/i)).not.toBeInTheDocument();
+
+ // Switch back to QR code view
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /scan qr code instead/i }));
+ });
+
+ await findByText(/scan the following QR code/i);
+ expect(
+ queryByText(/Set up a new sign-in method in your authenticator and enter the Key provided below/i),
+ ).not.toBeInTheDocument();
+ expect(getByRole('button', { name: /can't scan qr code/i })).toBeInTheDocument();
+ });
+
+ it('should navigate back to main selection when clicking cancel from TOTP flow', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /cancel/i }));
+ });
+
+ // Should be back on main selection screen
+ expect(getByRole('button', { name: /authenticator application/i })).toBeInTheDocument();
+ expect(getByRole('button', { name: /sms code/i })).toBeInTheDocument();
+ });
+
+ it('should display error when createTOTP fails', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockRejectedValueOnce(
+ new ClerkAPIResponseError('Error', {
+ data: [
+ {
+ code: 'totp_already_enabled',
+ long_message: 'TOTP is already enabled for this user',
+ message: 'TOTP already enabled',
+ meta: {},
+ },
+ ],
+ status: 422,
+ }),
+ );
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/TOTP is already enabled for this user/i);
+ });
+
+ it('should display error when verifyTOTP fails with incorrect code', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createTOTP.mockResolvedValue({
+ uri: 'otpauth://totp/Test:test@clerk.com?secret=TESTSECRET&issuer=Test',
+ secret: 'TESTSECRET',
+ } as TOTPResource);
+
+ fixtures.clerk.user?.verifyTOTP.mockRejectedValueOnce(
+ new ClerkAPIResponseError('Error', {
+ data: [
+ {
+ code: 'form_code_incorrect',
+ long_message: 'Incorrect authenticator code',
+ message: 'is incorrect',
+ meta: { param_name: 'code' },
+ },
+ ],
+ status: 422,
+ }),
+ );
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /authenticator application/i }));
+ });
+
+ await findByText(/add authenticator application/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ await findByText(/enter verification code generated by your authenticator/i);
+
+ await userEvent.type(screen.getByLabelText(/verification code/i), '123456');
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.verifyTOTP).toHaveBeenCalledWith({ code: '123456' });
+ });
+
+ expect(await screen.findByTestId('form-feedback-error')).toHaveTextContent(/Incorrect authenticator code/i);
+ });
+ });
+
+ describe('sms code', () => {
+ it('should render the phone selection screen when clicking SMS code button', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [{ phone_number: '+306911111111', id: 'phone_1' }],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+ await findByText(/choose phone number you want to use/i);
+ await findByText(/\+30 691 1111111/i);
+ expect(getByRole('menuitem', { name: /add phone number/i })).toBeInTheDocument();
+ });
+
+ it('should show add phone screen when no existing phone numbers', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add phone number/i);
+ await findByText(/a text message containing a verification code/i);
+ });
+
+ it('clicking add phone number should navigate to add phone screen', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [{ phone_number: '+306911111111', id: 'phone_1' }],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('menuitem', { name: /add phone number/i }));
+ });
+
+ await findByText(/add phone number/i);
+ await findByText(/a text message containing a verification code/i);
+ });
+
+ test('completing SMS code verification should show success screen with backup codes', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'verified', strategy: 'phone_code' },
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withBackupCode();
+ });
+
+ fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor.mockResolvedValue({
+ backupCodes: ['code1', 'code2', 'code3'],
+ } as PhoneNumberResource);
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /\+30 691 1111111/i }));
+ });
+
+ expect(fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor).toHaveBeenCalledWith({
+ reserved: true,
+ });
+
+ await findByText(/sms code verification enabled/i);
+ await findByText(/save these backup codes/i);
+ });
+
+ test('completing SMS code verification should show simple success screen when backup codes are not enabled', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'verified', strategy: 'phone_code' },
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor.mockResolvedValue({} as PhoneNumberResource);
+
+ const { getByRole, findByText, queryByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /\+30 691 1111111/i }));
+ });
+
+ expect(fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor).toHaveBeenCalledWith({
+ reserved: true,
+ });
+
+ await findByText(/sms code verification enabled/i);
+ expect(queryByText(/save these backup codes/i)).not.toBeInTheDocument();
+ });
+
+ it('should not display phones already reserved for 2FA', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'verified', strategy: 'phone_code' },
+ reserved_for_second_factor: true,
+ },
+ {
+ phone_number: '+306922222222',
+ id: 'phone_2',
+ verification: { status: 'verified', strategy: 'phone_code' },
+ reserved_for_second_factor: false,
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const { getByRole, findByText, queryByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ // Phone already reserved for 2FA should not be shown
+ expect(queryByText(/\+30 691 1111111/i)).not.toBeInTheDocument();
+ // Phone not reserved should be shown
+ await findByText(/\+30 692 2222222/i);
+ });
+
+ it('should navigate back to main selection when clicking cancel from SMS code flow', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [{ phone_number: '+306911111111', id: 'phone_1' }],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withAuthenticatorApp({ enabled: true });
+ });
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /cancel/i }));
+ });
+
+ // Should be back on main selection screen
+ expect(getByRole('button', { name: /authenticator application/i })).toBeInTheDocument();
+ expect(getByRole('button', { name: /sms code/i })).toBeInTheDocument();
+ });
+
+ it('should display error when setReservedForSecondFactor fails', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'verified', strategy: 'phone_code' },
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor.mockRejectedValueOnce(
+ new ClerkAPIResponseError('Error', {
+ data: [
+ {
+ code: 'identification_update_failed',
+ long_message: 'You cannot set your last identification as second factor.',
+ message: 'Update failed',
+ meta: {},
+ },
+ ],
+ status: 422,
+ }),
+ );
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /\+30 691 1111111/i }));
+ });
+
+ expect(fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor).toHaveBeenCalledWith({
+ reserved: true,
+ });
+
+ await findByText(/You cannot set your last identification as second factor/i);
+ });
+
+ it('should allow adding a new phone number and navigate to verification', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ const mockPhoneResource = {
+ id: 'phone_new',
+ phoneNumber: '+16505551234',
+ prepareVerification: vi.fn().mockResolvedValue({}),
+ } as unknown as PhoneNumberResource;
+
+ fixtures.clerk.user?.createPhoneNumber.mockResolvedValue(mockPhoneResource);
+
+ const { getByRole, findByText, getByLabelText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ // Should go directly to add phone screen since user has no phones
+ await findByText(/add phone number/i);
+
+ await userEvent.type(getByLabelText(/phone number/i), '6505551234');
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ expect(fixtures.clerk.user?.createPhoneNumber).toHaveBeenCalledWith({
+ phoneNumber: expect.stringContaining('6505551234'),
+ });
+
+ // Should navigate to verification screen
+ await findByText(/enter the verification code/i);
+ });
+
+ it('should display error when createPhoneNumber fails', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.createPhoneNumber.mockRejectedValueOnce(
+ new ClerkAPIResponseError('Error', {
+ data: [
+ {
+ code: 'phone_number_exists',
+ long_message: 'This phone number is already associated with another account.',
+ message: 'Phone number exists',
+ meta: {},
+ },
+ ],
+ status: 422,
+ }),
+ );
+
+ const { getByRole, findByText, getByLabelText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add phone number/i);
+
+ await userEvent.type(getByLabelText(/phone number/i), '6505551234');
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /continue/i }));
+ });
+
+ await findByText(/This phone number is already associated with another account/i);
+ });
+
+ it('should verify phone with code and show success', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'unverified', strategy: 'phone_code' },
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.phoneNumbers[0].prepareVerification.mockResolvedValue({} as PhoneNumberResource);
+ fixtures.clerk.user?.phoneNumbers[0].attemptVerification.mockResolvedValue({} as PhoneNumberResource);
+ fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor.mockResolvedValue({} as PhoneNumberResource);
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ // Click unverified phone to go to verification
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /\+30 691 1111111/i }));
+ });
+
+ await findByText(/enter the verification code/i);
+
+ // Enter verification code
+ await userEvent.type(screen.getByLabelText(/verification code/i), '123456');
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.phoneNumbers[0].attemptVerification).toHaveBeenCalledWith({ code: '123456' });
+ });
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.phoneNumbers[0].setReservedForSecondFactor).toHaveBeenCalledWith({
+ reserved: true,
+ });
+ });
+
+ await findByText(/sms code verification enabled/i);
+ });
+
+ it('should display error when phone verification code is incorrect', async () => {
+ const { wrapper, fixtures } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ identifier: 'test@clerk.com',
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'phone_1',
+ verification: { status: 'unverified', strategy: 'phone_code' },
+ },
+ ],
+ tasks: [{ key: 'setup-mfa' }],
+ });
+ f.withAuthenticatorApp({ enabled: true });
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ });
+
+ fixtures.clerk.user?.phoneNumbers[0].prepareVerification.mockResolvedValue({} as PhoneNumberResource);
+ fixtures.clerk.user?.phoneNumbers[0].attemptVerification.mockRejectedValueOnce(
+ new ClerkAPIResponseError('Error', {
+ data: [
+ {
+ code: 'form_code_incorrect',
+ long_message: 'Incorrect phone code',
+ message: 'is incorrect',
+ meta: { param_name: 'code' },
+ },
+ ],
+ status: 422,
+ }),
+ );
+
+ const { getByRole, findByText, userEvent } = render(, { wrapper });
+
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /sms code/i }));
+ });
+
+ await findByText(/add sms code verification/i);
+
+ // Click unverified phone to go to verification
+ await act(async () => {
+ await userEvent.click(getByRole('button', { name: /\+30 691 1111111/i }));
+ });
+
+ await findByText(/enter the verification code/i);
+
+ // Enter incorrect verification code
+ await userEvent.type(screen.getByLabelText(/verification code/i), '000000');
+
+ await waitFor(() => {
+ expect(fixtures.clerk.user?.phoneNumbers[0].attemptVerification).toHaveBeenCalledWith({ code: '000000' });
+ });
+
+ expect(await screen.findByTestId('form-feedback-error')).toHaveTextContent(/Incorrect phone code/i);
+ });
+ });
+});
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/constants.ts b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/constants.ts
new file mode 100644
index 00000000000..09f742dd531
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/constants.ts
@@ -0,0 +1,4 @@
+export const MFA_METHODS_TO_STEP: Record<'phone_code' | 'totp', number> = {
+ phone_code: 1,
+ totp: 2,
+};
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/index.tsx
new file mode 100644
index 00000000000..fdfa8d65325
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/index.tsx
@@ -0,0 +1,107 @@
+import { useClerk, useSession, useUser } from '@clerk/shared/react';
+import { useEffect, useMemo } from 'react';
+
+import { useWizard, Wizard } from '@/ui/common';
+import { useEnvironment, withCoreSessionSwitchGuard } from '@/ui/contexts';
+import { useSessionTasksContext, useTaskSetupMFAContext } from '@/ui/contexts/components/SessionTasks';
+import { Flow } from '@/ui/customizables';
+import { withCardStateProvider } from '@/ui/elements/contexts';
+import { getSecondFactorsAvailableToAdd } from '@/ui/utils/mfa';
+
+import { withTaskGuardOnlyOnMount } from '../shared';
+import { SetupMfaStartScreen } from './SetupMfaStartScreen';
+import { SmsCodeFlow } from './SmsCodeFlowScreen';
+import { TOTPCodeFlow } from './TOTPCodeFlowScreen';
+
+const WIZARD_STEPS = {
+ start: 0,
+ phoneCode: 1,
+ totp: 2,
+} as const;
+
+const TaskSetupMFAInternal = () => {
+ const clerk = useClerk();
+ const { user } = useUser();
+ const { session } = useSession();
+ const {
+ userSettings: { attributes },
+ } = useEnvironment();
+
+ const secondFactorsAvailableToAdd = useMemo(() => {
+ const availableMethods = user ? getSecondFactorsAvailableToAdd(attributes, user) : [];
+
+ if (!user?.enterpriseAccounts || user.enterpriseAccounts.length === 0) {
+ return availableMethods;
+ }
+
+ const firstEnterpriseConnection = user?.enterpriseAccounts[0];
+
+ return availableMethods.filter(method => {
+ if (method === 'phone_code') {
+ return firstEnterpriseConnection?.enterpriseConnection?.disableAdditionalIdentifications === false;
+ }
+ return true;
+ });
+ }, [attributes, user]);
+
+ const defaultStep =
+ secondFactorsAvailableToAdd.indexOf('phone_code') > -1 ? WIZARD_STEPS.phoneCode : WIZARD_STEPS.totp;
+ const wizard = useWizard({
+ defaultStep: secondFactorsAvailableToAdd.length > 1 ? WIZARD_STEPS.start : defaultStep,
+ });
+ const { redirectUrlComplete } = useTaskSetupMFAContext();
+ const { navigateOnSetActive, redirectOnActiveSession } = useSessionTasksContext();
+
+ const handleSuccess = async () => {
+ if (redirectOnActiveSession) {
+ redirectOnActiveSession.current = false;
+ }
+ await clerk.setActive({
+ session: session?.id,
+ navigate: async ({ session }) => {
+ await navigateOnSetActive?.({ session, redirectUrlComplete });
+ },
+ });
+ };
+
+ // For this task we should not redirect to the redirectUrlComplete even if the session is active.
+ // This needed because we want the user to explicitly click the to go the the next page because they
+ // need to see the backups codes.
+ useEffect(() => {
+ if (redirectOnActiveSession) {
+ redirectOnActiveSession.current = false;
+ }
+ }, [redirectOnActiveSession]);
+
+ return (
+
+
+
+
+
+
+ wizard.goToStep(0)}
+ />
+
+
+ wizard.goToStep(0)}
+ />
+
+
+
+ );
+};
+
+export const TaskSetupMFA = withCoreSessionSwitchGuard(
+ withTaskGuardOnlyOnMount(withCardStateProvider(TaskSetupMFAInternal), 'setup-mfa'),
+);
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/shared.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/shared.tsx
new file mode 100644
index 00000000000..e3090dd25f4
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/TaskSetupMfa/shared.tsx
@@ -0,0 +1,56 @@
+import { useClerk, useSession, useUser } from '@clerk/shared/react';
+import type { UserResource } from '@clerk/shared/types';
+import React from 'react';
+
+import { useSignOutContext } from '@/ui/contexts';
+import { localizationKeys } from '@/ui/customizables';
+import { Card } from '@/ui/elements/Card';
+import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
+import { stringToFormattedPhoneString } from '@/ui/utils/phoneUtils';
+
+export const commonIdentifier = (user: UserResource) => {
+ const formattedPhoneNumber = user.primaryPhoneNumber?.phoneNumber
+ ? stringToFormattedPhoneString(user.primaryPhoneNumber?.phoneNumber)
+ : null;
+ return user.primaryEmailAddress?.emailAddress ?? user.username ?? formattedPhoneNumber;
+};
+
+export function SharedFooterActionForSignOut() {
+ const { user } = useUser();
+ const clerk = useClerk();
+ const { session } = useSession();
+ const { otherSessions } = useMultipleSessions({ user });
+ const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();
+
+ const handleSignOut = () => {
+ if (otherSessions.length === 0) {
+ return clerk.signOut(navigateAfterSignOut);
+ }
+ return clerk.signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
+ };
+
+ const identifier = React.useMemo(() => (user ? commonIdentifier(user) : null), [user]);
+
+ return (
+ ({ width: '100%' })}
+ >
+ {identifier && (
+
+ )}
+ ({ flexShrink: 0 })}
+ onClick={() => void handleSignOut()}
+ localizationKey={localizationKeys('taskSetupMfa.signOut.actionLink')}
+ />
+
+ );
+}
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/index.ts b/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/index.ts
index c78a073ba17..504f7d7143e 100644
--- a/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/index.ts
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/index.ts
@@ -1 +1,2 @@
export { withTaskGuard } from './withTaskGuard';
+export { withTaskGuardOnlyOnMount } from './withTaskGuardOnlyOnMount';
diff --git a/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/withTaskGuardOnlyOnMount.tsx b/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/withTaskGuardOnlyOnMount.tsx
new file mode 100644
index 00000000000..1052047564f
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SessionTasks/tasks/shared/withTaskGuardOnlyOnMount.tsx
@@ -0,0 +1,67 @@
+import { isDevelopmentFromPublishableKey } from '@clerk/shared/keys';
+import { useClerk } from '@clerk/shared/react';
+import type { SessionTask } from '@clerk/shared/types';
+import type { ComponentType } from 'react';
+import { useEffect, useRef } from 'react';
+
+import { warnings } from '@/core/warnings';
+import { useSessionTasksContext } from '@/ui/contexts/components/SessionTasks';
+import { useRouter } from '@/ui/router';
+import type { AvailableComponentProps } from '@/ui/types';
+
+/**
+ * Triggers a redirect if current task is not the given task key on initial mount only.
+ *
+ * Unlike the standard withTaskGuard, this guard captures the redirect condition on mount
+ * and does not re-evaluate it on subsequent renders. This allows tasks like setup-mfa to continue
+ * to still show the success screen after the task is completed mid-flow.
+ *
+ * If there's a current session, it will redirect to the `redirectUrlComplete` prop.
+ * If there's no current session, it will redirect to the sign in URL.
+ *
+ * @internal
+ */
+export const withTaskGuardOnlyOnMount = (
+ Component: ComponentType
,
+ taskKey: SessionTask['key'],
+): ((props: P) => null | JSX.Element) => {
+ const displayName = Component.displayName || Component.name || 'Component';
+ Component.displayName = displayName;
+
+ const HOC = (props: P) => {
+ const ctx = useSessionTasksContext();
+ const clerk = useClerk();
+ const { navigate } = useRouter();
+
+ const shouldRedirectOnMount = useRef(null);
+
+ if (shouldRedirectOnMount.current === null) {
+ shouldRedirectOnMount.current =
+ !clerk.session?.currentTask ||
+ (clerk.session.currentTask.key !== taskKey && !clerk.__internal_setActiveInProgress);
+ }
+
+ useEffect(() => {
+ if (shouldRedirectOnMount.current) {
+ if (isDevelopmentFromPublishableKey(clerk.publishableKey)) {
+ console.info(warnings.cannotRenderComponentWhenTaskDoesNotExist);
+ }
+ const redirectUrl = !clerk.session
+ ? clerk.buildSignInUrl()
+ : (ctx.redirectUrlComplete ?? clerk.buildAfterSignInUrl());
+ void navigate(redirectUrl);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ if (shouldRedirectOnMount.current) {
+ return null;
+ }
+
+ return ;
+ };
+
+ HOC.displayName = `withTaskGuardOnlyOnMount(${displayName})`;
+
+ return HOC;
+};
diff --git a/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
index d1a7d9e787d..d5930c75b5b 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
@@ -20,7 +20,7 @@ import { defaultFirst, getSecondFactors, getSecondFactorsAvailableToAdd } from '
export const MfaSection = () => {
const {
- userSettings: { attributes },
+ userSettings: { attributes, signUp },
} = useEnvironment();
const { user } = useUser();
const [actionValue, setActionValue] = useState(null);
@@ -34,12 +34,16 @@ export const MfaSection = () => {
const showTOTP = secondFactors.includes('totp') && user.totpEnabled;
const showBackupCode = secondFactors.includes('backup_code') && user.backupCodeEnabled;
+ const showPhoneCode = secondFactors.includes('phone_code');
const mfaPhones = user.phoneNumbers
.filter(ph => ph.verification.status === 'verified')
.filter(ph => ph.reservedForSecondFactor)
.sort(defaultFirst);
+ const hideTOTPDeleteAction = Boolean(signUp.mfa?.required && mfaPhones.length === 0);
+ const hidePhoneCodeDeleteAction = Boolean(signUp.mfa?.required && !showTOTP && mfaPhones.length === 1);
+
return (
{
-
+ {!hideTOTPDeleteAction && }
@@ -79,7 +83,7 @@ export const MfaSection = () => {
>
)}
- {secondFactors.includes('phone_code') &&
+ {showPhoneCode &&
mfaPhones.map(phone => {
const isDefault = !showTOTP && phone.defaultSecondFactor;
const phoneId = phone.id;
@@ -102,7 +106,8 @@ export const MfaSection = () => {
@@ -153,30 +158,37 @@ export const MfaSection = () => {
type MfaPhoneCodeMenuProps = {
phone: PhoneNumberResource;
- showTOTP: boolean;
+ isDefault: boolean;
+ hidePhoneCodeDeleteAction: boolean;
};
-const MfaPhoneCodeMenu = ({ phone, showTOTP }: MfaPhoneCodeMenuProps) => {
+const MfaPhoneCodeMenu = ({ phone, isDefault, hidePhoneCodeDeleteAction }: MfaPhoneCodeMenuProps) => {
const { open } = useActionContext();
const card = useCardState();
const phoneId = phone.id;
const actions = (
[
- !showTOTP && !phone.defaultSecondFactor
+ !isDefault
? {
label: localizationKeys('userProfile.start.mfaSection.phoneCode.actionLabel__setDefault'),
onClick: () => phone.makeDefaultSecondFactor().catch(err => handleError(err, [], card.setError)),
}
: null,
- {
- label: localizationKeys('userProfile.start.mfaSection.phoneCode.destructiveActionLabel'),
- isDestructive: true,
- onClick: () => open(`remove-${phoneId}`),
- },
+ !hidePhoneCodeDeleteAction
+ ? {
+ label: localizationKeys('userProfile.start.mfaSection.phoneCode.destructiveActionLabel'),
+ isDestructive: true,
+ onClick: () => open(`remove-${phoneId}`),
+ }
+ : null,
] satisfies (PropsOfComponent['actions'][0] | null)[]
).filter(a => a !== null) as PropsOfComponent['actions'];
+ if (actions.length === 0) {
+ return null;
+ }
+
return ;
};
@@ -216,6 +228,24 @@ type MfaAddMenuProps = ProfileSectionActionMenuItemProps & {
onClick?: () => void;
};
+const strategiesMap = {
+ phone_code: {
+ icon: Mobile,
+ text: 'SMS code',
+ key: 'phone_code',
+ },
+ totp: {
+ icon: AuthApp,
+ text: 'Authenticator application',
+ key: 'totp',
+ },
+ backup_code: {
+ icon: DotCircle,
+ text: 'Backup code',
+ key: 'backup_code',
+ },
+} as const;
+
const MfaAddMenu = (props: MfaAddMenuProps) => {
const { open } = useActionContext();
const { secondFactorsAvailableToAdd, onClick } = props;
@@ -225,27 +255,7 @@ const MfaAddMenu = (props: MfaAddMenuProps) => {
() =>
secondFactorsAvailableToAdd
.map(key => {
- if (key === 'phone_code') {
- return {
- icon: Mobile,
- text: 'SMS code',
- key: 'phone_code',
- } as const;
- } else if (key === 'totp') {
- return {
- icon: AuthApp,
- text: 'Authenticator application',
- key: 'totp',
- } as const;
- } else if (key === 'backup_code') {
- return {
- icon: DotCircle,
- text: 'Backup code',
- key: 'backup_code',
- } as const;
- }
-
- return null;
+ return strategiesMap[key as keyof typeof strategiesMap] || null;
})
.filter(element => element !== null),
[secondFactorsAvailableToAdd],
@@ -260,21 +270,18 @@ const MfaAddMenu = (props: MfaAddMenuProps) => {
triggerLocalizationKey={localizationKeys('userProfile.start.mfaSection.primaryButton')}
onClick={onClick}
>
- {strategies.map(
- method =>
- method && (
- {
- setSelectedStrategy(method.key);
- open('multi-factor');
- }}
- />
- ),
- )}
+ {strategies.map(method => (
+ {
+ setSelectedStrategy(method.key);
+ open('multi-factor');
+ }}
+ />
+ ))}
)}
diff --git a/packages/clerk-js/src/ui/components/UserProfile/__tests__/MfaPage.test.tsx b/packages/clerk-js/src/ui/components/UserProfile/__tests__/MfaPage.test.tsx
index 3fa7152f9e2..ff6e64e3a85 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/__tests__/MfaPage.test.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/__tests__/MfaPage.test.tsx
@@ -386,4 +386,194 @@ describe('MfaPage', () => {
});
});
});
+
+ describe('Hide delete actions when MFA is required', () => {
+ it('hides TOTP delete action when MFA is required and TOTP is the only second factor', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withAuthenticatorApp();
+ f.withMfaRequired(true);
+ f.withUser({
+ two_factor_enabled: true,
+ totp_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/Authenticator application/i);
+
+ const itemButton = (await findByText(/Authenticator application/i))?.parentElement?.parentElement?.children[1];
+ expect(itemButton).toBeUndefined();
+ });
+
+ it('shows TOTP delete action when MFA is required but phone_code is also available', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withAuthenticatorApp();
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withMfaRequired(true);
+ f.withUser({
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'id',
+ reserved_for_second_factor: true,
+ verification: { status: 'verified', strategy: 'phone_code' } as VerificationJSON,
+ },
+ ],
+ two_factor_enabled: true,
+ totp_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/Authenticator application/i);
+
+ const itemButton = (await findByText(/Authenticator application/i))?.parentElement?.parentElement?.children[1];
+ expect(itemButton).toBeDefined();
+ });
+
+ it('shows TOTP delete action when MFA is not required', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withAuthenticatorApp();
+ f.withMfaRequired(false);
+ f.withUser({
+ two_factor_enabled: true,
+ totp_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/Authenticator application/i);
+
+ const itemButton = (await findByText(/Authenticator application/i))?.parentElement?.parentElement?.children[1];
+ expect(itemButton).toBeDefined();
+ });
+
+ it('hides phone code delete action when it is the last one reserved for second factor and TOTP is not available', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withMfaRequired(true);
+ f.withUser({
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'id',
+ reserved_for_second_factor: true,
+ default_second_factor: true,
+ verification: { status: 'verified', strategy: 'phone_code' } as VerificationJSON,
+ },
+ ],
+ two_factor_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/\+30 691 1111111/i);
+
+ const itemButton = (await findByText(/\+30 691 1111111/i))?.parentElement?.parentElement?.parentElement
+ ?.children[1];
+
+ expect(itemButton).toBeUndefined();
+ });
+
+ it('shows phone code delete action when TOTP is also available', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withMfaRequired(true);
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withAuthenticatorApp();
+ f.withUser({
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'id',
+ reserved_for_second_factor: true,
+ verification: { status: 'verified', strategy: 'phone_code' } as VerificationJSON,
+ },
+ ],
+ two_factor_enabled: true,
+ totp_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/\+30 691 1111111/i);
+
+ const itemButton = (await findByText(/\+30 691 1111111/i))?.parentElement?.parentElement?.parentElement
+ ?.children[1];
+
+ expect(itemButton).toBeDefined();
+ });
+
+ it('shows phone code delete action when multiple phone numbers are registered', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withPhoneNumber({ second_factors: ['phone_code'], used_for_second_factor: true });
+ f.withUser({
+ phone_numbers: [
+ {
+ phone_number: '+306911111111',
+ id: 'id1',
+ reserved_for_second_factor: true,
+ verification: { status: 'verified', strategy: 'phone_code' } as VerificationJSON,
+ },
+ {
+ phone_number: '+306922222222',
+ id: 'id2',
+ reserved_for_second_factor: true,
+ verification: { status: 'verified', strategy: 'phone_code' } as VerificationJSON,
+ },
+ ],
+ two_factor_enabled: true,
+ });
+ });
+
+ const { findByText } = render(
+
+
+ ,
+ { wrapper },
+ );
+
+ await findByText('Two-step verification');
+ await findByText(/\+30 691 1111111/i);
+
+ const itemButton = (await findByText(/\+30 691 1111111/i))?.parentElement?.parentElement?.parentElement
+ ?.children[1];
+
+ expect(itemButton).toBeDefined();
+ });
+ });
});
diff --git a/packages/clerk-js/src/ui/components/UserProfile/utils.ts b/packages/clerk-js/src/ui/components/UserProfile/utils.ts
index e10993d2ba2..804efe568f9 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/utils.ts
+++ b/packages/clerk-js/src/ui/components/UserProfile/utils.ts
@@ -1,10 +1,6 @@
-import type {
- Attributes,
- EmailAddressResource,
- PhoneNumberResource,
- UserResource,
- Web3WalletResource,
-} from '@clerk/shared/types';
+import type { EmailAddressResource, PhoneNumberResource, Web3WalletResource } from '@clerk/shared/types';
+
+export { defaultFirst, getSecondFactors, getSecondFactorsAvailableToAdd } from '@/ui/utils/mfa';
type IDable = { id: string };
@@ -14,36 +10,6 @@ export const primaryIdentificationFirst = (primaryId: string | null) => (val1: I
export const currentSessionFirst = (id: string) => (a: IDable) => (a.id === id ? -1 : 1);
-export const defaultFirst = (a: PhoneNumberResource) => (a.defaultSecondFactor ? -1 : 1);
-
-export function getSecondFactors(attributes: Partial): string[] {
- const secondFactors: string[] = [];
-
- Object.entries(attributes).forEach(([, attr]) => {
- if (attr.used_for_second_factor) {
- secondFactors.push(...attr.second_factors);
- }
- });
-
- return secondFactors;
-}
-
-export function getSecondFactorsAvailableToAdd(attributes: Partial, user: UserResource): string[] {
- let sfs = getSecondFactors(attributes);
-
- // If user.totp_enabled, skip totp from the list of choices
- if (user.totpEnabled) {
- sfs = sfs.filter(f => f !== 'totp');
- }
-
- // Remove backup codes if already enabled or user doesn't have another MFA method added
- if (user.backupCodeEnabled || !user.twoFactorEnabled) {
- sfs = sfs.filter(f => f !== 'backup_code');
- }
-
- return sfs;
-}
-
export function sortIdentificationBasedOnVerification<
T extends Array,
>(array: T | null | undefined, primaryId: string | null | undefined): T {
diff --git a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
index 19229545f0b..e954d7e8486 100644
--- a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
+++ b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
@@ -4,6 +4,7 @@ import type {
PricingTableProps,
TaskChooseOrganizationProps,
TaskResetPasswordProps,
+ TaskSetupMFAProps,
UserButtonProps,
WaitlistProps,
} from '@clerk/shared/types';
@@ -32,6 +33,7 @@ import {
SessionTasksContext,
TaskChooseOrganizationContext,
TaskResetPasswordContext,
+ TaskSetupMFAContext,
} from './components/SessionTasks';
export function ComponentContextProvider({
@@ -143,6 +145,14 @@ export function ComponentContextProvider({
);
+ case 'TaskSetupMFA':
+ return (
+
+
+ {children}
+
+
+ );
default:
throw new Error(`Unknown component context: ${componentName}`);
}
diff --git a/packages/clerk-js/src/ui/contexts/components/SessionTasks.ts b/packages/clerk-js/src/ui/contexts/components/SessionTasks.ts
index 1f25c3cdc05..43db0224178 100644
--- a/packages/clerk-js/src/ui/contexts/components/SessionTasks.ts
+++ b/packages/clerk-js/src/ui/contexts/components/SessionTasks.ts
@@ -4,7 +4,7 @@ import { createContext, useContext } from 'react';
import { getTaskEndpoint } from '@/core/sessionTasks';
import { useRouter } from '@/ui/router';
-import type { SessionTasksCtx, TaskChooseOrganizationCtx, TaskResetPasswordCtx } from '../../types';
+import type { SessionTasksCtx, TaskChooseOrganizationCtx, TaskResetPasswordCtx, TaskSetupMFACtx } from '../../types';
export const SessionTasksContext = createContext(null);
@@ -67,3 +67,15 @@ export const useTaskResetPasswordContext = (): TaskResetPasswordCtx => {
return context;
};
+
+export const TaskSetupMFAContext = createContext(null);
+
+export const useTaskSetupMFAContext = (): TaskSetupMFACtx => {
+ const context = useContext(TaskSetupMFAContext);
+
+ if (context === null) {
+ throw new Error('Clerk: useTaskSetupMFAContext called outside of the mounted TaskSetupMFA component.');
+ }
+
+ return context;
+};
diff --git a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
index c5d7ed6583a..017a5717ac5 100644
--- a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
+++ b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
@@ -220,6 +220,12 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
'taskChooseOrganizationCreateOrganizationActionButton',
'taskChooseOrganizationPreviewButton',
+ 'taskSetupMfaMethodSelectionItem',
+ 'taskSetupMfaMethodSelectionItems',
+ 'taskSetupMfaPhoneSelectionItems',
+ 'taskSetupMfaPhoneSelectionItem',
+ 'taskSetupMfaPhoneSelectionAddPhoneAction',
+
'userAvatarBox',
'userAvatarImage',
diff --git a/packages/clerk-js/src/ui/elements/FormContainer.tsx b/packages/clerk-js/src/ui/elements/FormContainer.tsx
index 060023910a8..ee350698f4e 100644
--- a/packages/clerk-js/src/ui/elements/FormContainer.tsx
+++ b/packages/clerk-js/src/ui/elements/FormContainer.tsx
@@ -15,6 +15,7 @@ type PageProps = PropsOfComponent & {
headerTitleTextVariant?: PropsOfComponent['textVariant'];
headerSubtitle?: LocalizationKey;
headerSubtitleTextVariant?: PropsOfComponent['variant'];
+ badgeText?: LocalizationKey;
};
export const FormContainer = (props: PageProps) => {
@@ -23,6 +24,7 @@ export const FormContainer = (props: PageProps) => {
headerTitleTextVariant = 'h3',
headerSubtitle,
headerSubtitleTextVariant = 'body',
+ badgeText,
children,
sx,
...rest
@@ -37,7 +39,7 @@ export const FormContainer = (props: PageProps) => {
sx={[sx]}
>
{(headerTitle || headerSubtitle) && (
-
+
{headerTitle && (
& {
showLogo?: boolean;
showDivider?: boolean;
contentSx?: ThemableCssProp;
+ badgeText?: LocalizationKey;
};
const Root = React.memo(
React.forwardRef((props, ref) => {
- const { sx, children, contentSx, gap = 6, showLogo = false, showDivider = false, ...rest } = props;
+ const { sx, children, contentSx, gap = 6, showLogo = false, showDivider = false, badgeText, ...rest } = props;
const appearance = useAppearance();
const logoIsVisible = appearance.parsedLayout.logoPlacement === 'inside' && showLogo;
@@ -30,6 +42,11 @@ const Root = React.memo(
>
{logoIsVisible && }
{verticalDividerIsVisible && }
+ {badgeText && (
+
+
+
+ )}
, 'headerTitle' | 'title'> & {
title?: LocalizationKey;
+ subtitle?: LocalizationKey;
text?: LocalizationKey | LocalizationKey[];
finishLabel?: LocalizationKey;
contents?: React.ReactNode;
+ headerBadgeText?: LocalizationKey;
onFinish?: () => void;
+ finishButtonProps?: PropsOfComponent;
};
export const SuccessPage = (props: SuccessPageProps) => {
- const { text, title, finishLabel, onFinish, contents, ...rest } = props;
+ const { text, title, subtitle, finishLabel, onFinish, contents, finishButtonProps, headerBadgeText, ...rest } = props;
const { navigateToFlowStart } = useNavigateToFlowStart();
return (
@@ -26,11 +29,14 @@ export const SuccessPage = (props: SuccessPageProps) => {
{...rest}
gap={4}
>
-
-
+
+ {title && (
+
+ )}
+ {subtitle && }
{Array.isArray(text) ? (
@@ -62,6 +68,7 @@ export const SuccessPage = (props: SuccessPageProps) => {
localizationKey={finishLabel || localizationKeys('userProfile.formButtonPrimary__finish')}
elementDescriptor={descriptors.formButtonPrimary}
onClick={onFinish || navigateToFlowStart}
+ {...finishButtonProps}
/>
diff --git a/packages/clerk-js/src/ui/elements/VerificationCodeCard.tsx b/packages/clerk-js/src/ui/elements/VerificationCodeCard.tsx
index 3163ba73f2e..c8ac57972ff 100644
--- a/packages/clerk-js/src/ui/elements/VerificationCodeCard.tsx
+++ b/packages/clerk-js/src/ui/elements/VerificationCodeCard.tsx
@@ -15,10 +15,12 @@ export type VerificationCodeCardProps = {
cardSubtitle: LocalizationKey;
cardNotice?: LocalizationKey;
inputLabel?: LocalizationKey;
+ backLinkLabel?: LocalizationKey;
safeIdentifier?: string | undefined | null;
resendButton?: LocalizationKey;
alternativeMethodsLabel?: LocalizationKey;
profileImageUrl?: string;
+ badgeText?: LocalizationKey;
onCodeEntryFinishedAction: (
code: string,
resolve: () => Promise,
@@ -32,6 +34,18 @@ export type VerificationCodeCardProps = {
};
export const VerificationCodeCard = (props: PropsWithChildren) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export const VerificationCodeContent = (props: PropsWithChildren) => {
const { showAlternativeMethods = true, cardNotice, children } = props;
const card = useCardState();
@@ -43,63 +57,68 @@ export const VerificationCodeCard = (props: PropsWithChildren
-
-
-
-
-
-
- {card.error}
- {children}
-
-
+ <>
+
+
+
+
+
+ {card.error}
+ {children}
+
+
- {cardNotice && (
-
-
-
- )}
+ {cardNotice && (
+
+
+
+ )}
-
+
+
+ {props.onBackLinkClicked && (
- {showAlternativeMethods && props.onShowAlternativeMethodsClicked && (
-
-
-
- )}
-
+ )}
+ {showAlternativeMethods && props.onShowAlternativeMethodsClicked && (
+
+
+
+ )}
-
-
-
-
+
+ >
);
};
diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx
index c61a5fe7d37..b9a51ac1664 100644
--- a/packages/clerk-js/src/ui/elements/contexts/index.tsx
+++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx
@@ -103,7 +103,8 @@ export type FlowMetadata = {
| 'tasks'
| 'taskChooseOrganization'
| 'enableOrganizations'
- | 'taskResetPassword';
+ | 'taskResetPassword'
+ | 'taskSetupMfa';
part?:
| 'start'
| 'emailCode'
@@ -130,7 +131,8 @@ export type FlowMetadata = {
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
- | 'chooseWallet';
+ | 'chooseWallet'
+ | 'methodSelectionMFA';
};
const [FlowMetadataCtx, useFlowMetadata] = createContextAndHook('FlowMetadata');
diff --git a/packages/clerk-js/src/ui/lazyModules/components.ts b/packages/clerk-js/src/ui/lazyModules/components.ts
index e5a0d04b73e..0cc57f424ca 100644
--- a/packages/clerk-js/src/ui/lazyModules/components.ts
+++ b/packages/clerk-js/src/ui/lazyModules/components.ts
@@ -25,6 +25,7 @@ const componentImportPaths = {
import(/* webpackChunkName: "taskChooseOrganization" */ '../components/SessionTasks/tasks/TaskChooseOrganization'),
TaskResetPassword: () =>
import(/* webpackChunkName: "taskResetPassword" */ '../components/SessionTasks/tasks/TaskResetPassword'),
+ TaskSetupMFA: () => import(/* webpackChunkName: "taskSetupMFA" */ '../components/SessionTasks/tasks/TaskSetupMfa'),
PlanDetails: () => import(/* webpackChunkName: "planDetails" */ '../components/Plans/PlanDetails'),
SubscriptionDetails: () => import(/* webpackChunkName: "subscriptionDetails" */ '../components/SubscriptionDetails'),
APIKeys: () => import(/* webpackChunkName: "apiKeys" */ '../components/APIKeys/APIKeys'),
@@ -129,6 +130,10 @@ export const TaskResetPassword = lazy(() =>
componentImportPaths.TaskResetPassword().then(module => ({ default: module.TaskResetPassword })),
);
+export const TaskSetupMFA = lazy(() =>
+ componentImportPaths.TaskSetupMFA().then(module => ({ default: module.TaskSetupMFA })),
+);
+
export const PlanDetails = lazy(() =>
componentImportPaths.PlanDetails().then(module => ({ default: module.PlanDetails })),
);
@@ -179,6 +184,7 @@ export const ClerkComponents = {
SubscriptionDetails,
TaskChooseOrganization,
TaskResetPassword,
+ TaskSetupMFA,
};
export type ClerkComponentName = keyof typeof ClerkComponents;
diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts
index 6e8dbd0c679..4f63f36f78e 100644
--- a/packages/clerk-js/src/ui/types.ts
+++ b/packages/clerk-js/src/ui/types.ts
@@ -20,11 +20,13 @@ import type {
SignUpProps,
TaskChooseOrganizationProps,
TaskResetPasswordProps,
+ TaskSetupMFAProps,
UserAvatarProps,
UserButtonProps,
UserProfileProps,
WaitlistProps,
} from '@clerk/shared/types';
+import type { MutableRefObject } from 'react';
export type {
__internal_OAuthConsentProps,
@@ -60,7 +62,8 @@ export type AvailableComponentProps =
| __internal_PlanDetailsProps
| APIKeysProps
| TaskChooseOrganizationProps
- | TaskResetPasswordProps;
+ | TaskResetPasswordProps
+ | TaskSetupMFAProps;
type ComponentMode = 'modal' | 'mounted';
type SignInMode = 'modal' | 'redirect';
@@ -144,6 +147,7 @@ export type CheckoutCtx = __internal_CheckoutProps & {
export type SessionTasksCtx = {
redirectUrlComplete: string;
+ redirectOnActiveSession?: MutableRefObject;
};
export type TaskChooseOrganizationCtx = TaskChooseOrganizationProps & {
@@ -154,6 +158,10 @@ export type TaskResetPasswordCtx = TaskResetPasswordProps & {
componentName: 'TaskResetPassword';
};
+export type TaskSetupMFACtx = TaskSetupMFAProps & {
+ componentName: 'TaskSetupMFA';
+};
+
export type OAuthConsentCtx = __internal_OAuthConsentProps & {
componentName: 'OAuthConsent';
};
@@ -186,5 +194,6 @@ export type AvailableComponentCtx =
| SubscriptionDetailsCtx
| PlanDetailsCtx
| TaskChooseOrganizationCtx
- | TaskResetPasswordCtx;
+ | TaskResetPasswordCtx
+ | TaskSetupMFACtx;
export type AvailableComponentName = AvailableComponentCtx['componentName'];
diff --git a/packages/clerk-js/src/ui/utils/mfa.ts b/packages/clerk-js/src/ui/utils/mfa.ts
new file mode 100644
index 00000000000..b52bbc304c4
--- /dev/null
+++ b/packages/clerk-js/src/ui/utils/mfa.ts
@@ -0,0 +1,32 @@
+import type { Attributes, PhoneNumberResource, UserResource, VerificationStrategy } from '@clerk/shared/types';
+
+export const defaultFirst = (a: PhoneNumberResource) => (a.defaultSecondFactor ? -1 : 1);
+
+export function getSecondFactors(attributes: Partial): VerificationStrategy[] {
+ const secondFactors: VerificationStrategy[] = [];
+
+ Object.entries(attributes).forEach(([, attr]) => {
+ if (attr?.used_for_second_factor && attr.second_factors) {
+ secondFactors.push(...attr.second_factors);
+ }
+ });
+
+ return secondFactors;
+}
+
+export function getSecondFactorsAvailableToAdd(
+ attributes: Partial,
+ user: UserResource,
+): VerificationStrategy[] {
+ let sfs = getSecondFactors(attributes);
+
+ if (user.totpEnabled) {
+ sfs = sfs.filter(f => f !== 'totp');
+ }
+
+ if (user.backupCodeEnabled || !user.twoFactorEnabled) {
+ sfs = sfs.filter(f => f !== 'backup_code');
+ }
+
+ return sfs;
+}
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index 509a88ed625..974df8cff69 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -899,6 +899,76 @@ export const enUS: LocalizationResource = {
subtitle: 'Your account requires a new password before you can continue',
title: 'Reset your password',
},
+ taskSetupMfa: {
+ badge: 'Two-step verification setup',
+ signOut: {
+ actionLink: 'Sign out',
+ actionText: 'Signed in as {{identifier}}',
+ },
+ smsCode: {
+ addPhone: {
+ formButtonPrimary: 'Continue',
+ infoText:
+ 'A text message containing a verification code will be sent to this phone number. Message and data rates may apply.',
+ },
+ addPhoneNumber: 'Add phone number',
+ cancel: 'Cancel',
+ subtitle: 'Choose phone number you want to use for SMS code two-step verification',
+ success: {
+ finishButton: 'Continue',
+ message1:
+ 'Two-step verification is now enabled. When signing in, you will need to enter a verification code sent to this phone number as an additional step.',
+ message2:
+ '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.',
+ title: 'SMS code verification enabled',
+ },
+ title: 'Add SMS code verification',
+ verifyPhone: {
+ formButtonPrimary: 'Continue',
+ formTitle: 'Verification code',
+ resendButton: "Didn't receive a code? Resend",
+ subtitle: 'Enter the verification code sent to',
+ title: 'Verify your phone number',
+ },
+ },
+ start: {
+ methodSelection: {
+ phoneCode: 'SMS code',
+ totp: 'Authenticator application',
+ },
+ subtitle: 'Choose which method you prefer to protect your account with an extra layer of security',
+ title: 'Set up two-step verification',
+ },
+ totpCode: {
+ addAuthenticatorApp: {
+ buttonAbleToScan__nonPrimary: 'Scan QR code instead',
+ buttonUnableToScan__nonPrimary: "Can't scan QR code?",
+ formButtonPrimary: 'Continue',
+ formButtonReset: 'Cancel',
+ infoText__ableToScan:
+ 'Set up a new sign-in method in your authenticator app and scan the following QR code to link it to your account.',
+ infoText__unableToScan: 'Set up a new sign-in method in your authenticator and enter the Key provided below.',
+ inputLabel__unableToScan1:
+ 'Make sure Time-based or One-time passwords is enabled, then finish linking your account.',
+ },
+ success: {
+ finishButton: 'Continue',
+ message1:
+ 'Two-step verification is now enabled. When signing in, you will need to enter a verification code from this authenticator as an additional step.',
+ message2:
+ '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.',
+ title: 'Authenticator application verification enabled',
+ },
+ title: 'Add authenticator application',
+ verifyTotp: {
+ formButtonPrimary: 'Continue',
+ formButtonReset: 'Cancel',
+ formTitle: 'Verification code',
+ subtitle: 'Enter verification code generated by your authenticator',
+ title: 'Add authenticator application',
+ },
+ },
+ },
unstable__errors: {
already_a_member_in_organization: '{{email}} is already a member of the organization.',
avatar_file_size_exceeded: 'File size exceeds the maximum limit of 10MB. Please choose a smaller file.',
diff --git a/packages/nextjs/src/client-boundary/uiComponents.tsx b/packages/nextjs/src/client-boundary/uiComponents.tsx
index 3838edd423b..35df3c02c70 100644
--- a/packages/nextjs/src/client-boundary/uiComponents.tsx
+++ b/packages/nextjs/src/client-boundary/uiComponents.tsx
@@ -24,6 +24,7 @@ export {
SignUpButton,
TaskChooseOrganization,
TaskResetPassword,
+ TaskSetupMFA,
UserAvatar,
UserButton,
Waitlist,
diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts
index 744d1f13f68..2d7dab96a44 100644
--- a/packages/nextjs/src/index.ts
+++ b/packages/nextjs/src/index.ts
@@ -36,6 +36,7 @@ export {
SignUpButton,
TaskChooseOrganization,
TaskResetPassword,
+ TaskSetupMFA,
UserAvatar,
UserButton,
UserProfile,
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 7a9f5772212..d7c47009f10 100644
--- a/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap
+++ b/packages/react-router/src/__tests__/__snapshots__/exports.test.ts.snap
@@ -39,6 +39,7 @@ exports[`root public exports > should not change unexpectedly 1`] = `
"SignedOut",
"TaskChooseOrganization",
"TaskResetPassword",
+ "TaskSetupMFA",
"UserAvatar",
"UserButton",
"UserProfile",
diff --git a/packages/react/src/components/index.ts b/packages/react/src/components/index.ts
index dfbcedcfa93..124b06512b8 100644
--- a/packages/react/src/components/index.ts
+++ b/packages/react/src/components/index.ts
@@ -10,6 +10,7 @@ export {
SignUp,
TaskChooseOrganization,
TaskResetPassword,
+ TaskSetupMFA,
UserAvatar,
UserButton,
UserProfile,
diff --git a/packages/react/src/components/uiComponents.tsx b/packages/react/src/components/uiComponents.tsx
index 7ef5424f6d9..7b463a08457 100644
--- a/packages/react/src/components/uiComponents.tsx
+++ b/packages/react/src/components/uiComponents.tsx
@@ -10,6 +10,7 @@ import type {
SignUpProps,
TaskChooseOrganizationProps,
TaskResetPasswordProps,
+ TaskSetupMFAProps,
UserAvatarProps,
UserButtonProps,
UserProfileProps,
@@ -725,3 +726,31 @@ export const TaskResetPassword = withClerk(
},
{ component: 'TaskResetPassword', renderWhileLoading: true },
);
+
+export const TaskSetupMFA = withClerk(
+ ({ clerk, component, fallback, ...props }: WithClerkProp) => {
+ const mountingStatus = useWaitForComponentMount(component);
+ const shouldShowFallback = mountingStatus === 'rendering' || !clerk.loaded;
+
+ const rendererRootProps = {
+ ...(shouldShowFallback && fallback && { style: { display: 'none' } }),
+ };
+
+ return (
+ <>
+ {shouldShowFallback && fallback}
+ {clerk.loaded && (
+
+ )}
+ >
+ );
+ },
+ { component: 'TaskSetupMFA', renderWhileLoading: true },
+);
diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts
index 961a3acc47b..fe1f3814f90 100644
--- a/packages/react/src/isomorphicClerk.ts
+++ b/packages/react/src/isomorphicClerk.ts
@@ -50,6 +50,7 @@ import type {
State,
TaskChooseOrganizationProps,
TaskResetPasswordProps,
+ TaskSetupMFAProps,
TasksRedirectOptions,
UnsubscribeCallback,
UserAvatarProps,
@@ -153,6 +154,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
private premountOAuthConsentNodes = new Map();
private premountTaskChooseOrganizationNodes = new Map();
private premountTaskResetPasswordNodes = new Map();
+ private premountTaskSetupMFANodes = new Map();
// A separate Map of `addListener` method calls to handle multiple listeners.
private premountAddListenerCalls = new Map<
ListenerCallback,
@@ -682,6 +684,10 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
clerkjs.mountTaskResetPassword(node, props);
});
+ this.premountTaskSetupMFANodes.forEach((props, node) => {
+ clerkjs.mountTaskSetupMFA(node, props);
+ });
+
/**
* Only update status in case `clerk.status` is missing. In any other case, `clerk-js` should be the orchestrator.
*/
@@ -1240,6 +1246,22 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
}
};
+ mountTaskSetupMFA = (node: HTMLDivElement, props?: TaskSetupMFAProps): void => {
+ if (this.clerkjs && this.loaded) {
+ this.clerkjs.mountTaskSetupMFA(node, props);
+ } else {
+ this.premountTaskSetupMFANodes.set(node, props);
+ }
+ };
+
+ unmountTaskSetupMFA = (node: HTMLDivElement): void => {
+ if (this.clerkjs && this.loaded) {
+ this.clerkjs.unmountTaskSetupMFA(node);
+ } else {
+ this.premountTaskSetupMFANodes.delete(node);
+ }
+ };
+
addListener = (listener: ListenerCallback): UnsubscribeCallback => {
if (this.clerkjs) {
return this.clerkjs.addListener(listener);
diff --git a/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap
index 6e6d65b16e2..bb1778da3e9 100644
--- a/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap
+++ b/packages/remix/src/__tests__/__snapshots__/exports.test.ts.snap
@@ -33,6 +33,7 @@ exports[`root public exports > should not change unexpectedly 1`] = `
"SignedOut",
"TaskChooseOrganization",
"TaskResetPassword",
+ "TaskSetupMFA",
"UserAvatar",
"UserButton",
"UserProfile",
diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts
index 19598760418..3e25f01f787 100644
--- a/packages/shared/src/types/appearance.ts
+++ b/packages/shared/src/types/appearance.ts
@@ -359,6 +359,12 @@ export type ElementsConfig = {
taskChooseOrganizationCreateOrganizationActionButton: WithOptions;
taskChooseOrganizationPreviewButton: WithOptions;
+ taskSetupMfaMethodSelectionItem: WithOptions;
+ taskSetupMfaMethodSelectionItems: WithOptions;
+ taskSetupMfaPhoneSelectionItems: WithOptions;
+ taskSetupMfaPhoneSelectionItem: WithOptions;
+ taskSetupMfaPhoneSelectionAddPhoneAction: WithOptions;
+
userAvatarBox: WithOptions;
userAvatarImage: WithOptions;
@@ -1056,6 +1062,7 @@ export type APIKeysTheme = Theme;
export type OAuthConsentTheme = Theme;
export type TaskChooseOrganizationTheme = Theme;
export type TaskResetPasswordTheme = Theme;
+export type TaskSetupMFATheme = Theme;
type GlobalAppearanceOptions = {
/**
@@ -1140,6 +1147,10 @@ export type Appearance = T &
* Theme overrides that only apply to the `` component
*/
taskResetPassword?: T;
+ /**
+ * Theme overrides that only apply to the `` component
+ */
+ taskSetupMfa?: T;
/**
* Theme overrides that only apply to the `` component
*/
diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts
index e18204bed10..ec37ac0124f 100644
--- a/packages/shared/src/types/clerk.ts
+++ b/packages/shared/src/types/clerk.ts
@@ -15,6 +15,7 @@ import type {
SubscriptionDetailsTheme,
TaskChooseOrganizationTheme,
TaskResetPasswordTheme,
+ TaskSetupMFATheme,
UserAvatarTheme,
UserButtonTheme,
UserProfileTheme,
@@ -662,6 +663,22 @@ export interface Clerk {
*/
unmountTaskResetPassword: (targetNode: HTMLDivElement) => void;
+ /**
+ * Mounts a TaskSetupMFA component at the target element.
+ *
+ * @param targetNode - Target node to mount the TaskSetupMFA component.
+ * @param props - configuration parameters.
+ */
+ mountTaskSetupMFA: (targetNode: HTMLDivElement, props?: TaskSetupMFAProps) => void;
+
+ /**
+ * Unmount a TaskSetupMFA component from the target element.
+ * If there is no component mounted at the target node, results in a noop.
+ *
+ * @param targetNode - Target node to unmount the TaskSetupMFA component from.
+ */
+ unmountTaskSetupMFA: (targetNode: HTMLDivElement) => void;
+
/**
* @internal
* Loads Stripe libraries for commerce functionality
@@ -2277,6 +2294,14 @@ export type TaskResetPasswordProps = {
appearance?: TaskResetPasswordTheme;
};
+export type TaskSetupMFAProps = {
+ /**
+ * Full URL or path to navigate to after successfully resolving all tasks
+ */
+ redirectUrlComplete: string;
+ appearance?: TaskSetupMFATheme;
+};
+
export type CreateOrganizationInvitationParams = {
emailAddress: string;
role: OrganizationCustomRoleKey;
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index b7eb936734a..d81be772c21 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -1328,6 +1328,69 @@ export type __internal_LocalizationResource = {
};
formButtonPrimary: LocalizationValue;
};
+ taskSetupMfa: {
+ badge: LocalizationValue;
+ start: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ methodSelection: {
+ totp: LocalizationValue;
+ phoneCode: LocalizationValue;
+ };
+ };
+ smsCode: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ addPhoneNumber: LocalizationValue;
+ cancel: LocalizationValue;
+ verifyPhone: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ formTitle: LocalizationValue;
+ resendButton: LocalizationValue;
+ formButtonPrimary: LocalizationValue;
+ };
+ addPhone: {
+ infoText: LocalizationValue;
+ formButtonPrimary: LocalizationValue;
+ };
+ success: {
+ title: LocalizationValue;
+ message1: LocalizationValue;
+ message2: LocalizationValue;
+ finishButton: LocalizationValue;
+ };
+ };
+ totpCode: {
+ title: LocalizationValue;
+ addAuthenticatorApp: {
+ infoText__ableToScan: LocalizationValue;
+ infoText__unableToScan: LocalizationValue;
+ inputLabel__unableToScan1: LocalizationValue;
+ buttonUnableToScan__nonPrimary: LocalizationValue;
+ buttonAbleToScan__nonPrimary: LocalizationValue;
+ formButtonPrimary: LocalizationValue;
+ formButtonReset: LocalizationValue;
+ };
+ verifyTotp: {
+ title: LocalizationValue;
+ subtitle: LocalizationValue;
+ formTitle: LocalizationValue;
+ formButtonPrimary: LocalizationValue;
+ formButtonReset: LocalizationValue;
+ };
+ success: {
+ title: LocalizationValue;
+ message1: LocalizationValue;
+ message2: LocalizationValue;
+ finishButton: LocalizationValue;
+ };
+ };
+ signOut: {
+ actionText: LocalizationValue<'identifier'>;
+ actionLink: LocalizationValue;
+ };
+ };
web3SolanaWalletButtons: {
connect: LocalizationValue<'walletName'>;
continue: LocalizationValue<'walletName'>;
diff --git a/packages/shared/src/types/session.ts b/packages/shared/src/types/session.ts
index 727c044ad48..f35b1454c24 100644
--- a/packages/shared/src/types/session.ts
+++ b/packages/shared/src/types/session.ts
@@ -335,7 +335,7 @@ export interface SessionTask {
/**
* A unique identifier for the task
*/
- key: 'choose-organization' | 'reset-password';
+ key: 'choose-organization' | 'reset-password' | 'setup-mfa';
}
export type GetTokenOptions = {
diff --git a/packages/shared/src/types/userSettings.ts b/packages/shared/src/types/userSettings.ts
index 0827f0af0be..34a098ae699 100644
--- a/packages/shared/src/types/userSettings.ts
+++ b/packages/shared/src/types/userSettings.ts
@@ -58,6 +58,9 @@ export type SignUpData = {
captcha_enabled: boolean;
mode: SignUpModes;
legal_consent_enabled: boolean;
+ mfa?: {
+ required: boolean;
+ };
};
export type PasswordSettingsData = {
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 eca649e8e36..bb6ed6e33e2 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
@@ -44,6 +44,7 @@ exports[`root public exports > should not change unexpectedly 1`] = `
"SignedOut",
"TaskChooseOrganization",
"TaskResetPassword",
+ "TaskSetupMFA",
"UserAvatar",
"UserButton",
"UserProfile",
From 9be0ffd70118b4cb0851a414388856ead31526fd Mon Sep 17 00:00:00 2001
From: Mauricio Antunes
Date: Wed, 18 Feb 2026 12:39:57 -0300
Subject: [PATCH 107/123] fix(nextjs): Prevent infinite handshake redirect loop
on Netlify (#7857) (#7876)
Co-authored-by: Robert Soriano
---
.changeset/public-emus-stay.md | 5 +++++
packages/nextjs/src/server/clerkMiddleware.ts | 9 ++++++++-
2 files changed, 13 insertions(+), 1 deletion(-)
create mode 100644 .changeset/public-emus-stay.md
diff --git a/.changeset/public-emus-stay.md b/.changeset/public-emus-stay.md
new file mode 100644
index 00000000000..22698bf9f75
--- /dev/null
+++ b/.changeset/public-emus-stay.md
@@ -0,0 +1,5 @@
+---
+'@clerk/nextjs': patch
+---
+
+Fix infinite handshake redirect loop when deploying Next.js apps with Clerk development instances to Netlify
diff --git a/packages/nextjs/src/server/clerkMiddleware.ts b/packages/nextjs/src/server/clerkMiddleware.ts
index 971a8705130..44fa0159889 100644
--- a/packages/nextjs/src/server/clerkMiddleware.ts
+++ b/packages/nextjs/src/server/clerkMiddleware.ts
@@ -21,6 +21,7 @@ import {
TokenType,
} from '@clerk/backend/internal';
import { parsePublishableKey } from '@clerk/shared/keys';
+import { handleNetlifyCacheInDevInstance } from '@clerk/shared/netlifyCacheHandler';
import { notFound as nextjsNotFound } from 'next/navigation';
import type { NextMiddleware, NextRequest } from 'next/server';
import { NextResponse } from 'next/server';
@@ -196,7 +197,13 @@ export const clerkMiddleware = ((...args: unknown[]): NextMiddleware | NextMiddl
const locationHeader = requestState.headers.get(constants.Headers.Location);
if (locationHeader) {
- const res = NextResponse.redirect(locationHeader);
+ handleNetlifyCacheInDevInstance({
+ locationHeader,
+ requestStateHeaders: requestState.headers,
+ publishableKey: requestState.publishableKey,
+ });
+
+ const res = NextResponse.redirect(requestState.headers.get(constants.Headers.Location) || locationHeader);
requestState.headers.forEach((value, key) => {
if (key === constants.Headers.Location) {
return;
From 8e4fa16cc0c4b19311a88d5753f0d224deff29a4 Mon Sep 17 00:00:00 2001
From: Sarah Soutoul
Date: Wed, 18 Feb 2026 11:13:25 -0600
Subject: [PATCH 108/123] docs(repo): Add JSdocs to APIKey backend type (#7871)
Co-authored-by: Robert Soriano
---
.changeset/pretty-ends-deny.md | 2 +
packages/backend/src/api/resources/APIKey.ts | 51 ++++++++++++++++++++
2 files changed, 53 insertions(+)
create mode 100644 .changeset/pretty-ends-deny.md
diff --git a/.changeset/pretty-ends-deny.md b/.changeset/pretty-ends-deny.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/pretty-ends-deny.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/packages/backend/src/api/resources/APIKey.ts b/packages/backend/src/api/resources/APIKey.ts
index d6d2870e75b..ef4e44bf262 100644
--- a/packages/backend/src/api/resources/APIKey.ts
+++ b/packages/backend/src/api/resources/APIKey.ts
@@ -1,22 +1,73 @@
import type { APIKeyJSON } from './JSON';
+/**
+ * The Backend `APIKey` object holds information about an API key.
+ */
export class APIKey {
constructor(
+ /**
+ * A unique ID for the API key.
+ */
readonly id: string,
+ /**
+ * The type of the API key. Currently always `'api_key'`.
+ */
readonly type: string,
+ /**
+ * The API key's name.
+ */
readonly name: string,
+ /**
+ * The user or organization ID that the API key is associated with.
+ */
readonly subject: string,
+ /**
+ * An array of scopes that define what the API key can access.
+ */
readonly scopes: string[],
+ /**
+ * Custom claims associated with the API key.
+ */
readonly claims: Record | null,
+ /**
+ * A boolean indicating whether the API key has been revoked.
+ */
readonly revoked: boolean,
+ /**
+ * The reason for revoking the API key, if it has been revoked.
+ */
readonly revocationReason: string | null,
+ /**
+ * A boolean indicating whether the API key has expired.
+ */
readonly expired: boolean,
+ /**
+ * The expiration date and time of the API key. `null` if the API key never expires.
+ */
readonly expiration: number | null,
+ /**
+ * The user ID for the user creating the API key.
+ */
readonly createdBy: string | null,
+ /**
+ * An optional description for the API key.
+ */
readonly description: string | null,
+ /**
+ * The date and time when the API key was last used to authenticate a request.
+ */
readonly lastUsedAt: number | null,
+ /**
+ * The date when the API key was created.
+ */
readonly createdAt: number,
+ /**
+ * The date when the API key was last updated.
+ */
readonly updatedAt: number,
+ /**
+ * The API key secret. **This property is only present in the response from [`create()`](/docs/reference/javascript/api-keys#create) and cannot be retrieved later.**
+ */
readonly secret?: string,
) {}
From 2471e314b24eab485c78313d84d986ee30c63088 Mon Sep 17 00:00:00 2001
From: Kevin Wang <26389321+thiskevinwang@users.noreply.github.com>
Date: Wed, 18 Feb 2026 16:11:26 -0500
Subject: [PATCH 109/123] fix(backend): Type JwtTemplatesApi.list as
PaginatedResourceResponse (Core 2) (#7868)
---
.changeset/thick-points-watch.md | 5 +++++
packages/backend/src/api/endpoints/JwtTemplatesApi.ts | 3 ++-
2 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 .changeset/thick-points-watch.md
diff --git a/.changeset/thick-points-watch.md b/.changeset/thick-points-watch.md
new file mode 100644
index 00000000000..18f14be52e6
--- /dev/null
+++ b/.changeset/thick-points-watch.md
@@ -0,0 +1,5 @@
+---
+'@clerk/backend': patch
+---
+
+fix(backend): type JwtTemplatesApi.list as PaginatedResourceResponse
diff --git a/packages/backend/src/api/endpoints/JwtTemplatesApi.ts b/packages/backend/src/api/endpoints/JwtTemplatesApi.ts
index 66e3dc72a0f..263c6df64b4 100644
--- a/packages/backend/src/api/endpoints/JwtTemplatesApi.ts
+++ b/packages/backend/src/api/endpoints/JwtTemplatesApi.ts
@@ -2,6 +2,7 @@ import type { ClerkPaginationRequest } from '@clerk/types';
import { joinPaths } from 'src/util/path';
import type { DeletedObject, JwtTemplate } from '../resources';
+import type { PaginatedResourceResponse } from '../resources/Deserializer';
import { AbstractAPI } from './AbstractApi';
const basePath = '/jwt_templates';
@@ -48,7 +49,7 @@ type UpdateJWTTemplateParams = CreateJWTTemplateParams & {
export class JwtTemplatesApi extends AbstractAPI {
public async list(params: ClerkPaginationRequest = {}) {
- return this.request({
+ return this.request>({
method: 'GET',
path: basePath,
queryParams: { ...params, paginated: true },
From e62d804d921f0e99ed41a9d6268eebe0120ebb88 Mon Sep 17 00:00:00 2001
From: Bryce Kalow
Date: Wed, 18 Feb 2026 15:45:02 -0600
Subject: [PATCH 110/123] fix(clerk-js): Sync BaseRouter state on
pushState/replaceState (core 2) (#7863)
Co-authored-by: Claude Opus 4.6
Co-authored-by: Jacek Radko
---
.changeset/fix-router-sync-popup-oauth.md | 5 +
integration/presets/longRunningApps.ts | 1 +
.../react-vite/src/buttons/index.tsx | 9 +
integration/templates/react-vite/src/main.tsx | 5 +
.../react-vite/src/sign-in-popup/index.tsx | 15 ++
integration/tests/oauth-flows.test.ts | 57 +++++++
packages/clerk-js/src/ui/hooks/index.ts | 1 -
.../src/ui/hooks/useWindowEventListener.ts | 15 --
.../clerk-js/src/ui/router/BaseRouter.tsx | 158 +++++++++++++++++-
.../clerk-js/src/ui/router/PathRouter.tsx | 2 +-
10 files changed, 245 insertions(+), 23 deletions(-)
create mode 100644 .changeset/fix-router-sync-popup-oauth.md
create mode 100644 integration/templates/react-vite/src/sign-in-popup/index.tsx
delete mode 100644 packages/clerk-js/src/ui/hooks/useWindowEventListener.ts
diff --git a/.changeset/fix-router-sync-popup-oauth.md b/.changeset/fix-router-sync-popup-oauth.md
new file mode 100644
index 00000000000..639411475d0
--- /dev/null
+++ b/.changeset/fix-router-sync-popup-oauth.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix BaseRouter state not syncing after popup OAuth by observing `pushState`/`replaceState` changes in addition to `popstate`
diff --git a/integration/presets/longRunningApps.ts b/integration/presets/longRunningApps.ts
index f3d9a8739a5..bb4f485540b 100644
--- a/integration/presets/longRunningApps.ts
+++ b/integration/presets/longRunningApps.ts
@@ -60,6 +60,7 @@ export const createLongRunningApps = () => {
{ id: 'react.vite.withEmailCodes', config: react.vite, env: envs.withEmailCodes },
{ id: 'react.vite.withEmailCodes_persist_client', config: react.vite, env: envs.withEmailCodes_destroy_client },
{ id: 'react.vite.withEmailLinks', config: react.vite, env: envs.withEmailLinks },
+ { id: 'react.vite.withLegalConsent', config: react.vite, env: envs.withLegalConsent },
{ id: 'vue.vite', config: vue.vite, env: envs.withCustomRoles },
/**
diff --git a/integration/templates/react-vite/src/buttons/index.tsx b/integration/templates/react-vite/src/buttons/index.tsx
index 5aa32d433cf..cb5e6de7be1 100644
--- a/integration/templates/react-vite/src/buttons/index.tsx
+++ b/integration/templates/react-vite/src/buttons/index.tsx
@@ -11,6 +11,15 @@ export default function Home() {
Sign in button (force)
+
+ Sign in button (force, popup)
+
+
,
},
+ {
+ path: '/sign-in-popup/*',
+ element: ,
+ },
{
path: '/sign-up/*',
element: ,
diff --git a/integration/templates/react-vite/src/sign-in-popup/index.tsx b/integration/templates/react-vite/src/sign-in-popup/index.tsx
new file mode 100644
index 00000000000..b97b5841563
--- /dev/null
+++ b/integration/templates/react-vite/src/sign-in-popup/index.tsx
@@ -0,0 +1,15 @@
+import { SignIn } from '@clerk/clerk-react';
+
+export default function Page() {
+ return (
+
+ Loading sign in>}
+ />
+
+ );
+}
diff --git a/integration/tests/oauth-flows.test.ts b/integration/tests/oauth-flows.test.ts
index 6ff96a3cea2..77e97d8f8e5 100644
--- a/integration/tests/oauth-flows.test.ts
+++ b/integration/tests/oauth-flows.test.ts
@@ -181,6 +181,63 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })('oauth flo
});
});
+testAgainstRunningApps({ withPattern: ['react.vite.withLegalConsent'] })(
+ 'oauth popup with path-based routing @react',
+ ({ app }) => {
+ test.describe.configure({ mode: 'serial' });
+
+ let fakeUser: FakeUser;
+
+ test.beforeAll(async () => {
+ const client = createClerkClient({
+ secretKey: instanceKeys.get('oauth-provider').sk,
+ publishableKey: instanceKeys.get('oauth-provider').pk,
+ });
+ const users = createUserService(client);
+ fakeUser = users.createFakeUser({
+ withUsername: true,
+ });
+ await users.createBapiUser(fakeUser);
+ });
+
+ test.afterAll(async () => {
+ const u = createTestUtils({ app });
+ await fakeUser.deleteIfExists();
+ await u.services.users.deleteIfExists({ email: fakeUser.email });
+ await app.teardown();
+ });
+
+ test('popup OAuth navigates through sso-callback with path-based routing', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToRelative('/sign-in-popup');
+ await u.page.waitForClerkJsLoaded();
+ await u.po.signIn.waitForMounted();
+
+ const popupPromise = context.waitForEvent('page');
+ await u.page.getByRole('button', { name: 'E2E OAuth Provider' }).click();
+ const popup = await popupPromise;
+ const popupUtils = createTestUtils({ app, page: popup, context });
+ await popupUtils.page.getByText('Sign in to oauth-provider').waitFor();
+
+ // Complete OAuth in the popup
+ await popupUtils.po.signIn.setIdentifier(fakeUser.email);
+ await popupUtils.po.signIn.continue();
+ await popupUtils.po.signIn.enterTestOtpCode();
+
+ // Because the user is new to the app and legal consent is required,
+ // the sign-up can't complete in the popup. The popup sends return_url
+ // back to the parent, which navigates to /sso-callback via pushState.
+ await u.page.getByRole('heading', { name: 'Legal consent' }).waitFor();
+ await u.page.getByLabel(/I agree to the/).check();
+ await u.po.signIn.continue();
+
+ await u.page.waitForAppUrl('/protected');
+ await u.po.expect.toBeSignedIn();
+ });
+ },
+);
+
testAgainstRunningApps({ withEnv: [appConfigs.envs.withLegalConsent] })(
'oauth flows with legal consent @nextjs',
({ app }) => {
diff --git a/packages/clerk-js/src/ui/hooks/index.ts b/packages/clerk-js/src/ui/hooks/index.ts
index 7b531d210e4..796773dd1d4 100644
--- a/packages/clerk-js/src/ui/hooks/index.ts
+++ b/packages/clerk-js/src/ui/hooks/index.ts
@@ -17,4 +17,3 @@ export * from './useSafeState';
export * from './useScrollLock';
export * from './useSearchInput';
export * from './useTotalEnabledAuthMethods';
-export * from './useWindowEventListener';
diff --git a/packages/clerk-js/src/ui/hooks/useWindowEventListener.ts b/packages/clerk-js/src/ui/hooks/useWindowEventListener.ts
deleted file mode 100644
index 8426b1b0175..00000000000
--- a/packages/clerk-js/src/ui/hooks/useWindowEventListener.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import React from 'react';
-type EventType = keyof WindowEventMap;
-
-export const useWindowEventListener = (eventOrEvents: EventType | EventType[] | undefined, cb: () => void): void => {
- React.useEffect(() => {
- const events = [eventOrEvents].flat().filter(x => !!x);
- if (!events.length) {
- return;
- }
- events.forEach(e => window.addEventListener(e, cb));
- return () => {
- events.forEach(e => window.removeEventListener(e, cb));
- };
- }, [eventOrEvents, cb]);
-};
diff --git a/packages/clerk-js/src/ui/router/BaseRouter.tsx b/packages/clerk-js/src/ui/router/BaseRouter.tsx
index 734fc138937..4dc15538478 100644
--- a/packages/clerk-js/src/ui/router/BaseRouter.tsx
+++ b/packages/clerk-js/src/ui/router/BaseRouter.tsx
@@ -1,21 +1,140 @@
import { useClerk } from '@clerk/shared/react';
import type { NavigateOptions } from '@clerk/shared/types';
import React from 'react';
+import { flushSync } from 'react-dom';
import { getQueryParams, stringifyQueryParams, trimTrailingSlash } from '../../utils';
-import { useWindowEventListener } from '../hooks';
import { newPaths } from './newPaths';
import { match } from './pathToRegexp';
import { Route } from './Route';
import { RouteContext } from './RouteContext';
+// Custom events that don't exist on WindowEventMap but are handled
+// by wrapping history.pushState/replaceState in the fallback path.
+type HistoryEvent = 'pushstate' | 'replacestate';
+type RefreshEvent = keyof WindowEventMap | HistoryEvent;
+type NavigationType = 'push' | 'replace' | 'traverse';
+
+const isWindowRefreshEvent = (event: RefreshEvent): event is keyof WindowEventMap => {
+ return event !== 'pushstate' && event !== 'replacestate';
+};
+
+// Maps refresh events to Navigation API navigationType values.
+const eventToNavigationType: Partial> = {
+ popstate: 'traverse',
+ pushstate: 'push',
+ replacestate: 'replace',
+};
+
+// Global subscription sets for the history monkey-patching fallback.
+// Using a single patch with subscriber sets avoids conflicts when
+// multiple BaseRouter instances mount simultaneously.
+const pushStateSubscribers = new Set<() => void>();
+const replaceStateSubscribers = new Set<() => void>();
+let originalPushState: History['pushState'] | null = null;
+let originalReplaceState: History['replaceState'] | null = null;
+
+function ensurePushStatePatched(): void {
+ if (originalPushState) {
+ return;
+ }
+ const original = history.pushState.bind(history);
+ originalPushState = original;
+ history.pushState = (...args: Parameters) => {
+ original(...args);
+ pushStateSubscribers.forEach(fn => fn());
+ };
+}
+
+function ensureReplaceStatePatched(): void {
+ if (originalReplaceState) {
+ return;
+ }
+ const original = history.replaceState.bind(history);
+ originalReplaceState = original;
+ history.replaceState = (...args: Parameters) => {
+ original(...args);
+ replaceStateSubscribers.forEach(fn => fn());
+ };
+}
+
+/**
+ * Observes history changes so the router's internal state stays in sync
+ * with the URL. Uses the Navigation API when available, falling back to
+ * monkey-patching history.pushState/replaceState plus native window events.
+ *
+ * Note: `events` should be a stable array reference to avoid
+ * re-subscribing on every render.
+ */
+function useHistoryChangeObserver(events: Array | undefined, callback: () => void): void {
+ const callbackRef = React.useRef(callback);
+ callbackRef.current = callback;
+
+ React.useEffect(() => {
+ if (!events) {
+ return;
+ }
+
+ const notify = () => callbackRef.current();
+ const windowEvents = events.filter(isWindowRefreshEvent);
+ const navigationTypes = events
+ .map(e => eventToNavigationType[e])
+ .filter((type): type is NavigationType => Boolean(type));
+
+ const hasNavigationAPI =
+ typeof window !== 'undefined' &&
+ 'navigation' in window &&
+ typeof (window as any).navigation?.addEventListener === 'function';
+
+ if (hasNavigationAPI) {
+ const nav = (window as any).navigation;
+ const allowedTypes = new Set(navigationTypes);
+ const handler = (e: { navigationType: NavigationType }) => {
+ if (allowedTypes.has(e.navigationType)) {
+ Promise.resolve().then(notify);
+ }
+ };
+ nav.addEventListener('currententrychange', handler);
+
+ // Events without a navigationType mapping (e.g. hashchange) still
+ // need native listeners even when the Navigation API is available.
+ const unmappedEvents = windowEvents.filter(e => !eventToNavigationType[e]);
+ unmappedEvents.forEach(e => window.addEventListener(e, notify));
+
+ return () => {
+ nav.removeEventListener('currententrychange', handler);
+ unmappedEvents.forEach(e => window.removeEventListener(e, notify));
+ };
+ }
+
+ // Fallback: use global subscriber sets for pushState/replaceState
+ // so that multiple BaseRouter instances don't conflict.
+ if (events.includes('pushstate')) {
+ ensurePushStatePatched();
+ pushStateSubscribers.add(notify);
+ }
+ if (events.includes('replacestate')) {
+ ensureReplaceStatePatched();
+ replaceStateSubscribers.add(notify);
+ }
+
+ windowEvents.forEach(e => window.addEventListener(e, notify));
+
+ return () => {
+ pushStateSubscribers.delete(notify);
+ replaceStateSubscribers.delete(notify);
+ windowEvents.forEach(e => window.removeEventListener(e, notify));
+ };
+ }, [events]);
+}
+
interface BaseRouterProps {
basePath: string;
startPath: string;
getPath: () => string;
getQueryString: () => string;
internalNavigate: (toURL: URL, options?: NavigateOptions) => Promise | any;
- refreshEvents?: Array;
+ refreshEvents?: Array;
preservedParams?: string[];
urlStateParam?: {
startPath: string;
@@ -86,7 +205,23 @@ export const BaseRouter = ({
}
}, [currentPath, currentQueryString, getPath, getQueryString]);
- useWindowEventListener(refreshEvents, refresh);
+ // Suppresses the history observer during baseNavigate's internal navigation.
+ // Without this, the observer's microtask triggers a render before setActive's
+ // #updateAccessors sets clerk.session, causing task guards to see stale state.
+ const isNavigatingRef = React.useRef(false);
+
+ const observerRefresh = React.useCallback((): void => {
+ if (isNavigatingRef.current) {
+ return;
+ }
+ const newPath = getPath();
+ if (basePath && !newPath.startsWith('/' + basePath)) {
+ return;
+ }
+ refresh();
+ }, [basePath, getPath, refresh]);
+
+ useHistoryChangeObserver(refreshEvents, observerRefresh);
// TODO: Look into the real possible types of globalNavigate
const baseNavigate = async (toURL: URL | undefined): Promise => {
@@ -116,9 +251,20 @@ export const BaseRouter = ({
toURL.search = stringifyQueryParams(toQueryParams);
}
- const internalNavRes = await internalNavigate(toURL, { metadata: { navigationType: 'internal' } });
- setRouteParts({ path: toURL.pathname, queryString: toURL.search });
- return internalNavRes;
+ isNavigatingRef.current = true;
+ try {
+ const internalNavRes = await internalNavigate(toURL, { metadata: { navigationType: 'internal' } });
+ // We need to flushSync to guarantee the re-render happens before handing things back to the caller,
+ // otherwise setActive might emit, and children re-render with the old navigation state.
+ // An alternative solution here could be to return a deferred promise, set that to state together
+ // with the routeParts and resolve it in an effect. That way we could avoid the flushSync performance penalty.
+ flushSync(() => {
+ setRouteParts({ path: toURL.pathname, queryString: toURL.search });
+ });
+ return internalNavRes;
+ } finally {
+ isNavigatingRef.current = false;
+ }
};
return (
diff --git a/packages/clerk-js/src/ui/router/PathRouter.tsx b/packages/clerk-js/src/ui/router/PathRouter.tsx
index c34f5a404b0..b1c48e48b57 100644
--- a/packages/clerk-js/src/ui/router/PathRouter.tsx
+++ b/packages/clerk-js/src/ui/router/PathRouter.tsx
@@ -59,7 +59,7 @@ export const PathRouter = ({ basePath, preservedParams, children }: PathRouterPr
getPath={getPath}
getQueryString={getQueryString}
internalNavigate={internalNavigate}
- refreshEvents={['popstate']}
+ refreshEvents={['pushstate', 'replacestate', 'popstate']}
preservedParams={preservedParams}
>
{children}
From 7fe1e8218b22a5589072871477ee293bdb7c9b86 Mon Sep 17 00:00:00 2001
From: Bryce Kalow
Date: Wed, 18 Feb 2026 16:04:10 -0600
Subject: [PATCH 111/123] fix(clerk-js): Backport iframe __client_uat cookie
domain fix (#7882)
Co-authored-by: Claude Opus 4.6
---
.../fix-iframe-client-uat-cookie-domain.md | 5 ++++
.../auth/__tests__/getCookieDomain.test.ts | 17 ++++++++++--
.../src/core/auth/cookies/clientUat.ts | 2 +-
.../clerk-js/src/core/auth/getCookieDomain.ts | 27 +++++++++++++++----
4 files changed, 43 insertions(+), 8 deletions(-)
create mode 100644 .changeset/fix-iframe-client-uat-cookie-domain.md
diff --git a/.changeset/fix-iframe-client-uat-cookie-domain.md b/.changeset/fix-iframe-client-uat-cookie-domain.md
new file mode 100644
index 00000000000..a7fa09b3670
--- /dev/null
+++ b/.changeset/fix-iframe-client-uat-cookie-domain.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix `__client_uat` cookie being set on two different domain scopes when app is loaded in both iframe and non-iframe contexts. `getCookieDomain()` now falls back to `hostname` instead of `undefined` when the eTLD+1 probe fails, and the eTLD+1 probe uses the same `SameSite`/`Secure` attributes as the actual cookie to ensure consistent behavior across contexts.
diff --git a/packages/clerk-js/src/core/auth/__tests__/getCookieDomain.test.ts b/packages/clerk-js/src/core/auth/__tests__/getCookieDomain.test.ts
index 2f8bae19ffb..9de44e8022c 100644
--- a/packages/clerk-js/src/core/auth/__tests__/getCookieDomain.test.ts
+++ b/packages/clerk-js/src/core/auth/__tests__/getCookieDomain.test.ts
@@ -35,6 +35,19 @@ describe('getCookieDomain', () => {
expect(result).toBe(hostname);
});
+ it('passes cookie attributes to the probe', () => {
+ const hostname = 'app.example.com';
+ const handler: CookieHandler = {
+ get: vi.fn().mockReturnValueOnce(undefined).mockReturnValueOnce('1'),
+ set: vi.fn().mockReturnValue(undefined),
+ remove: vi.fn().mockReturnValue(undefined),
+ };
+ const attrs = { sameSite: 'None', secure: true };
+ getCookieDomain(hostname, handler, attrs);
+ expect(handler.set).toHaveBeenCalledWith('1', { sameSite: 'None', secure: true, domain: 'example.com' });
+ expect(handler.set).toHaveBeenCalledWith('1', { sameSite: 'None', secure: true, domain: 'app.example.com' });
+ });
+
it('handles localhost', () => {
const hostname = 'localhost';
const result = getCookieDomain(hostname);
@@ -53,7 +66,7 @@ describe('getCookieDomain', () => {
expect(getCookieDomain('bryce-local')).toBe('bryce-local');
});
- it('returns undefined if the domain could not be determined', () => {
+ it('falls back to hostname if the domain could not be determined', () => {
const handler: CookieHandler = {
get: vi.fn().mockReturnValue(undefined),
set: vi.fn().mockReturnValue(undefined),
@@ -61,7 +74,7 @@ describe('getCookieDomain', () => {
};
const hostname = 'app.hello.co.uk';
const result = getCookieDomain(hostname, handler);
- expect(result).toBeUndefined();
+ expect(result).toBe(hostname);
});
it('uses cached value if there is one', () => {
diff --git a/packages/clerk-js/src/core/auth/cookies/clientUat.ts b/packages/clerk-js/src/core/auth/cookies/clientUat.ts
index 7d52af06e43..a90d5a77184 100644
--- a/packages/clerk-js/src/core/auth/cookies/clientUat.ts
+++ b/packages/clerk-js/src/core/auth/cookies/clientUat.ts
@@ -45,7 +45,7 @@ export const createClientUatCookie = (cookieSuffix: string): ClientUatCookieHand
: 'Strict';
const secure = getSecureAttribute(sameSite);
const partitioned = __BUILD_VARIANT_CHIPS__ && secure;
- const domain = getCookieDomain();
+ const domain = getCookieDomain(undefined, undefined, { sameSite, secure });
// '0' indicates the user is signed out
let val = '0';
diff --git a/packages/clerk-js/src/core/auth/getCookieDomain.ts b/packages/clerk-js/src/core/auth/getCookieDomain.ts
index 492c2beab12..42a1a4f0a39 100644
--- a/packages/clerk-js/src/core/auth/getCookieDomain.ts
+++ b/packages/clerk-js/src/core/auth/getCookieDomain.ts
@@ -8,7 +8,19 @@ import { createCookieHandler } from '@clerk/shared/cookie';
let cachedETLDPlusOne: string;
const eTLDCookie = createCookieHandler('__clerk_test_etld');
-export function getCookieDomain(hostname = window.location.hostname, cookieHandler = eTLDCookie) {
+/**
+ * @param hostname - The hostname to determine the eTLD+1 for.
+ * @param cookieHandler - The cookie handler to use for the eTLD+1 probe.
+ * @param cookieAttributes - Optional cookie attributes (sameSite, secure) to use
+ * during the eTLD+1 probe. These should match the attributes that will be used
+ * when setting the actual cookie, so the probe accurately reflects whether a
+ * domain-scoped cookie can be set in the current context.
+ */
+export function getCookieDomain(
+ hostname = window.location.hostname,
+ cookieHandler = eTLDCookie,
+ cookieAttributes?: { sameSite?: string; secure?: boolean },
+) {
// only compute it once per session to avoid unnecessary cookie ops
if (cachedETLDPlusOne) {
return cachedETLDPlusOne;
@@ -28,17 +40,22 @@ export function getCookieDomain(hostname = window.location.hostname, cookieHandl
// we know for sure that the first entry is definitely a TLD, skip it
for (let i = hostnameParts.length - 2; i >= 0; i--) {
const eTLD = hostnameParts.slice(i).join('.');
- cookieHandler.set('1', { domain: eTLD });
+ cookieHandler.set('1', { ...cookieAttributes, domain: eTLD });
const res = cookieHandler.get();
if (res === '1') {
- cookieHandler.remove({ domain: eTLD });
+ cookieHandler.remove({ ...cookieAttributes, domain: eTLD });
cachedETLDPlusOne = eTLD;
return eTLD;
}
- cookieHandler.remove({ domain: eTLD });
+ cookieHandler.remove({ ...cookieAttributes, domain: eTLD });
}
- return;
+ // Fallback to hostname to ensure domain-scoped cookie rather than host-only.
+ // In restricted contexts (e.g. cross-origin iframes), the set() will silently
+ // fail — which is preferable to creating a host-only cookie that conflicts
+ // with domain-scoped cookies set by non-iframe contexts.
+ cachedETLDPlusOne = hostname;
+ return hostname;
}
From 73e34c1507e0b31b6b93dd7002fc1a9bbddc2a91 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Wed, 18 Feb 2026 17:28:03 -0500
Subject: [PATCH 112/123] ci(repo): Version packages (Core 2) (#7872)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/cold-clowns-fix.md | 9 ---------
.../fix-iframe-client-uat-cookie-domain.md | 5 -----
.changeset/fix-router-sync-popup-oauth.md | 5 -----
.changeset/pretty-ends-deny.md | 2 --
.changeset/public-emus-stay.md | 5 -----
.changeset/shy-loops-type.md | 7 -------
.changeset/thick-points-watch.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 | 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 | 10 ++++++++++
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 | 8 ++++++++
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 +-
51 files changed, 240 insertions(+), 60 deletions(-)
delete mode 100644 .changeset/cold-clowns-fix.md
delete mode 100644 .changeset/fix-iframe-client-uat-cookie-domain.md
delete mode 100644 .changeset/fix-router-sync-popup-oauth.md
delete mode 100644 .changeset/pretty-ends-deny.md
delete mode 100644 .changeset/public-emus-stay.md
delete mode 100644 .changeset/shy-loops-type.md
delete mode 100644 .changeset/thick-points-watch.md
diff --git a/.changeset/cold-clowns-fix.md b/.changeset/cold-clowns-fix.md
deleted file mode 100644
index 98658a7e261..00000000000
--- a/.changeset/cold-clowns-fix.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@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/.changeset/fix-iframe-client-uat-cookie-domain.md b/.changeset/fix-iframe-client-uat-cookie-domain.md
deleted file mode 100644
index a7fa09b3670..00000000000
--- a/.changeset/fix-iframe-client-uat-cookie-domain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix `__client_uat` cookie being set on two different domain scopes when app is loaded in both iframe and non-iframe contexts. `getCookieDomain()` now falls back to `hostname` instead of `undefined` when the eTLD+1 probe fails, and the eTLD+1 probe uses the same `SameSite`/`Secure` attributes as the actual cookie to ensure consistent behavior across contexts.
diff --git a/.changeset/fix-router-sync-popup-oauth.md b/.changeset/fix-router-sync-popup-oauth.md
deleted file mode 100644
index 639411475d0..00000000000
--- a/.changeset/fix-router-sync-popup-oauth.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix BaseRouter state not syncing after popup OAuth by observing `pushState`/`replaceState` changes in addition to `popstate`
diff --git a/.changeset/pretty-ends-deny.md b/.changeset/pretty-ends-deny.md
deleted file mode 100644
index a845151cc84..00000000000
--- a/.changeset/pretty-ends-deny.md
+++ /dev/null
@@ -1,2 +0,0 @@
----
----
diff --git a/.changeset/public-emus-stay.md b/.changeset/public-emus-stay.md
deleted file mode 100644
index 22698bf9f75..00000000000
--- a/.changeset/public-emus-stay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/nextjs': patch
----
-
-Fix infinite handshake redirect loop when deploying Next.js apps with Clerk development instances to Netlify
diff --git a/.changeset/shy-loops-type.md b/.changeset/shy-loops-type.md
deleted file mode 100644
index b55584f9cd2..00000000000
--- a/.changeset/shy-loops-type.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@clerk/localizations': minor
-'@clerk/clerk-js': minor
-'@clerk/shared': minor
----
-
-Add support for account credits in checkout.
diff --git a/.changeset/thick-points-watch.md b/.changeset/thick-points-watch.md
deleted file mode 100644
index 18f14be52e6..00000000000
--- a/.changeset/thick-points-watch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/backend': patch
----
-
-fix(backend): type JwtTemplatesApi.list as PaginatedResourceResponse
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 59c41231259..654b7bec0cb 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.24
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 0.2.23
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 30a1f8564da..1fda7d2679f 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.23",
+ "version": "0.2.24",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 1ce88b6a9c4..fbd028d7138 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.17.4
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 2.17.3
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 0f2604589e3..ee0673b1059 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.17.3",
+ "version": "2.17.4",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 344a8e8250b..38f1f58ca77 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.31.2
+
+### Patch Changes
+
+- fix(backend): type JwtTemplatesApi.list as PaginatedResourceResponse ([#7868](https://github.com/clerk/javascript/pull/7868)) by [@thiskevinwang](https://github.com/thiskevinwang)
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+ - @clerk/types@4.101.17
+
## 2.31.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 5ea6ed4d4ad..ae349485fe4 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.31.1",
+ "version": "2.31.2",
"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 98f4b533a17..47a7fec8fc7 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.9.4
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`7fe1e82`](https://github.com/clerk/javascript/commit/7fe1e8218b22a5589072871477ee293bdb7c9b86), [`e62d804`](https://github.com/clerk/javascript/commit/e62d804d921f0e99ed41a9d6268eebe0120ebb88), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/clerk-js@5.124.0
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+
## 2.9.3
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 154653c90fd..d5fdefb0ca7 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.9.3",
+ "version": "2.9.4",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 20bb5958127..407022c1464 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,23 @@
# Change Log
+## 5.124.0
+
+### Minor Changes
+
+- Introduces MFA setup session task for handling require MFA after sign-in and sign-up ([#7851](https://github.com/clerk/javascript/pull/7851)) by [@octoper](https://github.com/octoper)
+
+- Add support for account credits in checkout. ([#7870](https://github.com/clerk/javascript/pull/7870)) by [@dstaley](https://github.com/dstaley)
+
+### Patch Changes
+
+- Fix `__client_uat` cookie being set on two different domain scopes when app is loaded in both iframe and non-iframe contexts. `getCookieDomain()` now falls back to `hostname` instead of `undefined` when the eTLD+1 probe fails, and the eTLD+1 probe uses the same `SameSite`/`Secure` attributes as the actual cookie to ensure consistent behavior across contexts. ([#7882](https://github.com/clerk/javascript/pull/7882)) by [@brkalow](https://github.com/brkalow)
+
+- Fix BaseRouter state not syncing after popup OAuth by observing `pushState`/`replaceState` changes in addition to `popstate` ([#7863](https://github.com/clerk/javascript/pull/7863)) by [@brkalow](https://github.com/brkalow)
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/localizations@3.36.0
+ - @clerk/shared@3.46.0
+
## 5.123.1
### Patch Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 3684c1ca8b7..6ebc2ec3a68 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.123.1",
+ "version": "5.124.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index 5c85660bcb7..96abc14e66d 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/elements
+## 0.24.10
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/types@4.101.17
+
## 0.24.9
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index 7953c881cc8..d1230fe16c7 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.9",
+ "version": "0.24.10",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index c92e41cba14..d8c583a6a43 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.36
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+
## 0.4.35
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index 66774cfcba4..c2207bfd145 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.35",
+ "version": "0.4.36",
"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 8a23f790ebb..c739e6709d5 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.25
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`7fe1e82`](https://github.com/clerk/javascript/commit/7fe1e8218b22a5589072871477ee293bdb7c9b86), [`e62d804`](https://github.com/clerk/javascript/commit/e62d804d921f0e99ed41a9d6268eebe0120ebb88), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/clerk-js@5.124.0
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/types@4.101.17
+
## 2.19.24
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 1ae28a47fb4..769e8a06f16 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.24",
+ "version": "2.19.25",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 183d8a3921e..704494e30bd 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.72
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 1.7.71
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index 971f0b334ca..09d5dd260b0 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.71",
+ "version": "1.7.72",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index 79f5dde84db..b4e13030307 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.24
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 2.6.23
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index 91b2fddcfcd..85519ecc098 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.23",
+ "version": "2.6.24",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index f19645fa5ae..359cf854be4 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,18 @@
# Change Log
+## 3.36.0
+
+### Minor Changes
+
+- Introduces MFA setup session task for handling require MFA after sign-in and sign-up ([#7851](https://github.com/clerk/javascript/pull/7851)) by [@octoper](https://github.com/octoper)
+
+- Add support for account credits in checkout. ([#7870](https://github.com/clerk/javascript/pull/7870)) by [@dstaley](https://github.com/dstaley)
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @clerk/types@4.101.17
+
## 3.35.5
### Patch Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index 970b422a605..e275e5bee1b 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.35.5",
+ "version": "3.36.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 74f49fbba38..61ef7f4405f 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,21 @@
# Change Log
+## 6.38.0
+
+### Minor Changes
+
+- Introduces MFA setup session task for handling require MFA after sign-in and sign-up ([#7851](https://github.com/clerk/javascript/pull/7851)) by [@octoper](https://github.com/octoper)
+
+### Patch Changes
+
+- Fix infinite handshake redirect loop when deploying Next.js apps with Clerk development instances to Netlify ([#7876](https://github.com/clerk/javascript/pull/7876)) by [@mauricioabreu](https://github.com/mauricioabreu)
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 6.37.5
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 615d5d0d4d4..41bb8661004 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.37.5",
+ "version": "6.38.0",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index eac048accf8..baf3a3d7667 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.22
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+ - @clerk/vue@1.17.15
+
## 1.13.21
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 4083d287dba..5e91d7419bd 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.21",
+ "version": "1.13.22",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 19504e40e87..9b899002a6d 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.4.6
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 2.4.5
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index fd913377032..0ec40d9d055 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.4.5",
+ "version": "2.4.6",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 28845a5e676..0569ac9c021 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,16 @@
# Change Log
+## 5.61.0
+
+### Minor Changes
+
+- Introduces MFA setup session task for handling require MFA after sign-in and sign-up ([#7851](https://github.com/clerk/javascript/pull/7851)) by [@octoper](https://github.com/octoper)
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+
## 5.60.2
### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 65257f7a409..2dcf9e8ec35 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.60.2",
+ "version": "5.61.0",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 4ad5d57c8af..9f5aee0870a 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.39
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 4.13.38
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 2876cb4e860..950023196f3 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.38",
+ "version": "4.13.39",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index e2a9d0d734f..8f57572a1c3 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 3.46.0
+
+### Minor Changes
+
+- Introduces MFA setup session task for handling require MFA after sign-in and sign-up ([#7851](https://github.com/clerk/javascript/pull/7851)) by [@octoper](https://github.com/octoper)
+
+- Add support for account credits in checkout. ([#7870](https://github.com/clerk/javascript/pull/7870)) by [@dstaley](https://github.com/dstaley)
+
## 3.45.1
### Patch Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 24fd14ca712..b6dd3627760 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.45.1",
+ "version": "3.46.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 e54c2f9f764..bef35101b4e 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.4
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/clerk-react@5.61.0
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 0.29.3
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 711998ea9b2..68f46f88c8e 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.3",
+ "version": "0.29.4",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index 4f1e54810a5..d01a72f26c3 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.13.38
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8), [`2471e31`](https://github.com/clerk/javascript/commit/2471e314b24eab485c78313d84d986ee30c63088)]:
+ - @clerk/shared@3.46.0
+ - @clerk/backend@2.31.2
+ - @clerk/types@4.101.17
+
## 1.13.37
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index c147adec253..9d1dfd14f30 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.37",
+ "version": "1.13.38",
"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 f2c8f6b3260..1d0638ea0d5 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.54
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+
## 2.4.53
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 27a207d8fcf..8342bcca0d7 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.53",
+ "version": "2.4.54",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index 63d2ec939fa..1fd3e513a3d 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.17
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+
## 4.101.16
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index dcffd494f5e..ebd50489814 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.16",
+ "version": "4.101.17",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index c1f59d8573b..7a0bb5a0a79 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.15
+
+### Patch Changes
+
+- Updated dependencies [[`71bd53c`](https://github.com/clerk/javascript/commit/71bd53c67a5018bd7aa589c3baced2038123c228), [`935f780`](https://github.com/clerk/javascript/commit/935f780ab5b3871253da2ad46f0e44f9ce7e53e8)]:
+ - @clerk/shared@3.46.0
+ - @clerk/types@4.101.17
+
## 1.17.14
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 7c144585133..1290744052f 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.14",
+ "version": "1.17.15",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From c00c5246f340cf0339c5725cade90cfcd118727d Mon Sep 17 00:00:00 2001
From: Dylan Staley <88163+dstaley@users.noreply.github.com>
Date: Thu, 19 Feb 2026 13:04:55 -0600
Subject: [PATCH 113/123] feat(clerk-js,localizations,shared): Render credits
(#7885)
---
.changeset/sharp-monkeys-live.md | 7 +++++
packages/clerk-js/bundlewatch.config.json | 2 +-
.../src/core/resources/BillingSubscription.ts | 6 +++-
.../PaymentAttempts/PaymentAttemptPage.tsx | 28 +++++++++++++------
.../components/Statements/StatementPage.tsx | 16 +++++++++--
packages/clerk-js/src/utils/billing.ts | 2 +-
packages/localizations/src/en-US.ts | 4 +++
packages/shared/src/types/billing.ts | 1 +
packages/shared/src/types/localization.ts | 4 +++
9 files changed, 57 insertions(+), 13 deletions(-)
create mode 100644 .changeset/sharp-monkeys-live.md
diff --git a/.changeset/sharp-monkeys-live.md b/.changeset/sharp-monkeys-live.md
new file mode 100644
index 00000000000..394b8933c70
--- /dev/null
+++ b/.changeset/sharp-monkeys-live.md
@@ -0,0 +1,7 @@
+---
+'@clerk/localizations': minor
+'@clerk/clerk-js': minor
+'@clerk/shared': minor
+---
+
+Add support for displaying proration and account credits on payment attempts and statements.
diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json
index 8739f42128a..73138c36f87 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": "929KB" },
+ { "path": "./dist/clerk.js", "maxSize": "930KB" },
{ "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/resources/BillingSubscription.ts b/packages/clerk-js/src/core/resources/BillingSubscription.ts
index 3b80c7dbe66..ddcd083fdc5 100644
--- a/packages/clerk-js/src/core/resources/BillingSubscription.ts
+++ b/packages/clerk-js/src/core/resources/BillingSubscription.ts
@@ -1,4 +1,5 @@
import type {
+ BillingCredits,
BillingMoneyAmount,
BillingSubscriptionItemJSON,
BillingSubscriptionItemResource,
@@ -12,7 +13,7 @@ import type {
import { unixEpochToDate } from '@/utils/date';
-import { billingMoneyAmountFromJSON } from '../../utils';
+import { billingCreditsFromJSON, billingMoneyAmountFromJSON } from '../../utils';
import { Billing } from '../modules/billing/namespace';
import { BaseResource, BillingPlan, DeletedObject } from './internal';
@@ -75,6 +76,7 @@ export class BillingSubscriptionItem extends BaseResource implements BillingSubs
credit?: {
amount: BillingMoneyAmount;
};
+ credits?: BillingCredits;
isFreeTrial!: boolean;
constructor(data: BillingSubscriptionItemJSON) {
@@ -103,6 +105,8 @@ export class BillingSubscriptionItem extends BaseResource implements BillingSubs
this.credit =
data.credit && data.credit.amount ? { amount: billingMoneyAmountFromJSON(data.credit.amount) } : undefined;
+ this.credits = data.credits ? billingCreditsFromJSON(data.credits) : undefined;
+
this.isFreeTrial = this.withDefault(data.is_free_trial, false);
return this;
}
diff --git a/packages/clerk-js/src/ui/components/PaymentAttempts/PaymentAttemptPage.tsx b/packages/clerk-js/src/ui/components/PaymentAttempts/PaymentAttemptPage.tsx
index ca4671fd3ac..3cee693d74b 100644
--- a/packages/clerk-js/src/ui/components/PaymentAttempts/PaymentAttemptPage.tsx
+++ b/packages/clerk-js/src/ui/components/PaymentAttempts/PaymentAttemptPage.tsx
@@ -233,14 +233,26 @@ function PaymentAttemptBody({ subscriptionItem }: { subscriptionItem: BillingSub
text={`${subscriptionItem.amount?.currencySymbol}${subscriptionItem.amount?.amountFormatted}`}
/>
- {subscriptionItem.credit && subscriptionItem.credit.amount.amount > 0 && (
-
-
-
-
- )}
+ {subscriptionItem.credits &&
+ subscriptionItem.credits.proration &&
+ subscriptionItem.credits.proration.amount.amount > 0 && (
+
+
+
+
+ )}
+ {subscriptionItem.credits &&
+ subscriptionItem.credits.payer &&
+ subscriptionItem.credits.payer.appliedAmount.amount > 0 && (
+
+
+
+
+ )}
);
diff --git a/packages/clerk-js/src/ui/components/Statements/StatementPage.tsx b/packages/clerk-js/src/ui/components/Statements/StatementPage.tsx
index c5571e4f7ef..d9ddb8fc602 100644
--- a/packages/clerk-js/src/ui/components/Statements/StatementPage.tsx
+++ b/packages/clerk-js/src/ui/components/Statements/StatementPage.tsx
@@ -137,12 +137,24 @@ export const StatementPage = () => {
}
/>
- {item.subscriptionItem.credit && item.subscriptionItem.credit.amount.amount > 0 ? (
+ {item.subscriptionItem.credits &&
+ item.subscriptionItem.credits.proration &&
+ item.subscriptionItem.credits.proration.amount.amount > 0 ? (
+ ) : null}
+ {item.subscriptionItem.credits &&
+ item.subscriptionItem.credits.payer &&
+ item.subscriptionItem.credits.payer.appliedAmount.amount > 0 ? (
+
) : null}
diff --git a/packages/clerk-js/src/utils/billing.ts b/packages/clerk-js/src/utils/billing.ts
index 8c42f1a86fa..acdeb376016 100644
--- a/packages/clerk-js/src/utils/billing.ts
+++ b/packages/clerk-js/src/utils/billing.ts
@@ -18,7 +18,7 @@ export const billingMoneyAmountFromJSON = (data: BillingMoneyAmountJSON): Billin
};
};
-const billingCreditsFromJSON = (data: BillingCreditsJSON): BillingCredits => {
+export const billingCreditsFromJSON = (data: BillingCreditsJSON): BillingCredits => {
return {
proration: data.proration
? {
diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts
index 974df8cff69..2fb81fe0104 100644
--- a/packages/localizations/src/en-US.ts
+++ b/packages/localizations/src/en-US.ts
@@ -109,6 +109,8 @@ export const enUS: LocalizationResource = {
totalDueAfterTrial: 'Total Due after trial ends in {{days}} days',
},
credit: 'Credit',
+ prorationCredit: 'Prorated credit',
+ accountCredit: 'Account credit',
creditRemainder: 'Credit for the remainder of your current subscription.',
payerCreditRemainder: 'Credit from account balance.',
defaultFreePlanActive: "You're currently on the Free plan",
@@ -314,6 +316,7 @@ export const enUS: LocalizationResource = {
empty: 'No statements to display',
itemCaption__paidForPlan: 'Paid for {{plan}} {{period}} plan',
itemCaption__proratedCredit: 'Prorated credit for partial usage of previous subscription',
+ itemCaption__payerCredit: 'Credit from account balance',
itemCaption__subscribedAndPaidForPlan: 'Subscribed and paid for {{plan}} {{period}} plan',
notFound: 'Statement not found',
tableHeader__amount: 'Amount',
@@ -1144,6 +1147,7 @@ export const enUS: LocalizationResource = {
empty: 'No statements to display',
itemCaption__paidForPlan: 'Paid for {{plan}} {{period}} plan',
itemCaption__proratedCredit: 'Prorated credit for partial usage of previous subscription',
+ itemCaption__payerCredit: 'Credit from account balance',
itemCaption__subscribedAndPaidForPlan: 'Subscribed and paid for {{plan}} {{period}} plan',
notFound: 'Statement not found',
tableHeader__amount: 'Amount',
diff --git a/packages/shared/src/types/billing.ts b/packages/shared/src/types/billing.ts
index a7ba45ae532..37dbd50dd6a 100644
--- a/packages/shared/src/types/billing.ts
+++ b/packages/shared/src/types/billing.ts
@@ -548,6 +548,7 @@ export interface BillingSubscriptionItemResource extends ClerkResource {
*/
amount: BillingMoneyAmount;
};
+ credits?: BillingCredits;
/**
* A function to cancel the subscription item. Accepts the following parameters:
*
diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts
index d81be772c21..e9d6db10850 100644
--- a/packages/shared/src/types/localization.ts
+++ b/packages/shared/src/types/localization.ts
@@ -206,6 +206,8 @@ export type __internal_LocalizationResource = {
availableFeatures: LocalizationValue;
subtotal: LocalizationValue;
credit: LocalizationValue;
+ prorationCredit: LocalizationValue;
+ accountCredit: LocalizationValue;
creditRemainder: LocalizationValue;
payerCreditRemainder: LocalizationValue;
totalDue: LocalizationValue;
@@ -910,6 +912,7 @@ export type __internal_LocalizationResource = {
empty: LocalizationValue;
itemCaption__paidForPlan: LocalizationValue;
itemCaption__proratedCredit: LocalizationValue;
+ itemCaption__payerCredit: LocalizationValue;
itemCaption__subscribedAndPaidForPlan: LocalizationValue;
notFound: LocalizationValue;
tableHeader__date: LocalizationValue;
@@ -1148,6 +1151,7 @@ export type __internal_LocalizationResource = {
empty: LocalizationValue;
itemCaption__paidForPlan: LocalizationValue<'plan' | 'period'>;
itemCaption__proratedCredit: LocalizationValue;
+ itemCaption__payerCredit: LocalizationValue;
itemCaption__subscribedAndPaidForPlan: LocalizationValue<'plan' | 'period'>;
notFound: LocalizationValue;
tableHeader__date: LocalizationValue;
From 9c935adeda94af60219ed8b7c7f1f9c34fbd410d Mon Sep 17 00:00:00 2001
From: Tom Milewski
Date: Fri, 20 Feb 2026 13:01:44 -0500
Subject: [PATCH 114/123] feat(backend,testing): Add agent tasks endpoints &
helpers (#7897)
---
.changeset/smart-llamas-clean.md | 8 ++
.../src/api/__tests__/AgentTaskApi.test.ts | 96 +++++++++++++++++++
.../backend/src/api/endpoints/AgentTaskApi.ts | 72 ++++++++++++++
packages/backend/src/api/endpoints/index.ts | 1 +
packages/backend/src/api/factory.ts | 5 +
.../backend/src/api/resources/AgentTask.ts | 34 +++++++
.../backend/src/api/resources/Deserializer.ts | 3 +
packages/backend/src/api/resources/JSON.ts | 8 ++
packages/backend/src/api/resources/index.ts | 1 +
packages/backend/src/index.ts | 2 +
packages/testing/src/common/agent-task.ts | 63 ++++++++++++
packages/testing/src/common/index.ts | 1 +
packages/testing/src/cypress/agent-task.ts | 19 ++++
packages/testing/src/cypress/index.ts | 1 +
packages/testing/src/playwright/agent-task.ts | 18 ++++
packages/testing/src/playwright/index.ts | 1 +
16 files changed, 333 insertions(+)
create mode 100644 .changeset/smart-llamas-clean.md
create mode 100644 packages/backend/src/api/__tests__/AgentTaskApi.test.ts
create mode 100644 packages/backend/src/api/endpoints/AgentTaskApi.ts
create mode 100644 packages/backend/src/api/resources/AgentTask.ts
create mode 100644 packages/testing/src/common/agent-task.ts
create mode 100644 packages/testing/src/cypress/agent-task.ts
create mode 100644 packages/testing/src/playwright/agent-task.ts
diff --git a/.changeset/smart-llamas-clean.md b/.changeset/smart-llamas-clean.md
new file mode 100644
index 00000000000..d062c170f32
--- /dev/null
+++ b/.changeset/smart-llamas-clean.md
@@ -0,0 +1,8 @@
+---
+'@clerk/backend': minor
+'@clerk/testing': minor
+---
+
+Add support for Agent Tasks API endpoint which allows developers to create agent tasks that can be used to act on behalf of users through automated flows.
+
+Export `createAgentTestingTask` helper for creating agent tasks via the Clerk Backend API from both `@clerk/testing/playwright` and `@clerk/testing/cypress` subpaths.
diff --git a/packages/backend/src/api/__tests__/AgentTaskApi.test.ts b/packages/backend/src/api/__tests__/AgentTaskApi.test.ts
new file mode 100644
index 00000000000..8f77842f5f1
--- /dev/null
+++ b/packages/backend/src/api/__tests__/AgentTaskApi.test.ts
@@ -0,0 +1,96 @@
+import { http, HttpResponse } from 'msw';
+import { describe, expect, it } from 'vitest';
+
+import { server, validateHeaders } from '../../mock-server';
+import { createBackendApiClient } from '../factory';
+
+describe('AgentTaskAPI', () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ secretKey: 'deadbeef',
+ });
+
+ const mockAgentTaskResponse = {
+ object: 'agent_task',
+ agent_id: 'agent_123',
+ task_id: 'task_456',
+ url: 'https://example.com/agent-task',
+ };
+
+ describe('create', () => {
+ it('converts nested onBehalfOf.userId to snake_case', async () => {
+ server.use(
+ http.post(
+ 'https://api.clerk.test/v1/agents/tasks',
+ validateHeaders(async ({ request }) => {
+ const body = await request.json();
+
+ expect(body).toEqual({
+ on_behalf_of: {
+ user_id: 'user_123',
+ },
+ permissions: 'read,write',
+ agent_name: 'test-agent',
+ task_description: 'Test task',
+ redirect_url: 'https://example.com/callback',
+ session_max_duration_in_seconds: 1800,
+ });
+
+ return HttpResponse.json(mockAgentTaskResponse);
+ }),
+ ),
+ );
+
+ const response = await apiClient.agentTasks.create({
+ onBehalfOf: {
+ userId: 'user_123',
+ },
+ permissions: 'read,write',
+ agentName: 'test-agent',
+ taskDescription: 'Test task',
+ redirectUrl: 'https://example.com/callback',
+ sessionMaxDurationInSeconds: 1800,
+ });
+
+ expect(response.agentId).toBe('agent_123');
+ expect(response.taskId).toBe('task_456');
+ expect(response.url).toBe('https://example.com/agent-task');
+ });
+
+ it('converts nested onBehalfOf.identifier to snake_case', async () => {
+ server.use(
+ http.post(
+ 'https://api.clerk.test/v1/agents/tasks',
+ validateHeaders(async ({ request }) => {
+ const body = await request.json();
+
+ expect(body).toEqual({
+ on_behalf_of: {
+ identifier: 'user@example.com',
+ },
+ permissions: 'read',
+ agent_name: 'test-agent',
+ task_description: 'Test task',
+ redirect_url: 'https://example.com/callback',
+ });
+
+ return HttpResponse.json(mockAgentTaskResponse);
+ }),
+ ),
+ );
+
+ const response = await apiClient.agentTasks.create({
+ onBehalfOf: {
+ identifier: 'user@example.com',
+ },
+ permissions: 'read',
+ agentName: 'test-agent',
+ taskDescription: 'Test task',
+ redirectUrl: 'https://example.com/callback',
+ });
+
+ expect(response.agentId).toBe('agent_123');
+ expect(response.taskId).toBe('task_456');
+ });
+ });
+});
diff --git a/packages/backend/src/api/endpoints/AgentTaskApi.ts b/packages/backend/src/api/endpoints/AgentTaskApi.ts
new file mode 100644
index 00000000000..ecc55c8bf4d
--- /dev/null
+++ b/packages/backend/src/api/endpoints/AgentTaskApi.ts
@@ -0,0 +1,72 @@
+import { joinPaths } from '../../util/path';
+import type { AgentTask } from '../resources/AgentTask';
+import { AbstractAPI } from './AbstractApi';
+
+type CreateAgentTaskParams = {
+ /**
+ * The user to create an agent task for.
+ */
+ onBehalfOf:
+ | {
+ /**
+ * The identifier of the user to create an agent task for.
+ */
+ identifier: string;
+ userId?: never;
+ }
+ | {
+ /**
+ * The ID of the user to create an agent task for.
+ */
+ userId: string;
+ identifier?: never;
+ };
+ /**
+ * The permissions the agent task will have.
+ */
+ permissions: string;
+ /**
+ * The name of the agent to create an agent task for.
+ */
+ agentName: string;
+ /**
+ * The description of the agent task to create.
+ */
+ taskDescription: string;
+ /**
+ * The URL to redirect to after the agent task is consumed.
+ */
+ redirectUrl: string;
+
+ /**
+ * The maximum duration that the session which will be created by the generated agent task should last.
+ * By default, the duration is 30 minutes.
+ */
+ sessionMaxDurationInSeconds?: number;
+};
+
+const basePath = '/agents/tasks';
+
+export class AgentTaskAPI extends AbstractAPI {
+ /**
+ * @experimental This is an experimental API for the Agent Tokens feature that is available under a private 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.
+ */
+ public async create(params: CreateAgentTaskParams) {
+ return this.request({
+ method: 'POST',
+ path: basePath,
+ bodyParams: params,
+ options: {
+ deepSnakecaseBodyParamKeys: true,
+ },
+ });
+ }
+
+ public async revoke(agentTaskId: string) {
+ this.requireId(agentTaskId);
+ return this.request>({
+ method: 'POST',
+ path: joinPaths(basePath, agentTaskId, 'revoke'),
+ });
+ }
+}
diff --git a/packages/backend/src/api/endpoints/index.ts b/packages/backend/src/api/endpoints/index.ts
index c03875a427d..1f5d7bf7f51 100644
--- a/packages/backend/src/api/endpoints/index.ts
+++ b/packages/backend/src/api/endpoints/index.ts
@@ -1,4 +1,5 @@
export * from './ActorTokenApi';
+export * from './AgentTaskApi';
export * from './AccountlessApplicationsAPI';
export * from './AbstractApi';
export * from './AllowlistIdentifierApi';
diff --git a/packages/backend/src/api/factory.ts b/packages/backend/src/api/factory.ts
index 6c82869a46e..22f1aa89c21 100644
--- a/packages/backend/src/api/factory.ts
+++ b/packages/backend/src/api/factory.ts
@@ -1,6 +1,7 @@
import {
AccountlessApplicationAPI,
ActorTokenAPI,
+ AgentTaskAPI,
AllowlistIdentifierAPI,
APIKeysAPI,
BetaFeaturesAPI,
@@ -44,6 +45,10 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
buildRequest({ ...options, requireSecretKey: false }),
),
actorTokens: new ActorTokenAPI(request),
+ /**
+ * @experimental This is an experimental API for the Agent Tasks feature that is available under a private 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.
+ */
+ agentTasks: new AgentTaskAPI(request),
allowlistIdentifiers: new AllowlistIdentifierAPI(request),
apiKeys: new APIKeysAPI(
buildRequest({
diff --git a/packages/backend/src/api/resources/AgentTask.ts b/packages/backend/src/api/resources/AgentTask.ts
new file mode 100644
index 00000000000..e5e821320f6
--- /dev/null
+++ b/packages/backend/src/api/resources/AgentTask.ts
@@ -0,0 +1,34 @@
+import type { AgentTaskJSON } from './JSON';
+
+/**
+ * Represents a agent token resource.
+ *
+ * Agent tokens are used for testing purposes and allow creating sessions
+ * for users without requiring full authentication flows.
+ */
+export class AgentTask {
+ constructor(
+ /**
+ * A stable identifier for the agent, unique per agent_name within an instance.
+ */
+ readonly agentId: string,
+ /**
+ * A unique identifier for this agent task.
+ */
+ readonly taskId: string,
+ /**
+ * The FAPI URL that, when visited, creates a session for the user.
+ */
+ readonly url: string,
+ ) {}
+
+ /**
+ * Creates a AgentTask instance from a JSON object.
+ *
+ * @param data - The JSON object containing agent task data
+ * @returns A new AgentTask instance
+ */
+ static fromJSON(data: AgentTaskJSON): AgentTask {
+ return new AgentTask(data.agent_id, data.task_id, data.url);
+ }
+}
diff --git a/packages/backend/src/api/resources/Deserializer.ts b/packages/backend/src/api/resources/Deserializer.ts
index 79fbe119836..626d5e20019 100644
--- a/packages/backend/src/api/resources/Deserializer.ts
+++ b/packages/backend/src/api/resources/Deserializer.ts
@@ -1,5 +1,6 @@
import {
ActorToken,
+ AgentTask,
AllowlistIdentifier,
APIKey,
BlocklistIdentifier,
@@ -169,6 +170,8 @@ function jsonToObject(item: any): any {
return SamlConnection.fromJSON(item);
case ObjectType.SignInToken:
return SignInToken.fromJSON(item);
+ case ObjectType.AgentTask:
+ return AgentTask.fromJSON(item);
case ObjectType.SignUpAttempt:
return SignUpAttempt.fromJSON(item);
case ObjectType.Session:
diff --git a/packages/backend/src/api/resources/JSON.ts b/packages/backend/src/api/resources/JSON.ts
index 88e3d0c001e..d3ffa3c3c9e 100644
--- a/packages/backend/src/api/resources/JSON.ts
+++ b/packages/backend/src/api/resources/JSON.ts
@@ -19,6 +19,7 @@ import type {
export const ObjectType = {
AccountlessApplication: 'accountless_application',
ActorToken: 'actor_token',
+ AgentTask: 'agent_task',
AllowlistIdentifier: 'allowlist_identifier',
ApiKey: 'api_key',
BlocklistIdentifier: 'blocklist_identifier',
@@ -528,6 +529,13 @@ export interface SignInTokenJSON extends ClerkResourceJSON {
updated_at: number;
}
+export interface AgentTaskJSON extends ClerkResourceJSON {
+ object: typeof ObjectType.AgentTask;
+ agent_id: string;
+ task_id: string;
+ url: string;
+}
+
export interface SignUpJSON extends ClerkResourceJSON {
object: typeof ObjectType.SignUpAttempt;
id: string;
diff --git a/packages/backend/src/api/resources/index.ts b/packages/backend/src/api/resources/index.ts
index 855fb43df45..f97c5182e18 100644
--- a/packages/backend/src/api/resources/index.ts
+++ b/packages/backend/src/api/resources/index.ts
@@ -1,4 +1,5 @@
export * from './AccountlessApplication';
+export * from './AgentTask';
export * from './ActorToken';
export * from './AllowlistIdentifier';
export * from './APIKey';
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index 5b707bb8b82..9ce52f4d774 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -55,6 +55,7 @@ export type { VerifyTokenOptions } from './tokens/verify';
*/
export type {
ActorTokenJSON,
+ AgentTaskJSON,
AccountlessApplicationJSON,
ClerkResourceJSON,
TokenJSON,
@@ -110,6 +111,7 @@ export type {
* Resources
*/
export type {
+ AgentTask,
APIKey,
ActorToken,
AccountlessApplication,
diff --git a/packages/testing/src/common/agent-task.ts b/packages/testing/src/common/agent-task.ts
new file mode 100644
index 00000000000..747ee1ff1b0
--- /dev/null
+++ b/packages/testing/src/common/agent-task.ts
@@ -0,0 +1,63 @@
+import type { AgentTask, ClerkClient } from '@clerk/backend';
+import { createClerkClient } from '@clerk/backend';
+
+export type CreateAgentTaskParams = Parameters[0] &
+ (
+ | {
+ /**
+ * The API URL for your Clerk instance.
+ * If not provided, falls back to the `CLERK_API_URL` environment variable.
+ */
+ apiUrl?: string;
+ /**
+ * The secret key for your Clerk instance.
+ * If not provided, falls back to the `CLERK_SECRET_KEY` environment variable.
+ */
+ secretKey?: string;
+
+ clerkClient?: never;
+ }
+ | {
+ /**
+ * The Clerk client to use to create the agent task.
+ * If not provided, a new Clerk client will be created.
+ */
+ clerkClient?: ClerkClient;
+ apiUrl?: string;
+ secretKey?: string;
+ }
+ );
+
+export const ERROR_MISSING_SECRET_KEY =
+ 'A secretKey is required to create agent tasks. ' +
+ 'Pass it directly or set the CLERK_SECRET_KEY environment variable.';
+
+export const ERROR_MISSING_API_URL =
+ 'An apiUrl is required to create agent tasks. ' + 'Pass it directly or set the CLERK_API_URL environment variable.';
+
+export const ERROR_AGENT_TASK_FAILED = 'Failed to create agent task: ';
+
+/**
+ * Creates an agent task using the Clerk Backend API and returns its URL.
+ *
+ * @internal Framework-specific wrappers should call this after resolving the secret key.
+ *
+ * @experimental This is an experimental API for the Agent Tasks feature that is available under a private 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.
+ */
+export async function createAgentTestingTask(params: CreateAgentTaskParams): Promise {
+ const { apiUrl, secretKey, clerkClient, ...taskParams } = params;
+
+ if (!clerkClient && !secretKey) {
+ throw new Error(ERROR_MISSING_SECRET_KEY);
+ }
+
+ const client = clerkClient ?? createClerkClient({ apiUrl, secretKey });
+
+ try {
+ return await client.agentTasks.create(taskParams);
+ } catch (error) {
+ throw new Error(ERROR_AGENT_TASK_FAILED + (error instanceof Error ? error.message : String(error)));
+ }
+}
diff --git a/packages/testing/src/common/index.ts b/packages/testing/src/common/index.ts
index b5ddaed5011..bbf12afe13e 100644
--- a/packages/testing/src/common/index.ts
+++ b/packages/testing/src/common/index.ts
@@ -1,3 +1,4 @@
+export * from './agent-task';
export * from './constants';
export * from './types';
export * from './setup';
diff --git a/packages/testing/src/cypress/agent-task.ts b/packages/testing/src/cypress/agent-task.ts
new file mode 100644
index 00000000000..37c8df7bab6
--- /dev/null
+++ b/packages/testing/src/cypress/agent-task.ts
@@ -0,0 +1,19 @@
+///
+import { type CreateAgentTaskParams, createAgentTestingTask as _createAgentTestingTask } from '../common';
+
+/**
+ * Creates an agent task using the Clerk Backend API and returns its URL.
+ *
+ * If `secretKey` is not provided, falls back to the `CLERK_SECRET_KEY` Cypress environment variable.
+ *
+ * @experimental This is an experimental API for the Agent Tasks feature that is available under a private 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.
+ */
+export function createAgentTestingTask(params: CreateAgentTaskParams) {
+ return _createAgentTestingTask({
+ ...params,
+ apiUrl: params.apiUrl || Cypress.env('CLERK_API_URL') || process.env.CLERK_API_URL,
+ secretKey: params.secretKey || Cypress.env('CLERK_SECRET_KEY') || process.env.CLERK_SECRET_KEY,
+ });
+}
diff --git a/packages/testing/src/cypress/index.ts b/packages/testing/src/cypress/index.ts
index 95febb24a8e..a06ab01c226 100644
--- a/packages/testing/src/cypress/index.ts
+++ b/packages/testing/src/cypress/index.ts
@@ -1,3 +1,4 @@
export { clerkSetup } from './setup';
+export { createAgentTestingTask } from './agent-task';
export { setupClerkTestingToken } from './setupClerkTestingToken';
export { addClerkCommands } from './custom-commands';
diff --git a/packages/testing/src/playwright/agent-task.ts b/packages/testing/src/playwright/agent-task.ts
new file mode 100644
index 00000000000..164584a73be
--- /dev/null
+++ b/packages/testing/src/playwright/agent-task.ts
@@ -0,0 +1,18 @@
+import { type CreateAgentTaskParams, createAgentTestingTask as _createAgentTestingTask } from '../common';
+
+/**
+ * Creates an agent task using the Clerk Backend API and returns its URL.
+ *
+ * If `secretKey` is not provided, falls back to the `CLERK_SECRET_KEY` environment variable.
+ *
+ * @experimental This is an experimental API for the Agent Tasks feature that is available under a private 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.
+ */
+export function createAgentTestingTask(params: CreateAgentTaskParams) {
+ return _createAgentTestingTask({
+ ...params,
+ apiUrl: params.apiUrl || process.env.CLERK_API_URL,
+ secretKey: params.secretKey || process.env.CLERK_SECRET_KEY,
+ });
+}
diff --git a/packages/testing/src/playwright/index.ts b/packages/testing/src/playwright/index.ts
index da08ed20634..59a95a4b8d2 100644
--- a/packages/testing/src/playwright/index.ts
+++ b/packages/testing/src/playwright/index.ts
@@ -1,3 +1,4 @@
export { clerkSetup } from './setup';
+export { createAgentTestingTask } from './agent-task';
export { setupClerkTestingToken } from './setupClerkTestingToken';
export { clerk } from './helpers';
From ebf3ee44170186b5f36ed63ddc76cf1fb268fb66 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Fri, 20 Feb 2026 13:58:23 -0500
Subject: [PATCH 115/123] ci(repo): Version packages (Core 2) (#7887)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/sharp-monkeys-live.md | 7 -------
.changeset/smart-llamas-clean.md | 8 --------
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 | 14 ++++++++++++++
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 | 11 +++++++++++
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 | 15 +++++++++++++++
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 +-
46 files changed, 230 insertions(+), 37 deletions(-)
delete mode 100644 .changeset/sharp-monkeys-live.md
delete mode 100644 .changeset/smart-llamas-clean.md
diff --git a/.changeset/sharp-monkeys-live.md b/.changeset/sharp-monkeys-live.md
deleted file mode 100644
index 394b8933c70..00000000000
--- a/.changeset/sharp-monkeys-live.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@clerk/localizations': minor
-'@clerk/clerk-js': minor
-'@clerk/shared': minor
----
-
-Add support for displaying proration and account credits on payment attempts and statements.
diff --git a/.changeset/smart-llamas-clean.md b/.changeset/smart-llamas-clean.md
deleted file mode 100644
index d062c170f32..00000000000
--- a/.changeset/smart-llamas-clean.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@clerk/backend': minor
-'@clerk/testing': minor
----
-
-Add support for Agent Tasks API endpoint which allows developers to create agent tasks that can be used to act on behalf of users through automated flows.
-
-Export `createAgentTestingTask` helper for creating agent tasks via the Clerk Backend API from both `@clerk/testing/playwright` and `@clerk/testing/cypress` subpaths.
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 654b7bec0cb..1c6c5ed3e5e 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.25
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+
## 0.2.24
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 1fda7d2679f..b2be86a1ae8 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.24",
+ "version": "0.2.25",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index fbd028d7138..26b3adb9090 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.17.5
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+
## 2.17.4
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index ee0673b1059..27127168236 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.17.4",
+ "version": "2.17.5",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 38f1f58ca77..fd652224f28 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# Change Log
+## 2.32.0
+
+### Minor Changes
+
+- Add support for Agent Tasks API endpoint which allows developers to create agent tasks that can be used to act on behalf of users through automated flows. ([#7897](https://github.com/clerk/javascript/pull/7897)) by [@tmilewski](https://github.com/tmilewski)
+
+ Export `createAgentTestingTask` helper for creating agent tasks via the Clerk Backend API from both `@clerk/testing/playwright` and `@clerk/testing/cypress` subpaths.
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/types@4.101.18
+
## 2.31.2
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index ae349485fe4..4ae987a8a34 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.31.2",
+ "version": "2.32.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 47a7fec8fc7..dddce1e5b66 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.9.5
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/clerk-js@5.125.0
+ - @clerk/shared@3.47.0
+ - @clerk/clerk-react@5.61.1
+
## 2.9.4
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index d5fdefb0ca7..076c281d169 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.9.4",
+ "version": "2.9.5",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 407022c1464..5a24c05de71 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,17 @@
# Change Log
+## 5.125.0
+
+### Minor Changes
+
+- Add support for displaying proration and account credits on payment attempts and statements. ([#7885](https://github.com/clerk/javascript/pull/7885)) by [@dstaley](https://github.com/dstaley)
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/localizations@3.37.0
+ - @clerk/shared@3.47.0
+
## 5.124.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 6ebc2ec3a68..e33534720f8 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.124.0",
+ "version": "5.125.0",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index 96abc14e66d..5e959475bb1 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/elements
+## 0.24.11
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 0.24.10
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index d1230fe16c7..1ec55d94ad7 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.10",
+ "version": "0.24.11",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index d8c583a6a43..49bff423ad7 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.37
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+
## 0.4.36
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index c2207bfd145..665aaf8fc5d 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.36",
+ "version": "0.4.37",
"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 c739e6709d5..ff04da1f0bd 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.26
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/clerk-js@5.125.0
+ - @clerk/shared@3.47.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 2.19.25
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 769e8a06f16..d696fbc0f98 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.25",
+ "version": "2.19.26",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 704494e30bd..8d6315f6af6 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.73
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+
## 1.7.72
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index 09d5dd260b0..cec741d6e24 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.72",
+ "version": "1.7.73",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index b4e13030307..a372ab990b7 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.25
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+
## 2.6.24
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index 85519ecc098..ca71f35289c 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.24",
+ "version": "2.6.25",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index 359cf854be4..b87cc43049d 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,16 @@
# Change Log
+## 3.37.0
+
+### Minor Changes
+
+- Add support for displaying proration and account credits on payment attempts and statements. ([#7885](https://github.com/clerk/javascript/pull/7885)) by [@dstaley](https://github.com/dstaley)
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @clerk/types@4.101.18
+
## 3.36.0
### Minor Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index e275e5bee1b..f768e3c1b38 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.36.0",
+ "version": "3.37.0",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 61ef7f4405f..cff7a2196ec 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 6.38.1
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 6.38.0
### Minor Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 41bb8661004..04fec7a4782 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.38.0",
+ "version": "6.38.1",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index baf3a3d7667..b92691b0429 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.23
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+ - @clerk/vue@1.17.16
+
## 1.13.22
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 5e91d7419bd..a1d30d8d923 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.22",
+ "version": "1.13.23",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 9b899002a6d..2884e603d2a 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.4.7
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 2.4.6
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 0ec40d9d055..5def9ff46ad 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.4.6",
+ "version": "2.4.7",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 0569ac9c021..4b80e99f1e0 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 5.61.1
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+
## 5.61.0
### Minor Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 2dcf9e8ec35..6ea8ee4882d 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.61.0",
+ "version": "5.61.1",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 9f5aee0870a..868b2b10294 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.40
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 4.13.39
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 950023196f3..828975d9c4c 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.39",
+ "version": "4.13.40",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 8f57572a1c3..1425312dbff 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 3.47.0
+
+### Minor Changes
+
+- Add support for displaying proration and account credits on payment attempts and statements. ([#7885](https://github.com/clerk/javascript/pull/7885)) by [@dstaley](https://github.com/dstaley)
+
## 3.46.0
### Minor Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index b6dd3627760..ff0a735b66f 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.46.0",
+ "version": "3.47.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 bef35101b4e..5c522329846 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.5
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/clerk-react@5.61.1
+ - @clerk/types@4.101.18
+
## 0.29.4
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 68f46f88c8e..83bd24d1682 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.4",
+ "version": "0.29.5",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index d01a72f26c3..1656900ae96 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,20 @@
# @clerk/testing
+## 1.14.0
+
+### Minor Changes
+
+- Add support for Agent Tasks API endpoint which allows developers to create agent tasks that can be used to act on behalf of users through automated flows. ([#7897](https://github.com/clerk/javascript/pull/7897)) by [@tmilewski](https://github.com/tmilewski)
+
+ Export `createAgentTestingTask` helper for creating agent tasks via the Clerk Backend API from both `@clerk/testing/playwright` and `@clerk/testing/cypress` subpaths.
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d), [`9c935ad`](https://github.com/clerk/javascript/commit/9c935adeda94af60219ed8b7c7f1f9c34fbd410d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/backend@2.32.0
+ - @clerk/types@4.101.18
+
## 1.13.38
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index 9d1dfd14f30..d31ca55db9d 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.13.38",
+ "version": "1.14.0",
"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 1d0638ea0d5..6d5fa413412 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.55
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+
## 2.4.54
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 8342bcca0d7..954f577c61c 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.54",
+ "version": "2.4.55",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index 1fd3e513a3d..dee34933c1b 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.18
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+
## 4.101.17
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index ebd50489814..9382cbff8c4 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.17",
+ "version": "4.101.18",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 7a0bb5a0a79..e4890571236 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.16
+
+### Patch Changes
+
+- Updated dependencies [[`c00c524`](https://github.com/clerk/javascript/commit/c00c5246f340cf0339c5725cade90cfcd118727d)]:
+ - @clerk/shared@3.47.0
+ - @clerk/types@4.101.18
+
## 1.17.15
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 1290744052f..aae19dfe2d9 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.15",
+ "version": "1.17.16",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca Mon Sep 17 00:00:00 2001
From: Austin Calvelage
Date: Mon, 23 Feb 2026 11:26:33 -0700
Subject: [PATCH 116/123] fix(clerk-js): Add expired status to
OrganizationInvitationStatus (release/core-2) (#7909)
---
.changeset/every-badgers-wish.md | 5 +++++
packages/backend/src/api/resources/Enums.ts | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 .changeset/every-badgers-wish.md
diff --git a/.changeset/every-badgers-wish.md b/.changeset/every-badgers-wish.md
new file mode 100644
index 00000000000..bbdf9c79003
--- /dev/null
+++ b/.changeset/every-badgers-wish.md
@@ -0,0 +1,5 @@
+---
+'@clerk/backend': patch
+---
+
+Updates `OrganizationInvitationStatus` to include `expired` to match the API updates.
diff --git a/packages/backend/src/api/resources/Enums.ts b/packages/backend/src/api/resources/Enums.ts
index c42e4a31a14..396a865e8cc 100644
--- a/packages/backend/src/api/resources/Enums.ts
+++ b/packages/backend/src/api/resources/Enums.ts
@@ -24,7 +24,7 @@ export type OAuthStrategy = `oauth_${OAuthProvider}`;
/**
* @inline
*/
-export type OrganizationInvitationStatus = 'pending' | 'accepted' | 'revoked';
+export type OrganizationInvitationStatus = 'pending' | 'accepted' | 'revoked' | 'expired';
export type OrganizationDomainVerificationStatus = 'unverified' | 'verified';
From cd9e5f6888e4e7fd521242b26d2fe7f06ef60dce Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Mon, 23 Feb 2026 15:06:37 -0500
Subject: [PATCH 117/123] ci(repo): Version packages (Core 2) (#7910)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/every-badgers-wish.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/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 +-
23 files changed, 87 insertions(+), 16 deletions(-)
delete mode 100644 .changeset/every-badgers-wish.md
diff --git a/.changeset/every-badgers-wish.md b/.changeset/every-badgers-wish.md
deleted file mode 100644
index bbdf9c79003..00000000000
--- a/.changeset/every-badgers-wish.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/backend': patch
----
-
-Updates `OrganizationInvitationStatus` to include `expired` to match the API updates.
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 1c6c5ed3e5e..8f6c5423dc3 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/agent-toolkit
+## 0.2.26
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 0.2.25
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index b2be86a1ae8..612a1df8559 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.25",
+ "version": "0.2.26",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 26b3adb9090..46adfbc7156 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/astro
+## 2.17.6
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 2.17.5
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 27127168236..272efeccb29 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.17.5",
+ "version": "2.17.6",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index fd652224f28..f9e48e059d6 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 2.32.1
+
+### Patch Changes
+
+- Updates `OrganizationInvitationStatus` to include `expired` to match the API updates. ([#7909](https://github.com/clerk/javascript/pull/7909)) by [@austincalvelage](https://github.com/austincalvelage)
+
## 2.32.0
### Minor Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 4ae987a8a34..714f04a15e6 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.32.0",
+ "version": "2.32.1",
"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 8d6315f6af6..9b5a906bc06 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 1.7.74
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 1.7.73
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index cec741d6e24..bb6411a47eb 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.73",
+ "version": "1.7.74",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index a372ab990b7..de2c39febce 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.6.26
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 2.6.25
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index ca71f35289c..044d5b04a70 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.25",
+ "version": "2.6.26",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index cff7a2196ec..3b7205adbbd 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 6.38.2
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 6.38.1
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 04fec7a4782..d781edcff4a 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.38.1",
+ "version": "6.38.2",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index b92691b0429..0e07982cdbf 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/nuxt
+## 1.13.24
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 1.13.23
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index a1d30d8d923..64b730be3a5 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.23",
+ "version": "1.13.24",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 2884e603d2a..6ed572d2570 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.8
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 2.4.7
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 5def9ff46ad..e82861638b9 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.4.7",
+ "version": "2.4.8",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 868b2b10294..53ee0e841d8 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.13.41
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 4.13.40
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 828975d9c4c..198d97d9f69 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.40",
+ "version": "4.13.41",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/tanstack-react-start/CHANGELOG.md b/packages/tanstack-react-start/CHANGELOG.md
index 5c522329846..fea208ac0e5 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.6
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 0.29.5
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 83bd24d1682..27b28952761 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.5",
+ "version": "0.29.6",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index 1656900ae96..d1d5e277ceb 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/testing
+## 1.14.1
+
+### Patch Changes
+
+- Updated dependencies [[`c15c8a2`](https://github.com/clerk/javascript/commit/c15c8a2cd263bd777fd94fb4bdeae2cfb4a70aca)]:
+ - @clerk/backend@2.32.1
+
## 1.14.0
### Minor Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index d31ca55db9d..36ac0b4599d 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.14.0",
+ "version": "1.14.1",
"description": "Utilities to help you create E2E test suites for apps using Clerk",
"keywords": [
"auth",
From 1db38812c91bbe370705cbb7c11291a65f678f6f Mon Sep 17 00:00:00 2001
From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com>
Date: Tue, 24 Feb 2026 17:43:49 -0300
Subject: [PATCH 118/123] fix(clerk-js): "You must belong to an organization"
screen showing after accepting an invitation (#7921)
---
.changeset/some-drinks-smash.md | 5 +++++
.../SessionTasks/tasks/TaskChooseOrganization/index.tsx | 6 +++++-
2 files changed, 10 insertions(+), 1 deletion(-)
create mode 100644 .changeset/some-drinks-smash.md
diff --git a/.changeset/some-drinks-smash.md b/.changeset/some-drinks-smash.md
new file mode 100644
index 00000000000..32357efdde9
--- /dev/null
+++ b/.changeset/some-drinks-smash.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Fix "You must belong to an organization" screen showing after accepting an organization invitation
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 b150389e4de..0eab2ccdc03 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
@@ -25,7 +25,11 @@ const TaskChooseOrganizationInternal = () => {
userSuggestions?.isLoading ||
organizationCreationDefaults?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
- const isOrganizationCreationDisabled = !isLoading && !user?.createOrganizationEnabled && !hasExistingResources;
+ const isOrganizationCreationDisabled =
+ !isLoading &&
+ !user?.createOrganizationEnabled &&
+ user?.organizationMemberships?.length === 0 &&
+ !hasExistingResources;
if (isOrganizationCreationDisabled) {
return ;
From a20d156b01a4ac589430acd85e6e431409178aba Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Tue, 24 Feb 2026 23:03:27 +0200
Subject: [PATCH 119/123] ci(repo): Version packages (Core 2) (#7922)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
.changeset/some-drinks-smash.md | 5 -----
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 +-
7 files changed, 23 insertions(+), 8 deletions(-)
delete mode 100644 .changeset/some-drinks-smash.md
diff --git a/.changeset/some-drinks-smash.md b/.changeset/some-drinks-smash.md
deleted file mode 100644
index 32357efdde9..00000000000
--- a/.changeset/some-drinks-smash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@clerk/clerk-js': patch
----
-
-Fix "You must belong to an organization" screen showing after accepting an organization invitation
diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md
index dddce1e5b66..624d0ec8f8a 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.9.6
+
+### Patch Changes
+
+- Updated dependencies [[`1db3881`](https://github.com/clerk/javascript/commit/1db38812c91bbe370705cbb7c11291a65f678f6f)]:
+ - @clerk/clerk-js@5.125.1
+
## 2.9.5
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 076c281d169..50624a09715 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.9.5",
+ "version": "2.9.6",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 5a24c05de71..3c1cb7797b6 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 5.125.1
+
+### Patch Changes
+
+- Fix "You must belong to an organization" screen showing after accepting an organization invitation ([#7921](https://github.com/clerk/javascript/pull/7921)) by [@LauraBeatris](https://github.com/LauraBeatris)
+
## 5.125.0
### Minor Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index e33534720f8..b65d73b2bbe 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.125.0",
+ "version": "5.125.1",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md
index ff04da1f0bd..c398510e33a 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.19.27
+
+### Patch Changes
+
+- Updated dependencies [[`1db3881`](https://github.com/clerk/javascript/commit/1db38812c91bbe370705cbb7c11291a65f678f6f)]:
+ - @clerk/clerk-js@5.125.1
+
## 2.19.26
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index d696fbc0f98..1a02688753f 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.26",
+ "version": "2.19.27",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
From 8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0 Mon Sep 17 00:00:00 2001
From: Tom Milewski
Date: Thu, 26 Feb 2026 11:09:39 -0500
Subject: [PATCH 120/123] chore(clerk-js,shared): Don't display impersonation
for agents (Core 2) (#7934)
---
.changeset/short-taxes-move.md | 6 +++
.../clerk-js/src/core/resources/Session.ts | 3 ++
.../core/resources/__tests__/Session.test.ts | 53 +++++++++++++++++++
packages/clerk-js/src/test/fixture-helpers.ts | 3 +-
.../__tests__/ImpersonationFab.test.tsx | 40 ++++++++++++++
.../ui/components/ImpersonationFab/index.tsx | 3 +-
packages/shared/src/types/jwtv2.ts | 13 +++++
packages/shared/src/types/session.ts | 3 +-
8 files changed, 121 insertions(+), 3 deletions(-)
create mode 100644 .changeset/short-taxes-move.md
create mode 100644 packages/clerk-js/src/ui/components/ImpersonationFab/__tests__/ImpersonationFab.test.tsx
diff --git a/.changeset/short-taxes-move.md b/.changeset/short-taxes-move.md
new file mode 100644
index 00000000000..559ef6dbcb5
--- /dev/null
+++ b/.changeset/short-taxes-move.md
@@ -0,0 +1,6 @@
+---
+'@clerk/clerk-js': patch
+'@clerk/shared': patch
+---
+
+Don't display impersonation for agents
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index aeec7d47914..1ba793c710c 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -3,6 +3,7 @@ import { ClerkWebAuthnError, is4xxError, MissingExpiredTokenError } from '@clerk
import { retry } from '@clerk/shared/retry';
import type {
ActClaim,
+ AgentActClaim,
CheckAuthorization,
EmailCodeConfig,
EnterpriseSSOConfig,
@@ -50,6 +51,7 @@ export class Session extends BaseResource implements SessionResource {
lastActiveToken!: TokenResource | null;
lastActiveOrganizationId!: string | null;
actor!: ActClaim | null;
+ agent!: AgentActClaim | null;
user!: UserResource | null;
publicUserData!: PublicUserData;
factorVerificationAge: [number, number] | null = null;
@@ -311,6 +313,7 @@ export class Session extends BaseResource implements SessionResource {
this.lastActiveAt = unixEpochToDate(data.last_active_at || undefined);
this.lastActiveOrganizationId = data.last_active_organization_id;
this.actor = data.actor || null;
+ this.agent = data.actor?.type === 'agent' ? (data.actor as AgentActClaim) : null;
this.createdAt = unixEpochToDate(data.created_at);
this.updatedAt = unixEpochToDate(data.updated_at);
this.user = new User(data.user);
diff --git a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
index eb51257191d..a5bc96fe8a4 100644
--- a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
+++ b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts
@@ -1233,4 +1233,57 @@ describe('Session', () => {
expect(fetchSpy).toHaveBeenCalledTimes(1);
});
});
+
+ describe('agent', () => {
+ it('sets agent to null when actor is null', () => {
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ actor: null,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as SessionJSON);
+
+ expect(session.actor).toBeNull();
+ expect(session.agent).toBeNull();
+ });
+
+ it('sets agent to null when actor has no type (impersonation)', () => {
+ const actor = { sub: 'user_2' };
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ actor,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as SessionJSON);
+
+ expect(session.actor).toEqual(actor);
+ expect(session.agent).toBeNull();
+ });
+
+ it('sets agent to the actor when actor has type "agent"', () => {
+ const actor = { sub: 'user_2', type: 'agent' as const };
+ const session = new Session({
+ status: 'active',
+ id: 'session_1',
+ object: 'session',
+ user: createUser({}),
+ last_active_organization_id: null,
+ actor,
+ created_at: new Date().getTime(),
+ updated_at: new Date().getTime(),
+ } as SessionJSON);
+
+ expect(session.actor).toEqual(actor);
+ expect(session.agent).toEqual(actor);
+ expect(session.agent?.type).toBe('agent');
+ });
+ });
});
diff --git a/packages/clerk-js/src/test/fixture-helpers.ts b/packages/clerk-js/src/test/fixture-helpers.ts
index 133a63e5e40..33852ffa808 100644
--- a/packages/clerk-js/src/test/fixture-helpers.ts
+++ b/packages/clerk-js/src/test/fixture-helpers.ts
@@ -53,6 +53,7 @@ const createUserFixtureHelpers = (baseClient: ClientJSON) => {
saml_accounts?: Array>;
organization_memberships?: Array;
tasks?: SessionJSON['tasks'];
+ actor?: SessionJSON['actor'];
};
const createPublicUserData = (params: WithUserParams) => {
@@ -83,7 +84,7 @@ const createUserFixtureHelpers = (baseClient: ClientJSON) => {
id: baseClient.sessions.length.toString(),
object: 'session',
last_active_organization_id: activeOrganization,
- actor: null,
+ actor: params.actor ?? null,
user: createUser(params),
public_user_data: createPublicUserData(params),
created_at: new Date().getTime(),
diff --git a/packages/clerk-js/src/ui/components/ImpersonationFab/__tests__/ImpersonationFab.test.tsx b/packages/clerk-js/src/ui/components/ImpersonationFab/__tests__/ImpersonationFab.test.tsx
new file mode 100644
index 00000000000..416bc3f5a5e
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/ImpersonationFab/__tests__/ImpersonationFab.test.tsx
@@ -0,0 +1,40 @@
+import { describe, expect, it } from 'vitest';
+
+import { bindCreateFixtures } from '@/test/create-fixtures';
+import { render } from '@/test/utils';
+
+import { ImpersonationFab } from '../';
+
+const { createFixtures } = bindCreateFixtures('UserButton');
+
+describe('ImpersonationFab', () => {
+ it('does not render when user has no actor', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({ email_addresses: ['test@clerk.com'] });
+ });
+ render(, { wrapper });
+ expect(document.getElementById('cl-impersonationEye')).toBeNull();
+ });
+
+ it('renders when user has actor without type (impersonation)', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ actor: { sub: 'user_impersonated' },
+ });
+ });
+ render(, { wrapper });
+ expect(document.getElementById('cl-impersonationEye')).toBeInTheDocument();
+ });
+
+ it('does not render when user has actor with type "agent"', async () => {
+ const { wrapper } = await createFixtures(f => {
+ f.withUser({
+ email_addresses: ['test@clerk.com'],
+ actor: { sub: 'user_agent', type: 'agent' },
+ });
+ });
+ render(, { wrapper });
+ expect(document.getElementById('cl-impersonationEye')).toBeNull();
+ });
+});
diff --git a/packages/clerk-js/src/ui/components/ImpersonationFab/index.tsx b/packages/clerk-js/src/ui/components/ImpersonationFab/index.tsx
index 7596010d4e4..37f41c5fd0d 100644
--- a/packages/clerk-js/src/ui/components/ImpersonationFab/index.tsx
+++ b/packages/clerk-js/src/ui/components/ImpersonationFab/index.tsx
@@ -116,7 +116,8 @@ const ImpersonationFabInternal = () => {
const { parsedInternalTheme } = useAppearance();
const containerRef = useRef(null);
const actor = session?.actor;
- const isImpersonating = !!actor;
+ const agent = session?.agent;
+ const isImpersonating = !!actor && !agent;
//essentials for calcs
const eyeWidth = parsedInternalTheme.sizes.$16;
diff --git a/packages/shared/src/types/jwtv2.ts b/packages/shared/src/types/jwtv2.ts
index 88f6b94c5c6..54feffaa5db 100644
--- a/packages/shared/src/types/jwtv2.ts
+++ b/packages/shared/src/types/jwtv2.ts
@@ -184,15 +184,28 @@ export type VersionedJwtPayload =
export type JwtPayload = JWTPayloadBase & CustomJwtSessionClaims & VersionedJwtPayload;
+/**
+ * The type of the actor claim.
+ */
+export type ActClaimType = 'agent';
+
/**
* JWT Actor - [RFC8693](https://www.rfc-editor.org/rfc/rfc8693.html#name-act-actor-claim).
* @inline
*/
export interface ActClaim {
sub: string;
+ type?: ActClaimType;
[x: string]: unknown;
}
+/**
+ * ActClaim narrowed to actor type `'agent'`. Use for session.agent.
+ *
+ * @inline
+ */
+export type AgentActClaim = ActClaim & { type: 'agent' };
+
/**
* The current state of the session which can only be `active` or `pending`.
*/
diff --git a/packages/shared/src/types/session.ts b/packages/shared/src/types/session.ts
index f35b1454c24..c96d4cd6fff 100644
--- a/packages/shared/src/types/session.ts
+++ b/packages/shared/src/types/session.ts
@@ -11,7 +11,7 @@ import type {
PhoneCodeSecondFactorConfig,
TOTPAttempt,
} from './factors';
-import type { ActClaim } from './jwtv2';
+import type { ActClaim, AgentActClaim } from './jwtv2';
import type {
OrganizationCustomPermissionKey,
OrganizationCustomRoleKey,
@@ -226,6 +226,7 @@ export interface SessionResource extends ClerkResource {
lastActiveOrganizationId: string | null;
lastActiveAt: Date;
actor: ActClaim | null;
+ agent: AgentActClaim | null;
tasks: Array | null;
currentTask?: SessionTask;
/**
From 8a478ead7dd281ca68463e63ea24cfd22172e533 Mon Sep 17 00:00:00 2001
From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com>
Date: Thu, 26 Feb 2026 19:45:44 +0200
Subject: [PATCH 121/123] ci(repo): Version packages (Core 2) (#7938)
---
.changeset/short-taxes-move.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 | 10 ++++++++++
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 +-
45 files changed, 212 insertions(+), 28 deletions(-)
delete mode 100644 .changeset/short-taxes-move.md
diff --git a/.changeset/short-taxes-move.md b/.changeset/short-taxes-move.md
deleted file mode 100644
index 559ef6dbcb5..00000000000
--- a/.changeset/short-taxes-move.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@clerk/clerk-js': patch
-'@clerk/shared': patch
----
-
-Don't display impersonation for agents
diff --git a/packages/agent-toolkit/CHANGELOG.md b/packages/agent-toolkit/CHANGELOG.md
index 8f6c5423dc3..6ee3f5bc059 100644
--- a/packages/agent-toolkit/CHANGELOG.md
+++ b/packages/agent-toolkit/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/agent-toolkit
+## 0.2.27
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+
## 0.2.26
### Patch Changes
diff --git a/packages/agent-toolkit/package.json b/packages/agent-toolkit/package.json
index 612a1df8559..fef9c3c1d04 100644
--- a/packages/agent-toolkit/package.json
+++ b/packages/agent-toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/agent-toolkit",
- "version": "0.2.26",
+ "version": "0.2.27",
"description": "Clerk Toolkit for AI Agents",
"homepage": "https://clerk.com/",
"bugs": {
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index 46adfbc7156..22c485f31b7 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/astro
+## 2.17.7
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+
## 2.17.6
### Patch Changes
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 272efeccb29..2170a7b25b6 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/astro",
- "version": "2.17.6",
+ "version": "2.17.7",
"description": "Clerk SDK for Astro",
"keywords": [
"auth",
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index f9e48e059d6..f12fb99b911 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# Change Log
+## 2.32.2
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/types@4.101.19
+
## 2.32.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 714f04a15e6..f96bf642dc4 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/backend",
- "version": "2.32.1",
+ "version": "2.32.2",
"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 624d0ec8f8a..e131039d049 100644
--- a/packages/chrome-extension/CHANGELOG.md
+++ b/packages/chrome-extension/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.9.7
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/clerk-js@5.125.2
+ - @clerk/shared@3.47.1
+ - @clerk/clerk-react@5.61.2
+
## 2.9.6
### Patch Changes
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 50624a09715..12a8900ad50 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/chrome-extension",
- "version": "2.9.6",
+ "version": "2.9.7",
"description": "Clerk SDK for Chrome extensions",
"keywords": [
"auth",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 3c1cb7797b6..fc4f06303c3 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 5.125.2
+
+### Patch Changes
+
+- Don't display impersonation for agents ([#7934](https://github.com/clerk/javascript/pull/7934)) by [@tmilewski](https://github.com/tmilewski)
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/localizations@3.37.1
+
## 5.125.1
### Patch Changes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index b65d73b2bbe..4e9c586748e 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-js",
- "version": "5.125.1",
+ "version": "5.125.2",
"description": "Clerk JS library",
"keywords": [
"clerk",
diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md
index 5e959475bb1..dd2615abc70 100644
--- a/packages/elements/CHANGELOG.md
+++ b/packages/elements/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/elements
+## 0.24.12
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 0.24.11
### Patch Changes
diff --git a/packages/elements/package.json b/packages/elements/package.json
index 1ec55d94ad7..4df161a93c6 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/elements",
- "version": "0.24.11",
+ "version": "0.24.12",
"description": "Clerk Elements",
"keywords": [
"clerk",
diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md
index 49bff423ad7..143a1718566 100644
--- a/packages/expo-passkeys/CHANGELOG.md
+++ b/packages/expo-passkeys/CHANGELOG.md
@@ -1,5 +1,12 @@
# @clerk/expo-passkeys
+## 0.4.38
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+
## 0.4.37
### Patch Changes
diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json
index 665aaf8fc5d..cdcc7b60d98 100644
--- a/packages/expo-passkeys/package.json
+++ b/packages/expo-passkeys/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/expo-passkeys",
- "version": "0.4.37",
+ "version": "0.4.38",
"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 c398510e33a..8c79720eef7 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.19.28
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/clerk-js@5.125.2
+ - @clerk/shared@3.47.1
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 2.19.27
### Patch Changes
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 1a02688753f..a695f7b1270 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-expo",
- "version": "2.19.27",
+ "version": "2.19.28",
"description": "Clerk React Native/Expo library",
"keywords": [
"react",
diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md
index 9b5a906bc06..edfd92bfaf9 100644
--- a/packages/express/CHANGELOG.md
+++ b/packages/express/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 1.7.75
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+
## 1.7.74
### Patch Changes
diff --git a/packages/express/package.json b/packages/express/package.json
index bb6411a47eb..e4be78fb666 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/express",
- "version": "1.7.74",
+ "version": "1.7.75",
"description": "Clerk server SDK for usage with Express",
"keywords": [
"clerk",
diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md
index de2c39febce..8205e3fb437 100644
--- a/packages/fastify/CHANGELOG.md
+++ b/packages/fastify/CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log
+## 2.6.27
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+
## 2.6.26
### Patch Changes
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index 044d5b04a70..a55014bbf3a 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/fastify",
- "version": "2.6.26",
+ "version": "2.6.27",
"description": "Clerk SDK for Fastify",
"keywords": [
"auth",
diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md
index b87cc43049d..4cc5f0998b9 100644
--- a/packages/localizations/CHANGELOG.md
+++ b/packages/localizations/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 3.37.1
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @clerk/types@4.101.19
+
## 3.37.0
### Minor Changes
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index f768e3c1b38..0e0540c20dd 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/localizations",
- "version": "3.37.0",
+ "version": "3.37.1",
"description": "Localizations for the Clerk components",
"keywords": [
"react",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 3b7205adbbd..5212965b188 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 6.38.3
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 6.38.2
### Patch Changes
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index d781edcff4a..c6c84dbe8ef 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nextjs",
- "version": "6.38.2",
+ "version": "6.38.3",
"description": "Clerk SDK for NextJS",
"keywords": [
"clerk",
diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md
index 0e07982cdbf..093a5c83a14 100644
--- a/packages/nuxt/CHANGELOG.md
+++ b/packages/nuxt/CHANGELOG.md
@@ -1,5 +1,15 @@
# @clerk/nuxt
+## 1.13.25
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+ - @clerk/vue@1.17.17
+
## 1.13.24
### Patch Changes
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 64b730be3a5..fe2a2290755 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/nuxt",
- "version": "1.13.24",
+ "version": "1.13.25",
"description": "Clerk SDK for Nuxt",
"keywords": [
"clerk",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index 6ed572d2570..fcd4bc542c7 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 2.4.9
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 2.4.8
### Patch Changes
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index e82861638b9..ed980292ae3 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/react-router",
- "version": "2.4.8",
+ "version": "2.4.9",
"description": "Clerk SDK for React Router",
"keywords": [
"clerk",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 4b80e99f1e0..34e5fab3d85 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 5.61.2
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+
## 5.61.1
### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 6ea8ee4882d..337b3ad7daf 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/clerk-react",
- "version": "5.61.1",
+ "version": "5.61.2",
"description": "Clerk React library",
"keywords": [
"clerk",
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 53ee0e841d8..1fe81942033 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 4.13.42
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 4.13.41
### Patch Changes
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 198d97d9f69..d9ce1752153 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/remix",
- "version": "4.13.41",
+ "version": "4.13.42",
"description": "Clerk SDK for Remix",
"keywords": [
"clerk",
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 1425312dbff..adb15dca1eb 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -1,5 +1,11 @@
# Change Log
+## 3.47.1
+
+### Patch Changes
+
+- Don't display impersonation for agents ([#7934](https://github.com/clerk/javascript/pull/7934)) by [@tmilewski](https://github.com/tmilewski)
+
## 3.47.0
### Minor Changes
diff --git a/packages/shared/package.json b/packages/shared/package.json
index ff0a735b66f..da9dfd77edd 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/shared",
- "version": "3.47.0",
+ "version": "3.47.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 fea208ac0e5..92e894de2c1 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.7
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/clerk-react@5.61.2
+ - @clerk/types@4.101.19
+
## 0.29.6
### Patch Changes
diff --git a/packages/tanstack-react-start/package.json b/packages/tanstack-react-start/package.json
index 27b28952761..ef4587d0b49 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.6",
+ "version": "0.29.7",
"description": "Clerk SDK for TanStack React Start",
"keywords": [
"clerk",
diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md
index d1d5e277ceb..d138ed27692 100644
--- a/packages/testing/CHANGELOG.md
+++ b/packages/testing/CHANGELOG.md
@@ -1,5 +1,14 @@
# @clerk/testing
+## 1.14.2
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/backend@2.32.2
+ - @clerk/types@4.101.19
+
## 1.14.1
### Patch Changes
diff --git a/packages/testing/package.json b/packages/testing/package.json
index 36ac0b4599d..581911b97f1 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/testing",
- "version": "1.14.1",
+ "version": "1.14.2",
"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 6d5fa413412..b9b01936d17 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 2.4.56
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+
## 2.4.55
### Patch Changes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 954f577c61c..e54ee62f492 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/themes",
- "version": "2.4.55",
+ "version": "2.4.56",
"description": "Themes for the Clerk auth components",
"keywords": [
"react",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index dee34933c1b..e6bf90b1901 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,5 +1,12 @@
# Change Log
+## 4.101.19
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+
## 4.101.18
### Patch Changes
diff --git a/packages/types/package.json b/packages/types/package.json
index 9382cbff8c4..8e89790432b 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/types",
- "version": "4.101.18",
+ "version": "4.101.19",
"description": "Typings for Clerk libraries.",
"keywords": [
"clerk",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index e4890571236..4a8bdbd463a 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -1,5 +1,13 @@
# @clerk/vue
+## 1.17.17
+
+### Patch Changes
+
+- Updated dependencies [[`8a0c404`](https://github.com/clerk/javascript/commit/8a0c404d05a88697fcc3a609fef25bd5ff9f9ef0)]:
+ - @clerk/shared@3.47.1
+ - @clerk/types@4.101.19
+
## 1.17.16
### Patch Changes
diff --git a/packages/vue/package.json b/packages/vue/package.json
index aae19dfe2d9..78d91fdba5f 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@clerk/vue",
- "version": "1.17.16",
+ "version": "1.17.17",
"description": "Clerk SDK for Vue",
"keywords": [
"clerk",
From 51bc9a90554b83f04b33e836931f33b778bfc506 Mon Sep 17 00:00:00 2001
From: Robert Soriano
Date: Thu, 26 Feb 2026 11:18:50 -0800
Subject: [PATCH 122/123] chore(backend): Add M2M token list method (#7939)
---
.changeset/shiny-apples-travel.md | 29 +++
.../src/api/__tests__/M2MTokenApi.test.ts | 205 +++++++++++++++++-
.../backend/src/api/endpoints/M2MTokenApi.ts | 30 +++
.../backend/src/api/resources/Deserializer.ts | 27 +++
4 files changed, 280 insertions(+), 11 deletions(-)
create mode 100644 .changeset/shiny-apples-travel.md
diff --git a/.changeset/shiny-apples-travel.md b/.changeset/shiny-apples-travel.md
new file mode 100644
index 00000000000..8f09eca0e61
--- /dev/null
+++ b/.changeset/shiny-apples-travel.md
@@ -0,0 +1,29 @@
+---
+"@clerk/backend": minor
+---
+
+Add `list()` method to M2M tokens API to retrieve a list of machine-to-machine tokens for a given machine.
+
+```ts
+// Retrieve M2M tokens for a specific machine
+const response = await clerkClient.m2m.list({
+ subject: 'mch_1xxxxxxxxxxxxx',
+});
+
+console.log(response.data); // M2MToken[]
+console.log(response.totalCount); // number
+```
+
+Filter by revoked or expired tokens:
+
+```ts
+const revokedTokens = await clerkClient.m2m.list({
+ subject: 'mch_1xxxxxxxxxxxxx',
+ revoked: true,
+});
+
+const expiredTokens = await clerkClient.m2m.list({
+ subject: 'mch_1xxxxxxxxxxxxx',
+ expired: true,
+});
+```
diff --git a/packages/backend/src/api/__tests__/M2MTokenApi.test.ts b/packages/backend/src/api/__tests__/M2MTokenApi.test.ts
index b3ba1aed1c5..af17622b939 100644
--- a/packages/backend/src/api/__tests__/M2MTokenApi.test.ts
+++ b/packages/backend/src/api/__tests__/M2MTokenApi.test.ts
@@ -5,14 +5,14 @@ import { server, validateHeaders } from '../../mock-server';
import { createBackendApiClient } from '../factory';
describe('M2MToken', () => {
- const m2mId = 'mt_xxxxx';
- const m2mSecret = 'mt_secret_xxxxx';
+ const m2mId = 'mt_1xxxxxxxxxxxxx';
+ const m2mSecret = 'mt_secret_1xxxxxxxxxxxxx';
const mockM2MToken = {
object: 'machine_to_machine_token',
id: m2mId,
- subject: 'mch_xxxxx',
- scopes: ['mch_1xxxxx', 'mch_2xxxxx'],
+ subject: 'mch_1xxxxxxxxxxxxx',
+ scopes: ['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx'],
claims: { foo: 'bar' },
token: m2mSecret,
revoked: false,
@@ -46,7 +46,7 @@ describe('M2MToken', () => {
expect(response.id).toBe(m2mId);
expect(response.token).toBe(m2mSecret);
- expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
+ expect(response.scopes).toEqual(['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx']);
expect(response.claims).toEqual({ foo: 'bar' });
});
@@ -72,7 +72,7 @@ describe('M2MToken', () => {
expect(response.id).toBe(m2mId);
expect(response.token).toBe(m2mSecret);
- expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
+ expect(response.scopes).toEqual(['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx']);
expect(response.claims).toEqual({ foo: 'bar' });
});
@@ -116,8 +116,8 @@ describe('M2MToken', () => {
const mockRevokedM2MToken = {
object: 'machine_to_machine_token',
id: m2mId,
- subject: 'mch_xxxxx',
- scopes: ['mch_1xxxxx', 'mch_2xxxxx'],
+ subject: 'mch_1xxxxxxxxxxxxx',
+ scopes: ['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx'],
claims: { foo: 'bar' },
revoked: true,
revocation_reason: 'revoked by test',
@@ -151,7 +151,7 @@ describe('M2MToken', () => {
expect(response.revoked).toBe(true);
expect(response.token).toBeUndefined();
expect(response.revocationReason).toBe('revoked by test');
- expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
+ expect(response.scopes).toEqual(['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx']);
expect(response.claims).toEqual({ foo: 'bar' });
});
@@ -229,7 +229,7 @@ describe('M2MToken', () => {
expect(response.id).toBe(m2mId);
expect(response.token).toBe(m2mSecret);
- expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
+ expect(response.scopes).toEqual(['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx']);
expect(response.claims).toEqual({ foo: 'bar' });
});
@@ -255,7 +255,7 @@ describe('M2MToken', () => {
expect(response.id).toBe(m2mId);
expect(response.token).toBe(m2mSecret);
- expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
+ expect(response.scopes).toEqual(['mch_1xxxxxxxxxxxxx', 'mch_2xxxxxxxxxxxxx']);
expect(response.claims).toEqual({ foo: 'bar' });
});
@@ -282,4 +282,187 @@ describe('M2MToken', () => {
expect(errResponse.status).toBe(401);
});
});
+
+ describe('list', () => {
+ const machineId = 'mch_1xxxxxxxxxxxxx';
+ const mockM2MTokenList = {
+ m2m_tokens: [
+ {
+ ...mockM2MToken,
+ id: 'mt_1xxxxxxxxxxxxx',
+ },
+ {
+ ...mockM2MToken,
+ id: 'mt_2xxxxxxxxxxxxx',
+ revoked: true,
+ },
+ ],
+ total_count: 2,
+ };
+
+ it('lists m2m tokens with machine secret key', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ machineSecretKey: 'ak_xxxxx',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(({ request }) => {
+ expect(request.headers.get('Authorization')).toBe('Bearer ak_xxxxx');
+ const url = new URL(request.url);
+ expect(url.searchParams.get('subject')).toBe(machineId);
+ expect(url.searchParams.get('limit')).toBe('10');
+ return HttpResponse.json(mockM2MTokenList);
+ }),
+ ),
+ );
+
+ const response = await apiClient.m2m.list({
+ subject: machineId,
+ limit: 10,
+ });
+
+ expect(response.data).toHaveLength(2);
+ expect(response.data[0].id).toBe('mt_1xxxxxxxxxxxxx');
+ expect(response.data[1].id).toBe('mt_2xxxxxxxxxxxxx');
+ expect(response.totalCount).toBe(2);
+ });
+
+ it('lists m2m tokens with instance secret key', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ secretKey: 'sk_xxxxx',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(({ request }) => {
+ expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx');
+ return HttpResponse.json(mockM2MTokenList);
+ }),
+ ),
+ );
+
+ const response = await apiClient.m2m.list({
+ subject: machineId,
+ });
+
+ expect(response.data).toHaveLength(2);
+ expect(response.totalCount).toBe(2);
+ });
+
+ it('lists m2m tokens with revoked filter', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ secretKey: 'sk_xxxxx',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(({ request }) => {
+ const url = new URL(request.url);
+ expect(url.searchParams.get('revoked')).toBe('true');
+ return HttpResponse.json(mockM2MTokenList);
+ }),
+ ),
+ );
+
+ const response = await apiClient.m2m.list({
+ subject: machineId,
+ revoked: true,
+ });
+
+ expect(response.data).toHaveLength(2);
+ });
+
+ it('lists m2m tokens with expired filter', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ secretKey: 'sk_xxxxx',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(({ request }) => {
+ const url = new URL(request.url);
+ expect(url.searchParams.get('expired')).toBe('true');
+ return HttpResponse.json(mockM2MTokenList);
+ }),
+ ),
+ );
+
+ const response = await apiClient.m2m.list({
+ subject: machineId,
+ expired: true,
+ });
+
+ expect(response.data).toHaveLength(2);
+ });
+
+ it('lists m2m tokens with pagination', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ secretKey: 'sk_xxxxx',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(({ request }) => {
+ const url = new URL(request.url);
+ expect(url.searchParams.get('limit')).toBe('5');
+ expect(url.searchParams.get('offset')).toBe('10');
+ return HttpResponse.json(mockM2MTokenList);
+ }),
+ ),
+ );
+
+ const response = await apiClient.m2m.list({
+ subject: machineId,
+ limit: 5,
+ offset: 10,
+ });
+
+ expect(response.data).toHaveLength(2);
+ expect(response.totalCount).toBe(2);
+ });
+
+ it('requires a machine secret or instance secret to list m2m tokens', async () => {
+ const apiClient = createBackendApiClient({
+ apiUrl: 'https://api.clerk.test',
+ });
+
+ server.use(
+ http.get(
+ 'https://api.clerk.test/m2m_tokens',
+ validateHeaders(() => {
+ return HttpResponse.json(
+ {
+ errors: [
+ {
+ message: 'Unauthorized',
+ code: 'unauthorized',
+ },
+ ],
+ },
+ { status: 401 },
+ );
+ }),
+ ),
+ );
+
+ const errResponse = await apiClient.m2m
+ .list({
+ subject: machineId,
+ })
+ .catch(err => err);
+
+ expect(errResponse.status).toBe(401);
+ });
+ });
});
diff --git a/packages/backend/src/api/endpoints/M2MTokenApi.ts b/packages/backend/src/api/endpoints/M2MTokenApi.ts
index 1ba15555b53..1dc3dd8ec53 100644
--- a/packages/backend/src/api/endpoints/M2MTokenApi.ts
+++ b/packages/backend/src/api/endpoints/M2MTokenApi.ts
@@ -1,11 +1,33 @@
+import type { ClerkPaginationRequest } from '@clerk/shared/types';
+
import { joinPaths } from '../../util/path';
import { deprecated } from '../../util/shared';
import type { ClerkBackendApiRequestOptions } from '../request';
+import type { PaginatedResourceResponse } from '../resources/Deserializer';
import type { M2MToken } from '../resources/M2MToken';
import { AbstractAPI } from './AbstractApi';
const basePath = '/m2m_tokens';
+type GetM2MTokenListParams = ClerkPaginationRequest<{
+ /**
+ * The machine ID to query machine-to-machine tokens by
+ */
+ subject: string;
+ /**
+ * Whether to include revoked machine-to-machine tokens.
+ *
+ * @default false
+ */
+ revoked?: boolean;
+ /**
+ * Whether to include expired machine-to-machine tokens.
+ *
+ * @default false
+ */
+ expired?: boolean;
+}>;
+
type CreateM2MTokenParams = {
/**
* Custom machine secret key for authentication.
@@ -58,6 +80,14 @@ export class M2MTokenApi extends AbstractAPI {
return options;
}
+ async list(queryParams: GetM2MTokenListParams) {
+ return this.request>({
+ method: 'GET',
+ path: basePath,
+ queryParams,
+ });
+ }
+
async createToken(params?: CreateM2MTokenParams) {
const { claims = null, machineSecretKey, secondsUntilExpiration = null } = params || {};
diff --git a/packages/backend/src/api/resources/Deserializer.ts b/packages/backend/src/api/resources/Deserializer.ts
index 626d5e20019..4488ff0667a 100644
--- a/packages/backend/src/api/resources/Deserializer.ts
+++ b/packages/backend/src/api/resources/Deserializer.ts
@@ -77,6 +77,12 @@ export function deserialize(payload: unknown): PaginatedResourceRespons
if (Array.isArray(payload)) {
const data = payload.map(item => jsonToObject(item)) as U;
return { data };
+ } else if (isM2MTokenResponse(payload)) {
+ // Handle M2M token list responses with m2m_tokens property
+ data = payload.m2m_tokens.map(item => jsonToObject(item)) as U;
+ totalCount = payload.total_count;
+
+ return { data, totalCount };
} else if (isPaginated(payload)) {
data = payload.data.map(item => jsonToObject(item)) as U;
totalCount = payload.total_count;
@@ -95,6 +101,27 @@ function isPaginated(payload: unknown): payload is PaginatedResponseJSON {
return Array.isArray(payload.data) && payload.data !== undefined;
}
+/**
+ * Detects M2M token list responses from the Backend API.
+ *
+ * The Clerk Backend API returns M2M token lists with `m2m_tokens` and `total_count` properties.
+ * This function identifies those responses and normalizes them to the standard `data` and
+ * `totalCount` format for consistency with other paginated API methods across the SDK.
+ *
+ * This approach avoids making breaking changes to BAPI Proxy or supporting both response
+ * formats. Once BAPI Proxy is updated to return the standard `data` property format,
+ * this function can be safely removed.
+ *
+ * @see https://clerk.com/docs/reference/backend-api/tag/m2m-tokens/get/m2m_tokens
+ */
+function isM2MTokenResponse(payload: unknown): payload is { m2m_tokens: unknown[]; total_count: number } {
+ if (!payload || typeof payload !== 'object' || !('m2m_tokens' in payload)) {
+ return false;
+ }
+
+ return Array.isArray(payload.m2m_tokens);
+}
+
function getCount(item: PaginatedResponseJSON) {
return item.total_count;
}
From ff308afda6beee0a5ee8a11ba3e2ede80c652122 Mon Sep 17 00:00:00 2001
From: Jacek
Date: Thu, 26 Feb 2026 13:36:59 -0600
Subject: [PATCH 123/123] feat(clerk-js): Add debugLogger statements for
session token swap detection
Add debug logging to detect server-side token swaps in multi-session scenarios:
- Session.ts: Check if returned token's sid matches requested session (token swap detection)
- AuthCookieService.ts: Log multi-session cookie updates to track active session
- AuthCookieService.ts: Log token fetch errors (4xx and degraded status)
- clerk.ts: Log session state before unauthenticated flow to see active sessions
---
.../src/core/auth/AuthCookieService.ts | 23 +++++++++++++++----
packages/clerk-js/src/core/clerk.ts | 10 ++++++++
.../clerk-js/src/core/resources/Session.ts | 9 ++++++++
3 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/packages/clerk-js/src/core/auth/AuthCookieService.ts b/packages/clerk-js/src/core/auth/AuthCookieService.ts
index 51268dc6bcd..c4ce32b530a 100644
--- a/packages/clerk-js/src/core/auth/AuthCookieService.ts
+++ b/packages/clerk-js/src/core/auth/AuthCookieService.ts
@@ -177,6 +177,15 @@ export class AuthCookieService {
return;
}
+ const sessions = (this.clerk.client as any)?.sessions;
+ if (sessions?.length > 1 && token) {
+ debugLogger.info(
+ 'Updating session cookie (multi-session client)',
+ { activeSessionId: this.clerk.session?.id, sessionCount: sessions.length, hasActor: !!this.clerk.session?.actor },
+ 'authCookieService',
+ );
+ }
+
if (!token && !isValidBrowserOnline()) {
debugLogger.warn('Removing session cookie (offline)', { sessionId: this.clerk.session?.id }, 'authCookieService');
}
@@ -205,6 +214,11 @@ export class AuthCookieService {
//sign user out if a 4XX error
if (is4xxError(e)) {
+ debugLogger.warn(
+ 'Token fetch failed with 4xx, triggering unauthenticated flow',
+ { errorCode: isClerkAPIResponseError(e) ? e.errors[0]?.code : undefined, sessionId: this.clerk.session?.id },
+ 'authCookieService',
+ );
void this.clerk.handleUnauthenticated().catch(noop);
return;
}
@@ -212,10 +226,11 @@ export class AuthCookieService {
// The poller failed to fetch a fresh session token, update status to `degraded`.
this.clerkEventBus.emit(clerkEvents.Status, 'degraded');
- // --------
- // Treat any other error as a noop
- // TODO(debug-logs): Once debug logs is available log this error.
- // --------
+ debugLogger.warn(
+ 'Token fetch failed, status degraded',
+ { error: e?.message || String(e), sessionId: this.clerk.session?.id },
+ 'authCookieService',
+ );
}
private handleSignOut() {
diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts
index b4bb6b183ff..becdded12fc 100644
--- a/packages/clerk-js/src/core/clerk.ts
+++ b/packages/clerk-js/src/core/clerk.ts
@@ -2347,6 +2347,16 @@ export class Clerk implements ClerkInterface {
if (!this.client || !this.session) {
return;
}
+ debugLogger.warn(
+ 'handleUnauthenticated triggered',
+ {
+ activeSessionId: this.session.id,
+ hasActor: !!this.session.actor,
+ totalSessions: this.client.sessions.length,
+ signedInSessions: this.client.signedInSessions.map(s => ({ id: s.id, hasActor: !!s.actor })),
+ },
+ 'clerk',
+ );
try {
const newClient = await Client.getOrCreateInstance().fetch();
this.updateClient(newClient);
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index 1ba793c710c..a88fd12dc74 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -413,6 +413,15 @@ export class Session extends BaseResource implements SessionResource {
SessionTokenCache.set({ tokenId, tokenResolver });
return tokenResolver.then(token => {
+ const returnedSid = token.jwt?.claims?.sid;
+ if (returnedSid && returnedSid !== this.id) {
+ debugLogger.warn(
+ 'Token session mismatch: requested token for one session but received token for another',
+ { requestedSessionId: this.id, returnedSessionId: returnedSid, tokenId, hasActor: !!this.actor },
+ 'session',
+ );
+ }
+
if (shouldDispatchTokenUpdate) {
eventBus.emit(events.TokenUpdate, { token });