diff --git a/.changeset/few-files-switch.md b/.changeset/few-files-switch.md
new file mode 100644
index 00000000000..ec380ec43f2
--- /dev/null
+++ b/.changeset/few-files-switch.md
@@ -0,0 +1,3 @@
+---
+---
+
diff --git a/.changeset/fifty-cameras-tease.md b/.changeset/fifty-cameras-tease.md
new file mode 100644
index 00000000000..b0c77f8f96f
--- /dev/null
+++ b/.changeset/fifty-cameras-tease.md
@@ -0,0 +1,6 @@
+---
+'@clerk/expo-passkeys': patch
+'@clerk/clerk-expo': patch
+---
+- Replaced import { Buffer } from 'node:buffer' with import { Buffer } from 'buffer'.
+- Moved @clerk/expo-passkeys to a devDependency in @clerk/clerk-expo.
diff --git a/.changeset/friendly-mice-pull.md b/.changeset/friendly-mice-pull.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/friendly-mice-pull.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/large-bulldogs-tap.md b/.changeset/large-bulldogs-tap.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/large-bulldogs-tap.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/orange-radios-nail.md b/.changeset/orange-radios-nail.md
new file mode 100644
index 00000000000..a49ba48448f
--- /dev/null
+++ b/.changeset/orange-radios-nail.md
@@ -0,0 +1,2 @@
+---
+---
\ No newline at end of file
diff --git a/.changeset/red-chicken-visit.md b/.changeset/red-chicken-visit.md
new file mode 100644
index 00000000000..4e87d960f19
--- /dev/null
+++ b/.changeset/red-chicken-visit.md
@@ -0,0 +1,6 @@
+---
+"@clerk/clerk-js": patch
+"@clerk/types": patch
+---
+
+Inject captcha token into every X heartbeats
diff --git a/.changeset/rude-lions-know.md b/.changeset/rude-lions-know.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/rude-lions-know.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/shaggy-donuts-cry.md b/.changeset/shaggy-donuts-cry.md
new file mode 100644
index 00000000000..555d224ee0d
--- /dev/null
+++ b/.changeset/shaggy-donuts-cry.md
@@ -0,0 +1,5 @@
+---
+'@clerk/dev-cli': patch
+---
+
+Fix framework detection for Next.js. `clerk-dev` will now check for `next` as a dependency.
diff --git a/.changeset/shy-months-invite.md b/.changeset/shy-months-invite.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/shy-months-invite.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/silent-bears-worry.md b/.changeset/silent-bears-worry.md
new file mode 100644
index 00000000000..9af54068800
--- /dev/null
+++ b/.changeset/silent-bears-worry.md
@@ -0,0 +1,5 @@
+---
+'@clerk/shared': minor
+---
+
+Change `useReverification` to handle error in a callback, but still allow an error to be thrown via options.
diff --git a/.changeset/ten-hornets-deny.md b/.changeset/ten-hornets-deny.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/ten-hornets-deny.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/thin-turkeys-turn.md b/.changeset/thin-turkeys-turn.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/thin-turkeys-turn.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/unlucky-teachers-joke.md b/.changeset/unlucky-teachers-joke.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/unlucky-teachers-joke.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.changeset/wet-dryers-pay.md b/.changeset/wet-dryers-pay.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/wet-dryers-pay.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e311c99c1b7..dd17f3011e8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -143,7 +143,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- test-name: [ 'generic', 'express', 'quickstart', 'ap-flows', 'elements', 'sessions', 'astro', 'expo-web', 'tanstack-start', 'tanstack-router', 'vue']
+ test-name: [ 'generic', 'express', 'quickstart', 'ap-flows', 'elements', 'sessions', 'astro', 'expo-web', 'tanstack-start', 'tanstack-router', 'vue', 'nuxt']
test-project: ['chrome']
include:
- test-name: 'nextjs'
diff --git a/.npmrc b/.npmrc
index 02a6c3e54ce..e3d3527dfe5 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,3 +1,2 @@
engine-strict=false
-legacy-peer-deps=false
-link-workspace-packages=true
\ No newline at end of file
+legacy-peer-deps=false
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index daaa5ee2ec3..7efca3f1130 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,6 +1,5 @@
{
"recommendations": [
- "arcanis.vscode-zipfs",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
]
diff --git a/.vscode/settings.json b/.vscode/settings.json
index c39422fe0e1..0433f8458ab 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,7 +5,8 @@
"**/.yalc": true,
"**/node_modules": true,
".temp_integration": true,
- "packages/*/dist": true
+ "packages/*/dist": true,
+ "pnpm-lock.yaml": true,
},
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.tsdk": "node_modules/typescript/lib",
@@ -23,4 +24,5 @@
"url": "https://json.schemastore.org/chrome-manifest.json"
}
],
+ "npm.packageManager": "pnpm",
}
diff --git a/integration/presets/longRunningApps.ts b/integration/presets/longRunningApps.ts
index f789bdf0e18..3c310184f4e 100644
--- a/integration/presets/longRunningApps.ts
+++ b/integration/presets/longRunningApps.ts
@@ -6,6 +6,7 @@ import { envs } from './envs';
import { expo } from './expo';
import { express } from './express';
import { next } from './next';
+import { nuxt } from './nuxt';
import { react } from './react';
import { remix } from './remix';
import { tanstack } from './tanstack';
@@ -39,6 +40,7 @@ export const createLongRunningApps = () => {
{ id: 'tanstack.start', config: tanstack.start, env: envs.withEmailCodes },
{ id: 'tanstack.router', config: tanstack.router, env: envs.withEmailCodes },
{ id: 'vue.vite', config: vue.vite, env: envs.withCustomRoles },
+ { id: 'nuxt.node', config: nuxt.node, env: envs.withCustomRoles },
] as const;
const apps = configs.map(longRunningApplication);
diff --git a/integration/presets/nuxt.ts b/integration/presets/nuxt.ts
new file mode 100644
index 00000000000..8a552704545
--- /dev/null
+++ b/integration/presets/nuxt.ts
@@ -0,0 +1,17 @@
+import { applicationConfig } from '../models/applicationConfig';
+import { templates } from '../templates';
+
+const nuxtNode = applicationConfig()
+ .setName('nuxt-node')
+ .useTemplate(templates['nuxt-node'])
+ .setEnvFormatter('public', key => `NUXT_PUBLIC_${key}`)
+ .setEnvFormatter('private', key => `NUXT_${key}`)
+ .addScript('setup', 'pnpm install')
+ .addScript('dev', 'pnpm dev')
+ .addScript('build', 'pnpm build')
+ .addScript('serve', 'pnpm preview')
+ .addDependency('@clerk/nuxt', '*');
+
+export const nuxt = {
+ node: nuxtNode,
+} as const;
diff --git a/integration/templates/index.ts b/integration/templates/index.ts
index 9d9b1c84efa..41286f1a002 100644
--- a/integration/templates/index.ts
+++ b/integration/templates/index.ts
@@ -17,6 +17,7 @@ export const templates = {
'tanstack-start': resolve(__dirname, './tanstack-start'),
'tanstack-router': resolve(__dirname, './tanstack-router'),
'vue-vite': resolve(__dirname, './vue-vite'),
+ 'nuxt-node': resolve(__dirname, './nuxt-node'),
} as const;
if (new Set([...Object.values(templates)]).size !== Object.values(templates).length) {
diff --git a/integration/templates/nuxt-node/app.vue b/integration/templates/nuxt-node/app.vue
new file mode 100644
index 00000000000..8f62b8bf921
--- /dev/null
+++ b/integration/templates/nuxt-node/app.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/integration/templates/nuxt-node/middleware/auth.global.js b/integration/templates/nuxt-node/middleware/auth.global.js
new file mode 100644
index 00000000000..261cb30a3f7
--- /dev/null
+++ b/integration/templates/nuxt-node/middleware/auth.global.js
@@ -0,0 +1,16 @@
+export default defineNuxtRouteMiddleware((to, from) => {
+ const { userId } = useAuth();
+
+ const isPublicPage = ['/sign-in'].includes(to.path);
+ const isProtectedPage = ['/user'].includes(to.path);
+
+ // Is authenticated and trying to access a public page
+ if (userId.value && isPublicPage) {
+ return navigateTo('/user');
+ }
+
+ // Is not authenticated and trying to access a protected page
+ if (!userId.value && isProtectedPage) {
+ return navigateTo('/sign-in');
+ }
+});
diff --git a/integration/templates/nuxt-node/nuxt.config.js b/integration/templates/nuxt-node/nuxt.config.js
new file mode 100644
index 00000000000..e35608d38cb
--- /dev/null
+++ b/integration/templates/nuxt-node/nuxt.config.js
@@ -0,0 +1,3 @@
+export default defineNuxtConfig({
+ modules: ['@clerk/nuxt'],
+});
diff --git a/integration/templates/nuxt-node/package.json b/integration/templates/nuxt-node/package.json
new file mode 100644
index 00000000000..7414598924e
--- /dev/null
+++ b/integration/templates/nuxt-node/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "nuxt-clerk-integration-template",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "nuxt build",
+ "dev": "nuxt dev --port $PORT",
+ "generate": "nuxt generate",
+ "postinstall": "nuxt prepare",
+ "preview": "nuxt preview --port $PORT"
+ },
+ "dependencies": {
+ "nuxt": "^3.14.159",
+ "vue": "^3.5.12",
+ "vue-router": "^4.4.5"
+ }
+}
diff --git a/integration/templates/nuxt-node/pages/index.vue b/integration/templates/nuxt-node/pages/index.vue
new file mode 100644
index 00000000000..cf760d23939
--- /dev/null
+++ b/integration/templates/nuxt-node/pages/index.vue
@@ -0,0 +1,21 @@
+
+
+
Index Route
+
+ You are signed in!
+
+
View your profile here
+
+
+
+
+
+
+
+
+ You are signed out
+
+
+
+
+
diff --git a/integration/templates/nuxt-node/pages/only-admin.vue b/integration/templates/nuxt-node/pages/only-admin.vue
new file mode 100644
index 00000000000..aa19342a3f5
--- /dev/null
+++ b/integration/templates/nuxt-node/pages/only-admin.vue
@@ -0,0 +1,8 @@
+
+
+ I am an admin
+
+ Not an admin
+
+
+
diff --git a/integration/templates/nuxt-node/pages/sign-in.vue b/integration/templates/nuxt-node/pages/sign-in.vue
new file mode 100644
index 00000000000..b9258533122
--- /dev/null
+++ b/integration/templates/nuxt-node/pages/sign-in.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/integration/templates/nuxt-node/pages/user.vue b/integration/templates/nuxt-node/pages/user.vue
new file mode 100644
index 00000000000..bc5be9d7d67
--- /dev/null
+++ b/integration/templates/nuxt-node/pages/user.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+ - First name: {{ user.firstName }}
+ - Email: {{ user.emailAddresses[0].emailAddress }}
+
+
diff --git a/integration/templates/nuxt-node/server/api/me.js b/integration/templates/nuxt-node/server/api/me.js
new file mode 100644
index 00000000000..3534231821a
--- /dev/null
+++ b/integration/templates/nuxt-node/server/api/me.js
@@ -0,0 +1,16 @@
+import { clerkClient } from '@clerk/nuxt/server';
+
+export default eventHandler(async event => {
+ const { userId } = event.context.auth;
+
+ if (!userId) {
+ throw createError({
+ statusCode: 401,
+ statusMessage: 'Unauthorized',
+ });
+ }
+
+ const user = await clerkClient(event).users.getUser(userId);
+
+ return user;
+});
diff --git a/integration/tests/nuxt/basic.test.ts b/integration/tests/nuxt/basic.test.ts
new file mode 100644
index 00000000000..12bf61f114d
--- /dev/null
+++ b/integration/tests/nuxt/basic.test.ts
@@ -0,0 +1,101 @@
+import { expect, test } from '@playwright/test';
+
+import { appConfigs } from '../../presets';
+import type { FakeOrganization, FakeUser } from '../../testUtils';
+import { createTestUtils, testAgainstRunningApps } from '../../testUtils';
+
+testAgainstRunningApps({ withEnv: [appConfigs.envs.withCustomRoles] })('basic tests for @nuxt', ({ app }) => {
+ test.describe.configure({ mode: 'parallel' });
+
+ let fakeUser: FakeUser;
+ let fakeOrganization: FakeOrganization;
+
+ test.beforeAll(async () => {
+ const u = createTestUtils({ app });
+ fakeUser = u.services.users.createFakeUser();
+ const user = await u.services.users.createBapiUser(fakeUser);
+ fakeOrganization = await u.services.users.createFakeOrganization(user.id);
+ });
+
+ test.afterAll(async () => {
+ await fakeOrganization.delete();
+ await fakeUser.deleteIfExists();
+
+ await app.teardown();
+ });
+
+ test.afterEach(async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ await u.page.signOut();
+ await u.page.context().clearCookies();
+ });
+
+ test('sign in with hash routing', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToRelative('/sign-in');
+ await u.po.signIn.waitForMounted();
+
+ await u.po.signIn.setIdentifier(fakeUser.email);
+ await u.po.signIn.continue();
+ await u.page.waitForURL(`${app.serverUrl}/sign-in#/factor-one`);
+
+ await u.po.signIn.setPassword(fakeUser.password);
+ await u.po.signIn.continue();
+ await u.po.expect.toBeSignedIn();
+ });
+
+ test('render user profile with SSR data', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToRelative('/sign-in');
+ await u.po.signIn.waitForMounted();
+ await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password });
+ await u.po.expect.toBeSignedIn();
+
+ await u.po.userButton.waitForMounted();
+ await u.page.goToRelative('/user');
+ await u.po.userProfile.waitForMounted();
+
+ // Fetched from an API endpoint (/api/me), which is server-rendered.
+ // This also verifies that the server middleware is working.
+ await expect(u.page.getByText(`First name: ${fakeUser.firstName}`)).toBeVisible();
+ await expect(u.page.getByText(`Email: ${fakeUser.email}`)).toBeVisible();
+ });
+
+ test('redirects to sign-in when unauthenticated', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToRelative('/user');
+ await u.page.waitForURL(`${app.serverUrl}/sign-in`);
+ await u.po.signIn.waitForMounted();
+ });
+
+ test('renders control components contents in SSR', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToAppHome();
+ await expect(u.page.getByText('You are signed out')).toBeVisible();
+
+ await u.page.goToRelative('/sign-in');
+ await u.po.signIn.waitForMounted();
+ await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password });
+ await u.po.expect.toBeSignedIn();
+ await expect(u.page.getByText('You are signed in!')).toBeVisible();
+ });
+
+ test('renders component contents to admin', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+
+ await u.page.goToRelative('/sign-in');
+ await u.po.signIn.waitForMounted();
+ await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password });
+ await u.po.expect.toBeSignedIn();
+
+ await u.page.waitForAppUrl('/');
+ await u.po.organizationSwitcher.waitForMounted();
+ await u.po.organizationSwitcher.waitForAnOrganizationToSelected();
+ await u.page.goToRelative('/only-admin');
+ await expect(u.page.getByText('I am an admin')).toBeVisible();
+ });
+});
diff --git a/integration/tests/reverification.test.ts b/integration/tests/reverification.test.ts
index 31f94533b17..62054de82ca 100644
--- a/integration/tests/reverification.test.ts
+++ b/integration/tests/reverification.test.ts
@@ -41,7 +41,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withReverification] })(
});
utils.forEach(type => {
- test.skip(`reverification error from ${capitalize(type)}`, async ({ page, context }) => {
+ test(`reverification error from ${capitalize(type)}`, async ({ page, context }) => {
test.setTimeout(270_000);
const u = createTestUtils({ app, page, context });
@@ -67,12 +67,12 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withReverification] })(
await u.page.getByRole('button', { name: /LogUserId/i }).click();
await expect(
u.page.getByText(
- /\{\s*"clerk_error"\s*:\s*\{\s*"type"\s*:\s*"forbidden"\s*,\s*"reason"\s*:\s*"reverification-mismatch"\s*,\s*"metadata"\s*:\s*\{\s*"reverification"\s*:\s*\{\s*"level"\s*:\s*"secondFactor"\s*,\s*"afterMinutes"\s*:\s*1\s*\}\s*\}\s*\}\s*\}/i,
+ /\{\s*"clerk_error"\s*:\s*\{\s*"type"\s*:\s*"forbidden"\s*,\s*"reason"\s*:\s*"reverification-error"\s*,\s*"metadata"\s*:\s*\{\s*"reverification"\s*:\s*\{\s*"level"\s*:\s*"second_factor"\s*,\s*"afterMinutes"\s*:\s*1\s*\}\s*\}\s*\}\s*\}/i,
),
).toBeVisible();
});
- test.skip(`reverification recovery from ${capitalize(type)}`, async ({ page, context }) => {
+ test(`reverification recovery from ${capitalize(type)}`, async ({ page, context }) => {
test.setTimeout(270_000);
const u = createTestUtils({ app, page, context });
diff --git a/package.json b/package.json
index 6778850c631..e503f50bb58 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
"test:integration:express": "E2E_APP_ID=express.* pnpm test:integration:base --grep @express",
"test:integration:generic": "E2E_APP_ID=react.vite.*,next.appRouter.withEmailCodes* pnpm test:integration:base --grep @generic",
"test:integration:nextjs": "E2E_APP_ID=next.appRouter.* pnpm test:integration:base --grep @nextjs",
+ "test:integration:nuxt": "E2E_APP_ID=nuxt.node npm run test:integration:base -- --grep @nuxt",
"test:integration:quickstart": "E2E_APP_ID=quickstart.* pnpm test:integration:base --grep @quickstart",
"test:integration:remix": "echo 'placeholder'",
"test:integration:sessions": "pnpm test:integration:base --grep @sessions",
@@ -68,8 +69,8 @@
"@types/cross-spawn": "^6.0.3",
"@types/jest": "^29.3.1",
"@types/node": "^20.11.24",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"@vitest/coverage-v8": "2.1.4",
"citty": "^0.1.4",
"conventional-changelog-conventionalcommits": "^4.6.3",
@@ -93,16 +94,16 @@
"prettier-plugin-packagejson": "^2.5.3",
"prettier-plugin-tailwindcss": "^0.6.3",
"publint": "^0.2.4",
- "react": "18.3.1",
- "react-dom": "18.3.1",
+ "react": "catalog:react",
+ "react-dom": "catalog:react",
"rimraf": "6.0.1",
"statuses": "^1.4.0",
"tree-kill": "^1.2.2",
"ts-jest": "^29.0.3",
- "tsup": "^8.0.1",
+ "tsup": "catalog:repo",
"turbo": "^2.0.14",
"turbo-ignore": "^2.0.6",
- "typescript": "^5.6.3",
+ "typescript": "catalog:repo",
"verdaccio": "^5.26.3",
"vitest": "2.1.4",
"zx": "^7.2.3"
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 1bbe6483af0..eebbf490a28 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -89,8 +89,8 @@
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
- "react": "18.3.1",
- "typescript": "*"
+ "react": "catalog:react",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"astro": "^3.2.0 || ^4.0.0"
diff --git a/packages/astro/turbo.json b/packages/astro/turbo.json
new file mode 100644
index 00000000000..8fc08521e9d
--- /dev/null
+++ b/packages/astro/turbo.json
@@ -0,0 +1,10 @@
+{
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "dependsOn": ["^build"],
+ "outputLogs": "new-only",
+ "outputs": ["components/**", "dist/**"]
+ }
+ }
+}
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 8c5f3b081cc..3a704a9cc9b 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -96,7 +96,7 @@
"@clerk/types": "workspace:*",
"cookie": "0.7.0",
"snakecase-keys": "5.4.4",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
@@ -105,8 +105,8 @@
"@types/node": "^18.19.33",
"msw": "2.6.4",
"npm-run-all": "^4.1.5",
- "tsup": "*",
- "typescript": "*",
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo",
"vitest-environment-miniflare": "2.14.4"
},
"engines": {
diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json
index 75706b16e28..d668972f101 100644
--- a/packages/chrome-extension/package.json
+++ b/packages/chrome-extension/package.json
@@ -56,12 +56,12 @@
"@clerk/eslint-config-custom": "workspace:*",
"@types/chrome": "*",
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"@types/webextension-polyfill": "^0.10.7",
- "tsup": "*",
+ "tsup": "catalog:repo",
"type-fest": "^4.8.3",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"react": ">=18",
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 6bd50a94011..aa9ab025b59 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -34,12 +34,13 @@
"build:analyze": "rspack build --config rspack.config.js --env production --env variant=\"clerk.browser\" --env analysis --analyze",
"build:bundle": "pnpm clean && rspack build --config rspack.config.js --env production",
"build:declarations": "tsc -p tsconfig.declarations.json",
+ "build:sandbox": "rspack build --config rspack.config.js --env production --env sandbox",
"build:stats": "rspack build --config rspack.config.js --env production --json=stats.json --env variant=\"clerk.browser\"",
"bundlewatch": "pnpm dlx bundlewatch --config bundlewatch.config.json",
"clean": "rimraf ./dist",
"dev": "rspack serve --config rspack.config.js",
"dev:headless": "rspack serve --config rspack.config.js --env variant=\"clerk.headless.browser\"",
- "dev:sandbox": "rspack serve --config rspack.config.js --env devOrigin=http://localhost:4000",
+ "dev:sandbox": "rspack serve --config rspack.config.js --env devOrigin=http://localhost:4000 --env sandbox=1",
"lint": "eslint src/",
"lint:attw": "attw --pack .",
"lint:publint": "publint || true",
@@ -79,15 +80,15 @@
"@rspack/core": "^1.0.14",
"@rspack/plugin-react-refresh": "^1.0.0",
"@svgr/webpack": "^6.2.1",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"@types/webpack-dev-server": "^4.7.2",
"@types/webpack-env": "^1.16.4",
"react-refresh": "^0.14.0",
"react-refresh-typescript": "^2.0.5",
"terser-webpack-plugin": "^5.3.10",
"ts-loader": "^9.3.0",
- "typescript": "*",
+ "typescript": "catalog:repo",
"webpack-merge": "^5.9.0"
},
"peerDependencies": {
diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js
index c1a4c23ce4a..2f17f5cd940 100644
--- a/packages/clerk-js/rspack.config.js
+++ b/packages/clerk-js/rspack.config.js
@@ -308,11 +308,27 @@ const entryForVariant = variant => {
* @param {object} config
* @param {'development'|'production'} config.mode
* @param {boolean} config.analysis
+ * @param {object} config.env
* @returns {(import('@rspack/core').Configuration)[]}
*/
-const prodConfig = ({ mode, analysis }) => {
+const prodConfig = ({ mode, env, analysis }) => {
+ const isSandbox = !!env.sandbox;
+
const clerkBrowser = merge(
entryForVariant(variants.clerkBrowser),
+ isSandbox
+ ? {
+ entry: { sandbox: './sandbox/app.js' },
+ plugins: [
+ new rspack.HtmlRspackPlugin({
+ minify: false,
+ template: './sandbox/template.html',
+ inject: false,
+ hash: true,
+ }),
+ ],
+ }
+ : {},
common({ mode }),
commonForProd(),
commonForProdChunked(),
@@ -404,6 +420,7 @@ const devConfig = ({ mode, env }) => {
// accept an optional devOrigin environment option to change the origin of the dev server.
// By default we use https://js.lclclerk.com which is what our local dev proxy looks for.
const devUrl = new URL(env.devOrigin || 'https://js.lclclerk.com');
+ const isSandbox = !!env.sandbox;
/** @type {() => import('@rspack/core').Configuration} */
const commonForDev = () => {
@@ -411,12 +428,20 @@ const devConfig = ({ mode, env }) => {
module: {
rules: [svgLoader(), ...typescriptLoaderDev(), clerkUICSSLoader()],
},
- plugins: [new ReactRefreshPlugin(/** @type {any} **/ ({ overlay: { sockHost: devUrl.host } }))],
+ plugins: [
+ new ReactRefreshPlugin(/** @type {any} **/ ({ overlay: { sockHost: devUrl.host } })),
+ isSandbox &&
+ new rspack.HtmlRspackPlugin({
+ minify: false,
+ template: './sandbox/template.html',
+ inject: false,
+ }),
+ ].filter(Boolean),
devtool: 'eval-cheap-source-map',
output: {
- publicPath: `${devUrl.origin}/npm`,
+ publicPath: isSandbox ? `` : `${devUrl.origin}/npm`,
crossOriginLoading: 'anonymous',
- filename: `${variant}.js`,
+ filename: `[name].js`,
libraryTarget: 'umd',
},
optimization: {
@@ -430,10 +455,11 @@ const devConfig = ({ mode, env }) => {
hot: true,
liveReload: false,
client: { webSocketURL: `auto://${devUrl.host}/ws` },
- static: './sandbox',
- historyApiFallback: {
- index: '/index.html',
- },
+ ...(isSandbox
+ ? {
+ historyApiFallback: true,
+ }
+ : {}),
},
};
};
@@ -448,6 +474,7 @@ const devConfig = ({ mode, env }) => {
// prettier-ignore
[variants.clerkBrowser]: merge(
entryForVariant(variants.clerkBrowser),
+ isSandbox ? { entry: { sandbox: './sandbox/app.js' } } : {},
common({ mode }),
commonForDev(),
),
@@ -476,5 +503,5 @@ module.exports = env => {
const mode = env.production ? 'production' : 'development';
const analysis = !!env.analysis;
- return isProduction(mode) ? prodConfig({ mode, analysis }) : devConfig({ mode, env });
+ return isProduction(mode) ? prodConfig({ mode, env, analysis }) : devConfig({ mode, env });
};
diff --git a/packages/clerk-js/sandbox/app.js b/packages/clerk-js/sandbox/app.js
index e991783d0d4..6f7debdec9f 100644
--- a/packages/clerk-js/sandbox/app.js
+++ b/packages/clerk-js/sandbox/app.js
@@ -2,9 +2,99 @@
/** @typedef {import('@clerk/clerk-js').Clerk} Clerk */
+/**
+ * @typedef {object} ComponentPropsControl
+ * @property {(props: unknown) => void} setProps
+ * @property {() => (any | null)} getProps
+ */
+
+const AVAILABLE_COMPONENTS = /** @type {const} */ ([
+ 'signIn',
+ 'signUp',
+ 'userButton',
+ 'userProfile',
+ 'createOrganization',
+ 'organizationList',
+ 'organizationProfile',
+ 'organizationSwitcher',
+ 'waitlist',
+]);
+
+const COMPONENT_PROPS_NAMESPACE = 'clerk-js-sandbox';
+
+const urlParams = new URL(window.location.href).searchParams;
+for (const [component, encodedProps] of urlParams.entries()) {
+ if (AVAILABLE_COMPONENTS.includes(/** @type {typeof AVAILABLE_COMPONENTS[number]} */ (component))) {
+ localStorage.setItem(`${COMPONENT_PROPS_NAMESPACE}-${component}`, encodedProps);
+ }
+}
+
+/**
+ * @param {typeof AVAILABLE_COMPONENTS[number]} component
+ * @param {unknown} props
+ */
+function setComponentProps(component, props) {
+ const encodedProps = JSON.stringify(props);
+
+ const url = new URL(window.location.href);
+ url.searchParams.set(component, encodedProps);
+
+ window.location.href = url.toString();
+}
+
+/**
+ * @param {typeof AVAILABLE_COMPONENTS[number]} component
+ * @returns {unknown | null}
+ */
+function getComponentProps(component) {
+ const url = new URL(window.location.href);
+ const encodedProps = url.searchParams.get(component);
+ if (encodedProps) {
+ return JSON.parse(encodedProps);
+ }
+
+ const localEncodedProps = localStorage.getItem(`${COMPONENT_PROPS_NAMESPACE}-${component}`);
+ if (localEncodedProps) {
+ return JSON.parse(localEncodedProps);
+ }
+
+ return null;
+}
+
+/**
+ * @param {typeof AVAILABLE_COMPONENTS[number]} component
+ * @returns {ComponentPropsControl}
+ */
+function buildComponentControls(component) {
+ return {
+ setProps(props) {
+ setComponentProps(component, props);
+ },
+ getProps() {
+ return getComponentProps(component);
+ },
+ };
+}
+
+/**
+ * @type {Record}
+ */
+const componentControls = {
+ signIn: buildComponentControls('signIn'),
+ signUp: buildComponentControls('signUp'),
+ userButton: buildComponentControls('userButton'),
+ userProfile: buildComponentControls('userProfile'),
+ createOrganization: buildComponentControls('createOrganization'),
+ organizationList: buildComponentControls('organizationList'),
+ organizationProfile: buildComponentControls('organizationProfile'),
+ organizationSwitcher: buildComponentControls('organizationSwitcher'),
+ waitlist: buildComponentControls('waitlist'),
+};
+
/**
* @typedef {object} CustomWindowObject
* @property {Clerk} [Clerk]
+ * @property {Record} [components]
*/
/**
@@ -13,6 +103,7 @@
/** @type {CustomWindow} */
const windowWithClerk = window;
+windowWithClerk.components = componentControls;
const Clerk = /** @type {Clerk} **/ (windowWithClerk.Clerk);
if (!Clerk) {
@@ -36,31 +127,31 @@ const routes = {
mountIndex(app);
},
'/sign-in': () => {
- Clerk.mountSignIn(app, {});
+ Clerk.mountSignIn(app, componentControls.signIn.getProps() ?? {});
},
'/sign-up': () => {
- Clerk.mountSignUp(app, {});
+ Clerk.mountSignUp(app, componentControls.signUp.getProps() ?? {});
},
'/user-button': () => {
- Clerk.mountUserButton(app, {});
+ Clerk.mountUserButton(app, componentControls.userButton.getProps() ?? {});
},
'/user-profile': () => {
- Clerk.mountUserProfile(app, {});
+ Clerk.mountUserProfile(app, componentControls.userProfile.getProps() ?? {});
},
'/create-organization': () => {
- Clerk.mountCreateOrganization(app, {});
+ Clerk.mountCreateOrganization(app, componentControls.createOrganization.getProps() ?? {});
},
'/organization-list': () => {
- Clerk.mountOrganizationList(app, {});
+ Clerk.mountOrganizationList(app, componentControls.organizationList.getProps() ?? {});
},
'/organization-profile': () => {
- Clerk.mountOrganizationProfile(app, {});
+ Clerk.mountOrganizationProfile(app, componentControls.organizationProfile.getProps() ?? {});
},
'/organization-switcher': () => {
- Clerk.mountOrganizationSwitcher(app, {});
+ Clerk.mountOrganizationSwitcher(app, componentControls.organizationSwitcher.getProps() ?? {});
},
'/waitlist': () => {
- Clerk.mountWaitlist(app, {});
+ Clerk.mountWaitlist(app, componentControls.waitlist.getProps() ?? {});
},
};
@@ -72,8 +163,8 @@ function addCurrentRouteIndicator(currentRoute) {
if (!link) {
return;
}
- link.classList.remove('text-gray-400', 'hover:bg-[#1D1D21]', 'hover:text-white');
- link.classList.add('bg-[#1D1D21]', 'text-white');
+ link.removeAttribute('aria-current');
+ link.setAttribute('aria-current', 'page');
}
(async () => {
@@ -86,5 +177,7 @@ function addCurrentRouteIndicator(currentRoute) {
signUpUrl: '/sign-up',
});
renderCurrentRoute();
+ } else {
+ console.error(`Unknown route: "${route}".`);
}
})();
diff --git a/packages/clerk-js/sandbox/index.html b/packages/clerk-js/sandbox/index.html
deleted file mode 100644
index dba3386c5ae..00000000000
--- a/packages/clerk-js/sandbox/index.html
+++ /dev/null
@@ -1,211 +0,0 @@
-
-
-
- clerk-js Sandbox
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/clerk-js/sandbox/template.html b/packages/clerk-js/sandbox/template.html
new file mode 100644
index 00000000000..3d1c1eea4c7
--- /dev/null
+++ b/packages/clerk-js/sandbox/template.html
@@ -0,0 +1,258 @@
+
+
+
+ clerk-js Sandbox
+
+
+
+
+
+
+
+
+ Sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/clerk-js/src/core/__tests__/tokenCache.test.ts b/packages/clerk-js/src/core/__tests__/tokenCache.test.ts
index da39d29194b..75bbf824d92 100644
--- a/packages/clerk-js/src/core/__tests__/tokenCache.test.ts
+++ b/packages/clerk-js/src/core/__tests__/tokenCache.test.ts
@@ -124,8 +124,8 @@ describe('MemoryTokenCache', () => {
expect(cache.get(key)).toMatchObject(key);
- // 45s since token created
- jest.advanceTimersByTime(45 * 1000);
+ // 44s since token created
+ jest.advanceTimersByTime(44 * 1000);
expect(cache.get(key)).toMatchObject(key);
// 46s since token created
diff --git a/packages/clerk-js/src/core/fraudProtection.ts b/packages/clerk-js/src/core/fraudProtection.ts
index 173b72f02ca..5ad24208c38 100644
--- a/packages/clerk-js/src/core/fraudProtection.ts
+++ b/packages/clerk-js/src/core/fraudProtection.ts
@@ -1,8 +1,13 @@
+import { getCaptchaToken, retrieveCaptchaInfo } from '../utils/captcha';
+import type { Clerk } from './resources/internal';
+
/**
* TODO: @nikos Move captcha and fraud detection logic to this class
*/
class FraudProtectionService {
private inflightRequest: Promise | null = null;
+ private ticks = 0;
+ private readonly interval = 6;
public async execute Promise>(cb: T): Promise>> {
if (this.inflightRequest) {
@@ -20,6 +25,63 @@ class FraudProtectionService {
public blockUntilReady() {
return this.inflightRequest ? this.inflightRequest.then(() => null) : Promise.resolve();
}
+
+ public async challengeHeartbeat(clerk: Clerk) {
+ if (!clerk.__unstable__environment?.displayConfig.captchaHeartbeat || this.ticks++ % (this.interval - 1)) {
+ return undefined;
+ }
+ return this.invisibleChallenge(clerk);
+ }
+
+ /**
+ * Triggers an invisible challenge.
+ * This will always use the non-interactive variant of the CAPTCHA challenge and will
+ * always use the fallback key.
+ */
+ public async invisibleChallenge(clerk: Clerk) {
+ const { captchaSiteKey, canUseCaptcha, captchaURL, captchaPublicKeyInvisible } = retrieveCaptchaInfo(clerk);
+
+ if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) {
+ return getCaptchaToken({
+ siteKey: captchaPublicKeyInvisible,
+ invisibleSiteKey: captchaPublicKeyInvisible,
+ widgetType: 'invisible',
+ scriptUrl: captchaURL,
+ captchaProvider: 'turnstile',
+ });
+ }
+
+ return undefined;
+ }
+
+ /**
+ * Triggers a smart challenge if the user is required to solve a CAPTCHA.
+ * Depending on the environment settings, this will either trigger an
+ * invisible or smart (managed) CAPTCHA challenge.
+ * Managed challenged start as non-interactive and escalate to interactive if necessary.
+ * Important: For this to work at the moment, the instance needs to be using SMART protection
+ * as we need both keys (visible and invisible) to be present.
+ */
+ public async managedChallenge(clerk: Clerk) {
+ const { captchaSiteKey, canUseCaptcha, captchaURL, captchaWidgetType, captchaProvider, captchaPublicKeyInvisible } =
+ retrieveCaptchaInfo(clerk);
+
+ if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) {
+ return getCaptchaToken({
+ siteKey: captchaSiteKey,
+ widgetType: captchaWidgetType,
+ invisibleSiteKey: captchaPublicKeyInvisible,
+ scriptUrl: captchaURL,
+ captchaProvider,
+ modalWrapperQuerySelector: '#cl-modal-captcha-wrapper',
+ modalContainerQuerySelector: '#cl-modal-captcha-container',
+ openModal: () => clerk.__internal_openBlankCaptchaModal(),
+ closeModal: () => clerk.__internal_closeBlankCaptchaModal(),
+ });
+ }
+
+ return {};
+ }
}
export const fraudProtection = new FraudProtectionService();
diff --git a/packages/clerk-js/src/core/resources/DisplayConfig.ts b/packages/clerk-js/src/core/resources/DisplayConfig.ts
index f6b33901744..62fd568edcd 100644
--- a/packages/clerk-js/src/core/resources/DisplayConfig.ts
+++ b/packages/clerk-js/src/core/resources/DisplayConfig.ts
@@ -26,6 +26,7 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource
captchaProvider: CaptchaProvider = 'turnstile';
captchaPublicKeyInvisible: string | null = null;
captchaOauthBypass: OAuthStrategy[] = [];
+ captchaHeartbeat: boolean = false;
homeUrl!: string;
instanceEnvironmentType!: string;
faviconImageUrl!: string;
@@ -83,6 +84,7 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource
// These are the OAuth strategies we used to bypass the captcha for by default
// before the introduction of the captcha_oauth_bypass field
this.captchaOauthBypass = data.captcha_oauth_bypass || ['oauth_google', 'oauth_microsoft', 'oauth_apple'];
+ this.captchaHeartbeat = data.captcha_heartbeat || false;
this.supportEmail = data.support_email || '';
this.clerkJSVersion = data.clerk_js_version;
this.organizationProfileUrl = data.organization_profile_url;
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index f003334ea6c..c4a30e76008 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -22,7 +22,6 @@ import type {
UserResource,
} from '@clerk/types';
-import { getCaptchaToken, retrieveCaptchaInfo } from '../../utils/captcha';
import { unixEpochToDate } from '../../utils/date';
import { clerkInvalidStrategy } from '../errors';
import { eventBus, events } from '../events';
@@ -273,13 +272,15 @@ export class Session extends BaseResource implements SessionResource {
// TODO: update template endpoint to accept organizationId
const params: Record = template ? {} : { organizationId };
+ // this handles all getToken invocations with skipCache: true
await fraudProtection.blockUntilReady();
const createTokenWithCaptchaProtection = async () => {
- return Token.create(path, params).catch(e => {
+ const heartbeatParams = skipCache ? undefined : await fraudProtection.challengeHeartbeat(Session.clerk);
+ return Token.create(path, { ...params, ...heartbeatParams }).catch(e => {
if (isClerkAPIResponseError(e) && e.errors[0].code === 'requires_captcha') {
return fraudProtection.execute(async () => {
- const captchaParams = await this.#triggerCaptchaChallenge();
+ const captchaParams = await fraudProtection.managedChallenge(Session.clerk);
return Token.create(path, { ...params, ...captchaParams });
});
}
@@ -298,25 +299,4 @@ export class Session extends BaseResource implements SessionResource {
return token.getRawString() || null;
});
}
-
- async #triggerCaptchaChallenge() {
- const { captchaSiteKey, canUseCaptcha, captchaURL, captchaWidgetType, captchaProvider, captchaPublicKeyInvisible } =
- retrieveCaptchaInfo(Session.clerk);
-
- if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) {
- return getCaptchaToken({
- siteKey: captchaSiteKey,
- widgetType: captchaWidgetType,
- invisibleSiteKey: captchaPublicKeyInvisible,
- scriptUrl: captchaURL,
- captchaProvider,
- modalWrapperQuerySelector: '#cl-modal-captcha-wrapper',
- modalContainerQuerySelector: '#cl-modal-captcha-container',
- openModal: () => Session.clerk.__internal_openBlankCaptchaModal(),
- closeModal: () => Session.clerk.__internal_closeBlankCaptchaModal(),
- });
- }
-
- return {};
- }
}
diff --git a/packages/clerk-js/src/core/tokenCache.ts b/packages/clerk-js/src/core/tokenCache.ts
index 102798425ed..c5e74be3da1 100644
--- a/packages/clerk-js/src/core/tokenCache.ts
+++ b/packages/clerk-js/src/core/tokenCache.ts
@@ -26,7 +26,7 @@ interface TokenCache {
const KEY_PREFIX = 'clerk';
const DELIMITER = '::';
-const LEEWAY = 10;
+const LEEWAY = 11;
// This value should have the same value as the INTERVAL_IN_MS in SessionCookiePoller
const SYNC_LEEWAY = 5;
diff --git a/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
index 997916cee4f..3393e31e998 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
@@ -28,12 +28,7 @@ export const AddAuthenticatorApp = withCardStateProvider((props: AddAuthenticato
const { title, onSuccess, onReset } = props;
const { user } = useUser();
const card = useCardState();
- const [createTOTP] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.createTOTP();
- });
+ const [createTOTP] = useReverification(() => user?.createTOTP());
const { close } = useActionContext();
const [totp, setTOTP] = React.useState(undefined);
const [displayFormat, setDisplayFormat] = React.useState('qr');
diff --git a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx
index fbb2aab9743..9845cf6bf1d 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx
@@ -20,17 +20,13 @@ const ConnectMenuButton = (props: { strategy: OAuthStrategy }) => {
const isModal = mode === 'modal';
const [createExternalAccount] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
-
const socialProvider = strategy.replace('oauth_', '') as OAuthProvider;
const redirectUrl = isModal
? appendModalState({ url: window.location.href, componentName, socialProvider: socialProvider })
: window.location.href;
const additionalScopes = additionalOAuthScopes ? additionalOAuthScopes[socialProvider] : [];
- return user.createExternalAccount({
+ return user?.createExternalAccount({
strategy,
redirectUrl,
additionalScopes,
diff --git a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
index 75335459de3..ab61bcd6878 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
@@ -98,17 +98,13 @@ const ConnectedAccount = ({ account }: { account: ExternalAccountResource }) =>
})
: window.location.href;
- const [createExternalAccount] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
-
- return user.createExternalAccount({
+ const [createExternalAccount] = useReverification(() =>
+ user?.createExternalAccount({
strategy: account.verification!.strategy as OAuthStrategy,
redirectUrl,
additionalScopes,
- });
- });
+ }),
+ );
if (!user) {
return null;
diff --git a/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx
index 25fc2999198..edbe4b82441 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx
@@ -16,13 +16,7 @@ export const DeleteUserForm = withCardStateProvider((props: DeleteUserFormProps)
const { t } = useLocalizations();
const { otherSessions } = useMultipleSessions({ user });
const { setActive } = useClerk();
- const [deleteUserWithReverification] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
-
- return user.delete();
- });
+ const [deleteUserWithReverification] = useReverification(() => user?.delete());
const confirmationField = useFormControl('deleteConfirmation', '', {
type: 'text',
diff --git a/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx
index deeb86b8daf..4c7e0bf44e1 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx
@@ -22,12 +22,7 @@ export const EmailForm = withCardStateProvider((props: EmailFormProps) => {
const environment = useEnvironment();
const preferEmailLinks = emailLinksEnabledForInstance(environment);
- const [createEmailAddress] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.createEmailAddress({ email: emailField.value });
- });
+ const [createEmailAddress] = useReverification(() => user?.createEmailAddress({ email: emailField.value }));
const emailAddressRef = React.useRef(user?.emailAddresses.find(a => a.id === id));
const wizard = useWizard({
diff --git a/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx
index 0dd61ccb359..4f9cac0c069 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx
@@ -19,12 +19,7 @@ export const MfaBackupCodeCreateForm = withCardStateProvider((props: MfaBackupCo
const { onSuccess } = props;
const { user } = useUser();
const card = useCardState();
- const [createBackupCode] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.createBackupCode();
- });
+ const [createBackupCode] = useReverification(() => user?.createBackupCode());
const [backupCode, setBackupCode] = React.useState(undefined);
React.useEffect(() => {
diff --git a/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx
index a01eb98e0e6..4059a396a1b 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx
@@ -191,12 +191,7 @@ const AddPasskeyButton = () => {
const card = useCardState();
const { isSatellite } = useClerk();
const { user } = useUser();
- const [createPasskey] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.createPasskey();
- });
+ const [createPasskey] = useReverification(() => user?.createPasskey());
const handleCreatePasskey = async () => {
if (!user) {
diff --git a/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx
index 07f6fb7e2ae..8b9b22a5fc2 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx
@@ -1,4 +1,5 @@
import { __experimental_useReverification as useReverification, useSession, useUser } from '@clerk/shared/react';
+import type { UserResource } from '@clerk/types';
import { useRef } from 'react';
import { useEnvironment } from '../../contexts';
@@ -36,19 +37,9 @@ type PasswordFormProps = FormProps;
export const PasswordForm = withCardStateProvider((props: PasswordFormProps) => {
const { onSuccess, onReset } = props;
const { user } = useUser();
- const [updatePasswordWithReverification] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
-
- const opts = {
- newPassword: passwordField.value,
- signOutOfOtherSessions: sessionsField.checked,
- currentPassword: user.passwordEnabled ? currentPasswordField.value : undefined,
- } satisfies Parameters[0];
-
- return user.updatePassword(opts);
- });
+ const [updatePasswordWithReverification] = useReverification(
+ (user: UserResource, opts: Parameters) => user.updatePassword(...opts),
+ );
if (!user) {
return null;
@@ -124,7 +115,13 @@ export const PasswordForm = withCardStateProvider((props: PasswordFormProps) =>
text: generateSuccessPageText(user.passwordEnabled, !!sessionsField.checked),
};
- await updatePasswordWithReverification();
+ const opts = {
+ newPassword: passwordField.value,
+ signOutOfOtherSessions: sessionsField.checked,
+ currentPassword: user.passwordEnabled ? currentPasswordField.value : undefined,
+ } satisfies Parameters[0];
+
+ await updatePasswordWithReverification(user, [opts]);
onSuccess();
} catch (e) {
handleError(e, [currentPasswordField, passwordField, confirmField], card.setError);
diff --git a/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx
index 0627e33dafd..6b1baeb9ef9 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx
@@ -1,5 +1,5 @@
import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react';
-import type { PhoneNumberResource } from '@clerk/types';
+import type { PhoneNumberResource, UserResource } from '@clerk/types';
import React from 'react';
import { useWizard, Wizard } from '../../common';
@@ -49,12 +49,9 @@ export const AddPhone = (props: AddPhoneProps) => {
const { title, onSuccess, onReset, onUseExistingNumberClick, resourceRef } = props;
const card = useCardState();
const { user } = useUser();
- const [createPhoneNumber] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.createPhoneNumber({ phoneNumber: phoneField.value });
- });
+ const [createPhoneNumber] = useReverification(
+ (user: UserResource, opt: Parameters[0]) => user.createPhoneNumber(opt),
+ );
const phoneField = useFormControl('phoneNumber', '', {
type: 'tel',
@@ -70,7 +67,7 @@ export const AddPhone = (props: AddPhoneProps) => {
if (!user) {
return;
}
- return createPhoneNumber()
+ return createPhoneNumber(user, { phoneNumber: phoneField.value })
.then(res => {
resourceRef.current = res;
onSuccess();
diff --git a/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx
index 44c0023b462..fc4876ded12 100644
--- a/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx
@@ -12,12 +12,7 @@ export const UsernameForm = withCardStateProvider((props: UsernameFormProps) =>
const { onSuccess, onReset } = props;
const { user } = useUser();
- const [updateUsername] = useReverification(() => {
- if (!user) {
- return Promise.resolve(undefined);
- }
- return user.update({ username: usernameField.value });
- });
+ const [updateUsername] = useReverification(() => user?.update({ username: usernameField.value }));
const { userSettings } = useEnvironment();
const card = useCardState();
diff --git a/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts b/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts
index 9003d1ea5a8..68058d407ce 100644
--- a/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts
+++ b/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts
@@ -1,14 +1,4 @@
-import { getHCaptchaToken } from './hcaptcha';
import { getTurnstileToken } from './turnstile';
-import type { CaptchaOptions, GetCaptchaTokenReturn } from './types';
+import type { CaptchaOptions } from './types';
-/*
- * This is a temporary solution to test different captcha providers, until we decide on a single one.
- */
-export const getCaptchaToken = (opts: CaptchaOptions): Promise => {
- if (opts.captchaProvider === 'hcaptcha') {
- return getHCaptchaToken(opts);
- } else {
- return getTurnstileToken(opts);
- }
-};
+export const getCaptchaToken = (opts: CaptchaOptions) => getTurnstileToken(opts);
diff --git a/packages/clerk-js/src/utils/captcha/hcaptcha.ts b/packages/clerk-js/src/utils/captcha/hcaptcha.ts
deleted file mode 100644
index 8f74f2d66c1..00000000000
--- a/packages/clerk-js/src/utils/captcha/hcaptcha.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-///
-
-import { loadScript } from '@clerk/shared/loadScript';
-import type { CaptchaWidgetType } from '@clerk/types';
-
-import { CAPTCHA_ELEMENT_ID, CAPTCHA_INVISIBLE_CLASSNAME } from './constants';
-import type { CaptchaOptions } from './types';
-
-async function loadCaptcha(url: string) {
- if (!window.hcaptcha) {
- try {
- await loadScript(url, { defer: true });
- } catch {
- // Rethrow with specific message
- console.error('Clerk: Failed to load the CAPTCHA script from the URL: ', url);
- throw {
- captchaError: 'captcha_script_failed_to_load',
- };
- }
- }
- return window.hcaptcha;
-}
-
-export const getHCaptchaToken = async (captchaOptions: CaptchaOptions) => {
- const { siteKey, scriptUrl, widgetType, invisibleSiteKey } = captchaOptions;
- let captchaToken = '',
- id = '';
- let isInvisibleWidget = !widgetType || widgetType === 'invisible';
- let hCaptchaSiteKey = siteKey;
-
- let widgetDiv: HTMLElement | null = null;
-
- const createInvisibleDOMElement = () => {
- const div = document.createElement('div');
- div.id = CAPTCHA_INVISIBLE_CLASSNAME;
- document.body.appendChild(div);
- return div;
- };
-
- const captcha: HCaptcha = await loadCaptcha(scriptUrl);
- let retries = 0;
- const errorCodes: (string | number)[] = [];
-
- const handleCaptchaTokenGeneration = (): Promise<[string, string]> => {
- return new Promise((resolve, reject) => {
- try {
- if (isInvisibleWidget) {
- widgetDiv = createInvisibleDOMElement();
- } else {
- const visibleDiv = document.getElementById(CAPTCHA_ELEMENT_ID);
- if (visibleDiv) {
- visibleDiv.style.display = 'block';
- widgetDiv = visibleDiv;
- } else {
- console.error(
- 'Cannot initialize Smart CAPTCHA widget because the `clerk-captcha` DOM element was not found; falling back to Invisible CAPTCHA widget. If you are using a custom flow, visit https://clerk.com/docs/custom-flows/bot-sign-up-protection for instructions',
- );
- widgetDiv = createInvisibleDOMElement();
- isInvisibleWidget = true;
- hCaptchaSiteKey = invisibleSiteKey;
- }
- }
-
- const id = captcha.render(isInvisibleWidget ? CAPTCHA_INVISIBLE_CLASSNAME : CAPTCHA_ELEMENT_ID, {
- sitekey: hCaptchaSiteKey,
- size: isInvisibleWidget ? 'invisible' : 'normal',
- callback: function (token: string) {
- resolve([token, id]);
- },
- 'error-callback': function (errorCode) {
- errorCodes.push(errorCode);
- if (retries < 2) {
- setTimeout(() => {
- captcha.reset(id);
- retries++;
- }, 250);
- return;
- }
- reject([errorCodes.join(','), id]);
- },
- });
-
- if (isInvisibleWidget) {
- captcha.execute(id);
- }
- } catch (e) {
- /**
- * There is a case the captcha may fail before the challenge has started.
- * In such case the 'error-callback' does not fire.
- * We should mark the promise as rejected.
- */
- reject([e, undefined]);
- }
- });
- };
-
- try {
- [captchaToken, id] = await handleCaptchaTokenGeneration();
- // After a successful challenge remove it
- captcha.remove(id);
- } catch ([e, id]) {
- if (id) {
- // After a failed challenge remove it
- captcha.remove(id);
- }
- throw {
- captchaError: e,
- };
- } finally {
- if (widgetDiv) {
- if (isInvisibleWidget) {
- document.body.removeChild(widgetDiv as HTMLElement);
- } else {
- (widgetDiv as HTMLElement).style.display = 'none';
- }
- }
- }
-
- return { captchaToken, captchaWidgetType: (isInvisibleWidget ? 'invisible' : 'smart') as CaptchaWidgetType };
-};
diff --git a/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts b/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts
index 2d15bdea6b1..2cf78c84db0 100644
--- a/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts
+++ b/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts
@@ -18,7 +18,7 @@ export const retrieveCaptchaInfo = (clerk: Clerk) => {
: null,
captchaURL: fapiClient
.buildUrl({
- path: captchaProvider == 'hcaptcha' ? 'hcaptcha/1/api.js' : 'cloudflare/turnstile/v0/api.js',
+ path: 'cloudflare/turnstile/v0/api.js',
pathPrefix: '',
search: '?render=explicit',
})
diff --git a/packages/clerk-js/turbo.json b/packages/clerk-js/turbo.json
index 425069e3e0a..ecd642c0f5b 100644
--- a/packages/clerk-js/turbo.json
+++ b/packages/clerk-js/turbo.json
@@ -22,6 +22,11 @@
"!node_modules/**"
]
},
+ "build:sandbox": {
+ "dependsOn": ["^build"],
+ "inputs": ["sandbox/**"],
+ "outputs": ["dist/**"]
+ },
"test": {
"inputs": [
"*.d.ts",
diff --git a/packages/clerk-js/vercel.json b/packages/clerk-js/vercel.json
new file mode 100644
index 00000000000..3a48e56ba52
--- /dev/null
+++ b/packages/clerk-js/vercel.json
@@ -0,0 +1,3 @@
+{
+ "rewrites": [{ "source": "/(.*)", "destination": "/" }]
+}
diff --git a/packages/dev-cli/package.json b/packages/dev-cli/package.json
index 3fec2250445..b26b6708336 100644
--- a/packages/dev-cli/package.json
+++ b/packages/dev-cli/package.json
@@ -31,7 +31,7 @@
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
"@types/node": "^20.14.8",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/dev-cli/src/commands/setup.js b/packages/dev-cli/src/commands/setup.js
index 764e64be2ef..c739e4ed6aa 100644
--- a/packages/dev-cli/src/commands/setup.js
+++ b/packages/dev-cli/src/commands/setup.js
@@ -40,7 +40,7 @@ function hasPackage(packages, dependency) {
async function detectFramework() {
const { dependencies, devDependencies } = await getDependencies(join(process.cwd(), 'package.json'));
- const IS_NEXT = hasFile('next.config.js') || hasFile('next.config.mjs');
+ const IS_NEXT = hasPackage(dependencies, 'next');
if (IS_NEXT) {
return 'nextjs';
}
diff --git a/packages/elements/examples/nextjs/package.json b/packages/elements/examples/nextjs/package.json
index 4b8e8fbe833..99f67e6f433 100644
--- a/packages/elements/examples/nextjs/package.json
+++ b/packages/elements/examples/nextjs/package.json
@@ -23,8 +23,8 @@
},
"devDependencies": {
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"autoprefixer": "^10.4.20",
"eslint": "^8",
"eslint-config-next": "14.2",
diff --git a/packages/elements/package.json b/packages/elements/package.json
index 2fe1fd8f482..8588fd0ea7f 100644
--- a/packages/elements/package.json
+++ b/packages/elements/package.json
@@ -73,7 +73,7 @@
"dependencies": {
"@clerk/clerk-react": "workspace:*",
"@clerk/shared": "workspace:*",
- "@clerk/types": "^4.34.0",
+ "@clerk/types": "workspace:*",
"@radix-ui/primitive": "^1.1.0",
"@radix-ui/react-form": "^0.1.0",
"@radix-ui/react-slot": "^1.1.0",
@@ -85,14 +85,14 @@
"@clerk/eslint-config-custom": "workspace:*",
"@statelyai/inspect": "^0.4.0",
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"concurrently": "^8.2.2",
"next": "^14.2.10",
- "tslib": "2.4.1",
- "tsup": "*",
+ "tslib": "catalog:repo",
+ "tsup": "catalog:repo",
"type-fest": "^4.9.0",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"next": "^13.5.4 || ^14.0.3 || ^15",
diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
index 6625aaa8825..40442a00826 100644
--- a/packages/eslint-config-custom/package.json
+++ b/packages/eslint-config-custom/package.json
@@ -25,7 +25,7 @@
"eslint-plugin-unused-imports": "^3.2.0"
},
"peerDependencies": {
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"publishConfig": {
"access": "public"
diff --git a/packages/expo-passkeys/.eslintrc.js b/packages/expo-passkeys/.eslintrc.js
index 9c27d64800c..0aab09b0b25 100644
--- a/packages/expo-passkeys/.eslintrc.js
+++ b/packages/expo-passkeys/.eslintrc.js
@@ -4,4 +4,12 @@ module.exports = {
settings: {
'import/ignore': ['node_modules/react-native/index\\.js$'],
},
+ rules: {
+ 'no-restricted-imports': [
+ 'error',
+ {
+ patterns: ['node:*'],
+ },
+ ],
+ },
};
diff --git a/packages/expo-passkeys/src/utils.ts b/packages/expo-passkeys/src/utils.ts
index 0a7bfb5cee2..c9dc88fe9e5 100644
--- a/packages/expo-passkeys/src/utils.ts
+++ b/packages/expo-passkeys/src/utils.ts
@@ -1,6 +1,5 @@
-import { Buffer } from 'node:buffer';
-
import { ClerkWebAuthnError } from '@clerk/shared/error';
+import { Buffer } from 'buffer';
export { ClerkWebAuthnError };
export function encodeBase64(data: ArrayLike | ArrayBufferLike) {
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 782ca86349d..416c4bcd51c 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -62,27 +62,28 @@
"dependencies": {
"@clerk/clerk-js": "workspace:*",
"@clerk/clerk-react": "workspace:*",
- "@clerk/expo-passkeys": "workspace:*",
"@clerk/shared": "workspace:*",
"@clerk/types": "workspace:*",
"base-64": "^1.0.0",
"react-native-url-polyfill": "2.0.0",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
+ "@clerk/expo-passkeys": "workspace:*",
"@types/base-64": "^1.0.2",
"@types/node": "^20.11.24",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"expo-auth-session": "^5.4.0",
"expo-local-authentication": "^13.8.0",
"expo-secure-store": "^12.8.1",
"expo-web-browser": "^12.8.2",
"react-native": "^0.73.9",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"peerDependencies": {
+ "@clerk/expo-passkeys": ">=0.0.6",
"expo-auth-session": ">=5",
"expo-local-authentication": ">=13.5.0",
"expo-secure-store": ">=12.4.0",
@@ -92,6 +93,9 @@
"react-native": ">=0.73"
},
"peerDependenciesMeta": {
+ "@clerk/expo-passkeys": {
+ "optional": true
+ },
"expo-local-authentication": {
"optional": true
},
diff --git a/packages/express/package.json b/packages/express/package.json
index 64ac3d7314d..b55a009453b 100644
--- a/packages/express/package.json
+++ b/packages/express/package.json
@@ -58,7 +58,7 @@
"@clerk/backend": "workspace:^",
"@clerk/shared": "workspace:^",
"@clerk/types": "workspace:^",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@types/express": "^4.17.21",
@@ -66,8 +66,8 @@
"@types/supertest": "^6.0.2",
"express": "^4.20.0",
"supertest": "^6.3.4",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"express": "^4.17.0 || ^5.0.0"
diff --git a/packages/fastify/package.json b/packages/fastify/package.json
index b5aa4f864fd..3a11c37495e 100644
--- a/packages/fastify/package.json
+++ b/packages/fastify/package.json
@@ -50,8 +50,8 @@
"@clerk/eslint-config-custom": "workspace:*",
"@types/node": "^20.14.8",
"fastify": "^5.0.0",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"fastify": ">=5"
diff --git a/packages/localizations/package.json b/packages/localizations/package.json
index 09db3251b0b..b23db9e2618 100644
--- a/packages/localizations/package.json
+++ b/packages/localizations/package.json
@@ -104,8 +104,8 @@
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index d43dfdb4edd..9cc237ea0d6 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -72,16 +72,14 @@
"crypto-js": "4.2.0",
"ezheaders": "0.1.0",
"server-only": "0.0.1",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
"@types/crypto-js": "4.2.2",
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
"next": "^14.2.10",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"next": "^13.5.4 || ^14.0.3 || ^15.0.0",
diff --git a/packages/nuxt/README.md b/packages/nuxt/README.md
index ed490e3f34c..467faa14aaf 100644
--- a/packages/nuxt/README.md
+++ b/packages/nuxt/README.md
@@ -55,7 +55,7 @@ Make sure the following environment variables are set in a `.env` file in your N
```
NUXT_PUBLIC_CLERK_PUBLISHABLE_KEY=[publishable-key]
-CLERK_SECRET_KEY=[secret-key]
+NUXT_CLERK_SECRET_KEY=[secret-key]
```
Then, add `@clerk/nuxt` to the `modules` section of `nuxt.config.ts`:
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 4ba668aeeda..b0c13f93b07 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -49,17 +49,17 @@
"publish:local": "pnpm dlx yalc push --replace --sig"
},
"dependencies": {
- "@clerk/backend": "1.17.0",
- "@clerk/shared": "2.15.0",
- "@clerk/types": "4.34.0",
- "@clerk/vue": "0.0.5",
+ "@clerk/backend": "workspace:*",
+ "@clerk/shared": "workspace:*",
+ "@clerk/types": "workspace:*",
+ "@clerk/vue": "workspace:*",
"@nuxt/kit": "^3.14.159",
"@nuxt/schema": "^3.14.159",
"h3": "^1.13.0"
},
"devDependencies": {
"nuxt": "^3.14.159",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/react/package.json b/packages/react/package.json
index ff44a80dba2..6aac243dfd0 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -78,17 +78,15 @@
"dependencies": {
"@clerk/shared": "workspace:*",
"@clerk/types": "workspace:*",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
"@clerk/localizations": "workspace:*",
"@clerk/themes": "workspace:*",
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
"@types/semver": "^7.5.8",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"react": "^18 || ^19.0.0-0",
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 4ede1813814..b7f992bd9f4 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -78,7 +78,7 @@
"@clerk/shared": "workspace:*",
"@clerk/types": "workspace:*",
"cookie": "0.7.0",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
@@ -86,9 +86,9 @@
"@remix-run/server-runtime": "^2.0.0",
"@types/cookie": "^0.6.0",
"@types/node": "^18.19.33",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
- "typescript": "*"
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"@remix-run/react": "^2.0.0",
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index c8be6473721..3cd92e23ca1 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -56,7 +56,7 @@
"@clerk/backend": "workspace:*",
"@clerk/shared": "workspace:*",
"@clerk/types": "workspace:*",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
@@ -64,8 +64,8 @@
"@types/node": "^18.19.33",
"nock": "^13.0.7",
"npm-run-all": "^4.1.5",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 456f6f31674..5d54b275977 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -145,8 +145,8 @@
"@types/node": "^18.19.33",
"cross-fetch": "^4.0.0",
"esbuild": "0.20.2",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"react": "^18 || ^19.0.0-0",
diff --git a/packages/shared/src/authorization.ts b/packages/shared/src/authorization.ts
index 888e73c6ae8..489067bbfb6 100644
--- a/packages/shared/src/authorization.ts
+++ b/packages/shared/src/authorization.ts
@@ -94,11 +94,11 @@ const validateReverificationConfig = (config: __experimental_ReverificationConfi
return config;
};
- if (typeof config === 'string' && isValidVerificationType(config)) {
- return convertConfigToObject.bind(null, config);
- }
+ const isValidStringValue = typeof config === 'string' && isValidVerificationType(config);
+ const isValidObjectValue =
+ typeof config === 'object' && isValidLevel(config.level) && isValidMaxAge(config.afterMinutes);
- if (typeof config === 'object' && isValidLevel(config.level) && isValidMaxAge(config.afterMinutes)) {
+ if (isValidStringValue || isValidObjectValue) {
return convertConfigToObject.bind(null, config);
}
@@ -145,7 +145,7 @@ const checkStepUpAuthorization: CheckStepUpAuthorization = (params, { __experime
* The returned function authorizes if both checks pass, or if at least one passes
* when the other is indeterminate. Fails if userId is missing.
*/
-export const createCheckAuthorization = (options: AuthorizationOptions): CheckAuthorizationWithCustomPermissions => {
+const createCheckAuthorization = (options: AuthorizationOptions): CheckAuthorizationWithCustomPermissions => {
return (params): boolean => {
if (!options.userId) {
return false;
@@ -161,3 +161,5 @@ export const createCheckAuthorization = (options: AuthorizationOptions): CheckAu
return [orgAuthorization, stepUpAuthorization].every(a => a === true);
};
};
+
+export { createCheckAuthorization, validateReverificationConfig };
diff --git a/packages/shared/src/react/__tests__/useReverification.test.ts b/packages/shared/src/react/__tests__/useReverification.test.ts
new file mode 100644
index 00000000000..113ea3ee518
--- /dev/null
+++ b/packages/shared/src/react/__tests__/useReverification.test.ts
@@ -0,0 +1,61 @@
+import { expectTypeOf } from 'expect-type';
+
+import { __experimental_reverificationError } from '../../authorization-errors';
+import type { __experimental_useReverification as useReverification } from '../hooks/useReverification';
+
+type ExcludeClerkError = T extends { clerk_error: any } ? never : T;
+
+const fetcher = async (key: string, options: { id: string }) => {
+ return {
+ key,
+ options,
+ };
+};
+
+const fetcherWithHelper = async (key: string, options: { id: string }) => {
+ if (key == 'a') {
+ return __experimental_reverificationError();
+ }
+
+ return {
+ key,
+ options,
+ };
+};
+
+type Fetcher = typeof fetcherWithHelper;
+
+describe('useReverification type tests', () => {
+ it('allow pass through types', () => {
+ type UseReverificationWithFetcher = typeof useReverification;
+ type VerifiedFetcher = ReturnType[0];
+ expectTypeOf(fetcher).toEqualTypeOf();
+ });
+
+ it('returned callback with clerk error excluded and possible null in case of cancelled flow', () => {
+ type UseReverificationWithFetcherHelper = typeof useReverification;
+ type VerifiedFetcherHelper = ReturnType[0];
+
+ expectTypeOf(fetcherWithHelper).not.toEqualTypeOf();
+
+ expectTypeOf>().toEqualTypeOf>();
+ expectTypeOf>().not.toEqualTypeOf>();
+ expectTypeOf>> | null>().toEqualTypeOf<
+ Awaited>
+ >();
+ });
+
+ it('returned callback with clerk error excluded but without null since we throw', () => {
+ type UseReverificationWithFetcherHelperThrow = typeof useReverification<
+ typeof fetcherWithHelper,
+ {
+ throwOnCancel: true;
+ }
+ >;
+ type VerifiedFetcherHelperThrow = ReturnType[0];
+ expectTypeOf(fetcherWithHelper).not.toEqualTypeOf();
+ expectTypeOf>>>().toEqualTypeOf<
+ Awaited>
+ >();
+ });
+});
diff --git a/packages/shared/src/react/hooks/useReverification.ts b/packages/shared/src/react/hooks/useReverification.ts
index 74f3b87a82d..7efb0d844ec 100644
--- a/packages/shared/src/react/hooks/useReverification.ts
+++ b/packages/shared/src/react/hooks/useReverification.ts
@@ -1,36 +1,51 @@
import type { Clerk } from '@clerk/types';
import { useMemo, useRef } from 'react';
+import { validateReverificationConfig } from '../../authorization';
import { __experimental_isReverificationHint, __experimental_reverificationError } from '../../authorization-errors';
-import { ClerkRuntimeError, isClerkAPIResponseError } from '../../error';
+import { ClerkRuntimeError, isClerkAPIResponseError, isClerkRuntimeError } from '../../error';
import { createDeferredPromise } from '../../utils/createDeferredPromise';
import { useClerk } from './useClerk';
import { useSafeLayoutEffect } from './useSafeLayoutEffect';
async function resolveResult(
- result: Promise,
+ result: Promise | T,
): Promise> {
- return result
- .then(r => {
- if (r instanceof Response) {
- return r.json();
- }
- return r;
- })
- .catch(e => {
- // Treat fapi assurance as an assurance hint
- if (isClerkAPIResponseError(e) && e.errors.find(({ code }) => code == 'session_step_up_verification_required')) {
- return __experimental_reverificationError();
- }
+ try {
+ const r = await result;
+ if (r instanceof Response) {
+ return r.json();
+ }
+ return r;
+ } catch (e) {
+ // Treat fapi assurance as an assurance hint
+ if (isClerkAPIResponseError(e) && e.errors.find(({ code }) => code == 'session_step_up_verification_required')) {
+ return __experimental_reverificationError();
+ }
- // rethrow
- throw e;
- });
+ // rethrow
+ throw e;
+ }
}
-function createReverificationHandler(params: { onOpenModal: Clerk['__experimental_openUserVerification'] }) {
- function assertReverification Promise>(fetcher: Fetcher): Fetcher {
- return (async (...args) => {
+type ExcludeClerkError = T extends { clerk_error: any } ? (P extends { throwOnCancel: true } ? never : null) : T;
+
+type UseReverificationOptions = {
+ onCancel?: () => void;
+ throwOnCancel?: boolean;
+};
+
+type CreateReverificationHandlerParams = UseReverificationOptions & {
+ openUIComponent: Clerk['__experimental_openUserVerification'];
+};
+
+function createReverificationHandler(params: CreateReverificationHandlerParams) {
+ function assertReverification Promise | undefined>(
+ fetcher: Fetcher,
+ ): (
+ ...args: Parameters
+ ) => Promise>, Parameters[1]>> {
+ return (async (...args: Parameters) => {
let result = await resolveResult(fetcher(...args));
if (__experimental_isReverificationHint(result)) {
@@ -39,11 +54,14 @@ function createReverificationHandler(params: { onOpenModal: Clerk['__experimenta
*/
const resolvers = createDeferredPromise();
+ const isValidMetadata = validateReverificationConfig(result.clerk_error.metadata.reverification);
+
/**
* On success resolve the pending promise
* On cancel reject the pending promise
*/
- params.onOpenModal?.({
+ params.openUIComponent?.({
+ level: isValidMetadata ? isValidMetadata().level : undefined,
afterVerification() {
resolvers.resolve(true);
},
@@ -56,10 +74,22 @@ function createReverificationHandler(params: { onOpenModal: Clerk['__experimenta
},
});
- /**
- * Wait until the promise from above have been resolved or rejected
- */
- await resolvers.promise;
+ try {
+ /**
+ * Wait until the promise from above have been resolved or rejected
+ */
+ await resolvers.promise;
+ } catch (e) {
+ if (params.onCancel) {
+ params.onCancel();
+ }
+
+ if (isClerkRuntimeError(e) && e.code === 'reverification_cancelled' && params.throwOnCancel) {
+ throw e;
+ }
+
+ return null;
+ }
/**
* After the promise resolved successfully try the original request one more time
@@ -68,26 +98,55 @@ function createReverificationHandler(params: { onOpenModal: Clerk['__experimenta
}
return result;
- }) as Fetcher;
+ }) as ExcludeClerkError>, Parameters[1]>;
}
return assertReverification;
}
-function __experimental_useReverification Promise>(fetcher: Fetcher): readonly [Fetcher] {
+type UseReverificationResult<
+ Fetcher extends (...args: any[]) => Promise | undefined,
+ Options extends UseReverificationOptions,
+> = readonly [(...args: Parameters) => Promise>, Options>>];
+
+/**
+ * Receives a fetcher async function and returned an enhanced fetcher that automatically handles the reverification flow
+ * by displaying a prebuilt UI component when the request from the fetcher fails with a reverification error response.
+ *
+ * While the UI component is displayed the promise is still pending.
+ * On success: the original request is retried one more time.
+ * On error:
+ * (1) by default the fetcher will return `null` and the `onCancel` callback will be executed.
+ * (2) when `throwOnCancel: true` instead of returning null, the returned fetcher will throw a `ClerkRuntimeError`.
+ *
+ * @example
+ * A simple example:
+ *
+ * function Hello() {
+ * const [fetchBalance] = useReverification(()=> fetch('/transfer-balance',{method:"POST"}));
+ * return
+ * }
+ */
+function __experimental_useReverification<
+ Fetcher extends (...args: any[]) => Promise | undefined,
+ Options extends UseReverificationOptions,
+>(fetcher: Fetcher, options?: Options): UseReverificationResult {
const { __experimental_openUserVerification } = useClerk();
const fetcherRef = useRef(fetcher);
+ const optionsRef = useRef(options);
const handleReverification = useMemo(() => {
const handler = createReverificationHandler({
- onOpenModal: __experimental_openUserVerification,
+ openUIComponent: __experimental_openUserVerification,
+ ...optionsRef.current,
})(fetcherRef.current);
return [handler] as const;
- }, [__experimental_openUserVerification, fetcherRef.current]);
+ }, [__experimental_openUserVerification, fetcherRef.current, optionsRef.current]);
- // Keep fetcher ref in sync
+ // Keep fetcher and options ref in sync
useSafeLayoutEffect(() => {
fetcherRef.current = fetcher;
+ optionsRef.current = options;
});
return handleReverification;
diff --git a/packages/tailwindcss-transformer/package.json b/packages/tailwindcss-transformer/package.json
index 7c629c54809..bccbeb9dd47 100644
--- a/packages/tailwindcss-transformer/package.json
+++ b/packages/tailwindcss-transformer/package.json
@@ -35,6 +35,6 @@
"postcss-value-parser": "^4.2.0",
"recast": "^0.23.7",
"tailwindcss": "^3.4.3",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
}
}
diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json
index e99edee43c1..72315bfe74f 100644
--- a/packages/tanstack-start/package.json
+++ b/packages/tanstack-start/package.json
@@ -58,17 +58,17 @@
"@clerk/clerk-react": "workspace:*",
"@clerk/shared": "workspace:*",
"@clerk/types": "workspace:*",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
"@tanstack/react-router": "^1.81.9",
"@tanstack/start": "^1.81.9",
"@types/node": "^18.19.43",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"esbuild-plugin-file-path-extensions": "^2.1.2",
- "typescript": "*",
+ "typescript": "catalog:repo",
"vinxi": "^0.4.1"
},
"peerDependencies": {
diff --git a/packages/testing/package.json b/packages/testing/package.json
index 8cf0b092f5f..dab08e8d5c7 100644
--- a/packages/testing/package.json
+++ b/packages/testing/package.json
@@ -72,8 +72,8 @@
"@playwright/test": "^1.44.0",
"@types/node": "^18.19.33",
"cypress": "^13.9.0",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"peerDependencies": {
"@playwright/test": "^1",
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 7043b93b1ce..b5866bf6630 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -38,11 +38,11 @@
},
"dependencies": {
"@clerk/types": "workspace:*",
- "tslib": "2.4.1"
+ "tslib": "catalog:repo"
},
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
- "typescript": "*"
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/types/package.json b/packages/types/package.json
index f96e169fcd8..26b9f99cc9d 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -41,8 +41,8 @@
"devDependencies": {
"@clerk/eslint-config-custom": "workspace:*",
"@types/node": "^18.19.33",
- "tsup": "*",
- "typescript": "*"
+ "tsup": "catalog:repo",
+ "typescript": "catalog:repo"
},
"engines": {
"node": ">=18.17.0"
diff --git a/packages/types/src/displayConfig.ts b/packages/types/src/displayConfig.ts
index f10a8dbb9dd..2eab780801a 100644
--- a/packages/types/src/displayConfig.ts
+++ b/packages/types/src/displayConfig.ts
@@ -4,7 +4,7 @@ import type { OAuthStrategy } from './strategies';
export type PreferredSignInStrategy = 'password' | 'otp';
export type CaptchaWidgetType = 'smart' | 'invisible' | null;
-export type CaptchaProvider = 'hcaptcha' | 'turnstile';
+export type CaptchaProvider = 'turnstile';
export interface DisplayConfigJSON {
object: 'display_config';
@@ -21,6 +21,7 @@ export interface DisplayConfigJSON {
captcha_public_key_invisible: string | null;
captcha_provider: CaptchaProvider;
captcha_oauth_bypass: OAuthStrategy[] | null;
+ captcha_heartbeat?: boolean;
home_url: string;
instance_environment_type: string;
logo_image_url: string;
@@ -64,6 +65,7 @@ export interface DisplayConfigResource extends ClerkResource {
* This can also be used to bypass the captcha for a specific OAuth provider on a per-instance basis.
*/
captchaOauthBypass: OAuthStrategy[];
+ captchaHeartbeat: boolean;
homeUrl: string;
instanceEnvironmentType: string;
logoImageUrl: string;
diff --git a/packages/ui/theme-builder/package.json b/packages/ui/theme-builder/package.json
index 9ba0f550a54..cc5e14f618c 100644
--- a/packages/ui/theme-builder/package.json
+++ b/packages/ui/theme-builder/package.json
@@ -31,8 +31,8 @@
},
"devDependencies": {
"@types/node": "^20.12.12",
- "@types/react": "18.3.12",
- "@types/react-dom": "18.3.1",
+ "@types/react": "catalog:react",
+ "@types/react-dom": "catalog:react",
"eslint": "^8",
"eslint-config-next": "14.2.7",
"postcss": "^8.4.47",
diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json
index 060a71f420c..f599c66d36b 100644
--- a/packages/upgrade/package.json
+++ b/packages/upgrade/package.json
@@ -43,7 +43,7 @@
"jscodeshift": "^17.0.0",
"marked": "^11.1.1",
"meow": "^11.0.0",
- "react": "18.3.1",
+ "react": "catalog:react",
"read-pkg": "^9.0.1",
"semver-regex": "^4.0.5",
"temp-dir": "^3.0.0"
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 19c4a0a54b9..f528bb34ce5 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -57,7 +57,7 @@
"devDependencies": {
"@testing-library/vue": "^8.1.0",
"@vue.ts/tsx-auto-props": "^0.6.0",
- "typescript": "*",
+ "typescript": "catalog:repo",
"vue": "3.5.12"
},
"peerDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c98722711cd..8008c8d535f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,6 +4,31 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+catalogs:
+ react:
+ '@types/react':
+ specifier: 18.3.12
+ version: 18.3.12
+ '@types/react-dom':
+ specifier: 18.3.1
+ version: 18.3.1
+ react:
+ specifier: 18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: 18.3.1
+ version: 18.3.1
+ repo:
+ tslib:
+ specifier: 2.4.1
+ version: 2.4.1
+ tsup:
+ specifier: 8.3.5
+ version: 8.3.5
+ typescript:
+ specifier: 5.6.3
+ version: 5.6.3
+
overrides:
jest: 29.7.0
jest-snapshot-prettier: npm:prettier@^3
@@ -70,10 +95,10 @@ importers:
specifier: ^20.11.24
version: 20.17.5
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
'@vitest/coverage-v8':
specifier: 2.1.4
@@ -145,10 +170,10 @@ importers:
specifier: ^0.2.4
version: 0.2.4
react:
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
react-dom:
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1(react@18.3.1)
rimraf:
specifier: 6.0.1
@@ -163,8 +188,8 @@ importers:
specifier: ^29.0.3
version: 29.0.5(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3)
tsup:
- specifier: ^8.0.1
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
turbo:
specifier: ^2.0.14
version: 2.2.3
@@ -172,7 +197,7 @@ importers:
specifier: ^2.0.6
version: 2.2.3
typescript:
- specifier: ^5.6.3
+ specifier: catalog:repo
version: 5.6.3
verdaccio:
specifier: ^5.26.3
@@ -209,10 +234,10 @@ importers:
specifier: workspace:*
version: link:../eslint-config-custom
react:
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/backend:
@@ -230,7 +255,7 @@ importers:
specifier: 5.4.4
version: 5.4.4
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -252,10 +277,10 @@ importers:
specifier: ^4.1.5
version: 4.1.5
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
vitest-environment-miniflare:
specifier: 2.14.4
@@ -292,22 +317,22 @@ importers:
specifier: ^18.19.33
version: 18.19.64
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
'@types/webextension-polyfill':
specifier: ^0.10.7
version: 0.10.7
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
type-fest:
specifier: ^4.8.3
version: 4.26.1
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/clerk-js:
@@ -398,10 +423,10 @@ importers:
specifier: ^6.2.1
version: 6.5.1
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
'@types/webpack-dev-server':
specifier: ^4.7.2
@@ -422,7 +447,7 @@ importers:
specifier: ^9.3.0
version: 9.5.1(typescript@5.6.3)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.13)))
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
webpack-merge:
specifier: ^5.9.0
@@ -453,7 +478,7 @@ importers:
specifier: ^20.14.8
version: 20.17.5
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/elements:
@@ -465,7 +490,7 @@ importers:
specifier: workspace:*
version: link:../shared
'@clerk/types':
- specifier: ^4.34.0
+ specifier: workspace:*
version: link:../types
'@radix-ui/primitive':
specifier: ^1.1.0
@@ -502,10 +527,10 @@ importers:
specifier: ^18.19.33
version: 18.19.64
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
concurrently:
specifier: ^8.2.2
@@ -514,16 +539,16 @@ importers:
specifier: ^14.2.10
version: 14.2.16(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
type-fest:
specifier: ^4.9.0
version: 4.26.1
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/eslint-config-custom:
@@ -556,7 +581,7 @@ importers:
specifier: ^3.2.0
version: 3.2.0(@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.21.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/expo:
@@ -567,9 +592,6 @@ importers:
'@clerk/clerk-react':
specifier: workspace:*
version: link:../react
- '@clerk/expo-passkeys':
- specifier: workspace:*
- version: link:../expo-passkeys
'@clerk/shared':
specifier: workspace:*
version: link:../shared
@@ -589,12 +611,15 @@ importers:
specifier: 2.0.0
version: 2.0.0(react-native@0.73.9(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(react@18.3.1))
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
specifier: workspace:*
version: link:../eslint-config-custom
+ '@clerk/expo-passkeys':
+ specifier: workspace:*
+ version: link:../expo-passkeys
'@types/base-64':
specifier: ^1.0.2
version: 1.0.2
@@ -602,10 +627,10 @@ importers:
specifier: ^20.11.24
version: 20.17.5
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
expo-auth-session:
specifier: ^5.4.0
@@ -623,7 +648,7 @@ importers:
specifier: ^0.73.9
version: 0.73.9(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(react@18.3.1)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/expo-passkeys:
@@ -659,7 +684,7 @@ importers:
specifier: workspace:^
version: link:../types
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@types/express':
@@ -678,10 +703,10 @@ importers:
specifier: ^6.3.4
version: 6.3.4
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/fastify:
@@ -712,10 +737,10 @@ importers:
specifier: ^5.0.0
version: 5.0.0
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/localizations:
@@ -728,10 +753,10 @@ importers:
specifier: workspace:*
version: link:../eslint-config-custom
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/nextjs:
@@ -764,7 +789,7 @@ importers:
specifier: 0.0.1
version: 0.0.1
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -776,32 +801,26 @@ importers:
'@types/node':
specifier: ^18.19.33
version: 18.19.64
- '@types/react':
- specifier: 18.3.12
- version: 18.3.12
- '@types/react-dom':
- specifier: 18.3.1
- version: 18.3.1
next:
specifier: ^14.2.10
version: 14.2.16(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/nuxt:
dependencies:
'@clerk/backend':
- specifier: 1.17.0
+ specifier: workspace:*
version: link:../backend
'@clerk/shared':
- specifier: 2.15.0
+ specifier: workspace:*
version: link:../shared
'@clerk/types':
- specifier: 4.34.0
+ specifier: workspace:*
version: link:../types
'@clerk/vue':
- specifier: 0.0.5
+ specifier: workspace:*
version: link:../vue
'@nuxt/kit':
specifier: ^3.14.159
@@ -817,7 +836,7 @@ importers:
specifier: ^3.14.159
version: 3.14.159(@parcel/watcher@2.4.1)(@types/node@22.9.0)(eslint@8.49.0)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.26.0)(terser@5.31.1)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.31.1))(webpack-sources@3.2.3)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/react:
@@ -835,7 +854,7 @@ importers:
specifier: ^18 || ^19.0.0-0
version: 18.3.1(react@18.3.1)
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -850,17 +869,11 @@ importers:
'@types/node':
specifier: ^18.19.33
version: 18.19.64
- '@types/react':
- specifier: 18.3.12
- version: 18.3.12
- '@types/react-dom':
- specifier: 18.3.1
- version: 18.3.1
'@types/semver':
specifier: ^7.5.8
version: 7.5.8
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/remix:
@@ -890,7 +903,7 @@ importers:
specifier: ^6.0.0
version: 6.28.0(react@18.3.1)
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -909,13 +922,13 @@ importers:
specifier: ^18.19.33
version: 18.19.64
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/sdk-node:
@@ -930,7 +943,7 @@ importers:
specifier: workspace:*
version: link:../types
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -949,10 +962,10 @@ importers:
specifier: ^4.1.5
version: 4.1.5
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/shared:
@@ -1001,10 +1014,10 @@ importers:
specifier: 0.20.2
version: 0.20.2
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/tailwindcss-transformer:
@@ -1028,7 +1041,7 @@ importers:
specifier: ^3.4.3
version: 3.4.4(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
packages/tanstack-start:
@@ -1052,7 +1065,7 @@ importers:
specifier: '>=18 || >=19.0.0-beta'
version: 18.3.1(react@18.3.1)
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
@@ -1068,16 +1081,16 @@ importers:
specifier: ^18.19.43
version: 18.19.64
'@types/react':
- specifier: 18.3.12
+ specifier: catalog:react
version: 18.3.12
'@types/react-dom':
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
esbuild-plugin-file-path-extensions:
specifier: ^2.1.2
version: 2.1.2
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
vinxi:
specifier: ^0.4.1
@@ -1111,10 +1124,10 @@ importers:
specifier: ^13.9.0
version: 13.9.0
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/themes:
@@ -1123,14 +1136,14 @@ importers:
specifier: workspace:*
version: link:../types
tslib:
- specifier: 2.4.1
+ specifier: catalog:repo
version: 2.4.1
devDependencies:
'@clerk/eslint-config-custom':
specifier: workspace:*
version: link:../eslint-config-custom
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/types:
@@ -1146,10 +1159,10 @@ importers:
specifier: ^18.19.33
version: 18.19.64
tsup:
- specifier: '*'
- version: 8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3)
+ specifier: catalog:repo
+ version: 8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
packages/ui:
@@ -1255,7 +1268,7 @@ importers:
specifier: ^11.0.0
version: 11.0.0
react:
- specifier: 18.3.1
+ specifier: catalog:react
version: 18.3.1
read-pkg:
specifier: ^9.0.1
@@ -1296,7 +1309,7 @@ importers:
specifier: ^0.6.0
version: 0.6.0(rollup@4.26.0)(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)
typescript:
- specifier: '*'
+ specifier: catalog:repo
version: 5.6.3
vue:
specifier: 3.5.12
@@ -1613,10 +1626,10 @@ importers:
dependencies:
'@clerk/nextjs':
specifier: canary
- version: 6.4.1-canary.v20241119145452(next@15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 6.4.1-canary.v20241120214234(next@15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@clerk/themes':
specifier: canary
- version: 2.1.46-canary.v20241119145452
+ version: 2.1.46-canary.v20241120214234
next:
specifier: ^15
version: 15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -1784,13 +1797,13 @@ importers:
version: link:../../packages/types
'@remix-run/node':
specifier: ^2.0.0
- version: 2.14.0(typescript@5.6.3)
+ version: 2.14.0(typescript@5.3.3)
'@remix-run/react':
specifier: ^2.0.0
- version: 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ version: 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.3.3)
'@remix-run/serve':
specifier: ^2.0.0
- version: 2.14.0(typescript@5.6.3)
+ version: 2.14.0(typescript@5.3.3)
isbot:
specifier: ^3.6.5
version: 3.8.0
@@ -1803,10 +1816,10 @@ importers:
devDependencies:
'@remix-run/dev':
specifier: ^2.0.0
- version: 2.14.0(@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.14.0(typescript@5.6.3))(@types/node@22.9.0)(babel-plugin-macros@3.1.0)(terser@5.31.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.31.1))
+ version: 2.14.0(@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.3.3))(@remix-run/serve@2.14.0(typescript@5.3.3))(@types/node@22.9.0)(babel-plugin-macros@3.1.0)(terser@5.31.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3))(typescript@5.3.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.31.1))
'@remix-run/eslint-config':
specifier: ^2.0.0
- version: 2.14.0(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(react@18.3.1)(typescript@5.6.3)
+ version: 2.14.0(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(react@18.3.1)(typescript@5.3.3)
'@types/react':
specifier: ^18.0.27
version: 18.2.79
@@ -1818,7 +1831,7 @@ importers:
version: 8.49.0
typescript:
specifier: ^5
- version: 5.6.3
+ version: 5.3.3
playground/vite-react-ts:
dependencies:
@@ -1852,10 +1865,10 @@ importers:
version: 18.3.1
'@typescript-eslint/eslint-plugin':
specifier: ^5.59.0
- version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3)
+ version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3)
'@typescript-eslint/parser':
specifier: ^5.59.0
- version: 5.62.0(eslint@8.49.0)(typescript@5.6.3)
+ version: 5.62.0(eslint@8.49.0)(typescript@5.3.3)
'@vitejs/plugin-react':
specifier: ^4.0.0
version: 4.3.3(vite@4.5.5(@types/node@22.9.0)(terser@5.31.1))
@@ -1870,7 +1883,7 @@ importers:
version: 0.3.5(eslint@8.49.0)
typescript:
specifier: ^5.0.2
- version: 5.6.3
+ version: 5.3.3
vite:
specifier: ^4.3.9
version: 4.5.5(@types/node@22.9.0)(terser@5.31.1)
@@ -2803,27 +2816,27 @@ packages:
'@changesets/write@0.3.2':
resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==}
- '@clerk/backend@1.17.1-canary.v20241119145452':
- resolution: {integrity: sha512-oAF6mzK0LyNj8s1UNfdWe5YVqCUaksX8qnX6q+ySzuvEv5lVHHiCkD9ZDiwNmv6c2Y/1DJ2d3kbITHzXHanbpw==}
+ '@clerk/backend@1.17.1-canary.v20241120214234':
+ resolution: {integrity: sha512-/yrnzu1ymhJoWh1kxbmpE2vP2U8jkN+3v94ynwTTK6Kx8y4n0GUaqHFYV+fHQXv/te5iKmXgLgz5abdHhlbmCQ==}
engines: {node: '>=18.17.0'}
- '@clerk/clerk-react@5.16.1-canary.v20241119145452':
- resolution: {integrity: sha512-CRzoMe/OLQPc8jWKsrXzkJ6AdDc4fEFSw4mojFXoZmP48ZSl/kyzChk4E9Gry4T5SHq8JhHgRYUQLTluiPy7UA==}
+ '@clerk/clerk-react@5.16.1-canary.v20241120214234':
+ resolution: {integrity: sha512-B+ejRJwT8sc0VavVp9Ht/UfDc76zp5soz06LAWGaBKrV8sh3OtKVl//lYRWhrznyhab31aXtqMLbb4iVAKGx/A==}
engines: {node: '>=18.17.0'}
peerDependencies:
react: ^18 || ^19.0.0-0
react-dom: ^18 || ^19.0.0-0
- '@clerk/nextjs@6.4.1-canary.v20241119145452':
- resolution: {integrity: sha512-NPbCQeOXCKh2dOdUIfk/IsqrINOeOciyVlJiE2r4glvtrsJN8zll3e1TYmS9lN790Sy4WsCLZMWfnrdcuZLH/A==}
+ '@clerk/nextjs@6.4.1-canary.v20241120214234':
+ resolution: {integrity: sha512-WgH0Qx8ViXY1WB2c02LcLNcaeyohgXQWfo9Z138FAyJMYgIiksrPA78+ERUvfpjzTTTmkegH3Cy8Ohdn9sau5Q==}
engines: {node: '>=18.17.0'}
peerDependencies:
next: ^13.5.4 || ^14.0.3 || ^15.0.0
react: ^18 || ^19.0.0-0
react-dom: ^18 || ^19.0.0-0
- '@clerk/shared@2.15.1-canary.v20241119145452':
- resolution: {integrity: sha512-kjuK0tHXeHej8PNaojRZNe03T70pWsRSuIMCAtQR0/l53kXCBnGU65Fv23srsGl0yBx62dLvFUHnDmOEwgvxFA==}
+ '@clerk/shared@2.16.0-canary.v20241120214234':
+ resolution: {integrity: sha512-bEvwqkCqWuGryvOlyyeV3nznuHZb38kqPkdu1KEO4mmJOiYXgDNugrA1ihrKA+cTLHhzgZwDhMWwUk6chfUfCg==}
engines: {node: '>=18.17.0'}
peerDependencies:
react: ^18 || ^19.0.0-0
@@ -2834,12 +2847,12 @@ packages:
react-dom:
optional: true
- '@clerk/themes@2.1.46-canary.v20241119145452':
- resolution: {integrity: sha512-7fukfGK0o11ef8nKpMVJ/zhXciBe0QFmR3XJFg5U2wMi7MBEqMYTA3WaDgD076irnFcWy2TtMxiF+G2RyiENkg==}
+ '@clerk/themes@2.1.46-canary.v20241120214234':
+ resolution: {integrity: sha512-kEtExIuIwk2MoQHiGGWVW+cbU1Iy41kPTl7ILUrEsXzstOQC/r/pg4IyaAQ14/Xvn06rrmU4PKQadmQn2vYEFw==}
engines: {node: '>=18.17.0'}
- '@clerk/types@4.34.1-canary.v20241119145452':
- resolution: {integrity: sha512-YSQd1oLQ3MmKdJ7fL9vHjOaBKl1ybhrw+YKNdjrUx3Zpji1Rn6LEzj8qmny2vJFNw85dWH1Gu/bJTOfPeU7xQw==}
+ '@clerk/types@4.34.1-canary.v20241120214234':
+ resolution: {integrity: sha512-DPBk+dWMPNWac8fRuL4IllkohNl4Jy7/5CDcTRMmusOX6Q4q8x/9Nzy5oWRx6O01MgtKMt49aws96HokAdSWPw==}
engines: {node: '>=18.17.0'}
'@cloudflare/kv-asset-handler@0.1.3':
@@ -8645,11 +8658,11 @@ packages:
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
engines: {node: '>=18'}
- bundle-require@4.2.1:
- resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==}
+ bundle-require@5.0.0:
+ resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
peerDependencies:
- esbuild: '>=0.17'
+ esbuild: '>=0.18'
busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
@@ -14996,6 +15009,24 @@ packages:
ts-node:
optional: true
+ postcss-load-config@6.0.1:
+ resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ jiti: '>=1.21.0'
+ postcss: '>=8.0.9'
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ postcss:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
postcss-loader@6.2.1:
resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==}
engines: {node: '>= 12.13.0'}
@@ -17063,6 +17094,11 @@ packages:
engines: {node: '>=8'}
hasBin: true
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
sudo-prompt@8.2.5:
resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==}
@@ -17516,8 +17552,8 @@ packages:
resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
engines: {node: '>=0.6.x'}
- tsup@8.1.0:
- resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==}
+ tsup@8.3.5:
+ resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==}
engines: {node: '>=18'}
hasBin: true
peerDependencies:
@@ -20224,10 +20260,10 @@ snapshots:
human-id: 1.0.2
prettier: 2.8.8
- '@clerk/backend@1.17.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@clerk/backend@1.17.1-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@clerk/shared': 2.15.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@clerk/types': 4.34.1-canary.v20241119145452
+ '@clerk/shared': 2.16.0-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@clerk/types': 4.34.1-canary.v20241120214234
cookie: 0.7.0
snakecase-keys: 5.4.4
tslib: 2.4.1
@@ -20235,20 +20271,20 @@ snapshots:
- react
- react-dom
- '@clerk/clerk-react@5.16.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@clerk/clerk-react@5.16.1-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@clerk/shared': 2.15.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@clerk/types': 4.34.1-canary.v20241119145452
+ '@clerk/shared': 2.16.0-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@clerk/types': 4.34.1-canary.v20241120214234
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
tslib: 2.4.1
- '@clerk/nextjs@6.4.1-canary.v20241119145452(next@15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@clerk/nextjs@6.4.1-canary.v20241120214234(next@15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@clerk/backend': 1.17.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@clerk/clerk-react': 5.16.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@clerk/shared': 2.15.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@clerk/types': 4.34.1-canary.v20241119145452
+ '@clerk/backend': 1.17.1-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@clerk/clerk-react': 5.16.1-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@clerk/shared': 2.16.0-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@clerk/types': 4.34.1-canary.v20241120214234
crypto-js: 4.2.0
ezheaders: 0.1.0(next@15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
next: 15.0.3(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -20257,9 +20293,9 @@ snapshots:
server-only: 0.0.1
tslib: 2.4.1
- '@clerk/shared@2.15.1-canary.v20241119145452(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@clerk/shared@2.16.0-canary.v20241120214234(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@clerk/types': 4.34.1-canary.v20241119145452
+ '@clerk/types': 4.34.1-canary.v20241120214234
dequal: 2.0.3
glob-to-regexp: 0.4.1
js-cookie: 3.0.5
@@ -20269,12 +20305,12 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@clerk/themes@2.1.46-canary.v20241119145452':
+ '@clerk/themes@2.1.46-canary.v20241120214234':
dependencies:
- '@clerk/types': 4.34.1-canary.v20241119145452
+ '@clerk/types': 4.34.1-canary.v20241120214234
tslib: 2.4.1
- '@clerk/types@4.34.1-canary.v20241119145452':
+ '@clerk/types@4.34.1-canary.v20241120214234':
dependencies:
csstype: 3.1.1
@@ -24796,7 +24832,7 @@ snapshots:
- ts-node
- utf-8-validate
- '@remix-run/dev@2.14.0(@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.14.0(typescript@5.6.3))(@types/node@22.9.0)(babel-plugin-macros@3.1.0)(terser@5.31.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.31.1))':
+ '@remix-run/dev@2.14.0(@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.3.3))(@remix-run/serve@2.14.0(typescript@5.3.3))(@types/node@22.9.0)(babel-plugin-macros@3.1.0)(terser@5.31.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3))(typescript@5.3.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.31.1))':
dependencies:
'@babel/core': 7.26.0
'@babel/generator': 7.26.2
@@ -24808,10 +24844,10 @@ snapshots:
'@babel/types': 7.26.0
'@mdx-js/mdx': 2.3.0
'@npmcli/package-json': 4.0.1
- '@remix-run/node': 2.14.0(typescript@5.6.3)
- '@remix-run/react': 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@remix-run/node': 2.14.0(typescript@5.3.3)
+ '@remix-run/react': 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.3.3)
'@remix-run/router': 1.21.0
- '@remix-run/server-runtime': 2.14.0(typescript@5.6.3)
+ '@remix-run/server-runtime': 2.14.0(typescript@5.3.3)
'@types/mdx': 2.0.13
'@vanilla-extract/integration': 6.5.0(@types/node@22.9.0)(babel-plugin-macros@3.1.0)(terser@5.31.1)
arg: 5.0.2
@@ -24840,7 +24876,7 @@ snapshots:
pidtree: 0.6.0
postcss: 8.4.49
postcss-discard-duplicates: 5.1.0(postcss@8.4.49)
- postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))
+ postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3))
postcss-modules: 6.0.1(postcss@8.4.49)
prettier: 2.8.8
pretty-ms: 7.0.1
@@ -24851,12 +24887,12 @@ snapshots:
set-cookie-parser: 2.6.0
tar-fs: 2.1.1
tsconfig-paths: 4.2.0
- valibot: 0.41.0(typescript@5.6.3)
+ valibot: 0.41.0(typescript@5.3.3)
vite-node: 1.6.0(@types/node@22.9.0)(terser@5.31.1)
ws: 7.5.10
optionalDependencies:
- '@remix-run/serve': 2.14.0(typescript@5.6.3)
- typescript: 5.6.3
+ '@remix-run/serve': 2.14.0(typescript@5.3.3)
+ typescript: 5.3.3
vite: 5.4.10(@types/node@22.9.0)(terser@5.31.1)
transitivePeerDependencies:
- '@types/node'
@@ -24901,28 +24937,28 @@ snapshots:
- jest
- supports-color
- '@remix-run/eslint-config@2.14.0(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(react@18.3.1)(typescript@5.6.3)':
+ '@remix-run/eslint-config@2.14.0(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(react@18.3.1)(typescript@5.3.3)':
dependencies:
'@babel/core': 7.26.0
'@babel/eslint-parser': 7.22.15(@babel/core@7.26.0)(eslint@8.49.0)
'@babel/preset-react': 7.25.9(@babel/core@7.26.0)
'@rushstack/eslint-patch': 1.5.1
- '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3)
- '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.6.3)
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
eslint: 8.49.0
eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
- eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
- eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.3.3)
eslint-plugin-jest-dom: 4.0.3(eslint@8.49.0)
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.49.0)
eslint-plugin-node: 11.1.0(eslint@8.49.0)
eslint-plugin-react: 7.37.2(eslint@8.49.0)
eslint-plugin-react-hooks: 4.6.0(eslint@8.49.0)
- eslint-plugin-testing-library: 5.11.1(eslint@8.49.0)(typescript@5.6.3)
+ eslint-plugin-testing-library: 5.11.1(eslint@8.49.0)(typescript@5.3.3)
react: 18.3.1
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.3.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- jest
@@ -24936,12 +24972,12 @@ snapshots:
typescript: 4.9.5
optional: true
- '@remix-run/express@2.14.0(express@4.21.1)(typescript@5.6.3)':
+ '@remix-run/express@2.14.0(express@4.21.1)(typescript@5.3.3)':
dependencies:
- '@remix-run/node': 2.14.0(typescript@5.6.3)
+ '@remix-run/node': 2.14.0(typescript@5.3.3)
express: 4.21.1
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.3.3
'@remix-run/node@2.14.0(typescript@4.9.5)':
dependencies:
@@ -24955,9 +24991,9 @@ snapshots:
optionalDependencies:
typescript: 4.9.5
- '@remix-run/node@2.14.0(typescript@5.6.3)':
+ '@remix-run/node@2.14.0(typescript@5.3.3)':
dependencies:
- '@remix-run/server-runtime': 2.14.0(typescript@5.6.3)
+ '@remix-run/server-runtime': 2.14.0(typescript@5.3.3)
'@remix-run/web-fetch': 4.4.2
'@web3-storage/multipart-parser': 1.0.0
cookie-signature: 1.2.2
@@ -24965,7 +25001,7 @@ snapshots:
stream-slice: 0.1.2
undici: 6.21.0
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.3.3
'@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@4.9.5)':
dependencies:
@@ -24977,6 +25013,16 @@ snapshots:
optionalDependencies:
typescript: 4.9.5
+ '@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.3.3)':
+ dependencies:
+ '@remix-run/router': 1.9.0
+ '@remix-run/server-runtime': 2.0.0(typescript@5.3.3)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router-dom: 6.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ typescript: 5.3.3
+
'@remix-run/react@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@remix-run/router': 1.9.0
@@ -25006,10 +25052,10 @@ snapshots:
- typescript
optional: true
- '@remix-run/serve@2.14.0(typescript@5.6.3)':
+ '@remix-run/serve@2.14.0(typescript@5.3.3)':
dependencies:
- '@remix-run/express': 2.14.0(express@4.21.1)(typescript@5.6.3)
- '@remix-run/node': 2.14.0(typescript@5.6.3)
+ '@remix-run/express': 2.14.0(express@4.21.1)(typescript@5.3.3)
+ '@remix-run/node': 2.14.0(typescript@5.3.3)
chokidar: 3.6.0
compression: 1.7.4
express: 4.21.1
@@ -25032,6 +25078,18 @@ snapshots:
optionalDependencies:
typescript: 4.9.5
+ '@remix-run/server-runtime@2.0.0(typescript@5.3.3)':
+ dependencies:
+ '@remix-run/router': 1.9.0
+ '@types/cookie': 0.4.1
+ '@web3-storage/multipart-parser': 1.0.0
+ cookie: 0.4.2
+ set-cookie-parser: 2.6.0
+ source-map: 0.7.4
+ type-fest: 4.26.1
+ optionalDependencies:
+ typescript: 5.3.3
+
'@remix-run/server-runtime@2.0.0(typescript@5.6.3)':
dependencies:
'@remix-run/router': 1.9.0
@@ -25056,6 +25114,18 @@ snapshots:
optionalDependencies:
typescript: 4.9.5
+ '@remix-run/server-runtime@2.14.0(typescript@5.3.3)':
+ dependencies:
+ '@remix-run/router': 1.21.0
+ '@types/cookie': 0.6.0
+ '@web3-storage/multipart-parser': 1.0.0
+ cookie: 0.6.0
+ set-cookie-parser: 2.6.0
+ source-map: 0.7.4
+ turbo-stream: 2.4.0
+ optionalDependencies:
+ typescript: 5.3.3
+
'@remix-run/server-runtime@2.14.0(typescript@5.6.3)':
dependencies:
'@remix-run/router': 1.21.0
@@ -26465,6 +26535,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.8.1
+ '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ debug: 4.3.7(supports-color@8.1.1)
+ eslint: 8.49.0
+ graphemer: 1.4.0
+ ignore: 5.2.4
+ natural-compare-lite: 1.4.0
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3)':
dependencies:
'@eslint-community/regexpp': 4.8.1
@@ -26536,6 +26625,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3)
+ debug: 4.3.7(supports-color@8.1.1)
+ eslint: 8.49.0
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3)':
dependencies:
'@typescript-eslint/scope-manager': 5.62.0
@@ -26588,6 +26689,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ debug: 4.3.7(supports-color@8.1.1)
+ eslint: 8.49.0
+ tsutils: 3.21.0(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@5.6.3)':
dependencies:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
@@ -26646,6 +26759,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.3.7(supports-color@8.1.1)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
'@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)':
dependencies:
'@typescript-eslint/types': 5.62.0
@@ -26704,6 +26831,21 @@ snapshots:
- supports-color
- typescript
+ '@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@5.3.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0)
+ '@types/json-schema': 7.0.12
+ '@types/semver': 7.5.8
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3)
+ eslint: 8.49.0
+ eslint-scope: 5.1.1
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
'@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@5.6.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0)
@@ -28464,9 +28606,9 @@ snapshots:
dependencies:
run-applescript: 7.0.0
- bundle-require@4.2.1(esbuild@0.21.5):
+ bundle-require@5.0.0(esbuild@0.24.0):
dependencies:
- esbuild: 0.21.5
+ esbuild: 0.24.0
load-tsconfig: 0.2.5
busboy@1.6.0:
@@ -30439,7 +30581,7 @@ snapshots:
confusing-browser-globals: 1.0.11
eslint: 8.49.0
eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.49.0)
- eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)
eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3)
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.49.0)
eslint-plugin-react: 7.37.2(eslint@8.49.0)
@@ -30509,13 +30651,13 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0):
+ eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0):
dependencies:
debug: 4.3.7(supports-color@8.1.1)
enhanced-resolve: 5.17.1
eslint: 8.49.0
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
- eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
fast-glob: 3.3.2
get-tsconfig: 4.8.0
is-core-module: 2.13.0
@@ -30576,25 +30718,35 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
+ eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
dependencies:
debug: 3.2.7(supports-color@5.5.0)
optionalDependencies:
- '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.6.3)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
eslint: 8.49.0
eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
+ dependencies:
+ debug: 3.2.7(supports-color@5.5.0)
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ eslint: 8.49.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
+ eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.49.0):
dependencies:
debug: 3.2.7(supports-color@5.5.0)
optionalDependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.6.3)
eslint: 8.49.0
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
transitivePeerDependencies:
- supports-color
@@ -30683,7 +30835,34 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
+ eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0):
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.3
+ array.prototype.flat: 1.3.1
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7(supports-color@5.5.0)
+ doctrine: 2.1.0
+ eslint: 8.49.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ has: 1.0.3
+ is-core-module: 2.13.0
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.1
+ object.values: 1.2.0
+ semver: 6.3.1
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.3
@@ -30693,7 +30872,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.49.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.49.0)
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.49.0)
has: 1.0.3
is-core-module: 2.13.0
is-glob: 4.0.3
@@ -30766,12 +30945,12 @@ snapshots:
- supports-color
- typescript
- eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3):
+ eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(jest@29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.3.3):
dependencies:
- '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.6.3)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
eslint: 8.49.0
optionalDependencies:
- '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.6.3))(eslint@8.49.0)(typescript@5.6.3)
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.3))(eslint@8.49.0)(typescript@5.3.3)
jest: 29.7.0(@types/node@20.17.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3))
transitivePeerDependencies:
- supports-color
@@ -30923,6 +31102,14 @@ snapshots:
- supports-color
- typescript
+ eslint-plugin-testing-library@5.11.1(eslint@8.49.0)(typescript@5.3.3):
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.3)
+ eslint: 8.49.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
eslint-plugin-testing-library@5.11.1(eslint@8.49.0)(typescript@5.6.3):
dependencies:
'@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.6.3)
@@ -37052,29 +37239,29 @@ snapshots:
postcss: 8.4.49
postcss-value-parser: 4.2.0
- postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3)):
+ postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)):
dependencies:
lilconfig: 2.1.0
yaml: 2.6.0
optionalDependencies:
postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3)
+ ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)
- postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)):
+ postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5)):
dependencies:
lilconfig: 2.1.0
yaml: 2.6.0
optionalDependencies:
postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3)
+ ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5)
- postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5)):
+ postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3)):
dependencies:
lilconfig: 2.1.0
yaml: 2.6.0
optionalDependencies:
postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5)
+ ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3)
postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3)):
dependencies:
@@ -37084,6 +37271,15 @@ snapshots:
postcss: 8.4.49
ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3)
+ postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.0):
+ dependencies:
+ lilconfig: 3.1.2
+ optionalDependencies:
+ jiti: 2.4.0
+ postcss: 8.4.49
+ tsx: 4.19.2
+ yaml: 2.6.0
+
postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.13))):
dependencies:
cosmiconfig: 7.1.0
@@ -39663,6 +39859,16 @@ snapshots:
pirates: 4.0.6
ts-interface-checker: 0.1.13
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.4.5
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
sudo-prompt@8.2.5: {}
sudo-prompt@9.1.1: {}
@@ -39805,7 +40011,7 @@ snapshots:
postcss-nested: 6.0.1(postcss@8.4.49)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
- sucrase: 3.34.0
+ sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
@@ -39832,7 +40038,7 @@ snapshots:
postcss-nested: 6.0.1(postcss@8.4.49)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
- sucrase: 3.34.0
+ sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
@@ -40165,28 +40371,27 @@ snapshots:
optionalDependencies:
'@swc/core': 1.9.2(@swc/helpers@0.5.13)
- ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3):
+ ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.0.4):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 18.19.64
+ '@types/node': 20.17.5
acorn: 8.14.0
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.6.3
+ typescript: 5.0.4
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
'@swc/core': 1.9.2(@swc/helpers@0.5.13)
- optional: true
- ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.0.4):
+ ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
@@ -40200,34 +40405,35 @@ snapshots:
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.0.4
+ typescript: 5.6.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
'@swc/core': 1.9.2(@swc/helpers@0.5.13)
+ optional: true
- ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3):
+ ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 20.17.5
+ '@types/node': 22.9.0
acorn: 8.14.0
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.6.3
+ typescript: 4.9.5
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
'@swc/core': 1.9.2(@swc/helpers@0.5.13)
optional: true
- ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@4.9.5):
+ ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.3.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
@@ -40241,7 +40447,7 @@ snapshots:
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 4.9.5
+ typescript: 5.3.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
@@ -40294,77 +40500,33 @@ snapshots:
tsscmp@1.0.6: {}
- tsup@8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))(typescript@5.6.3):
- dependencies:
- bundle-require: 4.2.1(esbuild@0.21.5)
- cac: 6.7.14
- chokidar: 3.6.0
- debug: 4.3.7(supports-color@8.1.1)
- esbuild: 0.21.5
- execa: 5.1.1
- globby: 11.1.0
- joycon: 3.1.1
- postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@18.19.64)(typescript@5.6.3))
- resolve-from: 5.0.0
- rollup: 4.26.0
- source-map: 0.8.0-beta.0
- sucrase: 3.34.0
- tree-kill: 1.2.2
- optionalDependencies:
- '@swc/core': 1.9.2(@swc/helpers@0.5.13)
- postcss: 8.4.49
- typescript: 5.6.3
- transitivePeerDependencies:
- - supports-color
- - ts-node
-
- tsup@8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3))(typescript@5.6.3):
- dependencies:
- bundle-require: 4.2.1(esbuild@0.21.5)
- cac: 6.7.14
- chokidar: 3.6.0
- debug: 4.3.7(supports-color@8.1.1)
- esbuild: 0.21.5
- execa: 5.1.1
- globby: 11.1.0
- joycon: 3.1.1
- postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@20.17.5)(typescript@5.6.3))
- resolve-from: 5.0.0
- rollup: 4.26.0
- source-map: 0.8.0-beta.0
- sucrase: 3.34.0
- tree-kill: 1.2.2
- optionalDependencies:
- '@swc/core': 1.9.2(@swc/helpers@0.5.13)
- postcss: 8.4.49
- typescript: 5.6.3
- transitivePeerDependencies:
- - supports-color
- - ts-node
-
- tsup@8.1.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))(typescript@5.6.3):
+ tsup@8.3.5(@swc/core@1.9.2(@swc/helpers@0.5.13))(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0):
dependencies:
- bundle-require: 4.2.1(esbuild@0.21.5)
+ bundle-require: 5.0.0(esbuild@0.24.0)
cac: 6.7.14
- chokidar: 3.6.0
+ chokidar: 4.0.1
+ consola: 3.2.3
debug: 4.3.7(supports-color@8.1.1)
- esbuild: 0.21.5
- execa: 5.1.1
- globby: 11.1.0
+ esbuild: 0.24.0
joycon: 3.1.1
- postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.13))(@types/node@22.9.0)(typescript@5.6.3))
+ picocolors: 1.1.1
+ postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.0)
resolve-from: 5.0.0
rollup: 4.26.0
source-map: 0.8.0-beta.0
- sucrase: 3.34.0
+ sucrase: 3.35.0
+ tinyexec: 0.3.1
+ tinyglobby: 0.2.10
tree-kill: 1.2.2
optionalDependencies:
'@swc/core': 1.9.2(@swc/helpers@0.5.13)
postcss: 8.4.49
typescript: 5.6.3
transitivePeerDependencies:
+ - jiti
- supports-color
- - ts-node
+ - tsx
+ - yaml
tsutils@3.21.0(typescript@4.8.4):
dependencies:
@@ -40376,6 +40538,11 @@ snapshots:
tslib: 1.14.1
typescript: 4.9.5
+ tsutils@3.21.0(typescript@5.3.3):
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.3.3
+
tsutils@3.21.0(typescript@5.6.3):
dependencies:
tslib: 1.14.1
@@ -40930,9 +41097,9 @@ snapshots:
optionalDependencies:
typescript: 4.9.5
- valibot@0.41.0(typescript@5.6.3):
+ valibot@0.41.0(typescript@5.3.3):
optionalDependencies:
- typescript: 5.6.3
+ typescript: 5.3.3
valid-url@1.0.9: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index b425d4e8ea5..1243185e6ec 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,17 @@
packages:
- 'packages/*'
- 'playground/*'
+
+catalogs:
+ # Can be referenced through "catalog:react"
+ react:
+ react: 18.3.1
+ react-dom: 18.3.1
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ # Can be referenced through "catalog:repo"
+ repo:
+ tslib: 2.4.1
+ tsup: 8.3.5
+ typescript: 5.6.3
diff --git a/turbo.json b/turbo.json
index 50413a4b4eb..d6503add929 100644
--- a/turbo.json
+++ b/turbo.json
@@ -6,9 +6,11 @@
"ui": "tui",
"globalDependencies": [
".github/.cache-version",
+ ".npmrc",
"jest.*.ts",
"package.json",
- "package-lock.json",
+ "pnpm-lock.yaml",
+ "pnpm-workspace.yaml",
"tsconfig.json",
"tsconfig.*.json",
"scripts/subpath-workaround.mjs"
@@ -218,6 +220,12 @@
"env": ["CLEANUP", "DEBUG", "E2E_*", "INTEGRATION_INSTANCE_KEYS"],
"inputs": ["integration/**"],
"outputLogs": "new-only"
+ },
+ "//#test:integration:nuxt": {
+ "dependsOn": ["@clerk/clerk-js#build", "@clerk/vue#build", "@clerk/nuxt#build"],
+ "env": ["CLEANUP", "DEBUG", "E2E_*", "INTEGRATION_INSTANCE_KEYS"],
+ "inputs": ["integration/**"],
+ "outputLogs": "new-only"
}
}
}