diff --git a/.changeset/stupid-cherries-cry.md b/.changeset/angry-points-attack.md similarity index 100% rename from .changeset/stupid-cherries-cry.md rename to .changeset/angry-points-attack.md diff --git a/.changeset/young-llamas-prove.md b/.changeset/breezy-plums-wait.md similarity index 100% rename from .changeset/young-llamas-prove.md rename to .changeset/breezy-plums-wait.md diff --git a/.changeset/friendly-nails-nail.md b/.changeset/friendly-nails-nail.md new file mode 100644 index 0000000000..c41a2bc895 --- /dev/null +++ b/.changeset/friendly-nails-nail.md @@ -0,0 +1,5 @@ +--- +"@clerk/localizations": patch +--- + +pl-PL localization updates diff --git a/.changeset/real-boats-promise.md b/.changeset/real-boats-promise.md new file mode 100644 index 0000000000..8769bcdb66 --- /dev/null +++ b/.changeset/real-boats-promise.md @@ -0,0 +1,5 @@ +--- +"@clerk/upgrade": minor +--- + +Enhancing error handling throughout the SDK upgrade flow diff --git a/.changeset/shiny-files-smash.md b/.changeset/shiny-files-smash.md deleted file mode 100644 index 82d6ac164b..0000000000 --- a/.changeset/shiny-files-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Update `de-DE` translation to be GDPR-compliant diff --git a/.changeset/twelve-frogs-study.md b/.changeset/twelve-frogs-study.md new file mode 100644 index 0000000000..4935d9343f --- /dev/null +++ b/.changeset/twelve-frogs-study.md @@ -0,0 +1,5 @@ +--- +"@clerk/express": patch +--- + +Expose `AuthObject` type helper diff --git a/.changeset/twenty-kids-speak.md b/.changeset/twenty-kids-speak.md deleted file mode 100644 index 719a55d7f4..0000000000 --- a/.changeset/twenty-kids-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/clerk-js": patch ---- - -Updates webpack to address CVE-2024-43788. diff --git a/.changeset/unlucky-crabs-hunt.md b/.changeset/unlucky-crabs-hunt.md deleted file mode 100644 index 28a249609e..0000000000 --- a/.changeset/unlucky-crabs-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": minor ---- - -Add be-BY translation diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08d7eba2d9..a195c02992 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,7 +115,7 @@ jobs: run: | if [ "${{ matrix.node-version }}" == "18" ]; then echo "Running tests on Node 18 only for packages with LTS support." - npx turbo test $TURBO_ARGS --filter="@clerk/astro" --filter="@clerk/backend" --filter="@clerk/express" --filter="@clerk/nextjs" --filter="@clerk/clerk-react" --filter="@clerk/fastify" --filter="@clerk/clerk-sdk-node" --filter="@clerk/shared" --filter="@clerk/remix" --filter="@clerk/tanstack-start" --filter="@clerk/elements" + npx turbo test $TURBO_ARGS --filter="@clerk/astro" --filter="@clerk/backend" --filter="@clerk/express" --filter="@clerk/nextjs" --filter="@clerk/clerk-react" --filter="@clerk/clerk-sdk-node" --filter="@clerk/shared" --filter="@clerk/remix" --filter="@clerk/tanstack-start" --filter="@clerk/elements" else echo "Running tests for all packages on Node 20." npx turbo test $TURBO_ARGS diff --git a/.github/workflows/major-version-check.yml b/.github/workflows/major-version-check.yml index aeda33289b..b35dddf32a 100644 --- a/.github/workflows/major-version-check.yml +++ b/.github/workflows/major-version-check.yml @@ -1,6 +1,7 @@ name: Major Version Check on: + workflow_dispatch: pull_request: types: [opened, edited, synchronize] issue_comment: @@ -20,7 +21,7 @@ jobs: uses: actions/github-script@v7 with: script: | - const prNumber = context.payload.pull_request.number; + const prNumber = context.payload?.pull_request?.number || context.payload?.issue?.number; // Get list of files changed in the PR const { data: files } = await github.rest.pulls.listFiles({ @@ -29,6 +30,18 @@ jobs: pull_number: prNumber, }); + let pullRequest = context.payload.pull_request; + + if (!pullRequest) { + // Fetch the pull request data + const pullRequestData = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + pullRequest = pullRequestData.data; + } + // Check if any changeset files indicate a major bump let hasMajorChangeset = false; for (const file of files) { @@ -38,7 +51,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, path: file.filename, - ref: context.payload.pull_request.head.sha, + ref: pullRequest.head.sha, }); const content = Buffer.from(changesetContent.content, changesetContent.encoding).toString(); @@ -58,7 +71,7 @@ jobs: uses: actions/github-script@v7 with: script: | - const prNumber = context.payload.pull_request.number; + const prNumber = context.payload?.pull_request?.number || context.payload?.issue?.number; const org = context.repo.owner; // Get all comments on the PR diff --git a/.prettierrc b/.prettierrc index f6b714300b..bcb1ab38ed 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,12 +1,12 @@ { - "printWidth": 120, - "singleAttributePerLine": true, "arrowParens": "avoid", "bracketSpacing": true, "jsxSingleQuote": true, + "plugins": ["prettier-plugin-packagejson", "prettier-plugin-tailwindcss"], + "printWidth": 120, "semi": true, + "singleAttributePerLine": true, "singleQuote": true, "tabWidth": 2, - "trailingComma": "all", - "plugins": ["prettier-plugin-tailwindcss"] + "trailingComma": "all" } diff --git a/README.md b/README.md index 0aeac9ce9c..a7389aeb60 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,11 @@ Would you like to work on Open Source software and help maintain this repository This repository contains the SDKs for environment/platforms that Clerk supports. For example, if you want to use Clerk with Node.js you can install: ```sh -npm install @clerk/clerk-sdk-node +npm install @clerk/backend # or -yarn add @clerk/clerk-sdk-node +yarn add @clerk/backend # or -pnpm add @clerk/clerk-sdk-node +pnpm add @clerk/backend ``` ## πŸŽ“ Learning Clerk diff --git a/integration/templates/astro-hybrid/package.json b/integration/templates/astro-hybrid/package.json index e483d2dfdb..310e6cb42e 100644 --- a/integration/templates/astro-hybrid/package.json +++ b/integration/templates/astro-hybrid/package.json @@ -1,18 +1,18 @@ { "name": "astro-clerk-hybrid-playground", - "type": "module", "version": "0.0.1", + "type": "module", "scripts": { - "dev": "astro dev", - "start": "astro dev --port $PORT", + "astro": "astro", "build": "astro check && astro build", + "dev": "astro dev", "preview": "astro preview --port $PORT", - "astro": "astro" + "start": "astro dev --port $PORT" }, "dependencies": { "@astrojs/check": "^0.9.4", - "@astrojs/react": "^3.6.2", "@astrojs/node": "^8.3.4", + "@astrojs/react": "^3.6.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "astro": "^4.15.11", diff --git a/integration/templates/astro-node/package.json b/integration/templates/astro-node/package.json index 5d130bbbbd..3749e0d426 100644 --- a/integration/templates/astro-node/package.json +++ b/integration/templates/astro-node/package.json @@ -1,19 +1,19 @@ { "name": "astro-clerk-playground", - "type": "module", "version": "0.0.1", + "type": "module", "scripts": { - "dev": "astro dev", - "start": "astro dev --port $PORT", + "astro": "astro", "build": "astro check && astro build", + "dev": "astro dev", "preview": "astro preview --port $PORT", - "astro": "astro" + "start": "astro dev --port $PORT" }, "dependencies": { "@astrojs/check": "^0.9.4", + "@astrojs/node": "^8.3.4", "@astrojs/react": "^3.6.2", "@astrojs/tailwind": "^5.1.1", - "@astrojs/node": "^8.3.4", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "astro": "^4.15.11", diff --git a/integration/templates/astro-node/src/layouts/ViewTransitionsLayout.astro b/integration/templates/astro-node/src/layouts/ViewTransitionsLayout.astro new file mode 100644 index 0000000000..a01199898b --- /dev/null +++ b/integration/templates/astro-node/src/layouts/ViewTransitionsLayout.astro @@ -0,0 +1,27 @@ +--- +import { ViewTransitions } from 'astro:transitions'; + +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + {title} + + + +
+ +
+ + diff --git a/integration/templates/astro-node/src/pages/transitions/index.astro b/integration/templates/astro-node/src/pages/transitions/index.astro new file mode 100644 index 0000000000..a9465f5eb4 --- /dev/null +++ b/integration/templates/astro-node/src/pages/transitions/index.astro @@ -0,0 +1,15 @@ +--- +import { SignedIn, SignedOut, UserButton } from "@clerk/astro/components"; +import Layout from "../../layouts/ViewTransitionsLayout.astro"; +--- + + +
+ + Sign in + + + + +
+
diff --git a/integration/templates/astro-node/src/pages/transitions/sign-in.astro b/integration/templates/astro-node/src/pages/transitions/sign-in.astro new file mode 100644 index 0000000000..5afdd5a348 --- /dev/null +++ b/integration/templates/astro-node/src/pages/transitions/sign-in.astro @@ -0,0 +1,10 @@ +--- +import { SignIn } from "@clerk/astro/components"; +import Layout from "../../layouts/ViewTransitionsLayout.astro"; +--- + + +
+ +
+
diff --git a/integration/templates/expo-web/package.json b/integration/templates/expo-web/package.json index 297aacd58c..75e11a2c66 100644 --- a/integration/templates/expo-web/package.json +++ b/integration/templates/expo-web/package.json @@ -1,12 +1,13 @@ { "name": "expo-web", - "main": "expo-router/entry", "version": "1.0.0", + "private": true, + "main": "expo-router/entry", "scripts": { - "dev": "RCT_METRO_PORT=$PORT expo start --web --port $PORT", "build": "expo export -p web", - "start": "npx serve dist --single", - "lint": "expo lint" + "dev": "RCT_METRO_PORT=$PORT expo start --web --port $PORT", + "lint": "expo lint", + "start": "npx serve dist --single" }, "jest": { "preset": "jest-expo" @@ -30,8 +31,8 @@ "react-native-reanimated": "~3.10.1", "react-native-safe-area-context": "4.10.9", "react-native-screens": "~3.31.1", - "react-native-web": "~0.19.6", - "react-native-url-polyfill": "^2.0.0" + "react-native-url-polyfill": "^2.0.0", + "react-native-web": "~0.19.6" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -42,6 +43,5 @@ "jest-expo": "~51.0.3", "react-test-renderer": "18.2.0", "typescript": "~5.6.2" - }, - "private": true + } } diff --git a/integration/templates/next-app-router/src/app/api/me/route.ts b/integration/templates/next-app-router/src/app/api/me/route.ts index c6088c6a97..8ae059dff0 100644 --- a/integration/templates/next-app-router/src/app/api/me/route.ts +++ b/integration/templates/next-app-router/src/app/api/me/route.ts @@ -1,6 +1,6 @@ import { auth } from '@clerk/nextjs/server'; -export function GET() { - const { userId } = auth(); +export async function GET() { + const { userId } = await auth(); return new Response(JSON.stringify({ userId })); } diff --git a/integration/templates/next-app-router/src/app/api/settings/route.ts b/integration/templates/next-app-router/src/app/api/settings/route.ts index 62553e05ef..8e6d46017e 100644 --- a/integration/templates/next-app-router/src/app/api/settings/route.ts +++ b/integration/templates/next-app-router/src/app/api/settings/route.ts @@ -1,6 +1,6 @@ import { auth } from '@clerk/nextjs/server'; -export function GET() { - const { userId } = auth().protect(has => has({ role: 'admin' }) || has({ role: 'org:editor' })); +export async function GET() { + const { userId } = await auth.protect((has: any) => has({ role: 'admin' }) || has({ role: 'org:editor' })); return new Response(JSON.stringify({ userId })); } diff --git a/integration/templates/next-app-router/src/app/csp/page.tsx b/integration/templates/next-app-router/src/app/csp/page.tsx index 803218da79..fec6f7b09c 100644 --- a/integration/templates/next-app-router/src/app/csp/page.tsx +++ b/integration/templates/next-app-router/src/app/csp/page.tsx @@ -1,10 +1,12 @@ import { headers } from 'next/headers'; import { ClerkLoaded } from '@clerk/nextjs'; -export default function CSPPage() { +export default async function CSPPage() { + const cspHeader = await headers().get('Content-Security-Policy'); + return (
- CSP:
{headers().get('Content-Security-Policy')}
+ CSP:
{cspHeader}

clerk loaded

diff --git a/integration/templates/next-app-router/src/app/only-admin/page.tsx b/integration/templates/next-app-router/src/app/only-admin/page.tsx new file mode 100644 index 0000000000..a2817c4a6d --- /dev/null +++ b/integration/templates/next-app-router/src/app/only-admin/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return
User is admin
; +} diff --git a/integration/templates/next-app-router/src/app/organizations-by-id/[id]/page.tsx b/integration/templates/next-app-router/src/app/organizations-by-id/[id]/page.tsx new file mode 100644 index 0000000000..794d8c6b2a --- /dev/null +++ b/integration/templates/next-app-router/src/app/organizations-by-id/[id]/page.tsx @@ -0,0 +1,18 @@ +import { auth } from '@clerk/nextjs/server'; + +export default async function Home({ params }: { params: { id: string } }) { + const { orgId } = await auth(); + + if (params.id != orgId) { + console.log('Mismatch - returning nothing for now...', params.id, orgId); + } + + console.log("I'm the server and I got this id: ", orgId); + + return ( + <> +

Org-specific home

+

From auth(), I know your org id is: {orgId}

+ + ); +} diff --git a/integration/templates/next-app-router/src/app/organizations-by-id/[id]/settings/page.tsx b/integration/templates/next-app-router/src/app/organizations-by-id/[id]/settings/page.tsx new file mode 100644 index 0000000000..f99a9eb4cd --- /dev/null +++ b/integration/templates/next-app-router/src/app/organizations-by-id/[id]/settings/page.tsx @@ -0,0 +1,18 @@ +import { auth } from '@clerk/nextjs/server'; + +export default async function Home({ params }: { params: { id: string } }) { + const { orgId } = await auth(); + + if (params.id != orgId) { + console.log('Mismatch - returning nothing for now...', params.id, orgId); + } + + console.log("I'm the server and I got this id: ", orgId); + + return ( + <> +

Org-specific settings

+

From auth(), I know your org id is: {orgId}

+ + ); +} diff --git a/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/page.tsx b/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/page.tsx new file mode 100644 index 0000000000..fea8138ea7 --- /dev/null +++ b/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/page.tsx @@ -0,0 +1,18 @@ +import { auth } from '@clerk/nextjs/server'; + +export default async function Home({ params }: { params: { slug: string } }) { + const { orgSlug } = await auth(); + + if (params.slug != orgSlug) { + console.log('Mismatch - returning nothing for now...', params.slug, orgSlug); + } + + console.log("I'm the server and I got this slug: ", orgSlug); + + return ( + <> +

Org-specific home

+

From auth(), I know your org slug is: {orgSlug}

+ + ); +} diff --git a/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/settings/page.tsx b/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/settings/page.tsx new file mode 100644 index 0000000000..7cfcdbd93a --- /dev/null +++ b/integration/templates/next-app-router/src/app/organizations-by-slug/[slug]/settings/page.tsx @@ -0,0 +1,18 @@ +import { auth } from '@clerk/nextjs/server'; + +export default async function Home({ params }: { params: { slug: string } }) { + const { orgSlug } = await auth(); + + if (params.slug != orgSlug) { + console.log('Mismatch - returning nothing for now...', params.slug, orgSlug); + } + + console.log("I'm the server and I got this slug: ", orgSlug); + + return ( + <> +

Org-specific settings

+

From auth(), I know your org slug is: {orgSlug}

+ + ); +} diff --git a/integration/templates/next-app-router/src/app/page-protected/page.tsx b/integration/templates/next-app-router/src/app/page-protected/page.tsx index d67679ce80..0cce9cdcd9 100644 --- a/integration/templates/next-app-router/src/app/page-protected/page.tsx +++ b/integration/templates/next-app-router/src/app/page-protected/page.tsx @@ -1,6 +1,7 @@ import { auth } from '@clerk/nextjs/server'; -export default function Page() { - auth().protect(); +export default async function Page() { + await auth.protect(); + return
Protected Page
; } diff --git a/integration/templates/next-app-router/src/app/personal-account/page.tsx b/integration/templates/next-app-router/src/app/personal-account/page.tsx new file mode 100644 index 0000000000..39dc9da1da --- /dev/null +++ b/integration/templates/next-app-router/src/app/personal-account/page.tsx @@ -0,0 +1,15 @@ +import { auth } from '@clerk/nextjs/server'; + +export default async function Home() { + const { orgId } = await auth(); + + if (orgId != null) { + console.log('Oh no, this page should only activate on the personal account!'); + } + + return ( + <> +

Welcome to your personal account

+ + ); +} diff --git a/integration/templates/next-app-router/src/app/settings/auth-has/page.tsx b/integration/templates/next-app-router/src/app/settings/auth-has/page.tsx index a036ccfc7c..b1363c4972 100644 --- a/integration/templates/next-app-router/src/app/settings/auth-has/page.tsx +++ b/integration/templates/next-app-router/src/app/settings/auth-has/page.tsx @@ -1,7 +1,7 @@ import { auth } from '@clerk/nextjs/server'; -export default function Page() { - const { userId, has } = auth(); +export default async function Page() { + const { userId, has } = await auth(); if (!userId || !has({ permission: 'org:posts:manage' })) { return

User is missing permissions

; } diff --git a/integration/templates/next-app-router/src/app/settings/auth-protect/page.tsx b/integration/templates/next-app-router/src/app/settings/auth-protect/page.tsx index cddf0f7d50..c7f9b76b51 100644 --- a/integration/templates/next-app-router/src/app/settings/auth-protect/page.tsx +++ b/integration/templates/next-app-router/src/app/settings/auth-protect/page.tsx @@ -1,6 +1,6 @@ import { auth } from '@clerk/nextjs/server'; -export default function Page() { - auth().protect({ role: 'admin' }); +export default async function Page() { + await auth.protect({ role: 'admin' }); return

User has access

; } diff --git a/integration/templates/next-app-router/src/middleware.ts b/integration/templates/next-app-router/src/middleware.ts index 2deaf8df80..24c94de0e8 100644 --- a/integration/templates/next-app-router/src/middleware.ts +++ b/integration/templates/next-app-router/src/middleware.ts @@ -9,11 +9,16 @@ const csp = `default-src 'self'; `; const isProtectedRoute = createRouteMatcher(['/protected(.*)', '/user(.*)', '/switcher(.*)']); +const isAdminRoute = createRouteMatcher(['/only-admin(.*)']); const isCSPRoute = createRouteMatcher(['/csp']); -export default clerkMiddleware((auth, req) => { +export default clerkMiddleware(async (auth, req) => { if (isProtectedRoute(req)) { - auth().protect(); + await auth.protect(); + } + + if (isAdminRoute(req)) { + await auth.protect({ role: 'admin' }); } if (isCSPRoute(req)) { diff --git a/integration/templates/react-vite/src/custom-user-button-trigger/index.tsx b/integration/templates/react-vite/src/custom-user-button-trigger/index.tsx new file mode 100644 index 0000000000..bbcd41b52e --- /dev/null +++ b/integration/templates/react-vite/src/custom-user-button-trigger/index.tsx @@ -0,0 +1,100 @@ +import { UserButton } from '@clerk/clerk-react'; +import { PropsWithChildren, useContext, useState } from 'react'; +import { PageContext, PageContextProvider } from '../PageContext.tsx'; + +function Page1() { + const { counter, setCounter } = useContext(PageContext); + + return ( + <> +

Page 1

+

Counter: {counter}

+ + + ); +} + +function ToggleChildren(props: PropsWithChildren) { + const [isMounted, setMounted] = useState(false); + + return ( + <> + + {isMounted ? props.children : null} + + ); +} + +export default function Page() { + return ( + + + πŸ™ƒ

} + url='page-1' + > + +
+ + πŸ™ƒ

} + url='page-2' + > +

Page 2

+
+

This is leaking

+ 🌐

} + /> + + πŸ™ƒ} + open={'page-1'} + /> + + + 🌐} + /> + + 🌐} + /> + + πŸ””} + onClick={() => alert('custom-alert')} + /> + + 🌐

} + /> + + + +
+
+ ); +} diff --git a/integration/templates/react-vite/src/custom-user-button/index.tsx b/integration/templates/react-vite/src/custom-user-button/index.tsx index e6c800bcaf..e283cddd76 100644 --- a/integration/templates/react-vite/src/custom-user-button/index.tsx +++ b/integration/templates/react-vite/src/custom-user-button/index.tsx @@ -38,7 +38,7 @@ export default function Page() { >

Page 2

- 🌐 +

This is leaking

Page 2

- 🌐 +

This is leaking

{ const navigate = useNavigate(); @@ -64,6 +65,10 @@ const router = createBrowserRouter([ path: '/custom-user-button', element: , }, + { + path: '/custom-user-button-trigger', + element: , + }, ], }, ]); diff --git a/integration/templates/tanstack-router/package.json b/integration/templates/tanstack-router/package.json index e10226a00c..ed0b9c1009 100644 --- a/integration/templates/tanstack-router/package.json +++ b/integration/templates/tanstack-router/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "scripts": { - "dev": "vite --port=$PORT", "build": "vite build", + "dev": "vite --port=$PORT", "serve": "vite preview --port=$PORT", "start": "vite" }, diff --git a/integration/templates/tanstack-start/app.config.ts b/integration/templates/tanstack-start/app.config.ts index d1d9b04ded..732f04eabe 100644 --- a/integration/templates/tanstack-start/app.config.ts +++ b/integration/templates/tanstack-start/app.config.ts @@ -3,7 +3,7 @@ import tsConfigPaths from 'vite-tsconfig-paths' export default defineConfig({ vite: { - plugins: () => [ + plugins: [ tsConfigPaths({ projects: ['./tsconfig.json'], }), diff --git a/integration/testUtils/handshake.ts b/integration/testUtils/handshake.ts index 63c4fbf2d6..74c4cea202 100644 --- a/integration/testUtils/handshake.ts +++ b/integration/testUtils/handshake.ts @@ -104,7 +104,13 @@ export function generateConfig({ mode, matchedKeys = true }: { mode: 'test' | 'l exp: number; nbf: number; }; - const generateToken = ({ state }: { state: 'active' | 'expired' | 'early' }) => { + const generateToken = ({ + state, + extraClaims, + }: { + state: 'active' | 'expired' | 'early'; + extraClaims?: Map; + }) => { const claims = { sub: 'user_12345' } as Claims; const now = Math.floor(Date.now() / 1000); @@ -121,6 +127,14 @@ export function generateConfig({ mode, matchedKeys = true }: { mode: 'test' | 'l claims.nbf = now - 10 + 600; claims.exp = now + 60 + 600; } + + // Merge claims with extraClaims + if (extraClaims) { + for (const [key, value] of extraClaims) { + claims[key] = value; + } + } + return { token: jwt.sign(claims, rsa.private, { algorithm: 'RS256', diff --git a/integration/tests/astro/components.test.ts b/integration/tests/astro/components.test.ts index 8f9b3f9dfd..ed88f2a29e 100644 --- a/integration/tests/astro/components.test.ts +++ b/integration/tests/astro/components.test.ts @@ -451,4 +451,34 @@ testAgainstRunningApps({ withPattern: ['astro.node.withCustomRoles'] })('basic f await u.po.expect.toBeSignedIn(); await expect(u.page.getByText('Not a member')).toBeVisible(); }); + + test('renders components and keep internal routing behavior when view transitions is enabled', async ({ + page, + context, + }) => { + const u = createTestUtils({ app, page, context }); + await u.page.goToRelative('/transitions'); + // Navigate to sign-in page using link to simulate transition + await u.page.getByRole('link', { name: /Sign in/i }).click(); + + // Components should be mounted on the new document + // when navigating through links + await u.page.waitForURL(`${app.serverUrl}/transitions/sign-in`); + await u.po.signIn.waitForMounted(); + + await u.po.signIn.setIdentifier(fakeAdmin.email); + await u.po.signIn.continue(); + await u.page.waitForURL(`${app.serverUrl}/transitions/sign-in#/factor-one`); + + await u.po.signIn.setPassword(fakeAdmin.password); + await u.po.signIn.continue(); + + await u.po.expect.toBeSignedIn(); + + // Internal Clerk routing should still work + await u.page.waitForURL(`${app.serverUrl}/transitions`); + + // Components should be rendered on hard reload + await u.po.userButton.waitForMounted(); + }); }); diff --git a/integration/tests/custom-pages.test.ts b/integration/tests/custom-pages.test.ts index f3dd4a5193..f7621bb9ff 100644 --- a/integration/tests/custom-pages.test.ts +++ b/integration/tests/custom-pages.test.ts @@ -6,6 +6,7 @@ import { createTestUtils, testAgainstRunningApps } from '../testUtils'; const CUSTOM_PROFILE_PAGE = '/custom-user-profile'; const CUSTOM_BUTTON_PAGE = '/custom-user-button'; +const CUSTOM_BUTTON_TRIGGER_PAGE = '/custom-user-button-trigger'; async function waitForMountedComponent( component: 'UserButton' | 'UserProfile', @@ -106,11 +107,29 @@ testAgainstRunningApps({ withPattern: ['react.vite.withEmailCodes'] })( await u.page.waitForSelector('p[data-page="1"]', { state: 'attached' }); await expect(u.page.locator('p[data-page="1"]')).toHaveText('Counter: 0'); - u.page.locator('button[data-page="1"]').click(); + await u.page.locator('button[data-page="1"]').click(); await expect(u.page.locator('p[data-page="1"]')).toHaveText('Counter: 1'); }); + test('renders only custom pages and does not display unrelated child components', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password }); + await u.po.expect.toBeSignedIn(); + + await waitForMountedComponent(component, u); + + const buttons = await u.page.locator('button.cl-navbarButton__custom-page-0').all(); + expect(buttons.length).toBe(1); + const [profilePage] = buttons; + await expect(profilePage.locator('div.cl-navbarButtonIcon__custom-page-0')).toHaveText('πŸ™ƒ'); + await profilePage.click(); + + await expect(u.page.locator('p[data-leaked-child]')).toBeHidden(); + }); + test('user profile custom external absolute link', async ({ page, context }) => { const u = createTestUtils({ app, page, context }); await u.po.signIn.goTo(); @@ -149,6 +168,53 @@ testAgainstRunningApps({ withPattern: ['react.vite.withEmailCodes'] })( }); }); + test.describe('User Button with experimental asStandalone and asProvider', () => { + test('items at the specified order', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative(CUSTOM_BUTTON_TRIGGER_PAGE); + const toggleButton = await u.page.waitForSelector('button[data-toggle-btn]'); + await toggleButton.click(); + + await u.po.userButton.waitForPopover(); + await u.po.userButton.triggerManageAccount(); + await u.po.userProfile.waitForMounted(); + + const pagesContainer = u.page.locator('div.cl-navbarButtons').first(); + + const buttons = await pagesContainer.locator('button').all(); + + expect(buttons.length).toBe(6); + + const expectedTexts = ['Profile', 'πŸ™ƒPage 1', 'Security', 'πŸ™ƒPage 2', '🌐Visit Clerk', '🌐Visit User page']; + for (let i = 0; i < buttons.length; i++) { + await expect(buttons[i]).toHaveText(expectedTexts[i]); + } + }); + + test('children should be leaking when used with asProvider', async ({ page, context }) => { + const u = createTestUtils({ app, page, context }); + await u.po.signIn.goTo(); + await u.po.signIn.waitForMounted(); + await u.po.signIn.signInWithEmailAndInstantPassword({ email: fakeUser.email, password: fakeUser.password }); + await u.po.expect.toBeSignedIn(); + + await u.page.goToRelative(CUSTOM_BUTTON_TRIGGER_PAGE); + const toggleButton = await u.page.waitForSelector('button[data-toggle-btn]'); + await toggleButton.click(); + + await u.po.userButton.waitForPopover(); + await u.po.userButton.triggerManageAccount(); + await u.po.userProfile.waitForMounted(); + + await expect(u.page.locator('p[data-leaked-child]')).toBeVisible(); + }); + }); + test.describe('User Button custom items', () => { test('items at the specified order', async ({ page, context }) => { const u = createTestUtils({ app, page, context }); diff --git a/integration/tests/dynamic-keys.test.ts b/integration/tests/dynamic-keys.test.ts index e034146c64..832dfa95ad 100644 --- a/integration/tests/dynamic-keys.test.ts +++ b/integration/tests/dynamic-keys.test.ts @@ -13,22 +13,24 @@ test.describe('dynamic keys @nextjs', () => { .clone() .addFile( 'src/middleware.ts', - () => `import { clerkClient, clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server' - import { NextResponse } from 'next/server' + () => `import { clerkClient, clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; + import { NextResponse } from 'next/server'; const isProtectedRoute = createRouteMatcher(['/protected']); const shouldFetchBapi = createRouteMatcher(['/fetch-bapi-from-middleware']); export default clerkMiddleware(async (auth, request) => { if (isProtectedRoute(request)) { - auth().protect(); + await auth.protect(); } if (shouldFetchBapi(request)){ - const count = await clerkClient().users.getCount(); + const client = await clerkClient(); + + const count = await client.users?.getCount(); if (count){ - return NextResponse.redirect(new URL('/users-count', request.url)) + return NextResponse.redirect(new URL('/users-count', request.url)); } } }, { @@ -45,7 +47,7 @@ test.describe('dynamic keys @nextjs', () => { () => `import { clerkClient } from '@clerk/nextjs/server' export default async function Page(){ - const count = await clerkClient().users.getCount() + const count = await clerkClient().users?.getCount() ?? 0; return

Users count: {count}

} @@ -62,7 +64,7 @@ test.describe('dynamic keys @nextjs', () => { await app.teardown(); }); - test('redirects to `signInUrl` on `auth().protect()`', async ({ page, context }) => { + test('redirects to `signInUrl` on `await auth.protect()`', async ({ page, context }) => { const u = createTestUtils({ app, page, context }); await u.page.goToAppHome(); @@ -74,7 +76,7 @@ test.describe('dynamic keys @nextjs', () => { await u.page.waitForURL(/foobar/); }); - test('resolves auth signature with `secretKey` on `auth().protect()`', async ({ page, context }) => { + test('resolves auth signature with `secretKey` on `await auth.protect()`', async ({ page, context }) => { const u = createTestUtils({ app, page, context }); await u.page.goToRelative('/page-protected'); await u.page.waitForURL(/foobar/); diff --git a/integration/tests/handshake.test.ts b/integration/tests/handshake.test.ts index 887b45b0a4..af70df8893 100644 --- a/integration/tests/handshake.test.ts +++ b/integration/tests/handshake.test.ts @@ -2,6 +2,7 @@ import * as http from 'node:http'; import { expect, test } from '@playwright/test'; +import type { OrganizationSyncOptions } from '../../packages/backend/src/tokens/types'; import type { Application } from '../models/application'; import { appConfigs } from '../presets'; import { generateConfig, getJwksFromSecretKey } from '../testUtils/handshake'; @@ -38,14 +39,10 @@ test.describe('Client handshake @generic', () => { .clone() .addFile( 'src/middleware.ts', - () => `import { authMiddleware } from '@clerk/nextjs/server'; - - // Set the paths that don't require the user to be signed in - const publicPaths = ['/', /^(\\/(sign-in|sign-up|app-dir|custom)\\/*).*$/]; + () => `import { clerkMiddleware } from '@clerk/nextjs/server'; export const middleware = (req, evt) => { - return authMiddleware({ - publicRoutes: publicPaths, + return clerkMiddleware({ publishableKey: req.headers.get("x-publishable-key"), secretKey: req.headers.get("x-secret-key"), proxyUrl: req.headers.get("x-proxy-url"), @@ -885,3 +882,534 @@ test.describe('Client handshake @generic', () => { expect(res.status).toBe(200); }); }); + +test.describe('Client handshake with organization activation @nextjs', () => { + test.describe.configure({ mode: 'parallel' }); + + const devBrowserCookie = '__clerk_db_jwt=needstobeset;'; + + const jwksServer = http.createServer(function (req, res) { + const sk = req.headers.authorization?.replace('Bearer ', ''); + if (!sk) { + console.log('No SK to', req.url, req.headers); + } + + res.setHeader('Content-Type', 'application/json'); + res.write(JSON.stringify(getJwksFromSecretKey(sk))); + res.end(); + }); + + let app: Application; + + test.beforeAll('setup local jwks server', async () => { + // Start the jwks server + await new Promise(resolve => jwksServer.listen(0, resolve)); + app = await startAppWithOrganizationSyncOptions(`http://localhost:${jwksServer.address().port}`); + }); + + test.afterAll('setup local Clerk API mock', async () => { + await app.teardown(); + return new Promise(resolve => jwksServer.close(() => resolve())); + }); + + type TestCase = { + name: string; + when: When; + then: Then; + }; + type When = { + // With this initial state... + initialAuthState: 'active' | 'expired' | 'early'; + initialSessionClaims: Map; + + // When the customer app specifies these orgSyncOptions to middleware... + orgSyncOptions: OrganizationSyncOptions; + + // And a request arrives to the app at this path... + appRequestPath: string; + + // With a token specified in... + tokenAppearsIn: 'header' | 'cookie'; + + // And the Sec-fetch-dest header is... + secFetchDestHeader: string | null; + }; + + type Then = { + // A handshake should (or should not) occur: + expectStatus: number; + + // The middleware should redirect to fapi with this query param value: + fapiOrganizationIdParamValue: string | null; + }; + + const cookieAuthCases: TestCase[] = [ + // ---------------- Session active vs expired tests ---------------- + // Note: it would be possible to run _every_ test with both active and expired initial states + // and expect the same results, but we're avoiding that to save some test execution time. + { + name: 'Expired session, no org in session, but org a requested by ID => attempts to activate org A', + when: { + initialAuthState: 'expired', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: 'org_a', + }, + }, + { + name: 'Active session, no org in session, but org a requested by ID => attempts to activate org A', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: 'org_a', + }, + }, + + // ---------------- Header-based auth tests ---------------- + // Header-based auth requests come from non-browser actors, which don't have the __client cookie. + // Handshaking depends on a redirect that includes that __client cookie, so we should not handshake + // for this auth method, even if there's an org mismatch + { + name: 'Header-based auth should not handshake with active auth', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'header', + secFetchDestHeader: null, + }, + then: { + expectStatus: 200, + fapiOrganizationIdParamValue: null, + }, + }, + { + name: 'Header-based auth should not handshake with expired auth', + when: { + initialAuthState: 'expired', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'header', + secFetchDestHeader: null, + }, + then: { + expectStatus: 307, // Should redirect to sign-in + fapiOrganizationIdParamValue: null, + }, + }, + + // ---------------- Existing session active org tests ---------------- + { + name: 'Active session, org A active in session, but org B is requested by ID => attempts to activate org B', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id', '/organizations-by-id/:id/(.*)'], + }, + appRequestPath: '/organizations-by-id/org_b', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: 'org_b', + }, + }, + { + name: 'Active session, no active org in session, but org B is requested by slug => attempts to activate org B', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: [ + '/organizations-by-id/:id', + '/organizations-by-id/:id/(.*)', + '/organizations-by-slug/:slug', + '/organizations-by-slug/:id/(.*)', + ], + }, + appRequestPath: '/organizations-by-slug/bcorp', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: 'bcorp', + }, + }, + { + name: 'Active session, org a in session, but *an org B subresource* is requested by slug => attempts to activate org B', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: [ + '/organizations-by-slug/:slug', + '/organizations-by-slug/:id/(.*)', + '/organizations-by-id/:id', + '/organizations-by-id/:id/(.*)', + ], + }, + appRequestPath: '/organizations-by-slug/bcorp/settings', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: 'bcorp', + }, + }, + { + // This case ensures that, for the prototypical nextjs app, we permanent redirect before attempting the handshake logic. + // If this wasn't the case, we'd need to recommend adding an additional pattern with a trailing slash to our docs. + name: 'When org A is active in a signed-out session but an org B is requested by ID with a trailing slash, permanent redirects to the non-slash route without error.', + when: { + initialAuthState: 'expired', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id', '/organizations-by-id/:id/(.*)'], + }, + appRequestPath: '/organizations-by-id/org_b/', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 308, // Handshake never 308's - this points to `/organizations-by-id/org_b` (no trailing slash) + fapiOrganizationIdParamValue: null, + }, + }, + + // ---------------- Personal account tests ---------------- + { + name: 'Active session, org a in session, but *the personal account* is requested => attempts to activate PWS', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: [ + '/organizations-by-id/:id', + '/organizations-by-id/:id/(.*)', + '/organizations-by-slug/:slug', + '/organizations-by-slug/:id/(.*)', + ], + personalAccountPatterns: ['/personal-account', '/personal-account/(.*)'], + }, + appRequestPath: '/personal-account', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 307, + fapiOrganizationIdParamValue: '', // <-- Empty string indicates personal account + }, + }, + + // ---------------- No activation required tests ---------------- + { + name: 'Active session, nothing session, and the personal account is requested => nothing to activate!', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([ + // Intentionally empty + ]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-slug/:slug', '/organizations-by-slug/:id/(.*)'], + personalAccountPatterns: ['/personal-account', '/personal-account/(.*)'], + }, + appRequestPath: '/personal-account', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 200, + fapiOrganizationIdParamValue: null, + }, + }, + { + name: 'Active session, org a active in session, and org a is requested => nothing to activate!', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: ['/organizations-by-id/:id', '/organizations-by-id/:id/(.*)'], + personalAccountPatterns: ['/personal-account', '/personal-account/(.*)'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 200, + fapiOrganizationIdParamValue: null, + }, + }, + { + // NOTE(izaak): Would we prefer 500ing in this case? + name: 'No config => nothing to activate, return 200', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: null, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 200, + fapiOrganizationIdParamValue: null, + }, + }, + + // ---------------- Invalid permutation tests ---------------- + { + name: 'Invalid config => ignore it and return 200', + when: { + initialAuthState: 'active', + initialSessionClaims: new Map([['org_id', 'org_a']]), + orgSyncOptions: { + organizationPatterns: ['i am not valid config'], + }, + appRequestPath: '/organizations-by-id/org_a', + tokenAppearsIn: 'cookie', + secFetchDestHeader: 'document', + }, + then: { + expectStatus: 200, + fapiOrganizationIdParamValue: null, + }, + }, + ]; + + for (const testCase of cookieAuthCases) { + test(`${testCase.name}`, async () => { + const config = generateConfig({ + mode: 'test', + }); + // Create a new map with an org_id key + const { token, claims } = config.generateToken({ + state: testCase.when.initialAuthState, // <-- Critical + extraClaims: testCase.when.initialSessionClaims, + }); + + const headers = new Headers({ + 'X-Publishable-Key': config.pk, + 'X-Secret-Key': config.sk, + + // NOTE(izaak): To avoid needing to start a server with every test, we're passing in + // organization options to the app via a header. + 'x-organization-sync-options': JSON.stringify(testCase.when.orgSyncOptions), + }); + + if (testCase.when.secFetchDestHeader) { + headers.set('Sec-Fetch-Dest', testCase.when.secFetchDestHeader); + } + + switch (testCase.when.tokenAppearsIn) { + case 'cookie': + headers.set('Cookie', `${devBrowserCookie} __client_uat=${claims.iat}; __session=${token}`); + break; + case 'header': + headers.set('Authorization', `Bearer ${token}`); + break; + } + + const res = await fetch(app.serverUrl + testCase.when.appRequestPath, { + headers: headers, + redirect: 'manual', + }); + + if (testCase.name === 'Header-based auth should not handshake with expired auth') { + console.log(testCase.name); + console.log(res.headers.get('x-clerk-auth-status')); + console.log(res.headers.get('x-clerk-auth-reason')); + } + + expect(res.status).toBe(testCase.then.expectStatus); + const redirectSearchParams = new URLSearchParams(res.headers.get('location')); + expect(redirectSearchParams.get('organization_id')).toBe(testCase.then.fapiOrganizationIdParamValue); + }); + } +}); + +test.describe('Client handshake with an organization activation avoids infinite loops @nextjs', () => { + const devBrowserCookie = '__clerk_db_jwt=needstobeset;'; + + const jwksServer = http.createServer(function (req, res) { + const sk = req.headers.authorization?.replace('Bearer ', ''); + if (!sk) { + console.log('No SK to', req.url, req.headers); + } + + res.setHeader('Content-Type', 'application/json'); + res.write(JSON.stringify(getJwksFromSecretKey(sk))); + res.end(); + }); + + // define app as an application + let thisApp: Application; + + test.beforeAll('setup local jwks server', async () => { + // Start the jwks server + await new Promise(resolve => jwksServer.listen(0, resolve)); + + thisApp = await startAppWithOrganizationSyncOptions(`http://localhost:${jwksServer.address().port}`); + }); + + test.afterAll('setup local Clerk API mock', async () => { + await thisApp.teardown(); + return new Promise(resolve => jwksServer.close(() => resolve())); + }); + + // -------------- Test begin ------------ + + const config = generateConfig({ + mode: 'test', + }); + + const organizationSyncOptions = { + organizationPatterns: ['/organizations-by-id/:id', '/organizations-by-id/:id/(.*)'], + personalAccountPatterns: ['/personal-account', '/personal-account/(.*)'], + }; + + test('Sets the redirect loop tracking cookie', async () => { + // Create a new map with an org_id key + const { token, claims } = config.generateToken({ + state: 'active', + extraClaims: new Map([]), + }); + + const headers = new Headers({ + 'X-Publishable-Key': config.pk, + 'X-Secret-Key': config.sk, + 'Sec-Fetch-Dest': 'document', + 'x-organization-sync-options': JSON.stringify(organizationSyncOptions), + }); + headers.set('Cookie', `${devBrowserCookie} __client_uat=${claims.iat}; __session=${token}`); + + const res = await fetch(thisApp.serverUrl + '/organizations-by-id/org_a', { + headers: headers, + redirect: 'manual', + }); + + expect(res.status).toBe(307); + const redirectSearchParams = new URLSearchParams(res.headers.get('location')); + expect(redirectSearchParams.get('organization_id')).toBe('org_a'); + + // read the set-cookie directives + const setCookie = res.headers.get('set-cookie'); + + expect(setCookie).toContain(`__clerk_redirect_count=1`); // <-- Critical + }); + + test('Ignores organization config when being redirected to', async () => { + // Create a new map with an org_id key + const { token, claims } = config.generateToken({ + state: 'active', // Must be active - handshake logic only runs once session is determined to be active + extraClaims: new Map([]), + }); + + const headers = new Headers({ + 'X-Publishable-Key': config.pk, + 'X-Secret-Key': config.sk, + 'Sec-Fetch-Dest': 'document', + 'x-organization-sync-options': JSON.stringify(organizationSyncOptions), + }); + + // Critical cookie: __clerk_redirect_count + headers.set( + 'Cookie', + `${devBrowserCookie} __client_uat=${claims.iat}; __session=${token}; __clerk_redirect_count=1`, + ); + + const res = await fetch(thisApp.serverUrl + '/organizations-by-id/org_a', { + headers: headers, + redirect: 'manual', + }); + + expect(res.status).toBe(200); + const redirectSearchParams = new URLSearchParams(res.headers.get('location')); + expect(redirectSearchParams.get('organization_id')).toBe(null); + + expect(res.headers.get('set-cookie')).toBe(null); + }); +}); + +/** + * Start the nextjs sample app with the given organization sync options + * organization sync options can be passed to the app via the + * "x-organization-sync-options" header + */ +const startAppWithOrganizationSyncOptions = async (clerkAPIUrl: string): Promise => { + const env = appConfigs.envs.withEmailCodes.clone().setEnvVariable('private', 'CLERK_API_URL', clerkAPIUrl); + const middlewareFile = `import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; + + const isProtectedRoute = createRouteMatcher(['/organizations(.*)']) + + export const middleware = (req, evt) => { + const orgSyncOptions = req.headers.get("x-organization-sync-options") + return clerkMiddleware(async (auth, req) => { + if (isProtectedRoute(req) && !(await auth()).userId) { + (await auth()).redirectToSignIn() + } + }, { + publishableKey: req.headers.get("x-publishable-key"), + secretKey: req.headers.get("x-secret-key"), + proxyUrl: req.headers.get("x-proxy-url"), + domain: req.headers.get("x-domain"), + isSatellite: req.headers.get('x-satellite') === 'true', + signInUrl: req.headers.get("x-sign-in-url"), + + // Critical + organizationSyncOptions: JSON.parse(req.headers.get("x-organization-sync-options")), + + })(req, evt) + }; + export const config = { + matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'], + }; + `; + + const app = await appConfigs.next.appRouter + .clone() + .addFile('src/middleware.ts', () => middlewareFile) + .commit(); + + await app.setup(); + await app.withEnv(env); + await app.dev(); + return app; +}; diff --git a/integration/tests/next-middleware.test.ts b/integration/tests/next-middleware.test.ts deleted file mode 100644 index 3bf7c2eb74..0000000000 --- a/integration/tests/next-middleware.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { expect, test } from '@playwright/test'; - -import type { Application } from '../models/application'; -import { appConfigs } from '../presets'; -import { createTestUtils } from '../testUtils'; - -test.describe('next middleware @nextjs', () => { - test.describe.configure({ mode: 'parallel' }); - let app: Application; - - test.beforeAll(async () => { - const cookieExpires = new Date().getTime() + 60 * 60 * 24; - app = await appConfigs.next.appRouter - .clone() - .addFile( - 'src/middleware.ts', - () => `import { authMiddleware } from '@clerk/nextjs/server'; -import { NextResponse } from "next/server"; - -export default authMiddleware({ - publicRoutes: ['/', '/hash/sign-in', '/hash/sign-up'], - afterAuth: async (auth, req) => { - const response = NextResponse.next(); - response.cookies.set({ - name: "first", - value: "123456789", - sameSite: "Lax", - path: "/", - domain: 'localhost', - secure: false, - expires: ${cookieExpires} - }); - response.cookies.set("second", "987654321", { - sameSite: "Lax", - secure: false, - path: "/", - domain: 'localhost', - expires: ${cookieExpires} - }); - response.cookies.set("third", "foobar", { - sameSite: "Lax", - secure: false, - path: "/", - domain: 'localhost', - expires: ${cookieExpires} - }); - return response; - }, -}); - -export const config = { - matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], -};`, - ) - .addFile( - 'src/app/provider.tsx', - () => `'use client' -import { ClerkProvider } from "@clerk/nextjs" - -export function Provider({ children }: { children: any }) { - return ( - - {children} - - ) -}`, - ) - .addFile( - 'src/app/layout.tsx', - () => `import './globals.css'; -import { Inter } from 'next/font/google'; -import { Provider } from './provider'; - -const inter = Inter({ subsets: ['latin'] }); - -export const metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -}; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - {children} - - - ); -} - `, - ) - .commit(); - await app.setup(); - await app.withEnv(appConfigs.envs.withEmailCodes); - await app.dev(); - }); - - test.afterAll(async () => { - await app.teardown(); - }); - - test('authMiddleware passes through all cookies', async ({ browser }) => { - // See https://playwright.dev/docs/api/class-browsercontext - const context = await browser.newContext(); - const page = await context.newPage(); - const u = createTestUtils({ app, page }); - - await page.goto(app.serverUrl); - await u.po.signIn.waitForMounted(); - - const cookies = await context.cookies(); - - expect(cookies.find(c => c.name == 'first').value).toBe('123456789'); - expect(cookies.find(c => c.name == 'second').value).toBe('987654321'); - expect(cookies.find(c => c.name == 'third').value).toBe('foobar'); - - await context.close(); - }); -}); diff --git a/integration/tests/protect.test.ts b/integration/tests/protect.test.ts index 7b2c6868d2..fc5a5bc143 100644 --- a/integration/tests/protect.test.ts +++ b/integration/tests/protect.test.ts @@ -56,6 +56,9 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withCustomRoles] })('authoriz await u.page.goToRelative('/settings/auth-protect'); await expect(u.page.getByText(/User has access/i)).toBeVisible(); + await u.page.goToRelative('/only-admin'); + await expect(u.page.getByText(/User is admin/i)).toBeVisible(); + // route handler await u.page.goToRelative('/api/settings/'); await expect(u.page.getByText(/userId/i)).toBeVisible(); @@ -89,6 +92,8 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withCustomRoles] })('authoriz await u.po.signIn.waitForMounted(); await u.page.goToRelative('/page-protected'); await u.po.signIn.waitForMounted(); + await u.page.goToRelative('/only-admin'); + await u.po.signIn.waitForMounted(); }); test('Protect in RSCs and RCCs as `viewer`', async ({ page, context }) => { @@ -114,6 +119,9 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withCustomRoles] })('authoriz await u.page.goToRelative('/settings/auth-protect'); await expect(u.page.getByText(/this page could not be found/i)).toBeVisible(); + await u.page.goToRelative('/only-admin'); + await expect(u.page.getByText(/this page could not be found/i)).toBeVisible(); + // Route Handler await u.page.goToRelative('/api/settings/').catch(() => {}); diff --git a/integration/tests/restricted-mode.test.ts b/integration/tests/restricted-mode.test.ts index ab01612663..947f8a516a 100644 --- a/integration/tests/restricted-mode.test.ts +++ b/integration/tests/restricted-mode.test.ts @@ -102,8 +102,8 @@ export default function Page() { await u.po.signUp.goTo(); await u.po.signUp.waitForMounted(); - await expect(u.page.getByText(/Restricted access/i).first()).toBeVisible(); - const backToSignIn = u.page.getByRole('link', { name: /Back to sign in/i }); + await expect(u.page.getByText(/Access restricted/i).first()).toBeVisible(); + const backToSignIn = u.page.getByRole('link', { name: /Sign in/i }); await backToSignIn.click(); await u.po.signUp.waitForMounted(); diff --git a/package-lock.json b/package-lock.json index 2d9e8a737b..88ba9c4611 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,8 +36,6 @@ "eslint": "^8.49.0", "execa": "^5.1.1", "expect-type": "^0.16.0", - "fastify": "4.12.0", - "fastify-plugin": "^4.5.0", "fs-extra": "^11.1.1", "get-port": "^5.1.1", "globby": "^13.2.2", @@ -48,7 +46,8 @@ "jest-chrome": "^0.8.0", "jest-environment-jsdom": "^29.3.1", "lint-staged": "^14.0.1", - "prettier": "^3.3.2", + "prettier": "^3.3.3", + "prettier-plugin-packagejson": "^2.5.3", "prettier-plugin-tailwindcss": "^0.6.3", "publint": "^0.2.4", "react": "18.3.1", @@ -155,9 +154,8 @@ }, "node_modules/@arethetypeswrong/cli": { "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.15.4.tgz", - "integrity": "sha512-YDbImAi1MGkouT7f2yAECpUMFhhA1J0EaXzIqoC5GGtK0xDgauLtcsZezm8tNq7d3wOFXH7OnY+IORYcG212rw==", "dev": true, + "license": "MIT", "dependencies": { "@arethetypeswrong/core": "0.15.1", "chalk": "^4.1.2", @@ -266,28 +264,29 @@ "peer": true }, "node_modules/@astrojs/markdown-remark": { - "version": "5.2.0", - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.3.0.tgz", + "integrity": "sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==", "peer": true, "dependencies": { "@astrojs/prism": "3.1.0", "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.1", + "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.0", + "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.0", + "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", - "shiki": "^1.10.3", + "shiki": "^1.22.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", - "vfile": "^6.0.2" + "vfile": "^6.0.3" } }, "node_modules/@astrojs/prism": { @@ -469,17 +468,15 @@ }, "node_modules/@babel/compat-data": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -488,10 +485,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -508,8 +505,6 @@ }, "node_modules/@babel/core/node_modules/@babel/code-frame": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.25.7", @@ -562,8 +557,6 @@ }, "node_modules/@babel/generator": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "license": "MIT", "dependencies": { "@babel/types": "^7.25.7", @@ -576,10 +569,11 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -598,8 +592,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.7", @@ -731,8 +723,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.7", @@ -744,8 +734,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.7", @@ -772,8 +760,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -813,8 +799,6 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.7", @@ -847,8 +831,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -856,8 +838,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -865,8 +845,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -888,8 +866,6 @@ }, "node_modules/@babel/helpers": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.7", @@ -901,8 +877,6 @@ }, "node_modules/@babel/highlight": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.7", @@ -915,12 +889,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -993,9 +967,8 @@ }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", - "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -1026,10 +999,8 @@ }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -1202,9 +1173,8 @@ }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", - "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1318,8 +1288,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" @@ -1425,8 +1393,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" @@ -1804,8 +1770,7 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", @@ -2062,14 +2027,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "license": "MIT", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2490,8 +2456,7 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", @@ -2524,42 +2489,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/register/node_modules/make-dir": { "version": "2.1.0", "dev": true, @@ -2572,25 +2501,6 @@ "node": ">=6" } }, - "node_modules/@babel/register/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/register/node_modules/pify": { "version": "4.0.1", "dev": true, @@ -2599,17 +2509,6 @@ "node": ">=6" } }, - "node_modules/@babel/register/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/register/node_modules/semver": { "version": "5.7.2", "dev": true, @@ -2652,8 +2551,6 @@ }, "node_modules/@babel/template": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.7", @@ -2666,8 +2563,6 @@ }, "node_modules/@babel/template/node_modules/@babel/code-frame": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.25.7", @@ -2679,8 +2574,6 @@ }, "node_modules/@babel/traverse": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.7", @@ -2697,8 +2590,6 @@ }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.25.7", @@ -2709,9 +2600,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -3226,30 +3117,13 @@ "node": ">=16.13" } }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240925.0.tgz", - "integrity": "sha512-KdLnSXuzB65CbqZPm+qYzk+zkQ1tUNPaaRGYVd/jPYAxwwtfTUQdQ+ahDPwVVs2tmQELKy7ZjQjf2apqSWUfjw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, "node_modules/@cloudflare/workerd-darwin-arm64": { "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240925.0.tgz", - "integrity": "sha512-MiQ6uUmCXjsXgWNV+Ock2tp2/tYqNJGzjuaH6jFioeRF+//mz7Tv7J7EczOL4zq+TH8QFOh0/PUsLyazIWVGng==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -3258,59 +3132,10 @@ "node": ">=16" } }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240925.0.tgz", - "integrity": "sha512-Rjix8jsJMfsInmq3Hm3fmiRQ+rwzuWRPV1pg/OWhMSfNP7Qp2RCU+RGkhgeR9Z5eNAje0Sn2BMrFq4RvF9/yRA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240925.0.tgz", - "integrity": "sha512-VYIPeMHQRtbwQoIjUwS/zULlywPxyDvo46XkTpIW5MScEChfqHvAYviQ7TzYGx6Q+gmZmN+DUB2KOMx+MEpCxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240925.0.tgz", - "integrity": "sha512-C8peGvaU5R51bIySi1VbyfRgwNSSRknqoFSnSbSBI3uTN3THTB3UnmRKy7GXJDmyjgXuT9Pcs1IgaWNubLtNtw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, "node_modules/@cloudflare/workers-types": { "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.19.0.tgz", - "integrity": "sha512-0FRcsz7Ea3jT+gc5gKPIYciykm1bbAaTpygdzpCwGt0RL+V83zWnYN30NWDW4rIHj/FHtz+MIuBKS61C8l7AzQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@coinbase/wallet-sdk": { "version": "4.0.4", @@ -4433,81 +4258,72 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4518,323 +4334,271 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -4916,22 +4680,20 @@ }, "node_modules/@expo/bunyan": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", - "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", "dev": true, + "engines": [ + "node >=0.10.0" + ], + "license": "MIT", "peer": true, "dependencies": { "uuid": "^8.0.0" - }, - "engines": { - "node": ">=0.10.0" } }, "node_modules/@expo/cli": { "version": "0.18.29", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.29.tgz", - "integrity": "sha512-X810C48Ss+67RdZU39YEO1khNYo1RmjouRV+vVe0QhMoTe8R6OA3t+XYEdwaNbJ5p/DJN7szfHfNmX2glpC7xg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", @@ -5018,9 +4780,8 @@ }, "node_modules/@expo/cli/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -5028,9 +4789,8 @@ }, "node_modules/@expo/cli/node_modules/@expo/config": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.3.tgz", - "integrity": "sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", @@ -5048,9 +4808,8 @@ }, "node_modules/@expo/cli/node_modules/@expo/config-plugins": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.9.tgz", - "integrity": "sha512-dNCG45C7BbDPV9MdWvCbsFtJtVn4w/TJbb5b7Yr6FA8HYIlaaVM0wqUMzTPmGj54iYXw8X/Vge8uCPxg7RWgeA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config-types": "^51.0.0-unreleased", @@ -5072,10 +4831,8 @@ }, "node_modules/@expo/cli/node_modules/@expo/config-plugins/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5094,17 +4851,14 @@ }, "node_modules/@expo/cli/node_modules/@expo/config-types": { "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/@expo/config/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5123,9 +4877,8 @@ }, "node_modules/@expo/cli/node_modules/@react-native/debugger-frontend": { "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", - "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=18" @@ -5133,9 +4886,8 @@ }, "node_modules/@expo/cli/node_modules/@react-native/dev-middleware": { "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", - "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", @@ -5158,9 +4910,8 @@ }, "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -5168,9 +4919,8 @@ }, "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-docker": "^2.0.0", @@ -5185,9 +4935,8 @@ }, "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/ws": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "async-limiter": "~1.0.0" @@ -5195,9 +4944,8 @@ }, "node_modules/@expo/cli/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -5205,9 +4953,8 @@ }, "node_modules/@expo/cli/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -5221,9 +4968,8 @@ }, "node_modules/@expo/cli/node_modules/bplist-creator": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha512-xp/tcaV3T5PCiaY04mXga7o/TE+t95gqeLmADeBI1CvZtdWTbgBt3uLpvh4UWtenKeBhCV6oVxGk38yZr2uYEA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "stream-buffers": "~2.2.0" @@ -5231,9 +4977,8 @@ }, "node_modules/@expo/cli/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -5248,9 +4993,8 @@ }, "node_modules/@expo/cli/node_modules/cli-cursor": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -5261,9 +5005,8 @@ }, "node_modules/@expo/cli/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -5274,16 +5017,14 @@ }, "node_modules/@expo/cli/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.8.0" @@ -5291,9 +5032,8 @@ }, "node_modules/@expo/cli/node_modules/form-data": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "asynckit": "^0.4.0", @@ -5306,9 +5046,8 @@ }, "node_modules/@expo/cli/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -5321,10 +5060,8 @@ }, "node_modules/@expo/cli/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5343,9 +5080,8 @@ }, "node_modules/@expo/cli/node_modules/log-symbols": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.0.1" @@ -5356,9 +5092,8 @@ }, "node_modules/@expo/cli/node_modules/log-symbols/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -5369,9 +5104,8 @@ }, "node_modules/@expo/cli/node_modules/log-symbols/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.1", @@ -5384,9 +5118,8 @@ }, "node_modules/@expo/cli/node_modules/log-symbols/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "1.1.3" @@ -5394,16 +5127,14 @@ }, "node_modules/@expo/cli/node_modules/log-symbols/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/log-symbols/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -5414,9 +5145,8 @@ }, "node_modules/@expo/cli/node_modules/mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -5424,16 +5154,14 @@ }, "node_modules/@expo/cli/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/onetime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "mimic-fn": "^1.0.0" @@ -5444,9 +5172,8 @@ }, "node_modules/@expo/cli/node_modules/ora": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -5462,9 +5189,8 @@ }, "node_modules/@expo/cli/node_modules/ora/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -5475,9 +5201,8 @@ }, "node_modules/@expo/cli/node_modules/ora/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.1", @@ -5490,9 +5215,8 @@ }, "node_modules/@expo/cli/node_modules/ora/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "1.1.3" @@ -5500,16 +5224,14 @@ }, "node_modules/@expo/cli/node_modules/ora/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/ora/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -5520,9 +5242,8 @@ }, "node_modules/@expo/cli/node_modules/picomatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -5533,9 +5254,8 @@ }, "node_modules/@expo/cli/node_modules/restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "onetime": "^2.0.0", @@ -5547,16 +5267,14 @@ }, "node_modules/@expo/cli/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/@expo/cli/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -5564,9 +5282,8 @@ }, "node_modules/@expo/cli/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -5575,9 +5292,8 @@ }, "node_modules/@expo/cli/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -5588,9 +5304,8 @@ }, "node_modules/@expo/cli/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -5598,16 +5313,14 @@ }, "node_modules/@expo/cli/node_modules/url-join": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/cli/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "sax": ">=0.6.0", @@ -5619,9 +5332,8 @@ }, "node_modules/@expo/cli/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0" @@ -5629,9 +5341,8 @@ }, "node_modules/@expo/code-signing-certificates": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "node-forge": "^1.2.1", @@ -5746,9 +5457,8 @@ }, "node_modules/@expo/config-plugins/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -5759,9 +5469,8 @@ }, "node_modules/@expo/config-plugins/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -5830,9 +5539,8 @@ }, "node_modules/@expo/devcert": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.4.tgz", - "integrity": "sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "application-config-path": "^0.1.0", @@ -5851,9 +5559,8 @@ }, "node_modules/@expo/devcert/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0" @@ -5861,9 +5568,8 @@ }, "node_modules/@expo/devcert/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -5871,9 +5577,8 @@ }, "node_modules/@expo/devcert/node_modules/get-port": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -5881,9 +5586,8 @@ }, "node_modules/@expo/devcert/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "foreground-child": "^3.1.0", @@ -5902,9 +5606,8 @@ }, "node_modules/@expo/devcert/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -5918,9 +5621,8 @@ }, "node_modules/@expo/devcert/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5934,9 +5636,8 @@ }, "node_modules/@expo/devcert/node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "os-tmpdir": "~1.0.2" @@ -5947,9 +5648,8 @@ }, "node_modules/@expo/env": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz", - "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.0.0", @@ -5961,9 +5661,8 @@ }, "node_modules/@expo/env/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -5977,9 +5676,8 @@ }, "node_modules/@expo/env/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -5994,9 +5692,8 @@ }, "node_modules/@expo/env/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -6007,9 +5704,8 @@ }, "node_modules/@expo/env/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/fingerprint": { @@ -6090,9 +5786,8 @@ }, "node_modules/@expo/image-utils": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz", - "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -6109,9 +5804,8 @@ }, "node_modules/@expo/image-utils/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -6125,9 +5819,8 @@ }, "node_modules/@expo/image-utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -6142,9 +5835,8 @@ }, "node_modules/@expo/image-utils/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -6155,16 +5847,14 @@ }, "node_modules/@expo/image-utils/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/image-utils/node_modules/crypto-random-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -6172,9 +5862,8 @@ }, "node_modules/@expo/image-utils/node_modules/fs-extra": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -6188,9 +5877,8 @@ }, "node_modules/@expo/image-utils/node_modules/fs-extra/node_modules/universalify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -6198,9 +5886,8 @@ }, "node_modules/@expo/image-utils/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -6211,9 +5898,8 @@ }, "node_modules/@expo/image-utils/node_modules/temp-dir": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -6221,9 +5907,8 @@ }, "node_modules/@expo/image-utils/node_modules/tempy": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "temp-dir": "^1.0.0", @@ -6236,9 +5921,8 @@ }, "node_modules/@expo/image-utils/node_modules/type-fest": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=6" @@ -6246,9 +5930,8 @@ }, "node_modules/@expo/image-utils/node_modules/unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "crypto-random-string": "^1.0.0" @@ -6292,9 +5975,8 @@ }, "node_modules/@expo/metro-config": { "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz", - "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.20.0", @@ -6319,9 +6001,8 @@ }, "node_modules/@expo/metro-config/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -6329,9 +6010,8 @@ }, "node_modules/@expo/metro-config/node_modules/@expo/config": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.3.tgz", - "integrity": "sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", @@ -6349,9 +6029,8 @@ }, "node_modules/@expo/metro-config/node_modules/@expo/config-plugins": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.9.tgz", - "integrity": "sha512-dNCG45C7BbDPV9MdWvCbsFtJtVn4w/TJbb5b7Yr6FA8HYIlaaVM0wqUMzTPmGj54iYXw8X/Vge8uCPxg7RWgeA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config-types": "^51.0.0-unreleased", @@ -6373,10 +6052,8 @@ }, "node_modules/@expo/metro-config/node_modules/@expo/config-plugins/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -6395,17 +6072,14 @@ }, "node_modules/@expo/metro-config/node_modules/@expo/config-types": { "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/metro-config/node_modules/@expo/config/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -6424,9 +6098,8 @@ }, "node_modules/@expo/metro-config/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -6440,9 +6113,8 @@ }, "node_modules/@expo/metro-config/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -6457,9 +6129,8 @@ }, "node_modules/@expo/metro-config/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -6470,16 +6141,14 @@ }, "node_modules/@expo/metro-config/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/metro-config/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -6493,10 +6162,8 @@ }, "node_modules/@expo/metro-config/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -6515,9 +6182,8 @@ }, "node_modules/@expo/metro-config/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -6528,9 +6194,8 @@ }, "node_modules/@expo/metro-config/node_modules/lightningcss": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz", - "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==", "dev": true, + "license": "MPL-2.0", "peer": true, "dependencies": { "detect-libc": "^1.0.3" @@ -6555,12 +6220,11 @@ }, "node_modules/@expo/metro-config/node_modules/lightningcss-darwin-arm64": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", - "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", "cpu": [ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -6574,158 +6238,10 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@expo/metro-config/node_modules/lightningcss-darwin-x64": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", - "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", - "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", - "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", - "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", - "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-linux-x64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz", - "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@expo/metro-config/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", - "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@expo/metro-config/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "sax": ">=0.6.0", @@ -6737,9 +6253,8 @@ }, "node_modules/@expo/metro-config/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0" @@ -6747,9 +6262,8 @@ }, "node_modules/@expo/osascript": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", - "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -6761,9 +6275,8 @@ }, "node_modules/@expo/package-manager": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz", - "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/json-file": "^8.3.0", @@ -6782,9 +6295,8 @@ }, "node_modules/@expo/package-manager/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -6798,9 +6310,8 @@ }, "node_modules/@expo/package-manager/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -6815,9 +6326,8 @@ }, "node_modules/@expo/package-manager/node_modules/cli-cursor": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -6828,9 +6338,8 @@ }, "node_modules/@expo/package-manager/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -6841,16 +6350,14 @@ }, "node_modules/@expo/package-manager/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/package-manager/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.8.0" @@ -6858,9 +6365,8 @@ }, "node_modules/@expo/package-manager/node_modules/log-symbols": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.0.1" @@ -6871,9 +6377,8 @@ }, "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -6884,9 +6389,8 @@ }, "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.1", @@ -6899,9 +6403,8 @@ }, "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "1.1.3" @@ -6909,16 +6412,14 @@ }, "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -6929,9 +6430,8 @@ }, "node_modules/@expo/package-manager/node_modules/mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -6939,9 +6439,8 @@ }, "node_modules/@expo/package-manager/node_modules/onetime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "mimic-fn": "^1.0.0" @@ -6952,9 +6451,8 @@ }, "node_modules/@expo/package-manager/node_modules/ora": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -6970,9 +6468,8 @@ }, "node_modules/@expo/package-manager/node_modules/ora/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -6983,9 +6480,8 @@ }, "node_modules/@expo/package-manager/node_modules/ora/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.1", @@ -6998,9 +6494,8 @@ }, "node_modules/@expo/package-manager/node_modules/ora/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "1.1.3" @@ -7008,16 +6503,14 @@ }, "node_modules/@expo/package-manager/node_modules/ora/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/package-manager/node_modules/ora/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -7028,9 +6521,8 @@ }, "node_modules/@expo/package-manager/node_modules/restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "onetime": "^2.0.0", @@ -7042,16 +6534,14 @@ }, "node_modules/@expo/package-manager/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/@expo/package-manager/node_modules/split": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "through": "2" @@ -7062,9 +6552,8 @@ }, "node_modules/@expo/package-manager/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -7075,9 +6564,8 @@ }, "node_modules/@expo/package-manager/node_modules/strip-ansi/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -7085,9 +6573,8 @@ }, "node_modules/@expo/package-manager/node_modules/sudo-prompt": { "version": "9.1.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", - "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/plist": { @@ -7102,9 +6589,8 @@ }, "node_modules/@expo/prebuild-config": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.8.tgz", - "integrity": "sha512-wH9NVg6HiwF5y9x0TxiMEeBF+ITPGDXy5/i6OUheSrKpPgb0lF1Mwzl/f2fLPXBEpl+ZXOQ8LlLW32b7K9lrNg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config": "~9.0.0-beta.0", @@ -7125,9 +6611,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -7135,9 +6620,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/@expo/config": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.3.tgz", - "integrity": "sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", @@ -7155,9 +6639,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.9.tgz", - "integrity": "sha512-dNCG45C7BbDPV9MdWvCbsFtJtVn4w/TJbb5b7Yr6FA8HYIlaaVM0wqUMzTPmGj54iYXw8X/Vge8uCPxg7RWgeA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config-types": "^51.0.0-unreleased", @@ -7179,23 +6662,20 @@ }, "node_modules/@expo/prebuild-config/node_modules/@expo/config-types": { "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", - "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/prebuild-config/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -7209,9 +6689,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -7226,9 +6705,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -7239,16 +6717,14 @@ }, "node_modules/@expo/prebuild-config/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/prebuild-config/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -7262,10 +6738,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -7284,9 +6758,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -7297,9 +6770,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "sax": ">=0.6.0", @@ -7311,9 +6783,8 @@ }, "node_modules/@expo/prebuild-config/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0" @@ -7321,9 +6792,8 @@ }, "node_modules/@expo/rudder-sdk-node": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", - "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/bunyan": "^4.0.0", @@ -7345,9 +6815,8 @@ }, "node_modules/@expo/spawn-async": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3" }, @@ -7357,9 +6826,8 @@ }, "node_modules/@expo/vector-icons": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.0.3.tgz", - "integrity": "sha512-UJAKOXPPi6ez/1QZfoFVopCH3+c12Sw+T+IIVkvONCEN7zjN1fLxxWHkZ7Spz4WO5EH2ObtaJfCe/k4rw+ftxA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "prop-types": "^15.8.1" @@ -7367,9 +6835,8 @@ }, "node_modules/@expo/xcpretty": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz", - "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/code-frame": "7.10.4", @@ -7383,9 +6850,8 @@ }, "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -7393,9 +6859,8 @@ }, "node_modules/@expo/xcpretty/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -7409,16 +6874,14 @@ }, "node_modules/@expo/xcpretty/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, + "license": "Python-2.0", "peer": true }, "node_modules/@expo/xcpretty/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -7433,9 +6896,8 @@ }, "node_modules/@expo/xcpretty/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -7446,16 +6908,14 @@ }, "node_modules/@expo/xcpretty/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@expo/xcpretty/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "argparse": "^2.0.1" @@ -7479,33 +6939,6 @@ "npm": ">=6.14.13" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "license": "MIT", - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/@fastify/busboy": { "version": "2.0.0", "dev": true, @@ -7514,19 +6947,13 @@ "node": ">=14" } }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/@fastify/error": { - "version": "3.2.1", - "license": "MIT" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "license": "MIT", + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, "dependencies": { - "fast-json-stringify": "^5.7.0" + "fast-deep-equal": "^3.1.3" } }, "node_modules/@floating-ui/core": { @@ -7617,9 +7044,8 @@ }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" @@ -7711,66 +7137,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@inkjs/ui": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0", - "cli-spinners": "^2.9.0", - "deepmerge": "^4.3.1", - "figures": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "ink": "^4.2.0" - } - }, - "node_modules/@inkjs/ui/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@inkjs/ui/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inkjs/ui/node_modules/figures": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inkjs/ui/node_modules/is-unicode-supported": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@internationalized/date": { "version": "3.5.4", "license": "Apache-2.0", @@ -7976,8 +7342,7 @@ }, "node_modules/@jescalan/ink-markdown/node_modules/ansi-escapes": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -7987,8 +7352,7 @@ }, "node_modules/@jescalan/ink-markdown/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8008,7 +7372,6 @@ }, "node_modules/@jescalan/ink-markdown/node_modules/marked-terminal": { "version": "6.2.0", - "resolved": "git+ssh://git@github.com/jescalan/marked-terminal.git#44f5ab42076e16937f56d645d3d7264675558ea1", "license": "MIT", "dependencies": { "ansi-escapes": "^6.2.0", @@ -9362,9 +8725,8 @@ }, "node_modules/@npmcli/fs": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "semver": "^7.3.5" @@ -9536,8 +8898,6 @@ }, "node_modules/@oslojs/encoding": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT", "peer": true }, @@ -9627,6 +8987,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@playwright/test": { "version": "1.44.1", "dev": true, @@ -9700,9 +9072,8 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@radix-ui/primitive": { "version": "1.0.1", @@ -12785,9 +12156,8 @@ }, "node_modules/@rnx-kit/chromium-edge-launcher": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "@types/node": "^18.0.0", @@ -12803,10 +12173,8 @@ }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -12825,9 +12193,8 @@ }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -12838,10 +12205,8 @@ }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -13024,8 +12389,6 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -13074,11 +12437,10 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -13187,7 +12549,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -13243,15 +12604,13 @@ }, "node_modules/@rsdoctor/client": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/client/-/client-0.4.4.tgz", - "integrity": "sha512-xMtOWtLR9qidnXhQTRaaMVHhNqPYApk3uN5cGQJwWJDzmNNmmVeB663sIpHPKXD8cmC/w0z4SDjWA4jue8LM2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rsdoctor/core": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/core/-/core-0.4.4.tgz", - "integrity": "sha512-cV1f9Fu/S9cjZ9F/oWhgIZHaX0qZJVNh2/DS9vh0gWBZJhBVPz5NBCKjA322W7hGT343sadVdys2PqIxjCHcOw==", "dev": true, + "license": "MIT", "dependencies": { "@rsdoctor/graph": "0.4.4", "@rsdoctor/sdk": "0.4.4", @@ -13270,9 +12629,8 @@ }, "node_modules/@rsdoctor/core/node_modules/enhanced-resolve": { "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -13283,9 +12641,8 @@ }, "node_modules/@rsdoctor/core/node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -13295,18 +12652,16 @@ }, "node_modules/@rsdoctor/core/node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@rsdoctor/graph": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/graph/-/graph-0.4.4.tgz", - "integrity": "sha512-ZcCRo9ydqyNI5otai+qUGxw4HZQAE0Rolb9tV4aadNudl7A2Mcm6FT6yECB4jlbNECqc8B5kHKZuz971WgFkLA==", "dev": true, + "license": "MIT", "dependencies": { "@rsdoctor/types": "0.4.4", "@rsdoctor/utils": "0.4.4", @@ -13317,18 +12672,16 @@ }, "node_modules/@rsdoctor/graph/node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@rsdoctor/sdk": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/sdk/-/sdk-0.4.4.tgz", - "integrity": "sha512-Y+ySVfrFAT0GVwI0xTU/BdEsufnC/+1eLYISWTEa19MdWU/RpcLqsIdglKNbDUbS6k0AELOvl7CUuOiI0go8gw==", "dev": true, + "license": "MIT", "dependencies": { "@rsdoctor/client": "0.4.4", "@rsdoctor/graph": "0.4.4", @@ -13349,15 +12702,13 @@ }, "node_modules/@rsdoctor/sdk/node_modules/dayjs": { "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rsdoctor/sdk/node_modules/serve-static": { "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -13370,18 +12721,16 @@ }, "node_modules/@rsdoctor/sdk/node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@rsdoctor/types": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/types/-/types-0.4.4.tgz", - "integrity": "sha512-Ltf03hd/gAazRTmrwz7SqNDqB+BHC0BBVwQi7wUVsF6MphvTaqSdAocNefTgWDeXj0WEP0Vy5wrj+aUPTbPWtg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "3.4.38", "@types/estree": "1.0.5", @@ -13400,18 +12749,16 @@ }, "node_modules/@rsdoctor/types/node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@rsdoctor/utils": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/utils/-/utils-0.4.4.tgz", - "integrity": "sha512-J61vLwKdNnuToeU7ZfCIy5rYH4biMH7LfinQG9m4ySveyT9hD8z/CyxbpOlr7vdmnzBVzZCy+0aHm9UbhUpjxQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "7.24.7", "@rsdoctor/types": "0.4.4", @@ -13435,9 +12782,8 @@ }, "node_modules/@rsdoctor/utils/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13450,9 +12796,8 @@ }, "node_modules/@rsdoctor/utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13466,9 +12811,8 @@ }, "node_modules/@rsdoctor/utils/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13478,15 +12822,13 @@ }, "node_modules/@rsdoctor/utils/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rsdoctor/utils/node_modules/envinfo": { "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -13496,18 +12838,16 @@ }, "node_modules/@rsdoctor/utils/node_modules/lines-and-columns": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/@rsdoctor/webpack-plugin": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rsdoctor/webpack-plugin/-/webpack-plugin-0.4.4.tgz", - "integrity": "sha512-lXUNQaX3jGx+V6TCzOnWV5jMJ6vsziPGBPrz9m4PEsW+4nDrzEJLieE6e7AwrxGEUi02GbxmCq6FXBJVBIWdqA==", "dev": true, + "license": "MIT", "dependencies": { "@rsdoctor/core": "0.4.4", "@rsdoctor/graph": "0.4.4", @@ -13525,10 +12865,14 @@ "version": "1.5.1", "license": "MIT" }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", - "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", "dev": true, "peer": true, "dependencies": { @@ -13537,59 +12881,54 @@ } }, "node_modules/@shikijs/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.21.0.tgz", - "integrity": "sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==", - "license": "MIT", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", + "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", "peer": true, "dependencies": { - "@shikijs/engine-javascript": "1.21.0", - "@shikijs/engine-oniguruma": "1.21.0", - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.21.0.tgz", - "integrity": "sha512-jxQHNtVP17edFW4/0vICqAVLDAxmyV31MQJL4U/Kg+heQALeKYVOWo0sMmEZ18FqBt+9UCdyqGKYE7bLRtk9mg==", - "license": "MIT", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", + "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", "peer": true, "dependencies": { - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "oniguruma-to-js": "0.4.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.21.0.tgz", - "integrity": "sha512-AIZ76XocENCrtYzVU7S4GY/HL+tgHGbVU+qhiDyNw1qgCA5OSi4B4+HY4BtAoJSMGuD/L5hfTzoRVbzEm2WTvg==", - "license": "MIT", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", + "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", "peer": true, "dependencies": { - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2" + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.21.0.tgz", - "integrity": "sha512-tzndANDhi5DUndBtpojEq/42+dpUF2wS7wdCDQaFtIXm3Rd1QkrcVgSSRLOvEwexekihOXfbYJINW37g96tJRw==", - "license": "MIT", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", + "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", "peer": true, "dependencies": { - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", - "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==", - "license": "MIT", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", "peer": true }, "node_modules/@sideway/address": { @@ -13617,8 +12956,7 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -13677,9 +13015,8 @@ }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "6.5.1", @@ -13930,19 +13267,17 @@ }, "node_modules/@swc/helpers": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "node_modules/@tanstack/react-cross-context": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-cross-context/-/react-cross-context-1.60.0.tgz", - "integrity": "sha512-UZXc0ggrZLvNN3j1qQLtnhPp0gAcxeKS+d+hjGiJuIHSKt5fCbb/88C5uWrq4R4jsw5PnzUaKn8VqyUi/cXsXA==", + "version": "1.74.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-cross-context/-/react-cross-context-1.74.5.tgz", + "integrity": "sha512-a4BoKe1umpt4mmol2fUc7S11ilYIrn60ysoLot0NE+BeRsML83MvgPsLTAx7h1fTp0gmLjtpMjjubIJ8GlDIQg==", "dev": true, - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -13953,9 +13288,10 @@ } }, "node_modules/@tanstack/react-store": { - "version": "0.5.5", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.5.6.tgz", + "integrity": "sha512-SitIpS5jTj28DajjLpWbIX+YetmJL+6PRY0DKKiCGBKfYIqj3ryODQYF3jB3SNoR9ifUA/jFkqbJdBKFtWd+AQ==", "dev": true, - "license": "MIT", "dependencies": { "@tanstack/store": "0.5.5", "use-sync-external-store": "^1.2.2" @@ -13970,24 +13306,25 @@ } }, "node_modules/@tanstack/start-vite-plugin": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/@tanstack/start-vite-plugin/-/start-vite-plugin-1.60.0.tgz", - "integrity": "sha512-ap9NFBRyWJo7Xdklad0Bg3LOZ+n9nwWTDOU5ix/ZzZfifNWp5OoHRSVveHqPm2UAHUVp2BCzUK6xbAxtaSjjnw==", + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/@tanstack/start-vite-plugin/-/start-vite-plugin-1.66.1.tgz", + "integrity": "sha512-ZWGlNqF7vAiEOMQxxFQvzzcc/MIcT2l1xBz5mkjzTR4rrsLumaTXd8++LPoGD57NmlaGncBkGkiTiDMWZn1cFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.25.7", + "@babel/core": "^7.25.8", "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/plugin-syntax-jsx": "^7.25.7", "@babel/plugin-syntax-typescript": "^7.25.7", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.6.8", "@types/babel__template": "^7.4.4", - "@types/babel__traverse": "^7.20.6" + "@types/babel__traverse": "^7.20.6", + "babel-dead-code-elimination": "^1.0.6" }, "engines": { "node": ">=12" @@ -14293,9 +13630,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -14329,9 +13665,8 @@ }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -14357,24 +13692,6 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "license": "MIT" @@ -14416,9 +13733,8 @@ }, "node_modules/@types/fs-extra": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/jsonfile": "*", "@types/node": "*" @@ -14532,6 +13848,56 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jscodeshift": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.12.0.tgz", + "integrity": "sha512-Jr2fQbEoDmjwEa92TreR/mX2t9iAaY/l5P/GKezvK4BodXahex60PDLXaQR0vAgP0KfCzc1CivHusQB9NhzX8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.14.1", + "recast": "^0.20.3" + } + }, + "node_modules/@types/jscodeshift/node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/jscodeshift/node_modules/recast": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", + "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "0.14.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@types/jscodeshift/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@types/jsdom": { "version": "20.0.1", "dev": true, @@ -14652,9 +14018,8 @@ }, "node_modules/@types/qunit": { "version": "2.19.10", - "resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.19.10.tgz", - "integrity": "sha512-gVB+rxvxmbyPFWa6yjjKgcumWal3hyqoTXI0Oil161uWfo1OCzWZ/rnEumsx+6uVgrwPrCrhpQbLkzfildkSbg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.4", @@ -14690,8 +14055,7 @@ }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.1", @@ -14776,9 +14140,8 @@ }, "node_modules/@types/tapable": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.7.tgz", - "integrity": "sha512-D6QzACV9vNX3r8HQQNTOnpG+Bv1rko+yEA82wKs3O9CQ5+XW7HI7TED17/UE7+5dIxyxZIWTxKbsBeF6uKFCwA==", "dev": true, + "license": "MIT", "dependencies": { "tapable": "^2.2.0" } @@ -15048,9 +14411,8 @@ }, "node_modules/@urql/core": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", - "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.0", @@ -15062,9 +14424,8 @@ }, "node_modules/@urql/exchange-retry": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", - "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@urql/core": ">=2.3.1", @@ -15551,9 +14912,8 @@ }, "node_modules/@verdaccio/middleware/node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -15575,27 +14935,24 @@ }, "node_modules/@verdaccio/middleware/node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/@verdaccio/middleware/node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/@verdaccio/middleware/node_modules/express": { "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -15635,18 +14992,16 @@ }, "node_modules/@verdaccio/middleware/node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/@verdaccio/middleware/node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -15662,9 +15017,8 @@ }, "node_modules/@verdaccio/middleware/node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -15690,21 +15044,18 @@ }, "node_modules/@verdaccio/middleware/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/middleware/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@verdaccio/middleware/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15959,6 +15310,47 @@ "node": ">= 14.16" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", + "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.3", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/pretty-format": { "version": "2.0.5", "dev": true, @@ -16246,6 +15638,7 @@ }, "node_modules/abort-controller": { "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -16256,6 +15649,7 @@ }, "node_modules/abstract-logging": { "version": "2.0.1", + "dev": true, "license": "MIT" }, "node_modules/accepts": { @@ -16333,9 +15727,8 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -16396,6 +15789,7 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -16411,6 +15805,7 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.12.0", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -16425,6 +15820,7 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", + "dev": true, "license": "MIT" }, "node_modules/ajv-keywords": { @@ -16603,9 +15999,8 @@ }, "node_modules/application-config-path": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", - "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/aproba": { @@ -16821,10 +16216,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/archy": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/are-we-there-yet": { "version": "2.0.0", "dev": true, @@ -16852,8 +16243,7 @@ }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", @@ -17077,19 +16467,18 @@ } }, "node_modules/astro": { - "version": "4.15.11", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.15.11.tgz", - "integrity": "sha512-uA9fenaRR+j6ksPFsmhM88ttz94a66SET1TZxAJLxctxWkDlgz58BxZYUc1gNlt0azhgzOgh4hP3q9M4YzAmBA==", - "license": "MIT", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.1.tgz", + "integrity": "sha512-ZeZd+L147HHgHmvoSkve7KM3EutV+hY0mOCa4PwARHEFAAh+omo4MUNoTWsFkfq7ozTgR0PCXQwslrZduoWHNg==", "peer": true, "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.4.1", - "@astrojs/markdown-remark": "5.2.0", + "@astrojs/markdown-remark": "5.3.0", "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.25.2", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/types": "^7.25.6", + "@babel/core": "^7.25.7", + "@babel/plugin-transform-react-jsx": "^7.25.7", + "@babel/types": "^7.25.7", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.2", "@types/babel__core": "^7.20.5", @@ -17101,7 +16490,7 @@ "ci-info": "^4.0.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", - "cookie": "^0.6.0", + "cookie": "^0.7.2", "cssesc": "^3.0.0", "debug": "^4.3.7", "deterministic-object-hash": "^2.0.2", @@ -17113,7 +16502,6 @@ "esbuild": "^0.21.5", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", - "fastq": "^1.17.1", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", @@ -17133,9 +16521,7 @@ "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", - "shiki": "^1.21.0", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", + "shiki": "^1.22.0", "tinyexec": "^0.3.0", "tsconfck": "^3.1.3", "unist-util-visit": "^5.0.0", @@ -17161,97 +16547,13 @@ "sharp": "^0.33.3" } }, - "node_modules/astro/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/astro/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -17261,303 +16563,16 @@ "node": ">=12" } }, - "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/astro/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/astro/node_modules/@types/cookie": { "version": "0.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "peer": true }, "node_modules/astro/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "peer": true, "engines": { "node": ">=12" @@ -17570,7 +16585,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", "peer": true, "engines": { "node": ">=12" @@ -17581,14 +16595,14 @@ }, "node_modules/astro/node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "peer": true }, "node_modules/astro/node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", "peer": true, "engines": { "node": ">= 0.4" @@ -17596,7 +16610,8 @@ }, "node_modules/astro/node_modules/axobject-query": { "version": "4.1.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "peer": true, "engines": { "node": ">= 0.4" @@ -17606,7 +16621,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", - "license": "MIT", "peer": true, "dependencies": { "ansi-align": "^3.0.1", @@ -17629,7 +16643,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "license": "MIT", "peer": true, "engines": { "node": ">=16" @@ -17642,7 +16655,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -17653,29 +16665,23 @@ }, "node_modules/astro/node_modules/ci-info": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, - "node_modules/astro/node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/astro/node_modules/debug": { "version": "4.3.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "peer": true, "dependencies": { "ms": "^2.1.3" @@ -17691,13 +16697,15 @@ }, "node_modules/astro/node_modules/emoji-regex": { "version": "10.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "peer": true }, "node_modules/astro/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, - "license": "MIT", "peer": true, "bin": { "esbuild": "bin/esbuild" @@ -17736,7 +16744,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -17748,12 +16755,14 @@ }, "node_modules/astro/node_modules/html-escaper": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "peer": true }, "node_modules/astro/node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "peer": true, "dependencies": { "argparse": "^2.0.1" @@ -17764,7 +16773,8 @@ }, "node_modules/astro/node_modules/magicast": { "version": "0.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "peer": true, "dependencies": { "@babel/parser": "^7.25.4", @@ -17774,7 +16784,8 @@ }, "node_modules/astro/node_modules/micromatch": { "version": "4.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "peer": true, "dependencies": { "braces": "^3.0.3", @@ -17786,12 +16797,14 @@ }, "node_modules/astro/node_modules/ms": { "version": "2.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "peer": true }, "node_modules/astro/node_modules/p-limit": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", + "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", "peer": true, "dependencies": { "yocto-queue": "^1.1.1" @@ -17805,7 +16818,8 @@ }, "node_modules/astro/node_modules/preferred-pm": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", + "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", "peer": true, "dependencies": { "find-up-simple": "^1.0.0", @@ -17818,7 +16832,8 @@ }, "node_modules/astro/node_modules/semver": { "version": "7.6.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "peer": true, "bin": { "semver": "bin/semver.js" @@ -17829,7 +16844,8 @@ }, "node_modules/astro/node_modules/string-width": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "peer": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -17845,7 +16861,8 @@ }, "node_modules/astro/node_modules/strip-ansi": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "peer": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -17861,7 +16878,6 @@ "version": "4.26.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=16" @@ -17871,10 +16887,9 @@ } }, "node_modules/astro/node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "license": "MIT", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "peer": true, "dependencies": { "esbuild": "^0.21.3", @@ -17932,7 +16947,8 @@ }, "node_modules/astro/node_modules/which-pm": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", + "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", "peer": true, "dependencies": { "load-yaml-file": "^0.2.0" @@ -17945,7 +16961,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", - "license": "MIT", "peer": true, "dependencies": { "string-width": "^7.0.0" @@ -17961,7 +16976,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -17977,7 +16991,8 @@ }, "node_modules/astro/node_modules/yargs-parser": { "version": "21.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "peer": true, "engines": { "node": ">=12" @@ -17985,7 +17000,8 @@ }, "node_modules/astro/node_modules/yocto-queue": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "peer": true, "engines": { "node": ">=12.20" @@ -18038,11 +17054,24 @@ }, "node_modules/atomic-sleep": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "license": "MIT", @@ -18056,15 +17085,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/avvio": { - "version": "8.2.1", - "license": "MIT", - "dependencies": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "dev": true, @@ -18087,9 +17107,8 @@ }, "node_modules/axios": { "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -18098,9 +17117,8 @@ }, "node_modules/axios/node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/axobject-query": { "version": "3.2.1", @@ -18263,21 +17281,6 @@ "npm": ">=6" } }, - "node_modules/babel-plugin-module-resolver": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", - "pkg-up": "^3.1.0", - "reselect": "^4.1.7", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">= 16" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.5", "devOptional": true, @@ -18324,16 +17327,14 @@ }, "node_modules/babel-plugin-react-compiler": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0.tgz", - "integrity": "sha512-Kigl0V36a/6hLVH7+CCe1CCtU3mFBqBd829V//VtuG7I/pyq+B2QZJqOefd63snQmdfCryNhO9XW1FbGPBvYDA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/babel-plugin-react-native-web": { "version": "0.19.12", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.12.tgz", - "integrity": "sha512-eYZ4+P6jNcB37lObWIg0pUbi7+3PKoU1Oie2j0C8UF3cXyXoR74tO2NBjI/FORb2LJyItJZEAmjU5pSaJYEL1w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/babel-plugin-transform-flow-enums": { @@ -18368,9 +17369,8 @@ }, "node_modules/babel-preset-expo": { "version": "11.0.14", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.14.tgz", - "integrity": "sha512-4BVYR0Sc2sSNxYTiE/OLSnPiOp+weFNy8eV+hX3aD6YAIbBnw+VubKRWqJV/sOJauzOLz0SgYAYyFciYMqizRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", @@ -18387,9 +17387,8 @@ }, "node_modules/babel-preset-expo/node_modules/@react-native/babel-plugin-codegen": { "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.87.tgz", - "integrity": "sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@react-native/codegen": "0.74.87" @@ -18400,9 +17399,8 @@ }, "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset": { "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.87.tgz", - "integrity": "sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.20.0", @@ -18458,9 +17456,8 @@ }, "node_modules/babel-preset-expo/node_modules/@react-native/codegen": { "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.87.tgz", - "integrity": "sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/parser": "^7.20.0", @@ -18480,10 +17477,8 @@ }, "node_modules/babel-preset-expo/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -18502,16 +17497,14 @@ }, "node_modules/babel-preset-expo/node_modules/hermes-estree": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", - "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/babel-preset-expo/node_modules/hermes-parser": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", - "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "hermes-estree": "0.19.1" @@ -18575,9 +17568,8 @@ }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } @@ -18623,9 +17615,8 @@ }, "node_modules/better-opn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "open": "^8.0.4" @@ -18711,8 +17702,6 @@ }, "node_modules/body-parser": { "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "license": "MIT", "dependencies": { @@ -18736,8 +17725,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -18746,15 +17733,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -18972,8 +17955,6 @@ }, "node_modules/browserslist": { "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -19045,9 +18026,8 @@ }, "node_modules/buffer-alloc": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "buffer-alloc-unsafe": "^1.1.0", @@ -19056,9 +18036,8 @@ }, "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/buffer-crc32": { @@ -19076,9 +18055,8 @@ }, "node_modules/buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/buffer-from": { @@ -19105,9 +18083,8 @@ }, "node_modules/bundlewatch": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/bundlewatch/-/bundlewatch-0.4.0.tgz", - "integrity": "sha512-w8w4K8RdrsHMZD9Ss4Ailfsrax/0zSIgh25GCaiudNHg45xXuh/u/xezzjbu+WCQJGjL9O1Fg9k9TEdS/XkZFA==", "dev": true, + "license": "MIT", "dependencies": { "axios": "^0.28.0", "bytes": "^3.1.1", @@ -19129,9 +18106,8 @@ }, "node_modules/bundlewatch/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19144,9 +18120,8 @@ }, "node_modules/bundlewatch/node_modules/axios": { "version": "0.28.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz", - "integrity": "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -19155,9 +18130,8 @@ }, "node_modules/bundlewatch/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19171,9 +18145,8 @@ }, "node_modules/bundlewatch/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19183,16 +18156,13 @@ }, "node_modules/bundlewatch/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bundlewatch/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19210,9 +18180,8 @@ }, "node_modules/bundlewatch/node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/busboy": { "version": "1.6.0", @@ -19269,9 +18238,8 @@ }, "node_modules/cacache": { "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -19293,9 +18261,8 @@ }, "node_modules/cacache/node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "clean-stack": "^2.0.0", @@ -19307,9 +18274,8 @@ }, "node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0" @@ -19317,9 +18283,8 @@ }, "node_modules/cacache/node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -19327,9 +18292,8 @@ }, "node_modules/cacache/node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "minipass": "^7.0.3" @@ -19340,9 +18304,8 @@ }, "node_modules/cacache/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "foreground-child": "^3.1.0", @@ -19361,9 +18324,8 @@ }, "node_modules/cacache/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -19377,16 +18339,14 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -19400,9 +18360,8 @@ }, "node_modules/cacache/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "aggregate-error": "^3.0.0" @@ -19530,8 +18489,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "funding": [ { "type": "opencollective", @@ -19683,9 +18640,8 @@ }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -19920,8 +18876,7 @@ }, "node_modules/cli-highlight": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "license": "ISC", "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -19940,8 +18895,7 @@ }, "node_modules/cli-highlight/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19954,8 +18908,7 @@ }, "node_modules/cli-highlight/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19969,8 +18922,7 @@ }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -19979,8 +18931,7 @@ }, "node_modules/cli-highlight/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19990,18 +18941,15 @@ }, "node_modules/cli-highlight/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/cli-highlight/node_modules/parse5": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "license": "MIT" }, "node_modules/cli-highlight/node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -20017,8 +18965,7 @@ }, "node_modules/cli-highlight/node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } @@ -20035,8 +18982,7 @@ }, "node_modules/cli-table3": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -20260,9 +19206,8 @@ }, "node_modules/clone": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.8" @@ -20519,9 +19464,8 @@ }, "node_modules/component-type": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", - "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", "dev": true, + "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20894,8 +19838,9 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "license": "MIT", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } @@ -21282,9 +20227,8 @@ }, "node_modules/cross-fetch": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "node-fetch": "^2.6.12" @@ -21317,9 +20261,8 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -21331,9 +20274,8 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -21880,9 +20822,8 @@ }, "node_modules/dag-map": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/damerau-levenshtein": { @@ -22034,9 +20975,8 @@ }, "node_modules/debounce": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", @@ -22121,9 +21061,8 @@ }, "node_modules/deep-eql": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -22133,9 +21072,8 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -22154,9 +21092,8 @@ }, "node_modules/default-gateway": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { "execa": "^1.0.0", @@ -22168,9 +21105,8 @@ }, "node_modules/default-gateway/node_modules/cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "nice-try": "^1.0.4", @@ -22185,9 +21121,8 @@ }, "node_modules/default-gateway/node_modules/execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cross-spawn": "^6.0.0", @@ -22204,9 +21139,8 @@ }, "node_modules/default-gateway/node_modules/get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "pump": "^3.0.0" @@ -22217,9 +21151,8 @@ }, "node_modules/default-gateway/node_modules/is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -22227,9 +21160,8 @@ }, "node_modules/default-gateway/node_modules/npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "path-key": "^2.0.0" @@ -22240,9 +21172,8 @@ }, "node_modules/default-gateway/node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -22250,9 +21181,8 @@ }, "node_modules/default-gateway/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver" @@ -22260,9 +21190,8 @@ }, "node_modules/default-gateway/node_modules/shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "shebang-regex": "^1.0.0" @@ -22273,9 +21202,8 @@ }, "node_modules/default-gateway/node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -22283,16 +21211,14 @@ }, "node_modules/default-gateway/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/default-gateway/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -22375,9 +21301,8 @@ }, "node_modules/del": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "globby": "^11.0.1", @@ -22726,9 +21651,8 @@ }, "node_modules/del/node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "clean-stack": "^2.0.0", @@ -22740,9 +21664,8 @@ }, "node_modules/del/node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -22750,10 +21673,8 @@ }, "node_modules/del/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -22772,9 +21693,8 @@ }, "node_modules/del/node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-union": "^2.1.0", @@ -22793,9 +21713,8 @@ }, "node_modules/del/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "aggregate-error": "^3.0.0" @@ -22809,10 +21728,8 @@ }, "node_modules/del/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -22945,8 +21862,6 @@ }, "node_modules/devalue": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", "license": "MIT", "peer": true }, @@ -23135,9 +22050,8 @@ }, "node_modules/dotenv-expand": { "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { "dotenv": "^16.4.4" @@ -23151,8 +22065,6 @@ }, "node_modules/dset": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "license": "MIT", "peer": true, "engines": { @@ -23198,9 +22110,8 @@ }, "node_modules/edge-runtime": { "version": "2.5.10", - "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.10.tgz", - "integrity": "sha512-oe6JjFbU1MbISzeSBMHqmzBhNEwmy2AYDY0LxStl8FAIWSGdGO+CqzWub9nbgmANuJYPXZA0v3XAlbxeKV/Omw==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@edge-runtime/format": "2.2.1", "@edge-runtime/ponyfill": "2.4.2", @@ -23239,8 +22150,6 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.32", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz", - "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==", "license": "ISC" }, "node_modules/emittery": { @@ -23260,8 +22169,7 @@ }, "node_modules/emojilib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -23289,9 +22197,8 @@ }, "node_modules/engine.io": { "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, + "license": "MIT", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -23310,18 +22217,16 @@ }, "node_modules/engine.io-parser": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -23360,9 +22265,8 @@ }, "node_modules/env-editor": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -23389,9 +22293,7 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -23401,9 +22303,8 @@ }, "node_modules/eol": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/error-ex": { @@ -23578,10 +22479,9 @@ }, "node_modules/esbuild": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -23625,9 +22525,8 @@ }, "node_modules/esbuild-register": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -23635,230 +22534,604 @@ "esbuild": ">=0.12 <1" } }, - "node_modules/escalade": { - "version": "3.1.2", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "peer": true, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/escape-html": { - "version": "1.0.3", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/escodegen": { - "version": "2.0.0", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=12" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/eslint": { - "version": "8.49.0", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-config-custom": { - "version": "0.0.0", + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-config-next": "^12.0.8", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-react": "7.28.0" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/eslint-config-custom/node_modules/doctrine": { - "version": "2.1.0", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/eslint-config-custom/node_modules/eslint-config-prettier": { - "version": "8.10.0", + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/eslint-config-custom/node_modules/eslint-plugin-react": { - "version": "7.28.0", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=12" } }, - "node_modules/eslint-config-custom/node_modules/resolve": { - "version": "2.0.0-next.5", + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.49.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-custom": { + "version": "0.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-next": "^12.0.8", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-react": "7.28.0" + } + }, + "node_modules/eslint-config-custom/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-config-prettier": { + "version": "8.10.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-plugin-react": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-config-custom/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/eslint-config-custom/node_modules/semver": { "version": "6.3.1", @@ -24709,6 +23982,7 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -24726,6 +24000,7 @@ }, "node_modules/events": { "version": "3.3.0", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" @@ -24733,9 +24008,8 @@ }, "node_modules/exec-async": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/execa": { @@ -24827,9 +24101,8 @@ }, "node_modules/expo": { "version": "51.0.34", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.34.tgz", - "integrity": "sha512-l2oi+hIj/ph3qGcvM54Nyd2uF3Zq5caVmSg7AXfBUgtvcdv5Pj1EI/2xCXP9tfMNQo351CWyOwBkTGjv+GdrLg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", @@ -24854,9 +24127,8 @@ }, "node_modules/expo-asset": { "version": "10.0.10", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.10.tgz", - "integrity": "sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "expo-constants": "~16.0.0", @@ -24869,9 +24141,8 @@ }, "node_modules/expo-asset/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -24879,9 +24150,8 @@ }, "node_modules/expo-asset/node_modules/@expo/config": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.3.tgz", - "integrity": "sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", @@ -24899,9 +24169,8 @@ }, "node_modules/expo-asset/node_modules/@expo/config-plugins": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.9.tgz", - "integrity": "sha512-dNCG45C7BbDPV9MdWvCbsFtJtVn4w/TJbb5b7Yr6FA8HYIlaaVM0wqUMzTPmGj54iYXw8X/Vge8uCPxg7RWgeA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config-types": "^51.0.0-unreleased", @@ -24923,16 +24192,14 @@ }, "node_modules/expo-asset/node_modules/@expo/config-types": { "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/expo-asset/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -24946,9 +24213,8 @@ }, "node_modules/expo-asset/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -24963,9 +24229,8 @@ }, "node_modules/expo-asset/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -24976,16 +24241,14 @@ }, "node_modules/expo-asset/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/expo-asset/node_modules/expo-constants": { "version": "16.0.2", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-16.0.2.tgz", - "integrity": "sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config": "~9.0.0", @@ -24997,10 +24260,8 @@ }, "node_modules/expo-asset/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -25019,9 +24280,8 @@ }, "node_modules/expo-asset/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "sax": ">=0.6.0", @@ -25033,9 +24293,8 @@ }, "node_modules/expo-asset/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0" @@ -25054,9 +24313,8 @@ }, "node_modules/expo-file-system": { "version": "17.0.1", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz", - "integrity": "sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "expo": "*" @@ -25064,9 +24322,8 @@ }, "node_modules/expo-font": { "version": "12.0.10", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.10.tgz", - "integrity": "sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" @@ -25077,9 +24334,8 @@ }, "node_modules/expo-keep-awake": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz", - "integrity": "sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "expo": "*" @@ -25087,9 +24343,8 @@ }, "node_modules/expo-local-authentication": { "version": "13.8.0", - "resolved": "https://registry.npmjs.org/expo-local-authentication/-/expo-local-authentication-13.8.0.tgz", - "integrity": "sha512-h0YA7grVdo3834AS70EUCsalaXrrEnoq+yTvIhRTxiPmzWxUv7rNo5ff+XsIEYNElKPmT/wh/xPV1yo3l3fhGg==", "dev": true, + "license": "MIT", "dependencies": { "invariant": "^2.2.4" }, @@ -25099,9 +24354,8 @@ }, "node_modules/expo-modules-autolinking": { "version": "1.11.2", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.11.2.tgz", - "integrity": "sha512-fdcaNO8ucHA3yLNY52ZUENBcAG7KEx8QyMmnVNavO1JVBGRMZG8JyVcbrhYQDtVtpxkbai5YzwvLutINvbDZDQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.1.0", @@ -25118,9 +24372,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -25134,9 +24387,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -25151,9 +24403,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -25164,16 +24415,14 @@ }, "node_modules/expo-modules-autolinking/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/expo-modules-autolinking/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 10" @@ -25181,9 +24430,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -25197,9 +24445,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -25210,9 +24457,8 @@ }, "node_modules/expo-modules-core": { "version": "1.12.24", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.24.tgz", - "integrity": "sha512-3geIe2ecizlp7l26iY8Nmc59z2d1RUC5nQZtI9iJoi5uHEUV/zut8e4zRLFVnZb8KOcMcEDsrvaBL5DPnqdfpg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "invariant": "^2.2.4" @@ -25220,9 +24466,8 @@ }, "node_modules/expo-secure-store": { "version": "12.8.1", - "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-12.8.1.tgz", - "integrity": "sha512-Ju3jmkHby4w7rIzdYAt9kQyQ7HhHJ0qRaiQOInknhOLIltftHjEgF4I1UmzKc7P5RCfGNmVbEH729Pncp/sHXQ==", "dev": true, + "license": "MIT", "peerDependencies": { "expo": "*" } @@ -25241,9 +24486,8 @@ }, "node_modules/expo/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/highlight": "^7.10.4" @@ -25251,9 +24495,8 @@ }, "node_modules/expo/node_modules/@expo/config": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.3.tgz", - "integrity": "sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "~7.10.4", @@ -25271,9 +24514,8 @@ }, "node_modules/expo/node_modules/@expo/config-plugins": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.9.tgz", - "integrity": "sha512-dNCG45C7BbDPV9MdWvCbsFtJtVn4w/TJbb5b7Yr6FA8HYIlaaVM0wqUMzTPmGj54iYXw8X/Vge8uCPxg7RWgeA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@expo/config-types": "^51.0.0-unreleased", @@ -25295,16 +24537,14 @@ }, "node_modules/expo/node_modules/@expo/config-types": { "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/expo/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -25318,9 +24558,8 @@ }, "node_modules/expo/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -25335,9 +24574,8 @@ }, "node_modules/expo/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -25348,17 +24586,14 @@ }, "node_modules/expo/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/expo/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -25377,9 +24612,8 @@ }, "node_modules/expo/node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "sax": ">=0.6.0", @@ -25391,9 +24625,8 @@ }, "node_modules/expo/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0" @@ -25401,9 +24634,8 @@ }, "node_modules/express": { "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -25448,36 +24680,32 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -25493,27 +24721,24 @@ }, "node_modules/express/node_modules/finalhandler/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/express/node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -25523,21 +24748,18 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/send": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -25559,24 +24781,21 @@ }, "node_modules/express/node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/serve-static": { "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -25589,24 +24808,21 @@ }, "node_modules/express/node_modules/serve-static/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/serve-static/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/serve-static/node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -25628,9 +24844,8 @@ }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -25719,12 +24934,9 @@ ], "license": "MIT" }, - "node_modules/fast-content-type-parse": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", + "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -25764,42 +24976,13 @@ "version": "2.1.0", "license": "MIT" }, - "node_modules/fast-json-stringify": { - "version": "5.7.0", - "license": "MIT", - "dependencies": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" - } - }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/fast-levenshtein": { "version": "2.0.6", "license": "MIT" }, "node_modules/fast-querystring": { "version": "1.1.2", + "dev": true, "license": "MIT", "dependencies": { "fast-decode-uri-component": "^1.0.1" @@ -25807,6 +24990,7 @@ }, "node_modules/fast-redact": { "version": "3.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -25817,10 +25001,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "2.2.0", - "license": "MIT" - }, "node_modules/fast-xml-parser": { "version": "4.4.0", "dev": true, @@ -25849,31 +25029,6 @@ "node": ">= 4.9.1" } }, - "node_modules/fastify": { - "version": "4.12.0", - "license": "MIT", - "dependencies": { - "@fastify/ajv-compiler": "^3.3.1", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.1.0", - "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", - "fast-content-type-parse": "^1.0.0", - "find-my-way": "^7.3.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" - } - }, - "node_modules/fastify-plugin": { - "version": "4.5.0", - "license": "MIT" - }, "node_modules/fastq": { "version": "1.17.1", "license": "ISC", @@ -25902,9 +25057,8 @@ }, "node_modules/fbemitter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "fbjs": "^3.0.0" @@ -25912,9 +25066,8 @@ }, "node_modules/fbjs": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cross-fetch": "^3.1.5", @@ -25928,9 +25081,8 @@ }, "node_modules/fbjs-css-vars": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/fd-slicer": { @@ -25965,9 +25117,8 @@ }, "node_modules/fetch-retry": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", - "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/fflate": { @@ -26038,9 +25189,8 @@ }, "node_modules/filesize": { "version": "10.1.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", - "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 10.4.0" } @@ -26096,44 +25246,107 @@ "node": ">= 0.8" } }, - "node_modules/find-babel-config": { - "version": "2.0.0", - "dev": true, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "license": "MIT", "dependencies": { - "json5": "^2.1.1", - "path-exists": "^4.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=6" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "engines": { + "node": ">=6" } }, - "node_modules/find-my-way": { - "version": "7.6.2", + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=14" + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/find-root": { @@ -26167,9 +25380,8 @@ }, "node_modules/find-yarn-workspace-root": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "micromatch": "^4.0.2" @@ -26270,9 +25482,8 @@ }, "node_modules/fontfaceobserver": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "dev": true, + "license": "BSD-2-Clause", "peer": true }, "node_modules/for-each": { @@ -26307,9 +25518,8 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -26346,6 +25556,7 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -26353,9 +25564,8 @@ }, "node_modules/freeport-async": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -26529,7 +25739,6 @@ "node_modules/get-east-asian-width": { "version": "1.2.0", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -26595,6 +25804,8 @@ }, "node_modules/get-stdin": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "license": "MIT", "engines": { "node": ">=12" @@ -26683,6 +25894,8 @@ }, "node_modules/git-hooks-list": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.1.0.tgz", + "integrity": "sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==", "license": "MIT", "funding": { "url": "https://github.com/fisker/git-hooks-list?sponsor=1" @@ -26927,9 +26140,8 @@ }, "node_modules/graphql": { "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 10.x" @@ -26937,9 +26149,8 @@ }, "node_modules/graphql-tag": { "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "tslib": "^2.1.0" @@ -27134,8 +26345,9 @@ } }, "node_modules/hast-util-from-html": { - "version": "2.0.2", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", "peer": true, "dependencies": { "@types/hast": "^3.0.0", @@ -27219,8 +26431,6 @@ }, "node_modules/hast-util-to-html": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", "license": "MIT", "peer": true, "dependencies": { @@ -27352,8 +26562,7 @@ }, "node_modules/highlight.js": { "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -27372,9 +26581,8 @@ }, "node_modules/hosted-git-info": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "lru-cache": "^6.0.0" @@ -27385,9 +26593,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "yallist": "^4.0.0" @@ -27398,9 +26605,8 @@ }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/hpack.js": { @@ -27851,14 +27057,14 @@ }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/ink": { "version": "4.4.1", "license": "MIT", + "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.1.3", "ansi-escapes": "^6.0.0", @@ -27963,81 +27169,10 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/ink-link": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1", - "terminal-link": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "ink": ">=4" - } - }, - "node_modules/ink-link/node_modules/ansi-escapes": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ink-link/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ink-link/node_modules/supports-hyperlinks": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ink-link/node_modules/terminal-link": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ink-link/node_modules/type-fest": { - "version": "1.4.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ink/node_modules/ansi-escapes": { "version": "6.2.1", "license": "MIT", + "peer": true, "engines": { "node": ">=14.16" }, @@ -28048,6 +27183,7 @@ "node_modules/ink/node_modules/ansi-regex": { "version": "6.0.1", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -28058,6 +27194,7 @@ "node_modules/ink/node_modules/ansi-styles": { "version": "6.2.1", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -28065,19 +27202,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ink/node_modules/auto-bind": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ink/node_modules/chalk": { "version": "5.3.0", "license": "MIT", + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -28088,6 +27216,7 @@ "node_modules/ink/node_modules/cli-cursor": { "version": "4.0.0", "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^4.0.0" }, @@ -28101,6 +27230,7 @@ "node_modules/ink/node_modules/indent-string": { "version": "5.0.0", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -28111,6 +27241,7 @@ "node_modules/ink/node_modules/restore-cursor": { "version": "4.0.0", "license": "MIT", + "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -28124,11 +27255,13 @@ }, "node_modules/ink/node_modules/signal-exit": { "version": "3.0.7", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/ink/node_modules/slice-ansi": { "version": "6.0.0", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^4.0.0" @@ -28143,6 +27276,7 @@ "node_modules/ink/node_modules/string-width": { "version": "5.1.2", "license": "MIT", + "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -28158,6 +27292,7 @@ "node_modules/ink/node_modules/strip-ansi": { "version": "7.1.0", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -28171,6 +27306,7 @@ "node_modules/ink/node_modules/type-fest": { "version": "0.12.0", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -28181,6 +27317,7 @@ "node_modules/ink/node_modules/wrap-ansi": { "version": "8.1.0", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -28195,9 +27332,8 @@ }, "node_modules/internal-ip": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "default-gateway": "^4.2.0", @@ -28269,9 +27405,8 @@ }, "node_modules/ip-regex": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -28279,6 +27414,7 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" @@ -28561,6 +27697,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-ci": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", + "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", "license": "MIT", @@ -28640,9 +27791,8 @@ }, "node_modules/is-invalid-path": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-glob": "^2.0.0" @@ -28653,9 +27803,8 @@ }, "node_modules/is-invalid-path/node_modules/is-extglob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -28663,9 +27812,8 @@ }, "node_modules/is-invalid-path/node_modules/is-glob": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-extglob": "^1.0.0" @@ -28677,6 +27825,7 @@ "node_modules/is-lower-case": { "version": "2.0.2", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.3" } @@ -28733,9 +27882,8 @@ }, "node_modules/is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -28908,15 +28056,15 @@ "node_modules/is-upper-case": { "version": "2.0.2", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.0.3" } }, "node_modules/is-valid-path": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-invalid-path": "^0.1.0" @@ -30772,9 +29920,8 @@ }, "node_modules/jimp-compact": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/jiti": { @@ -30802,9 +29949,8 @@ }, "node_modules/join-component": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", - "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/joycon": { @@ -30990,8 +30136,6 @@ }, "node_modules/jsesc": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -31016,9 +30160,8 @@ }, "node_modules/json-schema-deref-sync": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", - "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "clone": "^2.1.2", @@ -31034,6 +30177,15 @@ "node": ">=6.0.0" } }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "license": "MIT" @@ -31044,9 +30196,8 @@ }, "node_modules/json-stream-stringify": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.0.1.tgz", - "integrity": "sha512-vuxs3G1ocFDiAQ/SX0okcZbtqXwgj1g71qE9+vrjJ2EkjKQlEFDAcUNRxRU8O+GekV4v5cM2qXP0Wyt/EMDBiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -31289,15 +30440,6 @@ "node": ">= 0.8.0" } }, - "node_modules/light-my-request": { - "version": "5.9.2", - "license": "BSD-3-Clause", - "dependencies": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", - "set-cookie-parser": "^2.4.1" - } - }, "node_modules/lighthouse-logger": { "version": "1.4.2", "dev": true, @@ -31322,8 +30464,7 @@ }, "node_modules/lightningcss": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", - "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", + "license": "MPL-2.0", "optional": true, "peer": true, "dependencies": { @@ -31351,12 +30492,11 @@ }, "node_modules/lightningcss-darwin-arm64": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", - "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -31370,195 +30510,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lilconfig": { "version": "2.1.0", "license": "MIT", @@ -32594,9 +31545,8 @@ }, "node_modules/marked": { "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -32606,9 +31556,8 @@ }, "node_modules/marked-terminal": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz", - "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "chalk": "^5.3.0", @@ -32626,9 +31575,8 @@ }, "node_modules/marked-terminal/node_modules/ansi-escapes": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -32641,9 +31589,8 @@ }, "node_modules/marked-terminal/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -32658,9 +31605,8 @@ }, "node_modules/md5": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "charenc": "~0.0.1", @@ -32670,9 +31616,8 @@ }, "node_modules/md5-file": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", - "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "buffer-alloc": "^1.1.0" @@ -32686,9 +31631,8 @@ }, "node_modules/md5hex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", - "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/mdast-util-definitions": { @@ -32944,9 +31888,8 @@ }, "node_modules/memory-cache": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", "dev": true, + "license": "BSD-2-Clause", "peer": true }, "node_modules/memorystream": { @@ -34219,9 +33162,8 @@ }, "node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "minipass": "^7.0.3" @@ -34232,9 +33174,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "minipass": "^3.0.0" @@ -34245,9 +33186,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "yallist": "^4.0.0" @@ -34258,16 +33198,14 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "minipass": "^3.0.0" @@ -34278,9 +33216,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "yallist": "^4.0.0" @@ -34291,9 +33228,8 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/minizlib": { @@ -34363,8 +33299,7 @@ }, "node_modules/mrmime": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -34864,8 +33799,7 @@ }, "node_modules/node-emoji": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -35028,9 +33962,8 @@ }, "node_modules/npm-package-arg": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", - "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "hosted-git-info": "^3.0.2", @@ -35041,16 +33974,14 @@ }, "node_modules/npm-package-arg/node_modules/builtins": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/npm-package-arg/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver" @@ -35058,9 +33989,8 @@ }, "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "builtins": "^1.0.3" @@ -35583,6 +34513,7 @@ }, "node_modules/on-exit-leak-free": { "version": "2.1.0", + "dev": true, "license": "MIT" }, "node_modules/on-finished": { @@ -35628,7 +34559,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", - "license": "MIT", "peer": true, "dependencies": { "regex": "^4.3.2" @@ -35873,9 +34803,8 @@ }, "node_modules/os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -35891,10 +34820,8 @@ }, "node_modules/osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "deprecated": "This package is no longer supported.", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "os-homedir": "^1.0.0", @@ -35938,9 +34865,8 @@ }, "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -36130,9 +35056,8 @@ }, "node_modules/parse-png": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "pngjs": "^3.3.0" @@ -36153,16 +35078,14 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } }, "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", @@ -36193,9 +35116,8 @@ }, "node_modules/password-prompt": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", "dev": true, + "license": "0BSD", "peer": true, "dependencies": { "ansi-escapes": "^4.3.2", @@ -36211,9 +35133,8 @@ }, "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", @@ -36359,6 +35280,7 @@ }, "node_modules/pino": { "version": "8.17.2", + "dev": true, "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", @@ -36379,6 +35301,7 @@ }, "node_modules/pino-abstract-transport": { "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { "readable-stream": "^4.0.0", @@ -36387,6 +35310,7 @@ }, "node_modules/pino-abstract-transport/node_modules/buffer": { "version": "6.0.3", + "dev": true, "funding": [ { "type": "github", @@ -36409,6 +35333,7 @@ }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { "version": "4.5.2", + "dev": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -36423,6 +35348,7 @@ }, "node_modules/pino-abstract-transport/node_modules/string_decoder": { "version": "1.3.0", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -36430,10 +35356,12 @@ }, "node_modules/pino-std-serializers": { "version": "6.2.1", + "dev": true, "license": "MIT" }, "node_modules/pino/node_modules/process-warning": { "version": "3.0.0", + "dev": true, "license": "MIT" }, "node_modules/pirates": { @@ -36494,59 +35422,6 @@ "pathe": "^1.1.2" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/pkginfo": { "version": "0.4.1", "dev": true, @@ -36621,9 +35496,8 @@ }, "node_modules/pngjs": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -36832,6 +35706,8 @@ }, "node_modules/prettier": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "devOptional": true, "license": "MIT", "bin": { @@ -36845,11 +35721,13 @@ } }, "node_modules/prettier-plugin-packagejson": { - "version": "2.4.6", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz", + "integrity": "sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg==", "license": "MIT", "dependencies": { - "sort-package-json": "2.6.0", - "synckit": "0.8.5" + "sort-package-json": "2.10.1", + "synckit": "0.9.2" }, "peerDependencies": { "prettier": ">= 1.16.0" @@ -36997,6 +35875,7 @@ }, "node_modules/process": { "version": "0.11.10", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -37007,15 +35886,10 @@ "dev": true, "license": "MIT" }, - "node_modules/process-warning": { - "version": "2.2.0", - "license": "MIT" - }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.4.0" @@ -37023,9 +35897,8 @@ }, "node_modules/promise": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "asap": "~2.0.3" @@ -37082,6 +35955,7 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "dev": true, "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -37200,8 +36074,6 @@ }, "node_modules/qrcode-terminal": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "dev": true, "peer": true, "bin": { @@ -37267,6 +36139,7 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", + "dev": true, "license": "MIT" }, "node_modules/quick-lru": { @@ -37324,8 +36197,6 @@ }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", "dependencies": { @@ -37340,9 +36211,8 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "peer": true, "dependencies": { "deep-extend": "^0.6.0", @@ -37356,9 +36226,8 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -37533,9 +36402,8 @@ }, "node_modules/react-refresh": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -37896,6 +36764,7 @@ }, "node_modules/real-require": { "version": "0.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -38022,7 +36891,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", - "license": "MIT", "peer": true }, "node_modules/regexp-tree": { @@ -38084,8 +36952,6 @@ }, "node_modules/rehype": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "license": "MIT", "peer": true, "dependencies": { @@ -38101,8 +36967,6 @@ }, "node_modules/rehype-parse": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", "license": "MIT", "peer": true, "dependencies": { @@ -38130,8 +36994,9 @@ } }, "node_modules/rehype-stringify": { - "version": "10.0.0", - "license": "MIT", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "peer": true, "dependencies": { "@types/hast": "^3.0.0", @@ -38176,8 +37041,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "license": "MIT", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "peer": true, "dependencies": { "@types/hast": "^3.0.0", @@ -38221,9 +37087,8 @@ }, "node_modules/remove-trailing-slash": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", - "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/request-progress": { @@ -38243,6 +37108,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -38255,8 +37121,6 @@ }, "node_modules/requireg": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, "peer": true, "dependencies": { @@ -38270,16 +37134,14 @@ }, "node_modules/requireg/node_modules/nested-error-stacks": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/requireg/node_modules/resolve": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "path-parse": "^1.0.5" @@ -38297,11 +37159,6 @@ "dev": true, "license": "MIT" }, - "node_modules/reselect": { - "version": "4.1.8", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.8", "license": "MIT", @@ -38368,13 +37225,6 @@ "dev": true, "license": "ISC" }, - "node_modules/ret": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/retext": { "version": "9.0.0", "license": "MIT", @@ -38442,6 +37292,7 @@ }, "node_modules/rfdc": { "version": "1.3.0", + "dev": true, "license": "MIT" }, "node_modules/rimraf": { @@ -38506,8 +37357,7 @@ }, "node_modules/rollup": { "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -38585,8 +37435,7 @@ }, "node_modules/rollup/node_modules/@types/estree": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + "license": "MIT" }, "node_modules/rrweb-cssom": { "version": "0.7.1", @@ -38595,8 +37444,6 @@ }, "node_modules/rslog": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.3.tgz", - "integrity": "sha512-antALPJaKBRPBU1X2q9t085K4htWDOOv/K1qhTUk7h0l1ePU/KbDqKJn19eKP0dk7PqMioeA0+fu3gyPXCsXxQ==", "dev": true, "engines": { "node": ">=14.17.6" @@ -38625,8 +37472,7 @@ }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -38691,15 +37537,9 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-regex2": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "ret": "~0.2.0" - } - }, "node_modules/safe-stable-stringify": { "version": "2.4.3", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -38773,6 +37613,7 @@ }, "node_modules/secure-json-parse": { "version": "2.7.0", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/select-hose": { @@ -39008,6 +37849,7 @@ }, "node_modules/set-cookie-parser": { "version": "2.6.0", + "dev": true, "license": "MIT" }, "node_modules/set-function-length": { @@ -39040,9 +37882,8 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/setprototypeof": { @@ -39156,17 +37997,16 @@ } }, "node_modules/shiki": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.21.0.tgz", - "integrity": "sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==", - "license": "MIT", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", + "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", "peer": true, "dependencies": { - "@shikijs/core": "1.21.0", - "@shikijs/engine-javascript": "1.21.0", - "@shikijs/engine-oniguruma": "1.21.0", - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/core": "1.22.0", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, @@ -39269,9 +38109,8 @@ }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -39287,8 +38126,7 @@ }, "node_modules/skin-tone": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -39504,9 +38342,8 @@ }, "node_modules/socket.io": { "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -39522,9 +38359,8 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" @@ -39532,9 +38368,8 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -39555,6 +38390,7 @@ }, "node_modules/sonic-boom": { "version": "3.8.0", + "dev": true, "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -39573,10 +38409,14 @@ }, "node_modules/sort-object-keys": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", "license": "MIT" }, "node_modules/sort-package-json": { - "version": "2.6.0", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.1.tgz", + "integrity": "sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==", "license": "MIT", "dependencies": { "detect-indent": "^7.0.1", @@ -39585,6 +38425,7 @@ "git-hooks-list": "^3.0.0", "globby": "^13.1.2", "is-plain-obj": "^4.1.0", + "semver": "^7.6.0", "sort-object-keys": "^1.1.3" }, "bin": { @@ -39593,6 +38434,8 @@ }, "node_modules/sort-package-json/node_modules/detect-indent": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", "license": "MIT", "engines": { "node": ">=12.20" @@ -39600,6 +38443,8 @@ }, "node_modules/sort-package-json/node_modules/detect-newline": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -39610,6 +38455,8 @@ }, "node_modules/sort-package-json/node_modules/is-plain-obj": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { "node": ">=12" @@ -39816,6 +38663,7 @@ }, "node_modules/split2": { "version": "4.2.0", + "dev": true, "license": "ISC", "engines": { "node": ">= 10.x" @@ -39851,9 +38699,8 @@ }, "node_modules/ssri": { "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "minipass": "^7.0.3" @@ -40223,9 +39070,8 @@ }, "node_modules/strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -40282,9 +39128,8 @@ }, "node_modules/structured-headers": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/styled-jsx": { @@ -40315,8 +39160,7 @@ }, "node_modules/sucrase": { "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -40343,9 +39187,7 @@ }, "node_modules/sucrase/node_modules/glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -40363,9 +39205,8 @@ }, "node_modules/sudo-prompt": { "version": "8.2.5", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", - "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/superagent": { @@ -40441,8 +39282,7 @@ }, "node_modules/supports-hyperlinks": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -40456,8 +39296,7 @@ }, "node_modules/supports-hyperlinks/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -40522,7 +39361,9 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.9.0", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", @@ -40701,9 +39542,8 @@ }, "node_modules/tempy": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", - "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "del": "^6.0.0", @@ -40721,9 +39561,8 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=10" @@ -40745,9 +39584,8 @@ }, "node_modules/terminal-link": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -40762,9 +39600,8 @@ }, "node_modules/terminal-link/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -40772,9 +39609,8 @@ }, "node_modules/terminal-link/node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0", @@ -40965,6 +39801,7 @@ }, "node_modules/thread-stream": { "version": "2.7.0", + "dev": true, "license": "MIT", "dependencies": { "real-require": "^0.2.0" @@ -41029,13 +39866,6 @@ "version": "1.3.3", "license": "MIT" }, - "node_modules/tiny-lru": { - "version": "10.4.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, "node_modules/tiny-warning": { "version": "1.0.3", "dev": true, @@ -41052,8 +39882,7 @@ }, "node_modules/tinyexec": { "version": "0.3.0", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tinygradient": { "version": "1.1.5", @@ -41117,6 +39946,15 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/toggle-selection": { "version": "1.0.6", "license": "MIT" @@ -41177,9 +40015,8 @@ }, "node_modules/traverse": { "version": "0.6.10", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", - "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "gopd": "^1.0.1", @@ -41475,74 +40312,6 @@ } } }, - "node_modules/tsup/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "cpu": [ @@ -41558,312 +40327,6 @@ "node": ">=12" } }, - "node_modules/tsup/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/tsup/node_modules/bundle-require": { "version": "4.2.1", "dev": true, @@ -42228,9 +40691,8 @@ }, "node_modules/typedarray.prototype.slice": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.7", @@ -42249,8 +40711,7 @@ }, "node_modules/typescript": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -42261,8 +40722,6 @@ }, "node_modules/ua-parser-js": { "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", "dev": true, "funding": [ { @@ -42278,6 +40737,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "peer": true, "bin": { "ua-parser-js": "script/cli.js" @@ -42370,8 +40830,7 @@ }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -42486,9 +40945,8 @@ }, "node_modules/unique-filename": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "unique-slug": "^4.0.0" @@ -42499,9 +40957,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "imurmurhash": "^0.1.4" @@ -42512,9 +40969,8 @@ }, "node_modules/unique-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" @@ -42986,8 +41442,6 @@ }, "node_modules/valid-url": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", "dev": true, "peer": true }, @@ -43099,9 +41553,8 @@ }, "node_modules/verdaccio-audit/node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -43123,27 +41576,24 @@ }, "node_modules/verdaccio-audit/node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/verdaccio-audit/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/verdaccio-audit/node_modules/express": { "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -43183,9 +41633,8 @@ }, "node_modules/verdaccio-audit/node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -43201,16 +41650,14 @@ }, "node_modules/verdaccio-audit/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/verdaccio-audit/node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -43228,15 +41675,13 @@ }, "node_modules/verdaccio-audit/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/verdaccio-audit/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -43319,9 +41764,8 @@ }, "node_modules/verdaccio/node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -43343,27 +41787,24 @@ }, "node_modules/verdaccio/node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/verdaccio/node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/verdaccio/node_modules/express": { "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -43403,18 +41844,16 @@ }, "node_modules/verdaccio/node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/verdaccio/node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -43430,9 +41869,8 @@ }, "node_modules/verdaccio/node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -43469,15 +41907,13 @@ }, "node_modules/verdaccio/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/verdaccio/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/verdaccio/node_modules/semver": { "version": "7.6.2", @@ -43492,9 +41928,8 @@ }, "node_modules/verdaccio/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -43651,78 +42086,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "cpu": [ @@ -43739,330 +42102,6 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", "devOptional": true, @@ -44391,7 +42430,6 @@ "version": "2.4.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -44447,10 +42485,8 @@ }, "node_modules/webpack": { "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -44494,9 +42530,8 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -44803,7 +42838,6 @@ "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -44816,7 +42850,6 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -45137,9 +43170,8 @@ }, "node_modules/wonka": { "version": "4.0.15", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", - "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/word-wrap": { @@ -45157,10 +43189,9 @@ }, "node_modules/workerd": { "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240925.0.tgz", - "integrity": "sha512-/Jj6+yLwfieZGEt3Kx4+5MoufuC3g/8iFaIh4MPBNGJOGYmdSKXvgCqz09m2+tVCYnysRfbq2zcbVxJRBfOCqQ==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "bin": { "workerd": "bin/workerd" }, @@ -45268,6 +43299,19 @@ "version": "1.0.2", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/ws": { "version": "8.17.1", "license": "MIT", @@ -45317,9 +43361,8 @@ }, "node_modules/xml2js": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -45446,6 +43489,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoga-wasm-web": { "version": "0.3.3", "license": "MIT" @@ -45535,8 +43590,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.23.3", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.3.tgz", - "integrity": "sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==", "license": "ISC", "peer": true, "peerDependencies": { @@ -45640,12 +43693,12 @@ }, "packages/astro": { "name": "@clerk/astro", - "version": "1.3.12", + "version": "1.4.1", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "nanoid": "5.0.7", "nanostores": "0.11.3" }, @@ -45692,12 +43745,12 @@ }, "packages/backend": { "name": "@clerk/backend", - "version": "1.13.8", + "version": "1.15.1", "license": "MIT", "dependencies": { - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookie": "0.5.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookie": "0.7.0", "snakecase-keys": "5.4.4", "tslib": "2.4.1" }, @@ -45791,12 +43844,11 @@ }, "packages/backend/node_modules/@esbuild/darwin-arm64": { "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -46013,6 +44065,22 @@ "node": ">=18" } }, + "packages/backend/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "packages/backend/node_modules/@esbuild/openbsd-x64": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", @@ -46098,6 +44166,14 @@ "dev": true, "license": "MIT" }, + "packages/backend/node_modules/cookie": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.0.tgz", + "integrity": "sha512-qCf+V4dtlNhSRXGAZatc1TasyFO6GjohcOul807YOb5ik3+kQSnb4d7iajeCL8QHaJ4uZEjCgiCJerKXwdRVlQ==", + "engines": { + "node": ">= 0.6" + } + }, "packages/backend/node_modules/denque": { "version": "1.5.1", "dev": true, @@ -46110,10 +44186,9 @@ }, "packages/backend/node_modules/esbuild": { "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -46247,12 +44322,12 @@ }, "packages/chrome-extension": { "name": "@clerk/chrome-extension", - "version": "1.3.15", + "version": "1.3.23", "license": "MIT", "dependencies": { - "@clerk/clerk-js": "5.26.1", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", + "@clerk/clerk-js": "5.29.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", "webextension-polyfill": "^0.10.0" }, "devDependencies": { @@ -46296,12 +44371,12 @@ }, "packages/clerk-js": { "name": "@clerk/clerk-js", - "version": "5.26.1", + "version": "5.29.1", "license": "MIT", "dependencies": { - "@clerk/localizations": "3.1.2", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/localizations": "3.4.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "@coinbase/wallet-sdk": "4.0.4", "@emotion/cache": "11.11.0", "@emotion/react": "11.11.1", @@ -46318,13 +44393,8 @@ "regenerator-runtime": "0.13.11" }, "devDependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@babel/preset-typescript": "^7.12.1", "@clerk/eslint-config-custom": "*", + "@clerk/ui": "0.1.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@rsdoctor/webpack-plugin": "^0.4.4", "@svgr/webpack": "^6.2.1", @@ -46332,8 +44402,6 @@ "@types/react-dom": "*", "@types/webpack-dev-server": "^4.7.2", "@types/webpack-env": "^1.16.4", - "babel-loader": "^9.1.2", - "babel-plugin-module-resolver": "^5.0.0", "bundlewatch": "^0.4.0", "react-refresh": "^0.14.0", "react-refresh-typescript": "^2.0.5", @@ -46354,206 +44422,6 @@ "react-dom": ">=18" } }, - "packages/clerk-js/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/clerk-js/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "packages/clerk-js/node_modules/babel-loader": { - "version": "9.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "packages/clerk-js/node_modules/enhanced-resolve": { - "version": "5.16.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "packages/clerk-js/node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "packages/clerk-js/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "packages/clerk-js/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "packages/clerk-js/node_modules/schema-utils": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "packages/clerk-js/node_modules/watchpack": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "packages/clerk-js/node_modules/webpack": { - "version": "5.91.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "packages/clerk-js/node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/clerk-js/node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "packages/clerk-js/node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "packages/clerk-js/node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "packages/dev-cli": { "name": "@clerk/dev-cli", "version": "0.0.8", @@ -46761,8 +44629,7 @@ }, "packages/dev-cli/node_modules/concurrently": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", - "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", @@ -46785,8 +44652,7 @@ }, "packages/dev-cli/node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -46797,28 +44663,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "packages/dev-cli/node_modules/find-cache-dir": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/dev-cli/node_modules/find-up": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "packages/dev-cli/node_modules/globby": { "version": "14.0.2", "license": "MIT", @@ -46839,8 +44683,7 @@ }, "packages/dev-cli/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -46881,17 +44724,6 @@ } } }, - "packages/dev-cli/node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "packages/dev-cli/node_modules/make-dir": { "version": "2.1.0", "license": "MIT", @@ -46914,23 +44746,6 @@ "node": ">=8.6" } }, - "packages/dev-cli/node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/dev-cli/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "packages/dev-cli/node_modules/path-type": { "version": "5.0.0", "license": "MIT", @@ -46948,16 +44763,6 @@ "node": ">=6" } }, - "packages/dev-cli/node_modules/pkg-dir": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "packages/dev-cli/node_modules/recast": { "version": "0.23.9", "license": "MIT", @@ -47043,23 +44848,13 @@ "node": ">=6.0.0" } }, - "packages/dev-cli/node_modules/write-file-atomic": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "packages/elements": { "name": "@clerk/elements", - "version": "0.15.9", + "version": "0.17.1", "license": "MIT", "dependencies": { - "@clerk/types": "^4.25.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "^4.28.0", "@radix-ui/react-form": "^0.1.0", "@radix-ui/react-slot": "^1.1.0", "@xstate/react": "^4.1.1", @@ -47067,9 +44862,8 @@ "xstate": "^5.15.0" }, "devDependencies": { - "@clerk/clerk-react": "5.11.0", + "@clerk/clerk-react": "5.13.1", "@clerk/eslint-config-custom": "*", - "@clerk/shared": "2.9.0", "@statelyai/inspect": "^0.4.0", "@types/node": "^18.19.33", "@types/react": "*", @@ -47085,7 +44879,6 @@ "node": ">=18.17.0" }, "peerDependencies": { - "@clerk/shared": "^2.0.0", "react": "^18.0.0 || ^19.0.0-beta", "react-dom": "^18.0.0 || ^19.0.0-beta" }, @@ -47095,6 +44888,18 @@ } } }, + "packages/elements/node_modules/@clerk/shared/node_modules/@clerk/types": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.25.1.tgz", + "integrity": "sha512-ILvR2YXz6BSGXDoozBAd2BGj8ZF/FQrfWQd0FtLz1JXt1vurkgRncAhEcC427OiXNRnq5R2Pn++urfFEa0PqYA==", + "extraneous": true, + "dependencies": { + "csstype": "3.1.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, "packages/elements/node_modules/@next/env": { "version": "14.2.4", "dev": true, @@ -47888,13 +45693,13 @@ }, "packages/expo": { "name": "@clerk/clerk-expo", - "version": "2.2.21", + "version": "2.2.29", "license": "MIT", "dependencies": { - "@clerk/clerk-js": "5.26.1", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/clerk-js": "5.29.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "base-64": "^1.0.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" @@ -48173,12 +45978,12 @@ }, "packages/express": { "name": "@clerk/express", - "version": "1.2.1", + "version": "1.3.3", "license": "MIT", "dependencies": { - "@clerk/backend": "^1.13.8", - "@clerk/shared": "^2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "^1.15.1", + "@clerk/shared": "^2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { @@ -48204,34 +46009,350 @@ }, "packages/fastify": { "name": "@clerk/fastify", - "version": "1.0.51", + "version": "2.0.5", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookies": "0.8.0" + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookies": "0.8.0", + "fastify-plugin": "^5.0.1" }, "devDependencies": { "@clerk/eslint-config-custom": "*", - "@types/node": "^18.19.33", + "@types/node": "^20.14.8", + "fastify": "^5.0.0", "tsup": "*", "typescript": "*" }, "engines": { - "node": ">=18.17.0" + "node": ">=20" }, "peerDependencies": { - "fastify": ">=4", - "fastify-plugin": "^4.5.0" + "fastify": ">=5" + } + }, + "packages/fastify/node_modules/@fastify/ajv-compiler": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.1.tgz", + "integrity": "sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==", + "dev": true, + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "packages/fastify/node_modules/@fastify/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.0.0.tgz", + "integrity": "sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==", + "dev": true + }, + "packages/fastify/node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.1.tgz", + "integrity": "sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==", + "dev": true, + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "packages/fastify/node_modules/@types/node": { + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "packages/fastify/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/fastify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "packages/fastify/node_modules/avvio": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.0.0.tgz", + "integrity": "sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==", + "dev": true, + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "packages/fastify/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "packages/fastify/node_modules/fast-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", + "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "dev": true, + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.1", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.3.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "packages/fastify/node_modules/fast-json-stringify/node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "dev": true + }, + "packages/fastify/node_modules/fast-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "dev": true + }, + "packages/fastify/node_modules/fastify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.0.0.tgz", + "integrity": "sha512-Qe4dU+zGOzg7vXjw4EvcuyIbNnMwTmcuOhlOrOJsgwzvjEZmsM/IeHulgJk+r46STjdJS/ZJbxO8N70ODXDMEQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@fastify/ajv-compiler": "^4.0.0", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^9.0.0", + "process-warning": "^4.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.1", + "secure-json-parse": "^2.7.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "packages/fastify/node_modules/fastify-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.0.1.tgz", + "integrity": "sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==" + }, + "packages/fastify/node_modules/find-my-way": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.1.0.tgz", + "integrity": "sha512-Y5jIsuYR4BwWDYYQ2A/RWWE6gD8a0FMgtU+HOq1WKku+Cwdz8M1v8wcAmRXXM1/iqtoqg06v+LjAxMYbCjViMw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "packages/fastify/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "packages/fastify/node_modules/light-my-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.1.0.tgz", + "integrity": "sha512-+NFuhlOGoEwxeQfJ/pobkVFxcnKyDtiX847hLjuB/IzBxIl3q4VJeFI8uRCgb3AlTWL1lgOr+u5+8QdUcr33ng==", + "dev": true, + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" } }, + "packages/fastify/node_modules/pino": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.4.0.tgz", + "integrity": "sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "packages/fastify/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dev": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "packages/fastify/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "dev": true + }, + "packages/fastify/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==", + "dev": true + }, + "packages/fastify/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/fastify/node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "packages/fastify/node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "packages/fastify/node_modules/safe-regex2": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.0.tgz", + "integrity": "sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==", + "dev": true, + "dependencies": { + "ret": "~0.5.0" + } + }, + "packages/fastify/node_modules/sonic-boom": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", + "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "packages/fastify/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/fastify/node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dev": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, + "packages/fastify/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "packages/localizations": { "name": "@clerk/localizations", - "version": "3.1.2", + "version": "3.4.0", "license": "MIT", "dependencies": { - "@clerk/types": "4.25.0" + "@clerk/types": "4.28.0" }, "devDependencies": { "@clerk/eslint-config-custom": "*", @@ -48244,13 +46365,13 @@ }, "packages/nextjs": { "name": "@clerk/nextjs", - "version": "5.7.1", + "version": "6.0.2", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "crypto-js": "4.2.0", "server-only": "0.0.1", "tslib": "2.4.1" @@ -48503,16 +46624,16 @@ }, "packages/react": { "name": "@clerk/clerk-react", - "version": "5.11.0", + "version": "5.13.1", "license": "MIT", "dependencies": { - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { "@clerk/eslint-config-custom": "*", - "@clerk/themes": "2.1.35", + "@clerk/themes": "2.1.39", "@types/node": "^18.19.33", "@types/react": "*", "@types/react-dom": "*", @@ -48533,14 +46654,14 @@ }, "packages/remix": { "name": "@clerk/remix", - "version": "4.2.35", + "version": "4.2.41", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookie": "0.5.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookie": "0.7.0", "tslib": "2.4.1" }, "devDependencies": { @@ -48568,18 +46689,26 @@ "dev": true, "license": "MIT" }, + "packages/remix/node_modules/cookie": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.0.tgz", + "integrity": "sha512-qCf+V4dtlNhSRXGAZatc1TasyFO6GjohcOul807YOb5ik3+kQSnb4d7iajeCL8QHaJ4uZEjCgiCJerKXwdRVlQ==", + "engines": { + "node": ">= 0.6" + } + }, "packages/remix/node_modules/tslib": { "version": "2.4.1", "license": "0BSD" }, "packages/sdk-node": { "name": "@clerk/clerk-sdk-node", - "version": "5.0.48", + "version": "5.0.54", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { @@ -48588,7 +46717,6 @@ "@types/node": "^18.19.33", "nock": "^13.0.7", "npm-run-all": "^4.1.5", - "prettier": "^2.5.0", "tsup": "*", "typescript": "*" }, @@ -48596,31 +46724,17 @@ "node": ">=18.17.0" } }, - "packages/sdk-node/node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "packages/sdk-node/node_modules/tslib": { "version": "2.4.1", "license": "0BSD" }, "packages/shared": { "name": "@clerk/shared", - "version": "2.9.0", + "version": "2.10.1", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@clerk/types": "4.25.0", + "@clerk/types": "4.28.0", "glob-to-regexp": "0.4.1", "js-cookie": "3.0.5", "std-env": "^3.7.0", @@ -49315,13 +47429,13 @@ }, "packages/tanstack-start": { "name": "@clerk/tanstack-start", - "version": "0.4.11", + "version": "0.4.17", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { @@ -49345,380 +47459,6 @@ "react-dom": ">=18 || >=19.0.0-beta" } }, - "packages/tanstack-start/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/tanstack-start/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "packages/tanstack-start/node_modules/@tanstack/history": { "version": "1.45.3", "dev": true, @@ -50141,12 +47881,12 @@ }, "packages/testing": { "name": "@clerk/testing", - "version": "1.3.9", + "version": "1.3.15", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "dotenv": "16.4.5" }, "devDependencies": { @@ -50175,10 +47915,10 @@ }, "packages/themes": { "name": "@clerk/themes", - "version": "2.1.35", + "version": "2.1.39", "license": "MIT", "dependencies": { - "@clerk/types": "4.25.0", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { @@ -50195,7 +47935,7 @@ }, "packages/types": { "name": "@clerk/types", - "version": "4.25.0", + "version": "4.28.0", "license": "MIT", "dependencies": { "csstype": "3.1.1" @@ -50216,13 +47956,12 @@ }, "packages/ui": { "name": "@clerk/ui", - "version": "0.1.9", + "version": "0.1.10", "license": "MIT", "dependencies": { - "@clerk/clerk-react": "file:../react", - "@clerk/elements": "file:../elements", - "@clerk/shared": "file:../shared", - "@clerk/types": "file:../types", + "@clerk/elements": "0.17.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "@formkit/auto-animate": "^0.8.2", "@radix-ui/react-slot": "^1.1.0", "cmdk": "^1.0.0", @@ -50511,19 +48250,21 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "1.0.9", + "version": "1.1.2", "license": "MIT", "dependencies": { - "@inkjs/ui": "^1.0.0", + "@inkjs/ui": "^2.0.0", "@jescalan/ink-markdown": "^2.0.0", "ejs": "3.1.10", + "execa": "9.4.1", "globby": "^14.0.1", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", - "ink": "^4.4.1", + "ink": "^5.0.1", "ink-big-text": "^2.0.0", "ink-gradient": "^3.0.0", - "ink-link": "^3.0.0", + "ink-link": "^4.1.0", + "jscodeshift": "^17.0.0", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.3.1", @@ -50537,14 +48278,225 @@ "devDependencies": { "@babel/cli": "^7.24.7", "@babel/preset-react": "^7.24.7", - "chalk": "^5.3.0", + "@types/jscodeshift": "^0.12.0", "del-cli": "^5.1.0", - "eslint-config-custom": "*" + "eslint-config-custom": "*", + "vitest": "^2.1.3" }, "engines": { "node": ">=18.17.0" } }, + "packages/upgrade/.yalc/@clerk/upgrade": { + "version": "1.0.9", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@clerk/upgrade": "file:.yalc/@clerk/upgrade", + "@inkjs/ui": "^2.0.0", + "@jescalan/ink-markdown": "^2.0.0", + "ejs": "3.1.10", + "globby": "^14.0.1", + "gray-matter": "^4.0.3", + "index-to-position": "^0.1.2", + "ink": "^5.0.1", + "ink-big-text": "^2.0.0", + "ink-gradient": "^3.0.0", + "ink-link": "^4.1.0", + "jscodeshift": "^17.0.0", + "marked": "^11.1.1", + "meow": "^11.0.0", + "react": "^18.3.1", + "read-pkg": "^9.0.1", + "semver-regex": "^4.0.5", + "temp-dir": "^3.0.0" + }, + "bin": { + "clerk-upgrade": "dist/cli.js" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "packages/upgrade/node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/upgrade/node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/upgrade/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/upgrade/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/upgrade/node_modules/@babel/helper-replace-supers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/upgrade/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-syntax-flow": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz", + "integrity": "sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz", + "integrity": "sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-flow": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "packages/upgrade/node_modules/@babel/plugin-transform-react-display-name": { "version": "7.24.7", "dev": true, @@ -50588,6 +48540,23 @@ "@babel/core": "^7.0.0-0" } }, + "packages/upgrade/node_modules/@babel/preset-flow": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.7.tgz", + "integrity": "sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-flow-strip-types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "packages/upgrade/node_modules/@babel/preset-react": { "version": "7.24.7", "dev": true, @@ -50607,6 +48576,187 @@ "@babel/core": "^7.0.0-0" } }, + "packages/upgrade/node_modules/@babel/register": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.7.tgz", + "integrity": "sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@inkjs/ui": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inkjs/ui/-/ui-2.0.0.tgz", + "integrity": "sha512-5+8fJmwtF9UvikzLfph9sA+LS+l37Ij/szQltkuXLOAXwNkBX9innfzh4pLGXIB59vKEQUtc6D4qGvhD7h3pAg==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-spinners": "^3.0.0", + "deepmerge": "^4.3.1", + "figures": "^6.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ink": ">=5" + } + }, + "packages/upgrade/node_modules/@inkjs/ui/node_modules/cli-spinners": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.2.0.tgz", + "integrity": "sha512-pXftdQloMZzjCr3pCTIRniDcys6dDzgpgVhAHHk6TKBDbRuP1MkuetTF5KSv4YUutbOPa7+7ZrAJ2kVtbMqyXA==", + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/@vitest/expect": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", + "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/@vitest/pretty-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", + "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/@vitest/runner": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", + "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.3", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/@vitest/snapshot": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", + "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.3", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/@vitest/spy": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/@vitest/utils": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", + "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/upgrade/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/upgrade/node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "packages/upgrade/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "packages/upgrade/node_modules/camelcase": { "version": "7.0.1", "license": "MIT", @@ -50643,9 +48793,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "packages/upgrade/node_modules/chalk": { "version": "5.3.0", - "dev": true, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -50654,6 +48822,49 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "packages/upgrade/node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "packages/upgrade/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "packages/upgrade/node_modules/decamelize": { "version": "6.0.0", "license": "MIT", @@ -50664,6 +48875,81 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/upgrade/node_modules/execa": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.1.tgz", + "integrity": "sha512-5eo/BRqZm3GYce+1jqX/tJ7duA2AnE39i88fuedNFUV8XxGxUpF3aWkBRfbUcjV49gCkvS/pzc0YrCPhaIewdg==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "packages/upgrade/node_modules/execa/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/upgrade/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/find-up": { "version": "6.3.0", "license": "MIT", @@ -50678,6 +48964,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/upgrade/node_modules/globby": { "version": "14.0.1", "license": "MIT", @@ -50696,6 +49019,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "packages/upgrade/node_modules/hosted-git-info": { "version": "5.2.1", "license": "ISC", @@ -50706,6 +49038,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "packages/upgrade/node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "packages/upgrade/node_modules/indent-string": { "version": "5.0.0", "license": "MIT", @@ -50716,6 +49057,294 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/ink": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-5.0.1.tgz", + "integrity": "sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==", + "license": "MIT", + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.1.3", + "ansi-escapes": "^7.0.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "indent-string": "^5.0.0", + "is-in-ci": "^0.1.0", + "lodash": "^4.17.21", + "patch-console": "^2.0.0", + "react-reconciler": "^0.29.0", + "scheduler": "^0.23.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^7.0.0", + "type-fest": "^4.8.3", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.15.0", + "yoga-wasm-web": "~0.3.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0", + "react-devtools-core": "^4.19.1" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "packages/upgrade/node_modules/ink-link": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ink-link/-/ink-link-4.1.0.tgz", + "integrity": "sha512-3nNyJXum0FJIKAXBK8qat2jEOM41nJ1J60NRivwgK9Xh92R5UMN/k4vbz0A9xFzhJVrlf4BQEmmxMgXkCE1Jeg==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1", + "terminal-link": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "ink": ">=4" + } + }, + "packages/upgrade/node_modules/ink/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "packages/upgrade/node_modules/ink/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "packages/upgrade/node_modules/ink/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "packages/upgrade/node_modules/ink/node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/ink/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "packages/upgrade/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/jscodeshift": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-17.0.0.tgz", + "integrity": "sha512-Af+MFsNwLSVO+t4kKjJdJKh6iNbNHfDfFGdyltJ2wUFN3furgbvHguJmB85iou+fY7wbHgI8eiEKpp6doGgtKg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/preset-flow": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@babel/register": "^7.24.6", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.7", + "neo-async": "^2.5.0", + "picocolors": "^1.0.1", + "recast": "^0.23.9", + "temp": "^0.9.4", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, "packages/upgrade/node_modules/locate-path": { "version": "7.2.0", "license": "MIT", @@ -50729,6 +49358,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, "packages/upgrade/node_modules/lru-cache": { "version": "7.18.3", "license": "ISC", @@ -50736,6 +49372,28 @@ "node": ">=12" } }, + "packages/upgrade/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/upgrade/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "packages/upgrade/node_modules/marked": { "version": "11.2.0", "license": "MIT", @@ -50770,6 +49428,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "packages/upgrade/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "packages/upgrade/node_modules/normalize-package-data": { "version": "4.0.1", "license": "BSD-2-Clause", @@ -50783,6 +49461,34 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "packages/upgrade/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/p-limit": { "version": "4.0.0", "license": "MIT", @@ -50834,6 +49540,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/path-exists": { "version": "5.0.0", "license": "MIT", @@ -50841,6 +49559,18 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "packages/upgrade/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/path-type": { "version": "5.0.0", "license": "MIT", @@ -50851,6 +49581,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "packages/upgrade/node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "packages/upgrade/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/upgrade/node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/quick-lru": { "version": "6.1.2", "license": "MIT", @@ -51008,6 +49778,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "packages/upgrade/node_modules/redent": { "version": "4.0.0", "license": "MIT", @@ -51022,6 +49808,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "packages/upgrade/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "packages/upgrade/node_modules/slash": { "version": "5.1.0", "license": "MIT", @@ -51032,6 +49853,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/upgrade/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "packages/upgrade/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "packages/upgrade/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/strip-indent": { "version": "4.0.0", "license": "MIT", @@ -51045,6 +49912,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/upgrade/node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "packages/upgrade/node_modules/temp-dir": { "version": "3.0.0", "license": "MIT", @@ -51052,6 +49945,49 @@ "node": ">=14.16" } }, + "packages/upgrade/node_modules/terminal-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", + "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^5.0.0", + "supports-hyperlinks": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/upgrade/node_modules/terminal-link/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "packages/upgrade/node_modules/trim-newlines": { "version": "4.1.1", "license": "MIT", @@ -51072,6 +50008,93 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/upgrade/node_modules/vite-node": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", + "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.6", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/upgrade/node_modules/vitest": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", + "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.3", + "@vitest/mocker": "2.1.3", + "@vitest/pretty-format": "^2.1.3", + "@vitest/runner": "2.1.3", + "@vitest/snapshot": "2.1.3", + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "debug": "^4.3.6", + "magic-string": "^0.30.11", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.3", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.3", + "@vitest/ui": "2.1.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "packages/upgrade/node_modules/yallist": { "version": "4.0.0", "license": "ISC" diff --git a/package.json b/package.json index 1f44355e66..2c3d65b1ca 100644 --- a/package.json +++ b/package.json @@ -31,23 +31,23 @@ "test": "FORCE_COLOR=1 turbo test --concurrency=${TURBO_CONCURRENCY:-80%}", "test:cache:clear": "FORCE_COLOR=1 turbo test:cache:clear --continue --concurrency=${TURBO_CONCURRENCY:-80%}", "test:integration:ap-flows": "npm run test:integration:base -- --grep @ap-flows", + "test:integration:astro": "E2E_APP_ID=astro.* npm run test:integration:base -- --grep @astro", "test:integration:base": "npx playwright test --config integration/playwright.config.ts", "test:integration:cleanup": "npx playwright test --config integration/playwright.cleanup.config.ts", "test:integration:deployment:nextjs": "npx playwright test --config integration/playwright.deployments.config.ts", "test:integration:elements": "E2E_APP_ID=elements.* npm run test:integration:base -- --grep @elements", + "test:integration:expo-web": "E2E_APP_ID=expo.expo-web npm run test:integration:base -- --grep @expo-web", "test:integration:express": "E2E_APP_ID=express.* npm run test:integration:base -- --grep @express", "test:integration:generic": "E2E_APP_ID=react.vite.*,next.appRouter.withEmailCodes* npm run test:integration:base -- --grep @generic", "test:integration:nextjs": "E2E_APP_ID=next.appRouter.* npm run test:integration:base -- --grep @nextjs", - "test:integration:astro": "E2E_APP_ID=astro.* npm run test:integration:base -- --grep @astro", - "test:integration:expo-web": "E2E_APP_ID=expo.expo-web npm run test:integration:base -- --grep @expo-web", "test:integration:quickstart": "E2E_APP_ID=quickstart.* npm run test:integration:base -- --grep @quickstart", + "test:integration:remix": "echo 'placeholder'", "test:integration:sessions": "npm run test:integration:base -- --grep @sessions", - "test:integration:tanstack-start": "E2E_APP_ID=tanstack.start npm run test:integration:base -- --grep @tanstack-start", "test:integration:tanstack-router": "E2E_APP_ID=tanstack.router npm run test:integration:base -- --grep @tanstack-router", - "test:integration:remix": "echo 'placeholder'", + "test:integration:tanstack-start": "E2E_APP_ID=tanstack.start npm run test:integration:base -- --grep @tanstack-start", "turbo:clean": "turbo daemon clean", "update:lockfile": "npm run nuke && npm install -D --arch=x64 --platform=linux turbo && npm install -D --arch=arm64 --platform=darwin turbo", - "version": "changeset version && npm install --package-lock-only", + "version": "changeset version && npm install --package-lock-only --engine-strict=false", "version:canary": "./scripts/canary.mjs", "version:snapshot": "./scripts/snapshot.mjs", "yalc:all": "for d in packages/*/; do echo $d; cd $d; npx yalc push --replace --sig; cd '../../'; done" @@ -80,8 +80,6 @@ "eslint": "^8.49.0", "execa": "^5.1.1", "expect-type": "^0.16.0", - "fastify": "4.12.0", - "fastify-plugin": "^4.5.0", "fs-extra": "^11.1.1", "get-port": "^5.1.1", "globby": "^13.2.2", @@ -92,7 +90,8 @@ "jest-chrome": "^0.8.0", "jest-environment-jsdom": "^29.3.1", "lint-staged": "^14.0.1", - "prettier": "^3.3.2", + "prettier": "^3.3.3", + "prettier-plugin-packagejson": "^2.5.3", "prettier-plugin-tailwindcss": "^0.6.3", "publint": "^0.2.4", "react": "18.3.1", diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index d3a37fe480..165ae42c6f 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,59 @@ # @clerk/astro +## 1.4.1 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/shared@2.10.1 + +## 1.4.0 + +### Minor Changes + +- Add support for Astro View Transitions ([#4354](https://github.com/clerk/javascript/pull/4354)) by [@wobsoriano](https://github.com/wobsoriano) + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 1.3.16 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 1.3.15 + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 1.3.14 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + +## 1.3.13 + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 1.3.12 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index c5c90fc216..265932495c 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,18 +1,7 @@ { "name": "@clerk/astro", + "version": "1.4.1", "description": "Clerk SDK for Astro", - "version": "1.3.12", - "type": "module", - "license": "MIT", - "author": "Clerk", - "homepage": "https://clerk.com/", - "repository": { - "type": "git", - "url": "git+https://github.com/clerk/javascript.git", - "directory": "packages/astro" - }, - "module": "./dist/index.js", - "types": "./dist/index.d.ts", "keywords": [ "auth", "authentication", @@ -24,29 +13,27 @@ "astro-component", "withastro" ], - "sideEffects": false, + "homepage": "https://clerk.com/", "bugs": { "url": "https://github.com/clerk/javascript/issues" }, - "scripts": { - "dev": "tsup --watch --onSuccess \"npm run build:dts\"", - "build": "tsup --onSuccess \"npm run build:dts\" && npm run copy:components", - "build:dts": "tsc --emitDeclarationOnly --declaration", - "copy:components": "rm -rf ./components && mkdir -p ./components/ && cp -r ./src/astro-components/* ./components/ && cp ./src/types.ts ./", - "lint": "eslint src/", - "lint:attw": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm internal-resolution-error", - "lint:publint": "npm run copy:components && publint", - "publish:local": "npx yalc push --replace --sig" + "repository": { + "type": "git", + "url": "git+https://github.com/clerk/javascript.git", + "directory": "packages/astro" + }, + "license": "MIT", + "author": "Clerk", + "sideEffects": false, + "type": "module", + "imports": { + "#async-local-storage": { + "workerd": "./dist/async-local-storage.server.js", + "browser": "./dist/async-local-storage.client.js", + "node": "./dist/async-local-storage.server.js", + "default": "./dist/async-local-storage.server.js" + } }, - "files": [ - "dist", - "client", - "server", - "internal", - "components", - "env.d.ts", - "types.ts" - ], "exports": { ".": { "types": "./dist/index.d.ts", @@ -72,18 +59,31 @@ "./components": "./components/index.ts", "./package.json": "./package.json" }, - "imports": { - "#async-local-storage": { - "workerd": "./dist/async-local-storage.server.js", - "browser": "./dist/async-local-storage.client.js", - "node": "./dist/async-local-storage.server.js", - "default": "./dist/async-local-storage.server.js" - } + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist", + "client", + "server", + "internal", + "components", + "env.d.ts", + "types.ts" + ], + "scripts": { + "build": "tsup --onSuccess \"npm run build:dts\" && npm run copy:components", + "build:dts": "tsc --emitDeclarationOnly --declaration", + "copy:components": "rm -rf ./components && mkdir -p ./components/ && cp -r ./src/astro-components/* ./components/ && cp ./src/types.ts ./", + "dev": "tsup --watch --onSuccess \"npm run build:dts\"", + "lint": "eslint src/", + "lint:attw": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm internal-resolution-error", + "lint:publint": "npm run copy:components && publint", + "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "nanoid": "5.0.7", "nanostores": "0.11.3" }, diff --git a/packages/astro/src/integration/create-integration.ts b/packages/astro/src/integration/create-integration.ts index b640dedbbf..4505b0d939 100644 --- a/packages/astro/src/integration/create-integration.ts +++ b/packages/astro/src/integration/create-integration.ts @@ -109,8 +109,31 @@ function createIntegration() 'page', ` ${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: page")` : ''} - import { runInjectionScript } from "${buildImportPath}"; - await runInjectionScript(${JSON.stringify(internalParams)});`, + import { runInjectionScript, swapDocument } from "${buildImportPath}"; + import { navigate, transitionEnabledOnThisPage } from "astro:transitions/client"; + + if (transitionEnabledOnThisPage()) { + document.addEventListener('astro:before-swap', (e) => { + const clerkComponents = document.querySelector('#clerk-components'); + // Keep the div element added by Clerk + if (clerkComponents) { + const clonedEl = clerkComponents.cloneNode(true); + e.newDocument.body.appendChild(clonedEl); + } + + e.swap = () => swapDocument(e.newDocument); + }); + + document.addEventListener('astro:page-load', async (e) => { + await runInjectionScript({ + ...${JSON.stringify(internalParams)}, + routerPush: navigate, + routerReplace: (url) => navigate(url, { history: 'replace' }), + }); + }) + } else { + await runInjectionScript(${JSON.stringify(internalParams)}); + }`, ); }, }, diff --git a/packages/astro/src/integration/vite-plugin-astro-config.ts b/packages/astro/src/integration/vite-plugin-astro-config.ts index dfc60db120..f7f511a4d4 100644 --- a/packages/astro/src/integration/vite-plugin-astro-config.ts +++ b/packages/astro/src/integration/vite-plugin-astro-config.ts @@ -26,6 +26,8 @@ export function vitePluginAstroConfig(astroConfig: AstroConfig): VitePlugin { // This ensures @clerk/astro/client is properly processed and bundled, // resolving runtime import issues in these components. config.optimizeDeps?.include?.push('@clerk/astro/client'); + // Let astro vite plugin handle this. + config.optimizeDeps?.exclude?.push('astro:transitions/client'); }, load(id) { if (id === resolvedVirtualModuleId) { diff --git a/packages/astro/src/internal/create-clerk-instance.ts b/packages/astro/src/internal/create-clerk-instance.ts index da6e4b11dc..597519dda5 100644 --- a/packages/astro/src/internal/create-clerk-instance.ts +++ b/packages/astro/src/internal/create-clerk-instance.ts @@ -45,9 +45,9 @@ async function createClerkInstanceInternal(options?: AstroClerkCreateInstancePar } initOptions = { - ...options, routerPush: createNavigationHandler(window.history.pushState.bind(window.history)), routerReplace: createNavigationHandler(window.history.replaceState.bind(window.history)), + ...options, }; return clerkJSInstance diff --git a/packages/astro/src/internal/index.ts b/packages/astro/src/internal/index.ts index c00256cf3f..24c1b6670a 100644 --- a/packages/astro/src/internal/index.ts +++ b/packages/astro/src/internal/index.ts @@ -13,3 +13,4 @@ const runInjectionScript = createInjectionScriptRunner(createClerkInstance); export { runInjectionScript }; export { generateSafeId } from './utils/generateSafeId'; +export { swapDocument } from './swap-document'; diff --git a/packages/astro/src/internal/swap-document.ts b/packages/astro/src/internal/swap-document.ts new file mode 100644 index 0000000000..0bf08713ba --- /dev/null +++ b/packages/astro/src/internal/swap-document.ts @@ -0,0 +1,61 @@ +// eslint-disable-next-line import/no-unresolved +import { swapFunctions } from 'astro:transitions/client'; + +const PERSIST_ATTR = 'data-astro-transition-persist'; +const EMOTION_ATTR = 'data-emotion'; + +/** + * @internal + * Custom swap function to make mounting and styling + * of Clerk components work with View Transitions in Astro. + * + * See https://docs.astro.build/en/guides/view-transitions/#building-a-custom-swap-function + */ +export function swapDocument(doc: Document) { + swapFunctions.deselectScripts(doc); + swapFunctions.swapRootAttributes(doc); + + // Keep the elements created by `@emotion/cache` + const emotionElements = document.querySelectorAll(`style[${EMOTION_ATTR}]`); + swapHeadElements(doc, Array.from(emotionElements)); + + const restoreFocusFunction = swapFunctions.saveFocus(); + swapFunctions.swapBodyElement(doc.body, document.body); + restoreFocusFunction(); +} + +/** + * This function is a copy of the original `swapHeadElements` function from `astro:transitions/client`. + * The difference is that you can pass a list of elements that should not be removed + * in the new document. + * + * See https://github.com/withastro/astro/blob/d6f17044d3873df77cfbc73230cb3194b5a7d82a/packages/astro/src/transitions/swap-functions.ts#L51 + */ +function swapHeadElements(doc: Document, ignoredElements: Element[]) { + for (const el of Array.from(document.head.children)) { + const newEl = persistedHeadElement(el, doc); + + if (newEl) { + newEl.remove(); + } else { + if (!ignoredElements.includes(el)) { + el.remove(); + } + } + } + + document.head.append(...doc.head.children); +} + +function persistedHeadElement(el: Element, newDoc: Document) { + const id = el.getAttribute(PERSIST_ATTR); + const newEl = id && newDoc.head.querySelector(`[${PERSIST_ATTR}="${id}"]`); + if (newEl) { + return newEl; + } + if (el.matches('link[rel=stylesheet]')) { + const href = el.getAttribute('href'); + return newDoc.head.querySelector(`link[rel=stylesheet][href="${href}"]`); + } + return null; +} diff --git a/packages/astro/tsup.config.ts b/packages/astro/tsup.config.ts index 608373d993..e453f9b1a1 100644 --- a/packages/astro/tsup.config.ts +++ b/packages/astro/tsup.config.ts @@ -24,6 +24,6 @@ export default defineConfig(() => { bundle: true, sourcemap: true, format: ['esm'], - external: ['astro', 'react', 'react-dom', 'node:async_hooks', '#async-local-storage'], + external: ['astro', 'react', 'react-dom', 'node:async_hooks', '#async-local-storage', 'astro:transitions/client'], }; }); diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 48953a55f6..38e586062d 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,66 @@ # Change Log +## 1.15.1 + +### Patch Changes + +- Add the 'session-token-expired-refresh-unexpected-bapi-error' debug handshake reason. ([#4363](https://github.com/clerk/javascript/pull/4363)) by [@anagstef](https://github.com/anagstef) + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + - @clerk/shared@2.10.1 + +## 1.15.0 + +### Minor Changes + +- - Added `legalAcceptedAt` on `User` ([#4367](https://github.com/clerk/javascript/pull/4367)) by [@octoper](https://github.com/octoper) + + - Added `legalAcceptedAt` and `skipLegalChecks` on `CreateUserParams` and `UpdateUserParams` + - Added `legal_accepted_at` on `UserJSON` + +### Patch Changes + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 1.14.1 + +### Patch Changes + +- Remove console error message from refresh token flow failures. ([#4351](https://github.com/clerk/javascript/pull/4351)) by [@anagstef](https://github.com/anagstef) + +## 1.14.0 + +### Minor Changes + +- Updates `organizationPatterns` to take precedence over `personalAccountPatterns` in `organizationSyncOptions` ([#4320](https://github.com/clerk/javascript/pull/4320)) by [@izaaklauer](https://github.com/izaaklauer) + +- Use EIP-4361 message spec for Web3 wallets sign in signature requests ([#4334](https://github.com/clerk/javascript/pull/4334)) by [@chanioxaris](https://github.com/chanioxaris) + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + +## 1.13.10 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + +## 1.13.9 + +### Patch Changes + +- Expose `permissions` field for `OrganizationMembership` resource ([#4310](https://github.com/clerk/javascript/pull/4310)) by [@dstaley](https://github.com/dstaley) + +- Introduces organizationSyncOptions option to clerkMiddleware, which syncs an active organization or personal account from a URL to the Clerk session. (https://github.com/clerk/javascript/pull/3977) by [@izaaklauer](https://github.com/izaaklauer) + ## 1.13.8 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 6cc4099640..ae2339d17a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "1.13.8", + "version": "1.15.1", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { @@ -95,9 +95,9 @@ "test:cloudflare-workerd": "tests/cloudflare-workerd/run.sh" }, "dependencies": { - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookie": "0.5.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookie": "0.7.0", "snakecase-keys": "5.4.4", "tslib": "2.4.1" }, diff --git a/packages/backend/src/api/endpoints/UserApi.ts b/packages/backend/src/api/endpoints/UserApi.ts index 893bc4fd3b..c936a2df2b 100644 --- a/packages/backend/src/api/endpoints/UserApi.ts +++ b/packages/backend/src/api/endpoints/UserApi.ts @@ -74,6 +74,8 @@ type CreateUserParams = { lastName?: string; skipPasswordChecks?: boolean; skipPasswordRequirement?: boolean; + skipLegalChecks?: boolean; + legalAcceptedAt?: Date; totpSecret?: string; backupCodes?: string[]; createdAt?: Date; @@ -95,6 +97,8 @@ type UpdateUserParams = { backupCodes?: string[]; externalId?: string; createdAt?: Date; + skipLegalChecks?: boolean; + legalAcceptedAt?: Date; deleteSelfEnabled?: boolean; createOrganizationEnabled?: boolean; createOrganizationsLimit?: number; diff --git a/packages/backend/src/api/resources/JSON.ts b/packages/backend/src/api/resources/JSON.ts index 7b769f4495..a333d17e02 100644 --- a/packages/backend/src/api/resources/JSON.ts +++ b/packages/backend/src/api/resources/JSON.ts @@ -316,6 +316,7 @@ export interface UserJSON extends ClerkResourceJSON { create_organization_enabled: boolean; create_organizations_limit: number | null; delete_self_enabled: boolean; + legal_accepted_at: number | null; } export interface VerificationJSON extends ClerkResourceJSON { @@ -326,6 +327,7 @@ export interface VerificationJSON extends ClerkResourceJSON { verified_at_client?: string; external_verification_redirect_url?: string | null; nonce?: string | null; + message?: string | null; } export interface Web3WalletJSON extends ClerkResourceJSON { diff --git a/packages/backend/src/api/resources/OrganizationMembership.ts b/packages/backend/src/api/resources/OrganizationMembership.ts index ebeb3c628d..9c8e54f257 100644 --- a/packages/backend/src/api/resources/OrganizationMembership.ts +++ b/packages/backend/src/api/resources/OrganizationMembership.ts @@ -6,6 +6,7 @@ export class OrganizationMembership { constructor( readonly id: string, readonly role: OrganizationMembershipRole, + readonly permissions: string[], readonly publicMetadata: OrganizationMembershipPublicMetadata = {}, readonly privateMetadata: OrganizationMembershipPrivateMetadata = {}, readonly createdAt: number, @@ -18,6 +19,7 @@ export class OrganizationMembership { return new OrganizationMembership( data.id, data.role, + data.permissions, data.public_metadata, data.private_metadata, data.created_at, diff --git a/packages/backend/src/api/resources/User.ts b/packages/backend/src/api/resources/User.ts index 7eab723c5a..f70b7da959 100644 --- a/packages/backend/src/api/resources/User.ts +++ b/packages/backend/src/api/resources/User.ts @@ -38,6 +38,7 @@ export class User { readonly createOrganizationEnabled: boolean, readonly createOrganizationsLimit: number | null = null, readonly deleteSelfEnabled: boolean, + readonly legalAcceptedAt: number | null, ) {} static fromJSON(data: UserJSON): User { @@ -73,6 +74,7 @@ export class User { data.create_organization_enabled, data.create_organizations_limit, data.delete_self_enabled, + data.legal_accepted_at, ); } diff --git a/packages/backend/src/api/resources/Verification.ts b/packages/backend/src/api/resources/Verification.ts index 35cbfb4d36..451556ecd2 100644 --- a/packages/backend/src/api/resources/Verification.ts +++ b/packages/backend/src/api/resources/Verification.ts @@ -10,6 +10,7 @@ export class Verification { readonly attempts: number | null = null, readonly expireAt: number | null = null, readonly nonce: string | null = null, + readonly message: string | null = null, ) {} static fromJSON(data: VerificationJSON): Verification { diff --git a/packages/backend/src/internal.ts b/packages/backend/src/internal.ts index 11978dae04..af12ba0655 100644 --- a/packages/backend/src/internal.ts +++ b/packages/backend/src/internal.ts @@ -7,7 +7,7 @@ export { createAuthenticateRequest } from './tokens/factory'; export { debugRequestState } from './tokens/request'; -export type { AuthenticateRequestOptions } from './tokens/types'; +export type { AuthenticateRequestOptions, OrganizationSyncOptions } from './tokens/types'; export type { SignedInAuthObjectOptions, SignedInAuthObject, SignedOutAuthObject } from './tokens/authObjects'; export { makeAuthObjectSerializable, signedOutAuthObject, signedInAuthObject } from './tokens/authObjects'; diff --git a/packages/backend/src/tokens/__tests__/request.test.ts b/packages/backend/src/tokens/__tests__/request.test.ts index 7cd1ff3f4a..e187432ee7 100644 --- a/packages/backend/src/tokens/__tests__/request.test.ts +++ b/packages/backend/src/tokens/__tests__/request.test.ts @@ -13,8 +13,14 @@ import { import runtime from '../../runtime'; import { jsonOk } from '../../util/testUtils'; import { AuthErrorReason, type AuthReason, AuthStatus, type RequestState } from '../authStatus'; -import { authenticateRequest, RefreshTokenErrorReason } from '../request'; -import type { AuthenticateRequestOptions } from '../types'; +import { + authenticateRequest, + computeOrganizationSyncTargetMatchers, + getOrganizationSyncTarget, + type OrganizationSyncTarget, + RefreshTokenErrorReason, +} from '../request'; +import type { AuthenticateRequestOptions, OrganizationSyncOptions } from '../types'; const PK_TEST = 'pk_test_Y2xlcmsuaW5zcGlyZWQucHVtYS03NC5sY2wuZGV2JA'; const PK_LIVE = 'pk_live_Y2xlcmsuaW5zcGlyZWQucHVtYS03NC5sY2wuZGV2JA'; @@ -165,6 +171,183 @@ export default (QUnit: QUnit) => { return mockRequest({ cookie: cookieStr, ...headers }, requestUrl); }; + // Tests both getOrganizationSyncTarget and the organizationSyncOptions usage patterns + // that are recommended for typical use. + module('tokens.getOrganizationSyncTarget(url,options)', _ => { + type testCase = { + name: string; + // When the customer app specifies these orgSyncOptions to middleware... + whenOrgSyncOptions: OrganizationSyncOptions | undefined; + // And the path arrives at this URL path... + whenAppRequestPath: string; + // A handshake should (or should not) occur: + thenExpectActivationEntity: OrganizationSyncTarget | null; + }; + + const testCases: testCase[] = [ + { + name: 'none activates nothing', + whenOrgSyncOptions: undefined, + whenAppRequestPath: '/orgs/org_foo', + thenExpectActivationEntity: null, + }, + { + name: 'Can activate an org by ID (basic)', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id'], + }, + whenAppRequestPath: '/orgs/org_foo', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'mimatch activates nothing', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id'], + }, + whenAppRequestPath: '/personal-account/my-resource', + thenExpectActivationEntity: null, + }, + { + name: 'Can activate an org by ID (recommended matchers)', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id', '/orgs/:id/', '/orgs/:id/(.*)'], + }, + whenAppRequestPath: '/orgs/org_foo', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'Can activate an org by ID with a trailing slash', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id', '/orgs/:id/', '/orgs/:id/(.*)'], + }, + whenAppRequestPath: '/orgs/org_foo/', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'Can activate an org by ID with a trailing path component', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id', '/orgs/:id/', '/orgs/:id/(.*)'], + }, + whenAppRequestPath: '/orgs/org_foo/nested-resource', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'Can activate an org by ID with many trailing path component', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id/(.*)'], + }, + whenAppRequestPath: '/orgs/org_foo/nested-resource/and/more/deeply/nested/resources', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'Can activate an org by ID with an unrelated path token in the prefix', + whenOrgSyncOptions: { + organizationPatterns: ['/unknown-thing/:any/orgs/:id'], + }, + whenAppRequestPath: '/unknown-thing/thing/orgs/org_foo', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'org_foo', + }, + }, + { + name: 'Can activate an org by slug', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:slug'], + }, + whenAppRequestPath: '/orgs/my-org', + thenExpectActivationEntity: { + type: 'organization', + organizationSlug: 'my-org', + }, + }, + { + name: 'Can activate the personal account', + whenOrgSyncOptions: { + personalAccountPatterns: ['/personal-account'], + }, + whenAppRequestPath: '/personal-account', + thenExpectActivationEntity: { + type: 'personalAccount', + }, + }, + { + name: 'ID match precedes slug match', + whenOrgSyncOptions: { + organizationPatterns: ['/orgs/:id', '/orgs/:slug'], // bad practice + }, + whenAppRequestPath: '/orgs/my-org', + thenExpectActivationEntity: { + type: 'organization', + organizationId: 'my-org', + }, + }, + { + name: 'org match match precedes personal account', + whenOrgSyncOptions: { + personalAccountPatterns: ['/', '/(.*)'], // Personal account captures everything + organizationPatterns: ['/orgs/:slug'], // that isn't org scoped + }, + whenAppRequestPath: '/orgs/my-org', + thenExpectActivationEntity: { + type: 'organization', + organizationSlug: 'my-org', + }, + }, + { + name: 'personal account may contain path tokens', + whenOrgSyncOptions: { + personalAccountPatterns: ['/user/:any', '/user/:any/(.*)'], + }, + whenAppRequestPath: '/user/123/home', + thenExpectActivationEntity: { + type: 'personalAccount', + }, + }, + { + name: 'All of the config at once', + whenOrgSyncOptions: { + organizationPatterns: [ + '/orgs-by-id/:id', + '/orgs-by-id/:id/(.*)', + '/orgs-by-slug/:slug', + '/orgs-by-slug/:slug/(.*)', + ], + personalAccountPatterns: ['/personal-account', '/personal-account/(.*)'], + }, + whenAppRequestPath: '/orgs-by-slug/org_bar/sub-resource', + thenExpectActivationEntity: { + type: 'organization', + organizationSlug: 'org_bar', + }, + }, + ]; + + testCases.forEach(testCase => { + test(testCase.name, assert => { + const path = new URL(`http://localhost:3000${testCase.whenAppRequestPath}`); + const matchers = computeOrganizationSyncTargetMatchers(testCase.whenOrgSyncOptions); + const toActivate = getOrganizationSyncTarget(path, testCase.whenOrgSyncOptions, matchers); + assert.deepEqual(toActivate, testCase.thenExpectActivationEntity); + }); + }); + }); + module('tokens.authenticateRequest(options)', hooks => { let fakeClock; let fakeFetch; diff --git a/packages/backend/src/tokens/authStatus.ts b/packages/backend/src/tokens/authStatus.ts index 658ca3af77..6bb141fd2b 100644 --- a/packages/backend/src/tokens/authStatus.ts +++ b/packages/backend/src/tokens/authStatus.ts @@ -69,6 +69,7 @@ export const AuthErrorReason = { SessionTokenNBF: 'session-token-nbf', SessionTokenIatInTheFuture: 'session-token-iat-in-the-future', SessionTokenWithoutClientUAT: 'session-token-but-no-client-uat', + ActiveOrganizationMismatch: 'active-organization-mismatch', UnexpectedError: 'unexpected-error', } as const; diff --git a/packages/backend/src/tokens/request.ts b/packages/backend/src/tokens/request.ts index 57d553f157..dec5afdbc5 100644 --- a/packages/backend/src/tokens/request.ts +++ b/packages/backend/src/tokens/request.ts @@ -1,3 +1,5 @@ +import type { Match, MatchFunction } from '@clerk/shared/pathToRegexp'; +import { match } from '@clerk/shared/pathToRegexp'; import type { JwtPayload } from '@clerk/types'; import { constants } from '../constants'; @@ -8,12 +10,13 @@ import { assertValidSecretKey } from '../util/optionsAssertions'; import { isDevelopmentFromSecretKey } from '../util/shared'; import type { AuthenticateContext } from './authenticateContext'; import { createAuthenticateContext } from './authenticateContext'; +import type { SignedInAuthObject } from './authObjects'; import type { HandshakeState, RequestState, SignedInState, SignedOutState } from './authStatus'; import { AuthErrorReason, handshake, signedIn, signedOut } from './authStatus'; import { createClerkRequest } from './clerkRequest'; import { getCookieName, getCookieValue } from './cookie'; import { verifyHandshakeToken } from './handshake'; -import type { AuthenticateRequestOptions } from './types'; +import type { AuthenticateRequestOptions, OrganizationSyncOptions } from './types'; import { verifyToken } from './verify'; export const RefreshTokenErrorReason = { @@ -27,6 +30,7 @@ export const RefreshTokenErrorReason = { ExpiredSessionTokenMissingSidClaim: 'expired-session-token-missing-sid-claim', FetchError: 'fetch-error', UnexpectedSDKError: 'unexpected-sdk-error', + UnexpectedBAPIError: 'unexpected-bapi-error', } as const; function assertSignInUrlExists(signInUrl: string | undefined, key: string): asserts signInUrl is string { @@ -101,6 +105,9 @@ export async function authenticateRequest( assertProxyUrlOrDomain(authenticateContext.proxyUrl || authenticateContext.domain); } + // NOTE(izaak): compute regex matchers early for efficiency - they can be used multiple times. + const organizationSyncTargetMatchers = computeOrganizationSyncTargetMatchers(options.organizationSyncOptions); + function removeDevBrowserFromURL(url: URL) { const updatedURL = new URL(url); @@ -124,6 +131,19 @@ export async function authenticateRequest( url.searchParams.append(constants.QueryParameters.DevBrowser, authenticateContext.devBrowserToken); } + const toActivate = getOrganizationSyncTarget( + authenticateContext.clerkUrl, + options.organizationSyncOptions, + organizationSyncTargetMatchers, + ); + if (toActivate) { + const params = getOrganizationSyncQueryParams(toActivate); + + params.forEach((value, key) => { + url.searchParams.append(key, value); + }); + } + return new Headers({ [constants.Headers.Location]: url.href }); } @@ -279,7 +299,10 @@ ${error.getFullMessage()}`, } else { return { data: null, - error: err, + error: { + message: `Unexpected Server/BAPI error`, + cause: { reason: RefreshTokenErrorReason.UnexpectedBAPIError, errors: [err] }, + }, }; } } @@ -340,6 +363,67 @@ ${error.getFullMessage()}`, return signedOut(authenticateContext, reason, message); } + /** + * Determines if a handshake must occur to resolve a mismatch between the organization as specified + * by the URL (according to the options) and the actual active organization on the session. + * + * @returns {HandshakeState | SignedOutState | null} - The function can return the following: + * - {HandshakeState}: If a handshake is needed to resolve the mismatched organization. + * - {SignedOutState}: If a handshake is required but cannot be performed. + * - {null}: If no action is required. + */ + function handleMaybeOrganizationSyncHandshake( + authenticateContext: AuthenticateContext, + auth: SignedInAuthObject, + ): HandshakeState | SignedOutState | null { + const organizationSyncTarget = getOrganizationSyncTarget( + authenticateContext.clerkUrl, + options.organizationSyncOptions, + organizationSyncTargetMatchers, + ); + if (!organizationSyncTarget) { + return null; + } + let mustActivate = false; + if (organizationSyncTarget.type === 'organization') { + // Activate an org by slug? + if (organizationSyncTarget.organizationSlug && organizationSyncTarget.organizationSlug !== auth.orgSlug) { + mustActivate = true; + } + // Activate an org by ID? + if (organizationSyncTarget.organizationId && organizationSyncTarget.organizationId !== auth.orgId) { + mustActivate = true; + } + } + // Activate the personal account? + if (organizationSyncTarget.type === 'personalAccount' && auth.orgId) { + mustActivate = true; + } + if (!mustActivate) { + return null; + } + if (authenticateContext.handshakeRedirectLoopCounter > 0) { + // We have an organization that needs to be activated, but this isn't our first time redirecting. + // This is because we attempted to activate the organization previously, but the organization + // must not have been valid (either not found, or not valid for this user), and gave us back + // a null organization. We won't re-try the handshake, and leave it to the server component to handle. + console.warn( + 'Clerk: Organization activation handshake loop detected. This is likely due to an invalid organization ID or slug. Skipping organization activation.', + ); + return null; + } + const handshakeState = handleMaybeHandshakeStatus( + authenticateContext, + AuthErrorReason.ActiveOrganizationMismatch, + '', + ); + if (handshakeState.status !== 'handshake') { + // Currently, this is only possible if we're in a redirect loop, but the above check should guard against that. + return null; + } + return handshakeState; + } + async function authenticateRequestWithTokenInHeader() { const { sessionTokenInHeader } = authenticateContext; @@ -509,7 +593,23 @@ ${error.getFullMessage()}`, if (errors) { throw errors[0]; } - return signedIn(authenticateContext, data, undefined, authenticateContext.sessionTokenInCookie!); + const signedInRequestState = signedIn( + authenticateContext, + data, + undefined, + authenticateContext.sessionTokenInCookie!, + ); + + // Org sync if necessary + const handshakeRequestState = handleMaybeOrganizationSyncHandshake( + authenticateContext, + signedInRequestState.toAuth(), + ); + if (handshakeRequestState) { + return handshakeRequestState; + } + + return signedInRequestState; } catch (err) { return handleError(err, 'cookie'); } @@ -533,8 +633,7 @@ ${error.getFullMessage()}`, return signedIn(authenticateContext, data.jwtPayload, undefined, data.sessionToken); } - // If there's any error, simply fallback to the handshake flow. - console.error('Clerk: unable to refresh token:', error?.message || error); + // If there's any error, simply fallback to the handshake flow including the reason as a query parameter. if (error?.cause?.reason) { refreshError = error.cause.reason; } else { @@ -585,6 +684,132 @@ export const debugRequestState = (params: RequestState) => { return { isSignedIn, proxyUrl, reason, message, publishableKey, isSatellite, domain }; }; +type OrganizationSyncTargetMatchers = { + OrganizationMatcher: MatchFunction>> | null; + PersonalAccountMatcher: MatchFunction>> | null; +}; + +/** + * Computes regex-based matchers from the given organization sync options. + */ +export function computeOrganizationSyncTargetMatchers( + options: OrganizationSyncOptions | undefined, +): OrganizationSyncTargetMatchers { + let personalAccountMatcher: MatchFunction>> | null = null; + if (options?.personalAccountPatterns) { + try { + personalAccountMatcher = match(options.personalAccountPatterns); + } catch (e) { + // Likely to be encountered during development, so throwing the error is more prudent than logging + throw new Error(`Invalid personal account pattern "${options.personalAccountPatterns}": "${e}"`); + } + } + + let organizationMatcher: MatchFunction>> | null = null; + if (options?.organizationPatterns) { + try { + organizationMatcher = match(options.organizationPatterns); + } catch (e) { + // Likely to be encountered during development, so throwing the error is more prudent than logging + throw new Error(`Clerk: Invalid organization pattern "${options.organizationPatterns}": "${e}"`); + } + } + + return { + OrganizationMatcher: organizationMatcher, + PersonalAccountMatcher: personalAccountMatcher, + }; +} + +/** + * Determines if the given URL and settings indicate a desire to activate a specific + * organization or personal account. + * + * @param url - The URL of the original request. + * @param options - The organization sync options. + * @param matchers - The matchers for the organization and personal account patterns, as generated by `computeOrganizationSyncTargetMatchers`. + */ +export function getOrganizationSyncTarget( + url: URL, + options: OrganizationSyncOptions | undefined, + matchers: OrganizationSyncTargetMatchers, +): OrganizationSyncTarget | null { + if (!options) { + return null; + } + + // Check for organization activation + if (matchers.OrganizationMatcher) { + let orgResult: Match>>; + try { + orgResult = matchers.OrganizationMatcher(url.pathname); + } catch (e) { + // Intentionally not logging the path to avoid potentially leaking anything sensitive + console.error(`Clerk: Failed to apply organization pattern "${options.organizationPatterns}" to a path`, e); + return null; + } + + if (orgResult && 'params' in orgResult) { + const params = orgResult.params; + + if ('id' in params && typeof params.id === 'string') { + return { type: 'organization', organizationId: params.id }; + } + if ('slug' in params && typeof params.slug === 'string') { + return { type: 'organization', organizationSlug: params.slug }; + } + console.warn( + 'Clerk: Detected an organization pattern match, but no organization ID or slug was found in the URL. Does the pattern include `:id` or `:slug`?', + ); + } + } + + // Check for personal account activation + if (matchers.PersonalAccountMatcher) { + let personalResult: Match>>; + try { + personalResult = matchers.PersonalAccountMatcher(url.pathname); + } catch (e) { + // Intentionally not logging the path to avoid potentially leaking anything sensitive + console.error(`Failed to apply personal account pattern "${options.personalAccountPatterns}" to a path`, e); + return null; + } + + if (personalResult) { + return { type: 'personalAccount' }; + } + } + return null; +} + +/** + * Represents an organization or a personal account - e.g. an + * entity that can be activated by the handshake API. + */ +export type OrganizationSyncTarget = + | { type: 'personalAccount' } + | { type: 'organization'; organizationId?: string; organizationSlug?: string }; + +/** + * Generates the query parameters to activate an organization or personal account + * via the FAPI handshake api. + */ +function getOrganizationSyncQueryParams(toActivate: OrganizationSyncTarget): Map { + const ret = new Map(); + if (toActivate.type === 'personalAccount') { + ret.set('organization_id', ''); + } + if (toActivate.type === 'organization') { + if (toActivate.organizationId) { + ret.set('organization_id', toActivate.organizationId); + } + if (toActivate.organizationSlug) { + ret.set('organization_id', toActivate.organizationSlug); + } + } + return ret; +} + const convertTokenVerificationErrorReasonToAuthErrorReason = ({ tokenError, refreshError, diff --git a/packages/backend/src/tokens/types.ts b/packages/backend/src/tokens/types.ts index 3136f98338..235b08eb07 100644 --- a/packages/backend/src/tokens/types.ts +++ b/packages/backend/src/tokens/types.ts @@ -10,5 +10,60 @@ export type AuthenticateRequestOptions = { signUpUrl?: string; afterSignInUrl?: string; afterSignUpUrl?: string; + organizationSyncOptions?: OrganizationSyncOptions; apiClient?: ApiClient; } & VerifyTokenOptions; + +/** + * Defines the options for syncing an organization or personal account state from the URL to the clerk session. + * Useful if the application requires the inclusion of a URL that indicates that a given clerk organization + * (or personal account) must be active on the clerk session. + * + * If a mismatch between the active organization on the session and the organization as indicated by the URL is + * detected, an attempt to activate the given organization will be made. + * + * WARNING: If the activation cannot be performed, either because an organization does not exist or the user lacks + * access, then the active organization on the session will not be changed (and a warning will be logged). It is + * ultimately the responsibility of the page to verify that the resources are appropriate to render given the URL, + * and handle mismatches appropriately (e.g. by returning a 404). + */ +export type OrganizationSyncOptions = { + /** + * URL patterns that are organization-specific and contain an organization ID or slug as a path token. + * If a request matches this path, the organization identifier will be extracted and activated before rendering. + * + * WARNING: If the organization cannot be activated either because it does not exist or the user lacks access, + * organization-related fields will be set to null. The server component must detect this and respond + * with an appropriate error (e.g., notFound()). + * + * If the route also matches the personalAccountPatterns, this takes precedence. + * + * Must have a path token named either ":id" (matches a clerk organization ID) or ":slug" (matches a clerk + * organization slug). + * + * Common examples: + * - ["/orgs/:slug", "/orgs/:slug/(.*)"] + * - ["/orgs/:id", "/orgs/:id/(.*)"] + * - ["/app/:any/orgs/:slug", "/app/:any/orgs/:slug/(.*)"] + */ + organizationPatterns?: Pattern[]; + + /** + * URL patterns for resources in the context of a clerk personal account (user-specific, outside any organization). + * If the route also matches the organizationPattern, the organizationPatterns takes precedence. + * + * Common examples: + * - ["/user", "/user/(.*)"] + * - ["/user/:any", "/user/:any/(.*)"] + */ + personalAccountPatterns?: Pattern[]; +}; + +/** + * A pattern representing the structure of a URL path. + * In addition to a valid URL, may include: + * - Named path tokens prefixed with a colon (e.g., ":id", ":slug", ":any") + * - Wildcard token (e.g., ".(*)"), which will match the remainder of the path + * Examples: "/orgs/:slug", "/app/:any/orgs/:id", "/personal-account/(.*)" + */ +type Pattern = string; diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index a8ea88d80c..9924bab6c4 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,69 @@ # Change Log +## 1.3.23 + +### Patch Changes + +- Updated dependencies [[`7a632905c`](https://github.com/clerk/javascript/commit/7a632905c351b7795e5cf77e59b8b89f2c60d5c7), [`83c0e7f28`](https://github.com/clerk/javascript/commit/83c0e7f28dc187eac84f4909b47768f6eec472bf), [`d82886c70`](https://github.com/clerk/javascript/commit/d82886c70ae4a851422da845f1f06f93af9b60a9)]: + - @clerk/clerk-js@5.29.1 + +## 1.3.22 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/clerk-js@5.29.0 + - @clerk/clerk-react@5.13.1 + - @clerk/shared@2.10.1 + +## 1.3.21 + +### Patch Changes + +- Updated dependencies [[`1be6dac56`](https://github.com/clerk/javascript/commit/1be6dac56ecfd771d0683d16cab8e9d023695419), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`a0204a8e8`](https://github.com/clerk/javascript/commit/a0204a8e8742b63aea92d67e7d66fe0bc86a166f)]: + - @clerk/clerk-js@5.28.0 + - @clerk/shared@2.10.0 + - @clerk/clerk-react@5.13.0 + +## 1.3.20 + +### Patch Changes + +- Updated dependencies [[`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`48421febe`](https://github.com/clerk/javascript/commit/48421febe5feb85d8cf0706c3b150d3e8c545635), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/clerk-react@5.12.0 + - @clerk/clerk-js@5.27.0 + - @clerk/shared@2.9.2 + +## 1.3.19 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`02f54868d`](https://github.com/clerk/javascript/commit/02f54868d1176d973459498adcc84c5aee521ea5), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/clerk-js@5.26.5 + - @clerk/shared@2.9.1 + - @clerk/clerk-react@5.11.1 + +## 1.3.18 + +### Patch Changes + +- Updated dependencies [[`6ef3ec6b5`](https://github.com/clerk/javascript/commit/6ef3ec6b56ddb1c9c51e9a6c9648de0b0f8c1777)]: + - @clerk/clerk-js@5.26.4 + +## 1.3.17 + +### Patch Changes + +- Updated dependencies [[`e50ce1b10`](https://github.com/clerk/javascript/commit/e50ce1b101fc2c6805415b00193b108ab045d820)]: + - @clerk/clerk-js@5.26.3 + +## 1.3.16 + +### Patch Changes + +- Updated dependencies [[`a46c44eeb`](https://github.com/clerk/javascript/commit/a46c44eeb50b5cbac85d461384948cd77df7cf12), [`7719d1bcd`](https://github.com/clerk/javascript/commit/7719d1bcd8c7e38cb644fffbb85edc1fa0038288)]: + - @clerk/clerk-js@5.26.2 + ## 1.3.15 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index a9301855eb..f1fce1e221 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.3.15", + "version": "1.3.23", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", @@ -47,9 +47,9 @@ "test:coverage": "jest --collectCoverage && open coverage/lcov-report/index.html" }, "dependencies": { - "@clerk/clerk-js": "5.26.1", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", + "@clerk/clerk-js": "5.29.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", "webextension-polyfill": "^0.10.0" }, "devDependencies": { diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 89affdbc6d..0bff0b2695 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,117 @@ # Change Log +## 5.29.1 + +### Patch Changes + +- Move `@clerk/ui` to `devDependencies` ([#4399](https://github.com/clerk/javascript/pull/4399)) by [@dstaley](https://github.com/dstaley) + +- Show an error on `` if the Web3 wallet is already claimed. ([#4389](https://github.com/clerk/javascript/pull/4389)) by [@EmmanouelaPothitou](https://github.com/EmmanouelaPothitou) + +- Fix for legal consent rendered on the component when only social sign up is enabled ([#4403](https://github.com/clerk/javascript/pull/4403)) by [@octoper](https://github.com/octoper) + +## 5.29.0 + +### Minor Changes + +- Adding experimental support for legal consent for `` component ([#4337](https://github.com/clerk/javascript/pull/4337)) by [@octoper](https://github.com/octoper) + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`f9d53fe34`](https://github.com/clerk/javascript/commit/f9d53fe3444db5154dba47270a06c6a76dbea69f)]: + - @clerk/localizations@3.4.0 + - @clerk/types@4.28.0 + - @clerk/ui@0.1.10 + - @clerk/shared@2.10.1 + +## 5.28.0 + +### Minor Changes + +- Add experimental support for new UI components ([#4114](https://github.com/clerk/javascript/pull/4114)) by [@BRKalow](https://github.com/BRKalow) + +### Patch Changes + +- Bug fix: Always receive a new session verification object when UserVerification component mounts. ([#4359](https://github.com/clerk/javascript/pull/4359)) by [@panteliselef](https://github.com/panteliselef) + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + - @clerk/localizations@3.3.1 + +## 5.27.0 + +### Minor Changes + +- Drop `maxAgeMinutes` from `__experimental_startVerification`. ([#4338](https://github.com/clerk/javascript/pull/4338)) by [@panteliselef](https://github.com/panteliselef) + + Drop types `__experimental_SessionVerificationConfig` and `__experimental_SessionVerificationMaxAgeMinutes`. + +- The "Restricted access" screen has been improved for visual consistency and the ability to contact support. The displayed texts have been made more clear and the sign-in button has been moved to the bottom. ([#4335](https://github.com/clerk/javascript/pull/4335)) by [@nikospapcom](https://github.com/nikospapcom) + +- Add experimental standalone mode for `` and ``. ([#4042](https://github.com/clerk/javascript/pull/4042)) by [@panteliselef](https://github.com/panteliselef) + + When `__experimental_asStandalone: true` the component will not render its trigger, and instead it will render only the contents of the popover in place. + + APIs that changed: + + - (For internal usage) Added `__experimental_prefetchOrganizationSwitcher` as a way to mount an internal component that will render the `useOrganizationList()` hook and prefetch the necessary data for the popover of ``. This enhances the UX since no loading state will be visible and keeps CLS to the minimum. + - New property for `mountOrganizationSwitcher(node, { __experimental_asStandalone: true })` + - New property for `mountUserButton(node, { __experimental_asStandalone: true })` + +- Use EIP-4361 message spec for Web3 wallets sign in signature requests ([#4334](https://github.com/clerk/javascript/pull/4334)) by [@chanioxaris](https://github.com/chanioxaris) + +### Patch Changes + +- Retry with exponential backoff if loadScript fails to load the script ([#4349](https://github.com/clerk/javascript/pull/4349)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Add the `?render=explicit` query parameter to the Turnstile script. ([#4332](https://github.com/clerk/javascript/pull/4332)) by [@anagstef](https://github.com/anagstef) + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`0a9bf8ef4`](https://github.com/clerk/javascript/commit/0a9bf8ef4902606f06b371e11c7ae84d493eda6c), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/localizations@3.3.0 + +## 5.26.5 + +### Patch Changes + +- Only retry the OAuth flow if the captcha check failed. ([#4329](https://github.com/clerk/javascript/pull/4329)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Improve bot detection by loading the Turnstile SDK directly from CloudFlare. ([#4321](https://github.com/clerk/javascript/pull/4321)) by [@anagstef](https://github.com/anagstef) + + If loading fails due to CSP rules, load it through FAPI instead. + +- Bypass captcha for providers dynamically provided in environment ([#4322](https://github.com/clerk/javascript/pull/4322)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/localizations@3.2.1 + +## 5.26.4 + +### Patch Changes + +- Correctly handle malformed or protocol-relative URLs before navigating to cross-origin URLs ([#4317](https://github.com/clerk/javascript/pull/4317)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +## 5.26.3 + +### Patch Changes + +- Update `OrganizationSwitcher` popover action to include label ([#4304](https://github.com/clerk/javascript/pull/4304)) by [@LauraBeatris](https://github.com/LauraBeatris) + +## 5.26.2 + +### Patch Changes + +- Handle gracefully Coinbase Wallet use of existing Passkey ([#4302](https://github.com/clerk/javascript/pull/4302)) by [@chanioxaris](https://github.com/chanioxaris) + +- Updates webpack to address CVE-2024-43788. ([#4287](https://github.com/clerk/javascript/pull/4287)) by [@dependabot](https://github.com/apps/dependabot) + +- Updated dependencies [[`e29a8061d`](https://github.com/clerk/javascript/commit/e29a8061d4106b9192837056e5f505c05f3c3a64), [`00a9ddb5b`](https://github.com/clerk/javascript/commit/00a9ddb5bd566fea7f22182047ae2c02e28e2ddc)]: + - @clerk/localizations@3.2.0 + ## 5.26.1 ### Patch Changes diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index e1b6a6c774..7f6ab8562b 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,8 +1,8 @@ { "files": [ - { "path": "./dist/clerk.browser.js", "maxSize": "64.5kB" }, - { "path": "./dist/clerk.headless.js", "maxSize": "43kB" }, - { "path": "./dist/ui-common*.js", "maxSize": "86KB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "68kB" }, + { "path": "./dist/clerk.headless.js", "maxSize": "44kB" }, + { "path": "./dist/ui-common*.js", "maxSize": "87KB" }, { "path": "./dist/vendors*.js", "maxSize": "70KB" }, { "path": "./dist/coinbase*.js", "maxSize": "58KB" }, { "path": "./dist/createorganization*.js", "maxSize": "5KB" }, @@ -15,6 +15,6 @@ { "path": "./dist/userbutton*.js", "maxSize": "5KB" }, { "path": "./dist/userprofile*.js", "maxSize": "15KB" }, { "path": "./dist/userverification*.js", "maxSize": "5KB" }, - { "path": "./dist/onetap*.js", "maxSize": "1KB" } + { "path": "./dist/onetap*.js", "maxSize": "2KB" } ] } diff --git a/packages/clerk-js/global.d.ts b/packages/clerk-js/global.d.ts deleted file mode 100644 index 4684851c62..0000000000 --- a/packages/clerk-js/global.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.module.scss' { - const content: Record; - export default content; -} diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index aba6004664..fbeb415c5b 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.26.1", + "version": "5.29.1", "description": "Clerk JS library", "keywords": [ "clerk", @@ -50,9 +50,9 @@ }, "browserslist": "last 2 versions, ios_saf > 12, Safari > 12, > 1%, not dead, not ie > 0", "dependencies": { - "@clerk/localizations": "3.1.2", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/localizations": "3.4.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "@coinbase/wallet-sdk": "4.0.4", "@emotion/cache": "11.11.0", "@emotion/react": "11.11.1", @@ -69,13 +69,8 @@ "regenerator-runtime": "0.13.11" }, "devDependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@babel/preset-typescript": "^7.12.1", "@clerk/eslint-config-custom": "*", + "@clerk/ui": "0.1.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@rsdoctor/webpack-plugin": "^0.4.4", "@svgr/webpack": "^6.2.1", @@ -83,8 +78,6 @@ "@types/react-dom": "*", "@types/webpack-dev-server": "^4.7.2", "@types/webpack-env": "^1.16.4", - "babel-loader": "^9.1.2", - "babel-plugin-module-resolver": "^5.0.0", "bundlewatch": "^0.4.0", "react-refresh": "^0.14.0", "react-refresh-typescript": "^2.0.5", diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 98ebad1d08..36ff3a1eef 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -37,6 +37,7 @@ import type { HandleOAuthCallbackParams, InstanceType, ListenerCallback, + LoadedClerk, NavigateOptions, OrganizationListProps, OrganizationProfileProps, @@ -64,6 +65,7 @@ import type { } from '@clerk/types'; import type { MountComponentRenderer } from '../ui/Components'; +import { UI } from '../ui/new'; import { ALLOWED_PROTOCOLS, buildURL, @@ -145,7 +147,12 @@ const defaultOptions: ClerkOptions = { signUpForceRedirectUrl: undefined, }; +function clerkIsLoaded(clerk: ClerkInterface): clerk is LoadedClerk { + return !!clerk.client; +} + export class Clerk implements ClerkInterface { + public __experimental_ui?: UI; public static mountComponentRenderer?: MountComponentRenderer; public static version: string = __PKG_VERSION__; @@ -317,6 +324,14 @@ export class Clerk implements ClerkInterface { } else { this.#loaded = await this.#loadInNonStandardBrowser(); } + + if (clerkIsLoaded(this)) { + this.__experimental_ui = new UI({ + router: this.#options.__experimental_router, + clerk: this, + options: this.#options, + }); + } }; public signOut: SignOut = async (callbackOrOptions?: SignOutCallback | SignOutOptions, options?: SignOutOptions) => { @@ -495,15 +510,19 @@ export class Clerk implements ClerkInterface { }; public mountSignIn = (node: HTMLDivElement, props?: SignInProps): void => { - this.assertComponentsReady(this.#componentControls); - void this.#componentControls.ensureMounted({ preloadHint: 'SignIn' }).then(controls => - controls.mountComponent({ - name: 'SignIn', - appearanceKey: 'signIn', - node, - props, - }), - ); + if (props && props.__experimental?.newComponents && this.__experimental_ui) { + this.__experimental_ui.mount('SignIn', node, props); + } else { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls.ensureMounted({ preloadHint: 'SignIn' }).then(controls => + controls.mountComponent({ + name: 'SignIn', + appearanceKey: 'signIn', + node, + props, + }), + ); + } this.telemetry?.record(eventPrebuiltComponentMounted('SignIn', props)); }; @@ -517,15 +536,19 @@ export class Clerk implements ClerkInterface { }; public mountSignUp = (node: HTMLDivElement, props?: SignUpProps): void => { - this.assertComponentsReady(this.#componentControls); - void this.#componentControls.ensureMounted({ preloadHint: 'SignUp' }).then(controls => - controls.mountComponent({ - name: 'SignUp', - appearanceKey: 'signUp', - node, - props, - }), - ); + if (props && props.__experimental?.newComponents && this.__experimental_ui) { + this.__experimental_ui.mount('SignUp', node, props); + } else { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls.ensureMounted({ preloadHint: 'SignUp' }).then(controls => + controls.mountComponent({ + name: 'SignUp', + appearanceKey: 'signUp', + node, + props, + }), + ); + } this.telemetry?.record(eventPrebuiltComponentMounted('SignUp', props)); }; @@ -667,6 +690,13 @@ export class Clerk implements ClerkInterface { void this.#componentControls?.ensureMounted().then(controls => controls.unmountComponent({ node })); }; + public __experimental_prefetchOrganizationSwitcher = () => { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls + ?.ensureMounted({ preloadHint: 'OrganizationSwitcher' }) + .then(controls => controls.prefetch('organizationSwitcher')); + }; + public mountOrganizationList = (node: HTMLDivElement, props?: OrganizationListProps) => { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { @@ -1370,6 +1400,7 @@ export class Clerk implements ClerkInterface { return this.client?.signUp.create({ strategy: 'google_one_tap', token: params.token, + __experimental_legalAccepted: params.__experimental_legalAccepted, }); } throw err; @@ -1390,6 +1421,7 @@ export class Clerk implements ClerkInterface { customNavigate, unsafeMetadata, strategy, + __experimental_legalAccepted, }: ClerkAuthenticateWithWeb3Params): Promise => { if (!this.client || !this.environment) { return; @@ -1412,6 +1444,7 @@ export class Clerk implements ClerkInterface { generateSignature, unsafeMetadata, strategy, + __experimental_legalAccepted, }); if ( diff --git a/packages/clerk-js/src/core/resources/DisplayConfig.ts b/packages/clerk-js/src/core/resources/DisplayConfig.ts index 102610d889..73150b2e37 100644 --- a/packages/clerk-js/src/core/resources/DisplayConfig.ts +++ b/packages/clerk-js/src/core/resources/DisplayConfig.ts @@ -4,6 +4,7 @@ import type { DisplayConfigJSON, DisplayConfigResource, DisplayThemeJSON, + OAuthStrategy, PreferredSignInStrategy, } from '@clerk/types'; @@ -24,6 +25,7 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource captchaWidgetType: CaptchaWidgetType = null; captchaProvider: CaptchaProvider = 'turnstile'; captchaPublicKeyInvisible: string | null = null; + captchaOauthBypass: OAuthStrategy[] = []; homeUrl!: string; instanceEnvironmentType!: string; faviconImageUrl!: string; @@ -42,6 +44,8 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource afterCreateOrganizationUrl!: string; googleOneTapClientId?: string; showDevModeWarning!: boolean; + termsUrl!: string; + privacyPolicyUrl!: string; public constructor(data: DisplayConfigJSON) { super(); @@ -74,6 +78,9 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource this.captchaWidgetType = data.captcha_widget_type; this.captchaProvider = data.captcha_provider; this.captchaPublicKeyInvisible = data.captcha_public_key_invisible; + // 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.supportEmail = data.support_email || ''; this.clerkJSVersion = data.clerk_js_version; this.organizationProfileUrl = data.organization_profile_url; @@ -82,6 +89,8 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource this.afterCreateOrganizationUrl = data.after_create_organization_url; this.googleOneTapClientId = data.google_one_tap_client_id; this.showDevModeWarning = data.show_devmode_warning; + this.termsUrl = data.terms_url; + this.privacyPolicyUrl = data.privacy_policy_url; return this; } } diff --git a/packages/clerk-js/src/core/resources/Environment.ts b/packages/clerk-js/src/core/resources/Environment.ts index 28b3c1cad6..a3c5228052 100644 --- a/packages/clerk-js/src/core/resources/Environment.ts +++ b/packages/clerk-js/src/core/resources/Environment.ts @@ -33,7 +33,7 @@ export class Environment extends BaseResource implements EnvironmentResource { this.fromJSON(data); } - fetch({ touch = false }: { touch: boolean }): Promise { + fetch({ touch }: { touch: boolean } = { touch: false }): Promise { if (touch) { return this._basePatch({}); } diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts index 9a1c3963af..b9ef674373 100644 --- a/packages/clerk-js/src/core/resources/Session.ts +++ b/packages/clerk-js/src/core/resources/Session.ts @@ -122,7 +122,6 @@ export class Session extends BaseResource implements SessionResource { __experimental_startVerification = async ({ level, - maxAgeMinutes, }: __experimental_SessionVerifyCreateParams): Promise<__experimental_SessionVerificationResource> => { const json = ( await BaseResource._fetch({ @@ -130,7 +129,6 @@ export class Session extends BaseResource implements SessionResource { path: `/client/sessions/${this.id}/verify`, body: { level, - maxAgeMinutes, } as any, }) )?.response as unknown as __experimental_SessionVerificationJSON; diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 27bfc60da2..50ce5f39e4 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -250,16 +250,27 @@ export class SignIn extends BaseResource implements SignInResource { await this.prepareFirstFactor(web3FirstFactor); - const { nonce } = this.firstFactorVerification; - if (!nonce) { + const { message } = this.firstFactorVerification; + if (!message) { clerkVerifyWeb3WalletCalledBeforeCreate('SignIn'); } - const signature = await generateSignature({ - identifier: this.identifier!, - nonce: nonce, - provider, - }); + let signature: string; + try { + signature = await generateSignature({ identifier, nonce: message, provider }); + } catch (err) { + // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing + // Passkey in order to authenticate, the initial generate signature request to be rejected. For this + // reason we retry the request once more in order for the flow to be able to be completed successfully. + // + // error code 4001 means the user rejected the request + // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors + if (provider === 'coinbase_wallet' && err.code === 4001) { + signature = await generateSignature({ identifier, nonce: message, provider }); + } else { + throw err; + } + } return this.attemptFirstFactor({ signature, diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index a2ab627814..2dbaf05337 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -1,4 +1,5 @@ import { Poller } from '@clerk/shared'; +import { isCaptchaError, isClerkAPIResponseError } from '@clerk/shared/error'; import type { AttemptEmailAddressVerificationParams, AttemptPhoneNumberVerificationParams, @@ -69,6 +70,7 @@ export class SignUp extends BaseResource implements SignUpResource { createdSessionId: string | null = null; createdUserId: string | null = null; abandonAt: number | null = null; + legalAcceptedAt: number | null = null; constructor(data: SignUpJSON | null = null) { super(); @@ -110,6 +112,12 @@ export class SignUp extends BaseResource implements SignUpResource { paramsWithCaptcha.strategy = SignUp.clerk.client?.signIn.firstFactorVerification.strategy; } + // TODO(@vaggelis): Remove this once the legalAccepted is stable + if (typeof params.__experimental_legalAccepted !== 'undefined') { + paramsWithCaptcha.legalAccepted = params.__experimental_legalAccepted; + paramsWithCaptcha.__experimental_legalAccepted = undefined; + } + return this._basePost({ path: this.pathRoot, body: normalizeUnsafeMetadata(paramsWithCaptcha), @@ -189,9 +197,18 @@ export class SignUp extends BaseResource implements SignUpResource { }; public authenticateWithWeb3 = async ( - params: AuthenticateWithWeb3Params & { unsafeMetadata?: SignUpUnsafeMetadata }, + params: AuthenticateWithWeb3Params & { + unsafeMetadata?: SignUpUnsafeMetadata; + __experimental_legalAccepted?: boolean; + }, ): Promise => { - const { generateSignature, identifier, unsafeMetadata, strategy = 'web3_metamask_signature' } = params || {}; + const { + generateSignature, + identifier, + unsafeMetadata, + strategy = 'web3_metamask_signature', + __experimental_legalAccepted, + } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; if (!(typeof generateSignature === 'function')) { @@ -199,17 +216,17 @@ export class SignUp extends BaseResource implements SignUpResource { } const web3Wallet = identifier || this.web3wallet!; - await this.create({ web3Wallet, unsafeMetadata }); + await this.create({ web3Wallet, unsafeMetadata, __experimental_legalAccepted: __experimental_legalAccepted }); await this.prepareWeb3WalletVerification({ strategy }); - const { nonce } = this.verifications.web3Wallet; - if (!nonce) { + const { message } = this.verifications.web3Wallet; + if (!message) { clerkVerifyWeb3WalletCalledBeforeCreate('SignUp'); } let signature: string; try { - signature = await generateSignature({ identifier, nonce, provider }); + signature = await generateSignature({ identifier, nonce: message, provider }); } catch (err) { // There is a chance that as a first time visitor when you try to setup and use the // Coinbase Wallet from scratch in order to authenticate, the initial generate @@ -219,7 +236,7 @@ export class SignUp extends BaseResource implements SignUpResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce, provider }); + signature = await generateSignature({ identifier, nonce: message, provider }); } else { throw err; } @@ -228,18 +245,25 @@ export class SignUp extends BaseResource implements SignUpResource { return this.attemptWeb3WalletVerification({ signature, strategy }); }; - public authenticateWithMetamask = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { + public authenticateWithMetamask = async ( + params?: SignUpAuthenticateWithWeb3Params & { + __experimental_legalAccepted?: boolean; + }, + ): Promise => { const identifier = await getMetamaskIdentifier(); return this.authenticateWithWeb3({ identifier, generateSignature: generateSignatureWithMetamask, unsafeMetadata: params?.unsafeMetadata, strategy: 'web3_metamask_signature', + __experimental_legalAccepted: params?.__experimental_legalAccepted, }); }; public authenticateWithCoinbaseWallet = async ( - params?: SignUpAuthenticateWithWeb3Params, + params?: SignUpAuthenticateWithWeb3Params & { + __experimental_legalAccepted?: boolean; + }, ): Promise => { const identifier = await getCoinbaseWalletIdentifier(); return this.authenticateWithWeb3({ @@ -247,6 +271,7 @@ export class SignUp extends BaseResource implements SignUpResource { generateSignature: generateSignatureWithCoinbaseWallet, unsafeMetadata: params?.unsafeMetadata, strategy: 'web3_coinbase_wallet_signature', + __experimental_legalAccepted: params?.__experimental_legalAccepted, }); }; @@ -257,18 +282,31 @@ export class SignUp extends BaseResource implements SignUpResource { continueSignUp = false, unsafeMetadata, emailAddress, + __experimental_legalAccepted, }: AuthenticateWithRedirectParams & { unsafeMetadata?: SignUpUnsafeMetadata; }): Promise => { - const authenticateFn = (args: SignUpCreateParams | SignUpUpdateParams) => - continueSignUp && this.id ? this.update(args) : this.create(args); + const authenticateFn = () => { + const params = { + strategy, + redirectUrl: SignUp.clerk.buildUrlWithAuth(redirectUrl), + actionCompleteRedirectUrl: redirectUrlComplete, + unsafeMetadata, + emailAddress, + __experimental_legalAccepted, + }; + return continueSignUp && this.id ? this.update(params) : this.create(params); + }; - const { verifications } = await authenticateFn({ - strategy, - redirectUrl: SignUp.clerk.buildUrlWithAuth(redirectUrl), - actionCompleteRedirectUrl: redirectUrlComplete, - unsafeMetadata, - emailAddress, + const { verifications } = await authenticateFn().catch(async e => { + // If captcha verification failed because the environment has changed, we need + // to reload the environment and try again one more time with the new environment. + // If this fails again, we will let the caller handle the error accordingly. + if (isClerkAPIResponseError(e) && isCaptchaError(e)) { + await SignUp.clerk.__unstable__environment!.reload(); + return authenticateFn(); + } + throw e; }); const { externalAccount } = verifications; @@ -282,6 +320,13 @@ export class SignUp extends BaseResource implements SignUpResource { }; update = (params: SignUpUpdateParams): Promise => { + // TODO(@vaggelis): Remove this once the legalAccepted is stable + if (typeof params.__experimental_legalAccepted !== 'undefined') { + // @ts-expect-error - We need to remove the __experimental_legalAccepted key from the params + params.legalAccepted = params.__experimental_legalAccepted; + params.__experimental_legalAccepted = undefined; + } + return this._basePatch({ body: normalizeUnsafeMetadata(params), }); @@ -316,6 +361,7 @@ export class SignUp extends BaseResource implements SignUpResource { this.createdUserId = data.created_user_id; this.abandonAt = data.abandon_at; this.web3wallet = data.web3_wallet; + this.legalAcceptedAt = data.legal_accepted_at; } return this; } @@ -324,18 +370,19 @@ export class SignUp extends BaseResource implements SignUpResource { * We delegate bot detection to the following providers, instead of relying on turnstile exclusively */ protected shouldBypassCaptchaForAttempt(params: SignUpCreateParams) { - if ( - params.strategy === 'oauth_google' || - params.strategy === 'oauth_microsoft' || - params.strategy === 'oauth_apple' - ) { + if (!params.strategy) { + return false; + } + + const captchaOauthBypass = SignUp.clerk.__unstable__environment!.displayConfig.captchaOauthBypass; + + if (captchaOauthBypass.some(strategy => strategy === params.strategy)) { return true; } + if ( params.transfer && - (SignUp.clerk.client?.signIn.firstFactorVerification.strategy === 'oauth_google' || - SignUp.clerk.client?.signIn.firstFactorVerification.strategy === 'oauth_microsoft' || - SignUp.clerk.client?.signIn.firstFactorVerification.strategy === 'oauth_apple') + captchaOauthBypass.some(strategy => strategy === SignUp.clerk.client!.signIn.firstFactorVerification.strategy) ) { return true; } diff --git a/packages/clerk-js/src/core/resources/User.ts b/packages/clerk-js/src/core/resources/User.ts index 7fe40eda9c..c46c4180c2 100644 --- a/packages/clerk-js/src/core/resources/User.ts +++ b/packages/clerk-js/src/core/resources/User.ts @@ -87,6 +87,7 @@ export class User extends BaseResource implements UserResource { createOrganizationsLimit: number | null = null; deleteSelfEnabled = false; lastSignInAt: Date | null = null; + legalAcceptedAt: Date | null = null; updatedAt: Date | null = null; createdAt: Date | null = null; @@ -360,6 +361,10 @@ export class User extends BaseResource implements UserResource { this.lastSignInAt = unixEpochToDate(data.last_sign_in_at); } + if (data.legal_accepted_at) { + this.legalAcceptedAt = unixEpochToDate(data.legal_accepted_at); + } + this.updatedAt = unixEpochToDate(data.updated_at); this.createdAt = unixEpochToDate(data.created_at); return this; diff --git a/packages/clerk-js/src/core/resources/Verification.ts b/packages/clerk-js/src/core/resources/Verification.ts index e301098065..8028c4c177 100644 --- a/packages/clerk-js/src/core/resources/Verification.ts +++ b/packages/clerk-js/src/core/resources/Verification.ts @@ -23,6 +23,7 @@ export class Verification extends BaseResource implements VerificationResource { status: VerificationStatus | null = null; strategy: string | null = null; nonce: string | null = null; + message: string | null = null; externalVerificationRedirectURL: URL | null = null; attempts: number | null = null; expireAt: Date | null = null; @@ -44,6 +45,7 @@ export class Verification extends BaseResource implements VerificationResource { this.verifiedAtClient = data.verified_at_client; this.strategy = data.strategy; this.nonce = data.nonce || null; + this.message = data.message || null; if (data.external_verification_redirect_url) { this.externalVerificationRedirectURL = new URL(data.external_verification_redirect_url); } else { diff --git a/packages/clerk-js/src/global.d.ts b/packages/clerk-js/src/global.d.ts new file mode 100644 index 0000000000..4882a05c18 --- /dev/null +++ b/packages/clerk-js/src/global.d.ts @@ -0,0 +1,4 @@ +declare module '@clerk/ui/styles.css' { + const content: string; + export default content; +} diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index fa419d4c9f..5fd0168ee3 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -37,6 +37,7 @@ import { LazyModalRenderer, LazyOneTapRenderer, LazyProviders, + OrganizationSwitcherPrefetch, } from './lazyModules/providers'; import type { AvailableComponentProps } from './types'; @@ -88,6 +89,7 @@ export type ComponentControls = { notify?: boolean; }, ) => void; + prefetch: (component: 'organizationSwitcher') => void; // Special case, as the impersonation fab mounts automatically mountImpersonationFab: () => void; }; @@ -116,6 +118,7 @@ interface ComponentsState { userVerificationModal: null | __experimental_UserVerificationProps; organizationProfileModal: null | OrganizationProfileProps; createOrganizationModal: null | CreateOrganizationProps; + organizationSwitcherPrefetch: boolean; nodes: Map; impersonationFab: boolean; } @@ -193,6 +196,7 @@ const Components = (props: ComponentsProps) => { userVerificationModal: null, organizationProfileModal: null, createOrganizationModal: null, + organizationSwitcherPrefetch: false, nodes: new Map(), impersonationFab: false, }); @@ -301,6 +305,10 @@ const Components = (props: ComponentsProps) => { setState(s => ({ ...s, impersonationFab: true })); }; + componentsControls.prefetch = component => { + setState(s => ({ ...s, [`${component}Prefetch`]: true })); + }; + props.onComponentsMounted(); }, []); @@ -452,6 +460,8 @@ const Components = (props: ComponentsProps) => { )} + + {state.organizationSwitcherPrefetch && } ); diff --git a/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx index 234ddb9b2d..e0fdd0be56 100644 --- a/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx @@ -1,4 +1,5 @@ -import { useId } from 'react'; +import type { ReactElement } from 'react'; +import { cloneElement, useId } from 'react'; import { AcceptedInvitationsProvider, useOrganizationSwitcherContext, withCoreUserGuard } from '../../contexts'; import { Flow } from '../../customizables'; @@ -7,8 +8,9 @@ import { usePopover } from '../../hooks'; import { OrganizationSwitcherPopover } from './OrganizationSwitcherPopover'; import { OrganizationSwitcherTrigger } from './OrganizationSwitcherTrigger'; -const _OrganizationSwitcher = withFloatingTree(() => { +const OrganizationSwitcherWithFloatingTree = withFloatingTree<{ children: ReactElement }>(({ children }) => { const { defaultOpen } = useOrganizationSwitcherContext(); + const { floating, reference, styles, toggle, isOpen, nodeId, context } = usePopover({ defaultOpen, placement: 'bottom-start', @@ -17,34 +19,50 @@ const _OrganizationSwitcher = withFloatingTree(() => { const switcherButtonMenuId = useId(); + return ( + <> + + + {cloneElement(children, { + id: switcherButtonMenuId, + close: toggle, + ref: floating, + style: styles, + })} + + + ); +}); + +const _OrganizationSwitcher = () => { + const { __experimental_asStandalone } = useOrganizationSwitcherContext(); + return ( - - - - + {__experimental_asStandalone ? ( + + ) : ( + + + + )} ); -}); +}; export const OrganizationSwitcher = withCoreUserGuard(withCardStateProvider(_OrganizationSwitcher)); diff --git a/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx index 7edecbf80e..1fbb9436e9 100644 --- a/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx @@ -8,7 +8,6 @@ import { useEnvironment, useOrganizationSwitcherContext } from '../../contexts'; import { descriptors, Flex, localizationKeys } from '../../customizables'; import { Actions, - ExtraSmallAction, OrganizationPreview, PersonalWorkspacePreview, PopoverCard, @@ -21,12 +20,16 @@ import { useRouter } from '../../router'; import type { PropsOfComponent, ThemableCssProp } from '../../styledSystem'; import { OrganizationActionList } from './OtherOrganizationActions'; -type OrganizationSwitcherPopoverProps = { close: () => void } & PropsOfComponent; +type OrganizationSwitcherPopoverProps = { + close?: (open: boolean | ((prevState: boolean) => boolean)) => void; +} & PropsOfComponent; export const OrganizationSwitcherPopover = React.forwardRef( (props, ref) => { - const { close, ...rest } = props; + const { close: unsafeClose, ...rest } = props; + const close = () => unsafeClose?.(false); const card = useCardState(); + const { __experimental_asStandalone } = useOrganizationSwitcherContext(); const { openOrganizationProfile, openCreateOrganization } = useClerk(); const { organization: currentOrg } = useOrganization(); const { isLoaded, setActive } = useOrganizationList(); @@ -105,20 +108,6 @@ export const OrganizationSwitcherPopover = React.forwardRef handleItemClick()} - trailing={} - /> - ); - const manageOrganizationButton = ( - {manageOrganizationSmallIconButton} + {manageOrganizationButton} ); @@ -206,6 +195,7 @@ export const OrganizationSwitcherPopover = React.forwardRef diff --git a/packages/clerk-js/src/ui/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx b/packages/clerk-js/src/ui/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx index 60a9fb997b..bac49c52af 100644 --- a/packages/clerk-js/src/ui/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx +++ b/packages/clerk-js/src/ui/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx @@ -1,5 +1,6 @@ import type { MembershipRole } from '@clerk/types'; import { describe } from '@jest/globals'; +import { waitFor } from '@testing-library/react'; import { act, render } from '../../../../testUtils'; import { bindCreateFixtures } from '../../../utils/test/createFixtures'; @@ -119,10 +120,25 @@ describe('OrganizationSwitcher', () => { props.setProps({ hidePersonal: true }); const { getByText, getByRole, userEvent } = render(, { wrapper }); - await userEvent.click(getByRole('button')); + await userEvent.click(getByRole('button', { name: 'Open organization switcher' })); expect(getByText('Create organization')).toBeInTheDocument(); }); + it('renders organization switcher popover as standalone', async () => { + const { wrapper, props } = await createFixtures(f => { + f.withOrganizations(); + f.withUser({ email_addresses: ['test@clerk.com'], create_organization_enabled: true }); + }); + props.setProps({ + __experimental_asStandalone: true, + }); + const { getByText, queryByRole } = render(, { wrapper }); + await waitFor(() => { + expect(queryByRole('button', { name: 'Open organization switcher' })).toBeNull(); + expect(getByText('Personal account')).toBeInTheDocument(); + }); + }); + it('lists all organizations the user belongs to', async () => { const { wrapper, props, fixtures } = await createFixtures(f => { f.withOrganizations(); diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx index 7ac0c7188e..8cec478f8d 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx @@ -1,5 +1,5 @@ import { useClerk } from '@clerk/shared/react'; -import React from 'react'; +import React, { useMemo } from 'react'; import { useCoreSignUp, useEnvironment, useSignUpContext } from '../../contexts'; import { descriptors, Flex, Flow, localizationKeys } from '../../customizables'; @@ -38,12 +38,6 @@ function _SignUpContinue() { getInitialActiveIdentifier(attributes, userSettings.signUp.progressive), ); - // Redirect to sign-up if there is no persisted sign-up - if (!signUp.id) { - void navigate(displayConfig.signUpUrl); - return ; - } - // TODO: This form should be shared between SignUpStart and SignUpContinue const formState = { firstName: useFormControl('firstName', initialValues.firstName || '', { @@ -77,8 +71,25 @@ function _SignUpContinue() { placeholder: localizationKeys('formFieldInputPlaceholder__password'), validatePassword: true, }), + __experimental_legalAccepted: useFormControl('__experimental_legalAccepted', '', { + type: 'checkbox', + label: '', + defaultChecked: false, + isRequired: userSettings.signUp.legal_consent_enabled || false, + }), } as const; + const onlyLegalConsentMissing = useMemo( + () => signUp.missingFields && signUp.missingFields.length === 1 && signUp.missingFields[0] === 'legal_accepted', + [signUp.missingFields], + ); + + // Redirect to sign-up if there is no persisted sign-up + if (!signUp.id) { + void navigate(displayConfig.signUpUrl); + return ; + } + const hasEmail = !!formState.emailAddress.value; const hasVerifiedExternalAccount = signUp.verifications?.externalAccount?.status == 'verified'; const hasVerifiedWeb3 = signUp.verifications?.web3Wallet?.status == 'verified'; @@ -89,6 +100,7 @@ function _SignUpContinue() { activeCommIdentifierType, signUp, isProgressiveSignUp, + legalConsentRequired: userSettings.signUp.legal_consent_enabled, }); minimizeFieldsForExistingSignup(fields, signUp); @@ -131,12 +143,13 @@ function _SignUpContinue() { !phoneNumberProvided && emailOrPhone(attributes, isProgressiveSignUp) ) { - fieldsToSubmit.push(formState['emailAddress']); - fieldsToSubmit.push(formState['phoneNumber']); + fieldsToSubmit.push(formState.emailAddress); + fieldsToSubmit.push(formState.phoneNumber); } card.setLoading(); card.setError(undefined); + return signUp .update(buildRequest(fieldsToSubmit)) .then(res => @@ -156,13 +169,21 @@ function _SignUpContinue() { const showOauthProviders = !hasVerifiedExternalAccount && oauthOptions.length > 0; const showWeb3Providers = !hasVerifiedWeb3 && web3Options.length > 0; + const headerTitle = !onlyLegalConsentMissing + ? localizationKeys('signUp.continue.title') + : localizationKeys('signUp.__experimental_legalConsent.continue.title'); + + const headerSubtitle = !onlyLegalConsentMissing + ? localizationKeys('signUp.continue.subtitle') + : localizationKeys('signUp.__experimental_legalConsent.continue.subtitle'); + return ( - - + + {card.error} - {(showOauthProviders || showWeb3Providers) && ( + {(showOauthProviders || showWeb3Providers) && !onlyLegalConsentMissing && ( diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx index 25de5e805c..e23778e184 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Col, localizationKeys, useAppearance } from '../../customizables'; -import { Form } from '../../elements'; +import { Form, LegalCheckbox } from '../../elements'; import { CaptchaElement } from '../../elements/CaptchaElement'; import { mqu } from '../../styledSystem'; import type { FormControlState } from '../../utils'; @@ -13,10 +13,18 @@ type SignUpFormProps = { formState: Record, FormControlState>; canToggleEmailPhone: boolean; handleEmailPhoneToggle: (type: ActiveIdentifier) => void; + onlyLegalAcceptedMissing?: boolean; }; export const SignUpForm = (props: SignUpFormProps) => { - const { handleSubmit, fields, formState, canToggleEmailPhone, handleEmailPhoneToggle } = props; + const { + handleSubmit, + fields, + formState, + canToggleEmailPhone, + onlyLegalAcceptedMissing = false, + handleEmailPhoneToggle, + } = props; const { showOptionalFields } = useAppearance().parsedLayout; const shouldShow = (name: keyof typeof fields) => { @@ -34,80 +42,97 @@ export const SignUpForm = (props: SignUpFormProps) => { onSubmit={handleSubmit} gap={8} > - - {(shouldShow('firstName') || shouldShow('lastName')) && ( - - {shouldShow('firstName') && ( + {!onlyLegalAcceptedMissing && ( + + {(shouldShow('firstName') || shouldShow('lastName')) && ( + + {shouldShow('firstName') && ( + + )} + {shouldShow('lastName') && ( + + )} + + )} + {shouldShow('username') && ( + - )} - {shouldShow('lastName') && ( + + )} + {shouldShow('emailAddress') && ( + handleEmailPhoneToggle('phoneNumber') : undefined} /> - )} - - )} - {shouldShow('username') && ( - - - - )} - {shouldShow('emailAddress') && ( - - handleEmailPhoneToggle('phoneNumber') : undefined} - /> - - )} - {shouldShow('phoneNumber') && ( - - handleEmailPhoneToggle('emailAddress') : undefined} - /> - - )} - {shouldShow('password') && ( - - - - )} - + + )} + {shouldShow('phoneNumber') && ( + + handleEmailPhoneToggle('emailAddress') : undefined} + /> + + )} + {shouldShow('password') && ( + + + + )} + + )} - + + {shouldShow('__experimental_legalAccepted') && ( + + + + )} + + ); diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpRestrictedAccess.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpRestrictedAccess.tsx index 44d86185ac..2a931b5ce1 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpRestrictedAccess.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpRestrictedAccess.tsx @@ -1,14 +1,21 @@ import { useClerk } from '@clerk/shared/react'; import { useSignUpContext } from '../../contexts'; -import { Icon, localizationKeys } from '../../customizables'; +import { Button, Flex, Icon, localizationKeys } from '../../customizables'; import { Card, Header } from '../../elements'; import { useCardState } from '../../elements/contexts'; +import { useSupportEmail } from '../../hooks/useSupportEmail'; import { Block } from '../../icons'; + export const SignUpRestrictedAccess = () => { const clerk = useClerk(); const card = useCardState(); const { signInUrl } = useSignUpContext(); + const supportEmail = useSupportEmail(); + + const handleEmailSupport = () => { + window.location.href = `mailto:${supportEmail}`; + }; return ( @@ -18,22 +25,36 @@ export const SignUpRestrictedAccess = () => { icon={Block} sx={t => ({ margin: 'auto', - width: t.sizes.$12, - height: t.sizes.$12, + width: t.sizes.$10, + height: t.sizes.$10, })} /> {card.error} + {supportEmail && ( + +
); diff --git a/packages/elements/package.json b/packages/elements/package.json index af98919a73..1bd8b3deb4 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.15.9", + "version": "0.17.1", "description": "Clerk Elements", "keywords": [ "clerk", @@ -71,7 +71,8 @@ "test:cache:clear": "jest --clearCache --useStderr" }, "dependencies": { - "@clerk/types": "^4.25.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "^4.28.0", "@radix-ui/react-form": "^0.1.0", "@radix-ui/react-slot": "^1.1.0", "@xstate/react": "^4.1.1", @@ -79,9 +80,8 @@ "xstate": "^5.15.0" }, "devDependencies": { - "@clerk/clerk-react": "5.11.0", + "@clerk/clerk-react": "5.13.1", "@clerk/eslint-config-custom": "*", - "@clerk/shared": "2.9.0", "@statelyai/inspect": "^0.4.0", "@types/node": "^18.19.33", "@types/react": "*", @@ -94,7 +94,6 @@ "typescript": "*" }, "peerDependencies": { - "@clerk/shared": "^2.0.0", "react": "^18.0.0 || ^19.0.0-beta", "react-dom": "^18.0.0 || ^19.0.0-beta" }, diff --git a/packages/elements/src/internals/constants/index.ts b/packages/elements/src/internals/constants/index.ts index 1ca489d3c2..9ec7e3cc2d 100644 --- a/packages/elements/src/internals/constants/index.ts +++ b/packages/elements/src/internals/constants/index.ts @@ -1,9 +1,16 @@ +import type { SignUpModes } from '@clerk/types'; + import { safeAccess } from '~/utils/safe-access'; export const SSO_CALLBACK_PATH_ROUTE = '/sso-callback'; export const CHOOSE_SESSION_PATH_ROUTE = '/choose'; export const MAGIC_LINK_VERIFY_PATH_ROUTE = '/verify'; +export const SIGN_UP_MODES: Record = { + PUBLIC: 'public', + RESTRICTED: 'restricted', +}; + // TODO: remove reliance on next-specific variables here export const SIGN_IN_DEFAULT_BASE_PATH = safeAccess( () => process.env.CLERK_SIGN_IN_URL ?? process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL, @@ -51,6 +58,7 @@ export const ERROR_CODES = { export const ROUTING = { path: 'path', virtual: 'virtual', + hash: 'hash', } as const; export type ROUTING = (typeof ROUTING)[keyof typeof ROUTING]; diff --git a/packages/elements/src/internals/machines/form/form.machine.ts b/packages/elements/src/internals/machines/form/form.machine.ts index 25da38daae..28393b59f1 100644 --- a/packages/elements/src/internals/machines/form/form.machine.ts +++ b/packages/elements/src/internals/machines/form/form.machine.ts @@ -169,7 +169,7 @@ export const FormMachine = setup({ if (field) { field.checked = event.field.checked; - field.disabled = event.field.disabled || false; + field.disabled = event.field.disabled ?? field.disabled; field.value = event.field.value; context.fields.set(event.field.name, field); diff --git a/packages/elements/src/internals/machines/shared/shared.actions.ts b/packages/elements/src/internals/machines/shared/shared.actions.ts index 18ce93aa28..33fd00af02 100644 --- a/packages/elements/src/internals/machines/shared/shared.actions.ts +++ b/packages/elements/src/internals/machines/shared/shared.actions.ts @@ -12,7 +12,7 @@ import type { SignUpContinueContext, SignUpContinueEvents, SignUpStartContext, - SignUpStartRedirectEvent, + SignUpStartEvents, SignUpVerificationContext, SignUpVerificationEvents, } from '~/internals/machines/sign-up'; @@ -33,7 +33,7 @@ type SendToLoadingProps = { | SignInVerificationEvents | SignInResetPasswordEvents | ThirdPartyMachineEvent - | SignUpStartRedirectEvent + | SignUpStartEvents | SignUpContinueEvents | SignUpVerificationEvents; }; diff --git a/packages/elements/src/internals/machines/shared/shared.types.ts b/packages/elements/src/internals/machines/shared/shared.types.ts index 22eac7d24e..6add45dfe4 100644 --- a/packages/elements/src/internals/machines/shared/shared.types.ts +++ b/packages/elements/src/internals/machines/shared/shared.types.ts @@ -6,6 +6,9 @@ import type { SignInStrategy, } from '@clerk/types'; import type { SetRequired, Simplify } from 'type-fest'; +import type { ActorRefFrom } from 'xstate'; + +import type { FormMachine } from '../form'; export type WithClerk> = { clerk: LoadedClerk } & T; export type WithClient> = { client: LoadedClerk['client'] } & T; @@ -33,3 +36,5 @@ export type AuthenticateWithRedirectSamlParams = Simplify< // ================= Strategies ================= // export type SignInStrategyName = SignInStrategy | 'oauth' | 'web3'; + +export type SetFormEvent = { type: 'SET_FORM'; formRef: ActorRefFrom }; diff --git a/packages/elements/src/internals/machines/sign-in/verification.machine.ts b/packages/elements/src/internals/machines/sign-in/verification.machine.ts index 0ae248f3c3..eeedd8c2de 100644 --- a/packages/elements/src/internals/machines/sign-in/verification.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/verification.machine.ts @@ -14,7 +14,7 @@ import type { Web3Attempt, } from '@clerk/types'; import type { DoneActorEvent } from 'xstate'; -import { assign, fromPromise, log, not, sendTo, setup } from 'xstate'; +import { assign, fromPromise, log, sendTo, setup } from 'xstate'; import { MAGIC_LINK_VERIFY_PATH_ROUTE, @@ -270,7 +270,6 @@ const SignInVerificationMachine = setup({ description: 'Waiting for user input', on: { 'AUTHENTICATE.PASSKEY': { - guard: not('isExampleMode'), target: 'AttemptingPasskey', reenter: true, }, @@ -411,7 +410,7 @@ export const SignInFirstFactorMachine = SignInVerificationMachine.provide({ // prepareFirstFactor, we need to assert that the input is a PrepareFirstFactor. For some reason, ESLint thinks // the assertion is unnecessary, and will remove it during the pre-commit hook. To prevent that, we disable the // rule for the line. - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const { params, parent, resendable } = input as PrepareFirstFactorInput; const clerk = parent.getSnapshot().context.clerk; diff --git a/packages/elements/src/internals/machines/sign-up/router.machine.ts b/packages/elements/src/internals/machines/sign-up/router.machine.ts index 5019bd03dc..9f18b4c7dc 100644 --- a/packages/elements/src/internals/machines/sign-up/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/router.machine.ts @@ -9,6 +9,7 @@ import { SEARCH_PARAMS, SIGN_IN_DEFAULT_BASE_PATH, SIGN_UP_DEFAULT_BASE_PATH, + SIGN_UP_MODES, SSO_CALLBACK_PATH_ROUTE, } from '~/internals/constants'; import { ClerkElementsError, ClerkElementsRuntimeError } from '~/internals/errors'; @@ -156,6 +157,9 @@ export const SignUpRouterMachine = setup({ isLoggedIn: or(['isStatusComplete', ({ context }) => Boolean(context.clerk.user)]), isSingleSessionMode: ({ context }) => Boolean(context.clerk?.__unstable__environment?.authConfig.singleSessionMode), + isRestricted: ({ context }) => + context.clerk?.__unstable__environment?.userSettings.signUp.mode === SIGN_UP_MODES.RESTRICTED, + isRestrictedWithoutTicket: and(['isRestricted', not('hasTicket')]), isExampleMode: ({ context }) => Boolean(context.exampleMode), isMissingRequiredFields: and(['isStatusMissingRequirements', 'areFieldsMissing']), isMissingRequiredUnverifiedFields: and(['isStatusMissingRequirements', 'areFieldsUnverified']), @@ -311,6 +315,10 @@ export const SignUpRouterMachine = setup({ actions: { type: 'navigateInternal', params: { force: true, path: '/continue' } }, target: 'Continue', }, + { + guard: 'isRestrictedWithoutTicket', + target: 'Restricted', + }, { actions: { type: 'navigateInternal', params: { force: true, path: '/' } }, target: 'Start', @@ -335,8 +343,10 @@ export const SignUpRouterMachine = setup({ }, on: { 'RESET.STEP': { - target: 'Start', - reenter: true, + actions: enqueueActions(({ enqueue, context }) => { + enqueue('clearFormErrors'); + enqueue.sendTo('start', { type: 'SET_FORM', formRef: context.formRef }); + }), }, NEXT: [ { @@ -347,6 +357,7 @@ export const SignUpRouterMachine = setup({ guard: and(['hasTicket', 'statusNeedsContinue']), actions: { type: 'navigateInternal', params: { path: '/' } }, target: 'Start', + reenter: true, }, { guard: 'statusNeedsVerification', @@ -478,6 +489,12 @@ export const SignUpRouterMachine = setup({ ], }, }, + Restricted: { + tags: ['step:restricted'], + on: { + NEXT: 'Start', + }, + }, Error: { tags: ['step:error'], on: { diff --git a/packages/elements/src/internals/machines/sign-up/router.types.ts b/packages/elements/src/internals/machines/sign-up/router.types.ts index 599ba90958..77fa4648dd 100644 --- a/packages/elements/src/internals/machines/sign-up/router.types.ts +++ b/packages/elements/src/internals/machines/sign-up/router.types.ts @@ -26,6 +26,7 @@ export const SignUpRouterSteps = { verification: 'step:verification', callback: 'step:callback', error: 'step:error', + restricted: 'step:restricted', } as const; export type SignUpRouterSteps = keyof typeof SignUpRouterSteps; diff --git a/packages/elements/src/internals/machines/sign-up/start.machine.ts b/packages/elements/src/internals/machines/sign-up/start.machine.ts index 3bec675f0e..6e31223798 100644 --- a/packages/elements/src/internals/machines/sign-up/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/start.machine.ts @@ -1,9 +1,11 @@ import type { SignUpResource, Web3Strategy } from '@clerk/types'; -import { assertEvent, enqueueActions, fromPromise, not, sendTo, setup } from 'xstate'; +import type { DoneActorEvent } from 'xstate'; +import { and, assertEvent, assign, enqueueActions, fromPromise, not, sendTo, setup } from 'xstate'; import { SIGN_UP_DEFAULT_BASE_PATH } from '~/internals/constants'; import { ClerkElementsRuntimeError } from '~/internals/errors'; import type { FormFields } from '~/internals/machines/form'; +import type { SetFormEvent } from '~/internals/machines/shared'; import { sendToLoading } from '~/internals/machines/shared'; import { fieldsToSignUpParams } from '~/internals/machines/sign-up/utils'; import { ThirdPartyMachine } from '~/internals/machines/third-party'; @@ -48,8 +50,14 @@ export const SignUpStartMachine = setup({ thirdParty: ThirdPartyMachine, }, actions: { - sendToNext: ({ context }) => context.parent.send({ type: 'NEXT' }), + sendToNext: ({ context, event }) => + context.parent.send({ type: 'NEXT', resource: (event as unknown as DoneActorEvent).output }), sendToLoading, + setFormRef: assign(({ event }) => { + return { + formRef: (event as unknown as SetFormEvent).formRef, + }; + }), setFormDisabledTicketFields: enqueueActions(({ context, enqueue }) => { if (!context.ticket) { return; @@ -90,6 +98,8 @@ export const SignUpStartMachine = setup({ }, }, guards: { + isMissingRequirements: ({ context }) => + context.parent.getSnapshot().context.clerk?.client?.signUp?.status === 'missing_requirements', hasTicket: ({ context }) => Boolean(context.ticket), isExampleMode: ({ context }) => Boolean(context.parent.getSnapshot().context.exampleMode), }, @@ -105,11 +115,20 @@ export const SignUpStartMachine = setup({ }), entry: 'setDefaultFormValues', initial: 'Init', + on: { + SET_FORM: { + actions: 'setFormRef', + }, + }, states: { Init: { description: 'Handle ticket, if present; Else, default to Pending state. Per tickets, `Attempting` makes a `signUp.create` request allowing for an incomplete sign up to contain progressively filled fields on the Start step.', always: [ + { + guard: and(['hasTicket', 'isMissingRequirements']), + target: 'Pending', + }, { guard: 'hasTicket', target: 'Attempting', diff --git a/packages/elements/src/internals/machines/sign-up/start.types.ts b/packages/elements/src/internals/machines/sign-up/start.types.ts index 0cf78efdc6..435db4cd3d 100644 --- a/packages/elements/src/internals/machines/sign-up/start.types.ts +++ b/packages/elements/src/internals/machines/sign-up/start.types.ts @@ -4,6 +4,7 @@ import type { ActorRefFrom, ErrorActorEvent } from 'xstate'; import type { FormMachine } from '~/internals/machines/form'; +import type { SetFormEvent } from '../shared'; import type { SignInRouterMachineActorRef } from './router.types'; // ---------------------------------- Tags ---------------------------------- // @@ -24,7 +25,7 @@ export type SignUpStartRedirectEvent = | SignUpStartRedirectSamlEvent | SignUpStartRedirectWeb3Event; -export type SignUpStartEvents = ErrorActorEvent | SignUpStartSubmitEvent | SignUpStartRedirectEvent; +export type SignUpStartEvents = ErrorActorEvent | SignUpStartSubmitEvent | SignUpStartRedirectEvent | SetFormEvent; // ---------------------------------- Input ---------------------------------- // diff --git a/packages/elements/src/internals/machines/third-party/third-party.actors.ts b/packages/elements/src/internals/machines/third-party/third-party.actors.ts index 519e2153f0..050dca6ed2 100644 --- a/packages/elements/src/internals/machines/third-party/third-party.actors.ts +++ b/packages/elements/src/internals/machines/third-party/third-party.actors.ts @@ -74,7 +74,7 @@ export const handleRedirectCallback = fromCallback + ) : null; +} diff --git a/packages/elements/src/react/sign-up/step.tsx b/packages/elements/src/react/sign-up/step.tsx index d17e72c567..3d67ac563d 100644 --- a/packages/elements/src/react/sign-up/step.tsx +++ b/packages/elements/src/react/sign-up/step.tsx @@ -5,6 +5,8 @@ import { ClerkElementsRuntimeError } from '~/internals/errors'; import type { SignUpContinueProps } from './continue'; import { SignUpContinue } from './continue'; +import type { SignUpRestrictedProps } from './restricted'; +import { SignUpRestricted } from './restricted'; import type { SignUpStartProps } from './start'; import { SignUpStart } from './start'; import type { SignUpVerificationsProps } from './verifications'; @@ -14,6 +16,7 @@ export const SIGN_UP_STEPS = { start: 'start', continue: 'continue', verifications: 'verifications', + restricted: 'restricted', } as const; export type TSignUpStep = (typeof SIGN_UP_STEPS)[keyof typeof SIGN_UP_STEPS]; @@ -22,7 +25,8 @@ type StepWithProps = { name: N } & T; export type SignUpStepProps = | StepWithProps<'start', SignUpStartProps> | StepWithProps<'continue', SignUpContinueProps> - | StepWithProps<'verifications', SignUpVerificationsProps>; + | StepWithProps<'verifications', SignUpVerificationsProps> + | StepWithProps<'restricted', SignUpRestrictedProps>; /** * Render different steps of the sign-up flow. Initially the `'start'` step is rendered. Optionally, you can render additional fields in the `'continue'` step. Once a sign-up attempt has been created, `'verifications'` will be displayed. @@ -50,7 +54,11 @@ export function SignUpStep(props: SignUpStepProps) { return ; case SIGN_UP_STEPS.verifications: return ; + case SIGN_UP_STEPS.restricted: + return ; default: - throw new ClerkElementsRuntimeError(`Invalid step name. Use 'start', 'continue', or 'verifications'.`); + throw new ClerkElementsRuntimeError( + `Invalid step name. Use 'start', 'continue', 'verifications', or 'restricted'.`, + ); } } diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index dae73a1e6d..3acfd52908 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,73 @@ # Change Log +## 2.2.29 + +### Patch Changes + +- Updated dependencies [[`7a632905c`](https://github.com/clerk/javascript/commit/7a632905c351b7795e5cf77e59b8b89f2c60d5c7), [`83c0e7f28`](https://github.com/clerk/javascript/commit/83c0e7f28dc187eac84f4909b47768f6eec472bf), [`d82886c70`](https://github.com/clerk/javascript/commit/d82886c70ae4a851422da845f1f06f93af9b60a9)]: + - @clerk/clerk-js@5.29.1 + +## 2.2.28 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/clerk-js@5.29.0 + - @clerk/types@4.28.0 + - @clerk/clerk-react@5.13.1 + - @clerk/shared@2.10.1 + +## 2.2.27 + +### Patch Changes + +- Updated dependencies [[`1be6dac56`](https://github.com/clerk/javascript/commit/1be6dac56ecfd771d0683d16cab8e9d023695419), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`a0204a8e8`](https://github.com/clerk/javascript/commit/a0204a8e8742b63aea92d67e7d66fe0bc86a166f), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/clerk-js@5.28.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + - @clerk/clerk-react@5.13.0 + +## 2.2.26 + +### Patch Changes + +- Updated dependencies [[`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`48421febe`](https://github.com/clerk/javascript/commit/48421febe5feb85d8cf0706c3b150d3e8c545635), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/clerk-react@5.12.0 + - @clerk/clerk-js@5.27.0 + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + +## 2.2.25 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`02f54868d`](https://github.com/clerk/javascript/commit/02f54868d1176d973459498adcc84c5aee521ea5), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/clerk-js@5.26.5 + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/clerk-react@5.11.1 + +## 2.2.24 + +### Patch Changes + +- Updated dependencies [[`6ef3ec6b5`](https://github.com/clerk/javascript/commit/6ef3ec6b56ddb1c9c51e9a6c9648de0b0f8c1777)]: + - @clerk/clerk-js@5.26.4 + +## 2.2.23 + +### Patch Changes + +- Updated dependencies [[`e50ce1b10`](https://github.com/clerk/javascript/commit/e50ce1b101fc2c6805415b00193b108ab045d820)]: + - @clerk/clerk-js@5.26.3 + +## 2.2.22 + +### Patch Changes + +- Updated dependencies [[`a46c44eeb`](https://github.com/clerk/javascript/commit/a46c44eeb50b5cbac85d461384948cd77df7cf12), [`7719d1bcd`](https://github.com/clerk/javascript/commit/7719d1bcd8c7e38cb644fffbb85edc1fa0038288)]: + - @clerk/clerk-js@5.26.2 + ## 2.2.21 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 3cf53e5b9b..be86fec94f 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.2.21", + "version": "2.2.29", "description": "Clerk React Native/Expo library", "keywords": [ "react", @@ -55,10 +55,10 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/clerk-js": "5.26.1", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/clerk-js": "5.29.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "base-64": "^1.0.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" @@ -81,15 +81,15 @@ "expo-local-authentication": ">=13.5.0", "expo-secure-store": ">=12.4.0", "expo-web-browser": ">=12.5.0", - "react-native": ">=0.73", "react": ">=18", - "react-dom": ">=18" + "react-dom": ">=18", + "react-native": ">=0.73" }, "peerDependenciesMeta": { - "expo-secure-store": { + "expo-local-authentication": { "optional": true }, - "expo-local-authentication": { + "expo-secure-store": { "optional": true } }, diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 6cbc033e74..e034f396d7 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,65 @@ # Change Log +## 1.3.3 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/shared@2.10.1 + +## 1.3.2 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 1.3.1 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 1.3.0 + +### Minor Changes + +- Export [`authenticateRequest` method](https://clerk.com/docs/references/backend/authenticate-request) from `@clerk/express` (in case you want to go low-level and implement flows to your specific needs). You can use it like so: ([#4340](https://github.com/clerk/javascript/pull/4340)) by [@jescalan](https://github.com/jescalan) + + ```ts + import { authenticateRequest } from "@clerk/express"; + ``` + + This function is adapted to Express' Request wrapper and as such notably different to the exported function from `@clerk/backend`. If you need to use it, be sure to import from `@clerk/express`. + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 1.2.3 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + +## 1.2.2 + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 1.2.1 ### Patch Changes diff --git a/packages/express/env.d.ts b/packages/express/env.d.ts new file mode 100644 index 0000000000..f983f87926 --- /dev/null +++ b/packages/express/env.d.ts @@ -0,0 +1,9 @@ +import type { AuthObject } from '@clerk/backend'; + +declare global { + namespace Express { + interface Request { + auth: AuthObject; + } + } +} diff --git a/packages/express/package.json b/packages/express/package.json index 3b76f1d085..b7dfedfb6d 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.2.1", + "version": "1.3.3", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", @@ -33,11 +33,13 @@ "default": "./dist/index.js" } }, + "./env": "./env.d.ts", "./package.json": "./package.json" }, "main": "./dist/index.js", "files": [ - "dist" + "dist", + "env.d.ts" ], "scripts": { "build": "npm run clean && tsup", @@ -53,9 +55,9 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "^1.13.8", - "@clerk/shared": "^2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "^1.15.1", + "@clerk/shared": "^2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/express/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/express/src/__tests__/__snapshots__/exports.test.ts.snap index 406f539783..a25599d3af 100644 --- a/packages/express/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/express/src/__tests__/__snapshots__/exports.test.ts.snap @@ -2,6 +2,7 @@ exports[`module exports should not change unless explicitly set 1`] = ` [ + "authenticateRequest", "clerkClient", "clerkMiddleware", "createClerkClient", diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts index 197bf2cd96..b64dc029cf 100644 --- a/packages/express/src/index.ts +++ b/packages/express/src/index.ts @@ -6,3 +6,4 @@ export type { ExpressRequestWithAuth } from './types'; export { clerkMiddleware } from './clerkMiddleware'; export { getAuth } from './getAuth'; export { requireAuth } from './requireAuth'; +export { authenticateRequest } from './authenticateRequest'; diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 24085e32fe..44fde3c9cb 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,63 @@ # Change Log +## 2.0.5 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/shared@2.10.1 + +## 2.0.4 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 2.0.3 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 2.0.2 + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 2.0.1 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + +## 2.0.0 + +### Major Changes + +- Recently Fastify released its v5 and along with it came some breaking changes. Read their [migration guide](https://fastify.dev/docs/latest/Guides/Migration-Guide-V5/) to learn more. ([#4270](https://github.com/clerk/javascript/pull/4270)) by [@LekoArts](https://github.com/LekoArts) + + In order to support Fastify v5 a new major version of `@clerk/fastify` is required as Fastify's Node.js requirement is now `>=20`. Previously `@clerk/fastify` allowed `>=18.17.0`. + + `@clerk/fastify@2.0.0` only supports Fastify v5 or later, if you want/need to continue using Fastify v4, please stick with your current version. The `@clerk/fastify@2.0.0` upgrade itself doesn't have any required code changes as only internal dependencies and requirements were updated. + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 1.0.51 ### Patch Changes diff --git a/packages/fastify/README.md b/packages/fastify/README.md index 7d00d42d09..0be40bc6a8 100644 --- a/packages/fastify/README.md +++ b/packages/fastify/README.md @@ -31,8 +31,8 @@ ### Prerequisites -- Fastify `^4.0.0` or later -- Node.js `>=18.17.0` or later +- Fastify `^5.0.0` or later +- Node.js `>=20.0.0` or later - An existing Clerk application. [Create your account for free](https://dashboard.clerk.com/sign-up?utm_source=github&utm_medium=clerk_fastify). ### Installation diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 1b6e4ce282..dd19a0c84c 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "1.0.51", + "version": "2.0.5", "description": "Clerk SDK for Fastify", "keywords": [ "auth", @@ -40,23 +40,24 @@ "test:cache:clear": "jest --clearCache --useStderr" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookies": "0.8.0" + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookies": "0.8.0", + "fastify-plugin": "^5.0.1" }, "devDependencies": { "@clerk/eslint-config-custom": "*", - "@types/node": "^18.19.33", + "@types/node": "^20.14.8", + "fastify": "^5.0.0", "tsup": "*", "typescript": "*" }, "peerDependencies": { - "fastify": ">=4", - "fastify-plugin": "^4.5.0" + "fastify": ">=5" }, "engines": { - "node": ">=18.17.0" + "node": ">=20" }, "publishConfig": { "access": "public" diff --git a/packages/fastify/src/clerkPlugin.ts b/packages/fastify/src/clerkPlugin.ts index b6c3debc4b..477894881a 100644 --- a/packages/fastify/src/clerkPlugin.ts +++ b/packages/fastify/src/clerkPlugin.ts @@ -17,7 +17,6 @@ const plugin: FastifyPluginCallback = ( throw new Error(`Unsupported hookName: ${hookName}`); } - // @ts-expect-error unions don't play well with TS overload signatures instance.addHook(hookName, withClerkMiddleware(opts)); done(); @@ -25,5 +24,5 @@ const plugin: FastifyPluginCallback = ( export const clerkPlugin = fp(plugin, { name: '@clerk/fastify', - fastify: '4.x', + fastify: '5.x', }); diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 3b9bfe74a6..217fe1b2b2 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,53 @@ # Change Log +## 3.4.0 + +### Minor Changes + +- Adding experimental support for legal consent for `` component ([#4337](https://github.com/clerk/javascript/pull/4337)) by [@octoper](https://github.com/octoper) + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + +## 3.3.1 + +### Patch Changes + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/types@4.27.0 + +## 3.3.0 + +### Minor Changes + +- The "Restricted access" screen has been improved for visual consistency and the ability to contact support. The displayed texts have been made more clear and the sign-in button has been moved to the bottom. ([#4335](https://github.com/clerk/javascript/pull/4335)) by [@nikospapcom](https://github.com/nikospapcom) + +### Patch Changes + +- Remove typos from pl-PL ([#4319](https://github.com/clerk/javascript/pull/4319)) by [@pmichalski98](https://github.com/pmichalski98) + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + +## 3.2.1 + +### Patch Changes + +- Updated dependencies [[`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/types@4.25.1 + +## 3.2.0 + +### Minor Changes + +- Add be-BY translation ([#4280](https://github.com/clerk/javascript/pull/4280)) by [@NikitaRadzkov](https://github.com/NikitaRadzkov) + +### Patch Changes + +- Update `de-DE` translation to be GDPR-compliant ([#4195](https://github.com/clerk/javascript/pull/4195)) by [@serbanradulescu](https://github.com/serbanradulescu) + ## 3.1.2 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 2a52a7593b..9272092b33 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.1.2", + "version": "3.4.0", "description": "Localizations for the Clerk components", "keywords": [ "react", @@ -100,7 +100,7 @@ "lint": "eslint src/" }, "dependencies": { - "@clerk/types": "4.25.0" + "@clerk/types": "4.28.0" }, "devDependencies": { "@clerk/eslint-config-custom": "*", diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index b6f2342684..be3a0961b0 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -509,9 +509,23 @@ export const enUS: LocalizationResource = { title: 'Create your account', }, restrictedAccess: { - title: 'Restricted access', - subtitle: 'Access to this app is limited, and an invitation is required to sign up.', - actionLink: 'Back to sign in', + title: 'Access restricted', + subtitle: 'Sign ups are currently disabled. If you believe you should have access, please contact support.', + actionLink: 'Sign in', + actionText: 'Already have an account?', + blockButton__emailSupport: 'Email support', + }, + __experimental_legalConsent: { + continue: { + subtitle: 'Please read and accept the terms to continue', + title: 'Legal consent', + }, + checkbox: { + label__termsOfServiceAndPrivacyPolicy: + 'I agree to the {{ termsOfServiceLink || link("Terms of Service") }} and {{ privacyPolicyLink || link("Privacy Policy") }}', + label__onlyTermsOfService: 'I agree to the {{ termsOfServiceLink || link("Terms of Service") }}', + label__onlyPrivacyPolicy: 'I agree to the {{ privacyPolicyLink || link("Privacy Policy") }}', + }, }, }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 9af4c694c0..fa3c0b5d41 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -16,57 +16,58 @@ export const plPL: LocalizationResource = { locale: 'pl-PL', __experimental_userVerification: { alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, + actionLink: 'Uzyskaj pomoc', + actionText: 'Nie uΕΌywasz ΕΌadnej z tych metod?', + blockButton__backupCode: 'UΕΌyj kodu zapasowego', + blockButton__emailCode: 'WyΕ›lij kod e-mailem do {{identifier}}', + blockButton__password: 'Zaloguj siΔ™ za pomocΔ… hasΕ‚a', + blockButton__phoneCode: 'WyΕ›lij kod SMS-em do {{identifier}}', + blockButton__totp: 'UΕΌyj aplikacji uwierzytelniajΔ…cej', getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, + blockButton__emailSupport: 'Skontaktuj siΔ™ z pomocΔ…', + content: + 'JeΕ›li masz problem z weryfikacjΔ… konta, wyΕ›lij do nas e-mail, a postaramy siΔ™ jak najszybciej przywrΓ³ciΔ‡ dostΔ™p.', + title: 'Uzyskaj wsparcie', }, - subtitle: undefined, - title: undefined, + subtitle: 'Masz problem? MoΕΌesz uΕΌyΔ‡ dowolnej z tych metod weryfikacji.', + title: 'UΕΌyj innej metody', }, backupCodeMfa: { - subtitle: undefined, - title: undefined, + subtitle: 'TwΓ³j kod zapasowy to ten, ktΓ³ry otrzymaΕ‚eΕ› podczas konfigurowania uwierzytelniania dwuetapowego.', + title: 'WprowadΕΊ kod zapasowy', }, emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymaΕ‚eΕ› kodu? WyΕ›lij ponownie', + subtitle: 'aby kontynuowaΔ‡ w {{applicationName}}', + title: 'SprawdΕΊ swojΔ… pocztΔ™ e-mail', }, noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, + message: 'Nie moΕΌna kontynuowaΔ‡ weryfikacji. Brak dostΔ™pnych czynnikΓ³w uwierzytelniania.', + subtitle: 'WystΔ…piΕ‚ bΕ‚Δ…d', + title: 'Nie moΕΌemy zweryfikowaΔ‡ twojego konta', }, password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, + actionLink: 'UΕΌyj innej metody', + subtitle: 'WprowadΕΊ hasΕ‚o powiΔ…zane z twoim kontem', + title: 'WprowadΕΊ swoje hasΕ‚o', }, phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymaΕ‚eΕ› kodu? WyΕ›lij ponownie', + subtitle: 'aby kontynuowaΔ‡ w {{applicationName}}', + title: 'SprawdΕΊ swΓ³j telefon', }, phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymaΕ‚eΕ› kodu? WyΕ›lij ponownie', + subtitle: 'Aby kontynuowaΔ‡, wprowadΕΊ kod weryfikacyjny wysΕ‚any na twΓ³j telefon', + title: 'SprawdΕΊ swΓ³j telefon', }, totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, + formTitle: 'Kod weryfikacyjny', + subtitle: 'Aby kontynuowaΔ‡, wprowadΕΊ kod weryfikacyjny wygenerowany przez swojΔ… aplikacjΔ™ uwierzytelniajΔ…cΔ…', + title: 'Weryfikacja dwuetapowa', }, }, backButton: 'PowrΓ³t', @@ -103,9 +104,9 @@ export const plPL: LocalizationResource = { formFieldAction__forgotPassword: 'ZapomniaΕ‚em/am hasΕ‚a', formFieldError__matchingPasswords: 'HasΕ‚a siΔ™ zgadzajΔ….', formFieldError__notMatchingPasswords: 'HasΕ‚a siΔ™ nie zgadzajΔ….', - formFieldError__verificationLinkExpired: 'The verification link expired. Please request a new link.', + formFieldError__verificationLinkExpired: 'Link weryfikacyjny wygasΕ‚. SprΓ³buj ponownie.', formFieldHintText__optional: 'Opcjonalne', - formFieldHintText__slug: 'A slug is a human-readable ID that must be unique. It’s often used in URLs.', + formFieldHintText__slug: 'Jest to unikalne ID, ktΓ³re jest czytelne dla czΕ‚owieka, czΔ™sto uΕΌywane w adresach URL.', formFieldInputPlaceholder__backupCode: undefined, formFieldInputPlaceholder__confirmDeletionUserAccount: 'UsuΕ„ konto', formFieldInputPlaceholder__emailAddress: undefined, @@ -123,7 +124,7 @@ export const plPL: LocalizationResource = { formFieldInputPlaceholder__username: undefined, formFieldLabel__automaticInvitations: 'WΕ‚Δ…cz automatyczne zaproszenia dla tej domeny', formFieldLabel__backupCode: 'Kod zapasowy', - formFieldLabel__confirmDeletion: 'Confirmation', + formFieldLabel__confirmDeletion: 'Potwierdzenie', formFieldLabel__confirmPassword: 'PotwierdΕΊ hasΕ‚o', formFieldLabel__currentPassword: 'Obecne hasΕ‚o', formFieldLabel__emailAddress: 'Adres e-mail', @@ -334,7 +335,7 @@ export const plPL: LocalizationResource = { }, alternativeMethods: { actionLink: 'Uzyskaj pomoc', - actionText: 'Don’t have any of these?', + actionText: 'Nie uΕΌywasz ΕΌadnej z tych metod?', blockButton__backupCode: 'UΕΌyj kodu zapasowego', blockButton__emailCode: 'WyΕ›lij kod do {{identifier}}', blockButton__emailLink: 'WyΕ›lij link do {{identifier}}', @@ -348,7 +349,7 @@ export const plPL: LocalizationResource = { 'JeΕ›li masz problem z zalogowaniem siΔ™ do swojego konta, wyΕ›lij do nas e-mail, a postaramy siΔ™ jak najszybciej przywrΓ³ciΔ‡ dostΔ™p.', title: 'Uzyskaj pomoc', }, - subtitle: 'Facing issues? You can use any of these methods to sign in.', + subtitle: 'Masz problem? MoΕΌesz uΕΌyΔ‡ dowolnej z tych metod weryfikacji.', title: 'UΕΌyj innego sposobu', }, backupCodeMfa: { @@ -397,16 +398,16 @@ export const plPL: LocalizationResource = { }, }, forgotPassword: { - formTitle: 'Reset password code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'to reset your password', - subtitle_email: 'First, enter the code sent to your email ID', - subtitle_phone: 'First, enter the code sent to your phone', + formTitle: 'Kod werfikacyjny resetowania hasΕ‚a', + resendButton: 'Nie otrzymaΕ‚eΕ› kodu? WyΕ›lij ponownie', + subtitle: 'aby zresetowaΔ‡ hasΕ‚o', + subtitle_email: 'Najpierw wprowadΕΊ kod wysΕ‚any na TwΓ³j adres e-mail', + subtitle_phone: 'Najpierw wprowadΕΊ kod wysΕ‚any na TwΓ³j numer telefonu', title: 'ZmieΕ„ hasΕ‚o', }, forgotPasswordAlternativeMethods: { - blockButton__resetPassword: 'Reset your password', - label__alternativeMethods: 'Or, sign in with another method', + blockButton__resetPassword: 'Zresetuj hasΕ‚o', + label__alternativeMethods: 'Lub zaloguj siΔ™ za pomocΔ… innej metody', title: 'ZapomniaΕ‚eΕ› hasΕ‚a?', }, noAvailableMethods: { @@ -440,8 +441,8 @@ export const plPL: LocalizationResource = { }, resetPassword: { formButtonPrimary: 'ZmieΕ„ hasΕ‚o', - requiredMessage: 'For security reasons, it is required to reset your password.', - successMessage: 'Your password was successfully changed. Signing you in, please wait a moment.', + requiredMessage: 'Z powodΓ³w bezpieczeΕ„stwa konieczne jest zresetowanie hasΕ‚a.', + successMessage: 'Twoje hasΕ‚o zostaΕ‚o pomyΕ›lnie zresetowane. Logujemy CiΔ™, proszΔ™ czekaΔ‡...', title: 'Ustaw nowe hasΕ‚o', }, resetPasswordMfa: { @@ -508,6 +509,13 @@ export const plPL: LocalizationResource = { subtitle: 'aby kontynuowaΔ‡ w {{applicationName}}', title: 'Zweryfikuj swΓ³j numer telefonu', }, + restrictedAccess: { + actionLink: undefined, + actionText: undefined, + blockButton__emailSupport: undefined, + subtitle: undefined, + title: undefined, + }, start: { actionLink: 'Zaloguj siΔ™', actionLink__use_email: undefined, @@ -522,26 +530,26 @@ export const plPL: LocalizationResource = { unstable__errors: { already_a_member_in_organization: undefined, captcha_invalid: - 'Sign up unsuccessful due to failed security validations. Please refresh the page to try again or reach out to support for more assistance.', + 'Rejestracja nie powiodΕ‚a siΔ™ z powodu nieprawidΕ‚owej weryfikacji botΓ³w. OdΕ›wieΕΌ stronΔ™, aby sprΓ³bowaΔ‡ ponownie lub skontaktuj siΔ™ z pomocΔ…, aby uzyskaΔ‡ wsparcie.', captcha_unavailable: - 'Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.', + 'Rejestracja nie powiodΕ‚a siΔ™ z powodu niedostΔ™pnoΕ›ci weryfikacji botΓ³w. OdΕ›wieΕΌ stronΔ™, aby sprΓ³bowaΔ‡ ponownie lub skontaktuj siΔ™ z pomocΔ…, aby uzyskaΔ‡ wsparcie.', form_code_incorrect: undefined, form_identifier_exists: undefined, - form_identifier_exists__email_address: undefined, + form_identifier_exists__email_address: 'Adres e-mail jest juΕΌ zajΔ™ty. ProszΔ™ sprΓ³bowaΔ‡ innego.', form_identifier_exists__phone_number: undefined, form_identifier_exists__username: undefined, form_identifier_not_found: undefined, form_param_format_invalid: undefined, - form_param_format_invalid__email_address: 'Email address must be a valid email address.', + form_param_format_invalid__email_address: 'Adres e-mail musi byΔ‡ poprawnym adresem e-mail.', form_param_format_invalid__phone_number: 'Phone number must be in a valid international format', - form_param_max_length_exceeded__first_name: 'First name should not exceed 256 characters.', - form_param_max_length_exceeded__last_name: 'Last name should not exceed 256 characters.', - form_param_max_length_exceeded__name: 'Name should not exceed 256 characters.', + form_param_max_length_exceeded__first_name: 'ImiΔ™ nie powinno przekraczaΔ‡ 256 znakΓ³w.', + form_param_max_length_exceeded__last_name: 'Nazwisko nie powinno przekraczaΔ‡ 256 znakΓ³w.', + form_param_max_length_exceeded__name: 'Nazwa nie powinna przekraczaΔ‡ 256 znakΓ³w.', form_param_nil: undefined, form_param_value_invalid: undefined, form_password_incorrect: undefined, form_password_length_too_short: undefined, - form_password_not_strong_enough: 'Your password is not strong enough.', + form_password_not_strong_enough: 'Twoje hasΕ‚o nie jest wystarczajΔ…co silne', form_password_pwned: undefined, form_password_pwned__sign_in: undefined, form_password_size_in_bytes_exceeded: @@ -569,26 +577,26 @@ export const plPL: LocalizationResource = { requireUppercase: 'wielkΔ… literΔ™', sentencePrefix: 'Twoje hasΕ‚o musi zawieraΔ‡', }, - phone_number_exists: 'This phone number is taken. Please try another.', + phone_number_exists: 'Numer telefonu jest juΕΌ zajΔ™ty. ProszΔ™ sprΓ³bowaΔ‡ innego.', zxcvbn: { - couldBeStronger: 'Your password works, but could be stronger. Try adding more characters.', - goodPassword: 'Your password meets all the necessary requirements.', - notEnough: 'Your password is not strong enough.', + couldBeStronger: 'Twoje hasΕ‚o jest odpowiednie, ale mogΕ‚oby byΔ‡ silniejsze. SprΓ³buj dodaΔ‡ wiΔ™cej znakΓ³w.', + goodPassword: 'Twoje hasΕ‚o jest wystarczajΔ…co silne.', + notEnough: 'Twoje hasΕ‚o jest zbyt sΕ‚abe. SprΓ³buj dodaΔ‡ wiΔ™cej znakΓ³w.', suggestions: { - allUppercase: 'Capitalize some, but not all letters.', - anotherWord: 'Add more words that are less common.', - associatedYears: 'Avoid years that are associated with you.', - capitalization: 'Capitalize more than the first letter.', - dates: 'Avoid dates and years that are associated with you.', - l33t: "Avoid predictable letter substitutions like '@' for 'a'.", - longerKeyboardPattern: 'Use longer keyboard patterns and change typing direction multiple times.', - noNeed: 'You can create strong passwords without using symbols, numbers, or uppercase letters.', - pwned: 'If you use this password elsewhere, you should change it.', - recentYears: 'Avoid recent years.', - repeated: 'Avoid repeated words and characters.', - reverseWords: 'Avoid reversed spellings of common words.', - sequences: 'Avoid common character sequences.', - useWords: 'Use multiple words, but avoid common phrases.', + allUppercase: 'Unikaj uΕΌywania samych wielkich liter.', + anotherWord: 'Dodaj wiΔ™cej sΕ‚Γ³w, ktΓ³re sΔ… rzadsze.', + associatedYears: 'Unikaj lat zwiΔ…zanych z TobΔ….', + capitalization: 'UΕΌywaj wielkich liter czΔ™sciej.', + dates: 'Unikaj dat zwiΔ…zanych z TobΔ….', + l33t: "Unikaj przewidywalnego zamieniania liter, takich jak '@' za 'a'.", + longerKeyboardPattern: 'UΕΌywaj dΕ‚ugich wzorΓ³w na klawiaturze, zmieniajΔ…c kierunek pisania wielokrotnie.', + noNeed: 'MoΕΌesz tworzyΔ‡ silne hasΕ‚a bez uΕΌywania symboli, cyfr lub wielkich liter.', + pwned: 'JeΕΌeli uΕΌywasz tego hasΕ‚a gdzie indziej, zmieΕ„ je jak najszybciej.', + recentYears: 'Unikaj ostatnich lat.', + repeated: 'Unikaj powtarzanych sΕ‚Γ³w i znakΓ³w.', + reverseWords: 'Unikaj wpisywania popularnych sΕ‚Γ³w od tyΕ‚u.', + sequences: 'Unikaj popularnych kombinacji znakΓ³w.', + useWords: 'UΕΌywaj wielu sΕ‚Γ³w, ale unikaj popularnych fraz.', }, warnings: { common: 'This is a commonly used password.', @@ -648,10 +656,10 @@ export const plPL: LocalizationResource = { title: 'Dodaj poΕ‚Δ…czone konto', }, deletePage: { - actionDescription: 'Wpisz "Delete account" poniΕΌej aby kontynuowaΔ‡.', + actionDescription: 'Wpisz "UsuΕ„ konto" poniΕΌej aby kontynuowaΔ‡.', confirm: 'UsuΕ„ konto', messageLine1: 'Czy na pewno chcesz usunΔ…Δ‡ to konto?', - messageLine2: 'This action is permanent and irreversible.', + messageLine2: 'Ta operacja jest nieodwracalna i nie moΕΌna jej cofnΔ…Δ‡.', title: 'UsuΕ„ konto', }, emailAddressPage: { @@ -751,7 +759,7 @@ export const plPL: LocalizationResource = { }, passwordPage: { checkboxInfoText__signOutOfOtherSessions: - 'It is recommended to sign out of all other devices which may have used your old password.', + 'Zaleca siΔ™ wylogowanie z innych urzΔ…dzeΕ„, ktΓ³re mogΕ‚y uΕΌywaΔ‡ starego hasΕ‚a.', readonly: 'Your password can currently not be edited because you can sign in only via the enterprise connection.', successMessage__set: 'Twoje hasΕ‚o zostaΕ‚o ustawione.', successMessage__signOutOfOtherSessions: 'Wylogowano z wszystkich innych urzΔ…dzeΕ„.', diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 262c52ee8f..f64252e009 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,172 @@ # Change Log +## 6.0.2 + +### Patch Changes + +- Bug fix: Include protect types in `auth` ([#4398](https://github.com/clerk/javascript/pull/4398)) by [@panteliselef](https://github.com/panteliselef) + +## 6.0.1 + +### Patch Changes + +- Await usage of cookies() and ensure the return value of the server action is valid. ([#4396](https://github.com/clerk/javascript/pull/4396)) by [@BRKalow](https://github.com/BRKalow) + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/clerk-react@5.13.1 + - @clerk/shared@2.10.1 + +## 6.0.0 + +### Major Changes + +- Stop `` from opting applications into dynamic rendering. A new prop, `` can be used to opt-in to dynamic rendering and make auth data available during server-side rendering. The RSC `auth()` helper should be preferred for accessing auth data during dynamic rendering. ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + +- @clerk/nextjs: Converting auth() and clerkClient() interfaces to be async ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + + @clerk/upgrade: Adding required codemod for @clerk/nextjs breaking changes + + # Migration guide + + ## `auth()` is now async + + Previously the `auth()` method from `@clerk/nextjs/server` was synchronous. + + ```typescript + import { auth } from "@clerk/nextjs/server"; + + export function GET() { + const { userId } = auth(); + return new Response(JSON.stringify({ userId })); + } + ``` + + The `auth` method now becomes asynchronous. You will need to make the following changes to the snippet above to make it compatible. + + ```diff + - export function GET() { + + export async function GET() { + - const { userId } = auth(); + + const { userId } = await auth(); + return new Response(JSON.stringify({ userId })); + } + ``` + + ## Clerk middleware auth is now async + + ```typescript + import { clerkClient, clerkMiddleware } from '@clerk/nextjs/server'; + import { NextResponse } from 'next/server'; + + export default clerkMiddleware(async (auth, request) => { + const resolvedAuth = await auth(); + + const count = await resolvedAuth.users.getCount(); + + if (count) { + return NextResponse.redirect(new URL('/new-url', request.url)); + } + }); + + export const config = { + matcher: [...], + }; + ``` + + ## clerkClient() is now async + + Previously the `clerkClient()` method from `@clerk/nextjs/server` was synchronous. + + ```typescript + import { clerkClient, clerkMiddleware } from '@clerk/nextjs/server'; + import { NextResponse } from 'next/server'; + + export default clerkMiddleware((auth, request) => { + const client = clerkClient(); + + const count = await client.users?.getCount(); + + if (count) { + return NextResponse.redirect(new URL('/new-url', request.url)); + } + }); + + export const config = { + matcher: [...], + }; + ``` + + The method now becomes async. You will need to make the following changes to the snippet above to make it compatible. + + ```diff + - export default clerkMiddleware((auth, request) => { + - const client = clerkClient(); + + export default clerkMiddleware(async (auth, request) => { + + const client = await clerkClient(); + const count = await client.users?.getCount(); + + if (count) { + } + ``` + +- Support `unstable_rethrow` inside `clerkMiddleware`. ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + + We changed the errors thrown by `protect()` inside `clerkMiddleware` in order for `unstable_rethrow` to recognise them and rethrow them. + +- Removes deprecated APIs: `authMiddleware()`, `redirectToSignIn()`, and `redirectToSignUp()`. See the migration guide to learn how to update your usage. ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + +### Minor Changes + +- Bug fix: Correctly redirect to sign in page in Next 15. ([#4383](https://github.com/clerk/javascript/pull/4383)) by [@panteliselef](https://github.com/panteliselef) + +- Add experimental support for new UI components ([#4114](https://github.com/clerk/javascript/pull/4114)) by [@BRKalow](https://github.com/BRKalow) + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`a0204a8e8`](https://github.com/clerk/javascript/commit/a0204a8e8742b63aea92d67e7d66fe0bc86a166f), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + - @clerk/clerk-react@5.13.0 + +## 5.7.5 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 5.7.4 + +### Patch Changes + +- Updated dependencies [[`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/clerk-react@5.12.0 + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 5.7.3 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + - @clerk/clerk-react@5.11.1 + +## 5.7.2 + +### Patch Changes + +- Introduces `organizationSyncOptions` option to `clerkMiddleware`, which syncs an active organization or personal account from a URL to the Clerk session. ([#3977](https://github.com/clerk/javascript/pull/3977)) by [@izaaklauer](https://github.com/izaaklauer) + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 5.7.1 ### Patch Changes diff --git a/packages/nextjs/README.md b/packages/nextjs/README.md index 3a6fee56c1..01eef51558 100644 --- a/packages/nextjs/README.md +++ b/packages/nextjs/README.md @@ -46,6 +46,10 @@ You'll learn how to install `@clerk/nextjs`, set up your environment keys, add ` For further information, guides, and examples visit the [Next.js reference documentation](https://clerk.com/docs/references/nextjs/overview?utm_source=github&utm_medium=clerk_nextjs). +## Upgrading + +`@clerk/nextjs` supports upgrading through automatic code migration. + ## Support You can get in touch with us in any of the following ways: diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 1873220202..89137164ee 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "5.7.1", + "version": "6.0.2", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", @@ -67,10 +67,10 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "crypto-js": "4.2.0", "server-only": "0.0.1", "tslib": "2.4.1" diff --git a/packages/nextjs/src/app-router/client/ClerkProvider.tsx b/packages/nextjs/src/app-router/client/ClerkProvider.tsx index d9c1f9cf33..8b9099a619 100644 --- a/packages/nextjs/src/app-router/client/ClerkProvider.tsx +++ b/packages/nextjs/src/app-router/client/ClerkProvider.tsx @@ -2,11 +2,11 @@ import { ClerkProvider as ReactClerkProvider } from '@clerk/clerk-react'; import type { ClerkHostRouter } from '@clerk/shared/router'; import { ClerkHostRouterContext } from '@clerk/shared/router'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useRouter } from 'next/navigation'; import React, { useEffect, useTransition } from 'react'; import { useSafeLayoutEffect } from '../../client-boundary/hooks/useSafeLayoutEffect'; -import { ClerkNextOptionsProvider } from '../../client-boundary/NextOptionsContext'; +import { ClerkNextOptionsProvider, useClerkNextOptions } from '../../client-boundary/NextOptionsContext'; import type { NextClerkProviderProps } from '../../types'; import { ClerkJSScript } from '../../utils/clerk-js-script'; import { mergeNextClerkPropsWithEnv } from '../../utils/mergeNextClerkPropsWithEnv'; @@ -27,16 +27,13 @@ declare global { // The version that Next added support for the window.history.pushState and replaceState APIs. // ref: https://nextjs.org/blog/next-14-1#windowhistorypushstate-and-windowhistoryreplacestate -export const NEXT_WINDOW_HISTORY_SUPPORT_VERSION = '14.1.0'; +const NEXT_WINDOW_HISTORY_SUPPORT_VERSION = '14.1.0'; /** * Clerk router integration with Next.js's router. */ -export const useNextRouter = (): ClerkHostRouter => { +const useNextRouter = (): ClerkHostRouter => { const router = useRouter(); - const pathname = usePathname(); - // eslint-disable-next-line react-hooks/rules-of-hooks -- The order doesn't differ between renders as we're checking the execution environment. - const searchParams = typeof window === 'undefined' ? new URLSearchParams() : useSearchParams(); // The window.history APIs seem to prevent Next.js from triggering a full page re-render, allowing us to // preserve internal state between steps. @@ -52,8 +49,8 @@ export const useNextRouter = (): ClerkHostRouter => { shallowPush(path: string) { canUseWindowHistoryAPIs ? window.history.pushState(null, '', path) : router.push(path, {}); }, - pathname: () => pathname, - searchParams: () => searchParams, + pathname: () => window.location.pathname, + searchParams: () => new URLSearchParams(window.location.search), }; }; @@ -65,6 +62,12 @@ export const ClientClerkProvider = (props: NextClerkProviderProps) => { const replace = useAwaitableReplace(); const [isPending, startTransition] = useTransition(); + // Avoid rendering nested ClerkProviders by checking for the existence of the ClerkNextOptions context provider + const isNested = Boolean(useClerkNextOptions()); + if (isNested) { + return props.children; + } + useEffect(() => { if (!isPending) { window.__clerk_internal_invalidateCachePromise?.(); @@ -113,6 +116,7 @@ export const ClientClerkProvider = (props: NextClerkProviderProps) => { const mergedProps = mergeNextClerkPropsWithEnv({ ...props, + __experimental_router: clerkRouter, routerPush: push, routerReplace: replace, }); diff --git a/packages/nextjs/src/app-router/server-actions.ts b/packages/nextjs/src/app-router/server-actions.ts index 9ed90dfe51..caecdf189d 100644 --- a/packages/nextjs/src/app-router/server-actions.ts +++ b/packages/nextjs/src/app-router/server-actions.ts @@ -7,5 +7,5 @@ import { cookies } from 'next/headers'; // and the async is no longer required in newer next versions. // ref: https://github.com/vercel/next.js/pull/62821 export async function invalidateCacheAction() { - return cookies().delete(`__clerk_invalidate_cache_cookie_${Date.now()}`); + void (await cookies()).delete(`__clerk_invalidate_cache_cookie_${Date.now()}`); } diff --git a/packages/nextjs/src/app-router/server/ClerkProvider.tsx b/packages/nextjs/src/app-router/server/ClerkProvider.tsx index 1e7060926a..b55db7dd9c 100644 --- a/packages/nextjs/src/app-router/server/ClerkProvider.tsx +++ b/packages/nextjs/src/app-router/server/ClerkProvider.tsx @@ -1,25 +1,56 @@ +import type { AuthObject } from '@clerk/backend'; import type { InitialState, Without } from '@clerk/types'; import { headers } from 'next/headers'; import React from 'react'; +import { PromisifiedAuthProvider } from '../../client-boundary/PromisifiedAuthProvider'; +import { getDynamicAuthData } from '../../server/buildClerkProps'; import type { NextClerkProviderProps } from '../../types'; import { mergeNextClerkPropsWithEnv } from '../../utils/mergeNextClerkPropsWithEnv'; import { ClientClerkProvider } from '../client/ClerkProvider'; -import { initialState } from './auth'; -import { getScriptNonceFromHeader } from './utils'; +import { buildRequestLike, getScriptNonceFromHeader } from './utils'; -export function ClerkProvider(props: Without) { - const { children, ...rest } = props; - const state = initialState()?.__clerk_ssr_state as InitialState; - const cspHeader = headers().get('Content-Security-Policy'); +const getDynamicClerkState = React.cache(async function getDynamicClerkState() { + const request = await buildRequestLike(); + const data = getDynamicAuthData(request); - return ( + return data; +}); + +const getNonceFromCSPHeader = React.cache(async function getNonceFromCSPHeader() { + return getScriptNonceFromHeader((await headers()).get('Content-Security-Policy') || '') || ''; +}); + +export async function ClerkProvider( + props: Without, +) { + const { children, dynamic, ...rest } = props; + let statePromise: Promise = Promise.resolve(null); + let nonce = Promise.resolve(''); + + if (dynamic) { + statePromise = getDynamicClerkState(); + nonce = getNonceFromCSPHeader(); + } + + const output = ( {children} ); + + if (dynamic) { + return ( + // TODO: fix types so AuthObject is compatible with InitialState + }> + {output} + + ); + } + + return output; } diff --git a/packages/nextjs/src/app-router/server/auth.ts b/packages/nextjs/src/app-router/server/auth.ts index 4db3d4bf2d..e8e912cf43 100644 --- a/packages/nextjs/src/app-router/server/auth.ts +++ b/packages/nextjs/src/app-router/server/auth.ts @@ -1,9 +1,7 @@ import type { AuthObject } from '@clerk/backend'; -import type { RedirectFun } from '@clerk/backend/internal'; -import { constants, createClerkRequest, createRedirect } from '@clerk/backend/internal'; +import { constants, createClerkRequest, createRedirect, type RedirectFun } from '@clerk/backend/internal'; import { notFound, redirect } from 'next/navigation'; -import { buildClerkProps } from '../../server/buildClerkProps'; import { PUBLISHABLE_KEY, SIGN_IN_URL, SIGN_UP_URL } from '../../server/constants'; import { createGetAuth } from '../../server/createGetAuth'; import { authAuthHeaderMissing } from '../../server/errors'; @@ -12,12 +10,17 @@ import { createProtect } from '../../server/protect'; import { decryptClerkRequestData, getAuthKeyFromRequest, getHeader } from '../../server/utils'; import { buildRequestLike } from './utils'; -type Auth = AuthObject & { protect: AuthProtect; redirectToSignIn: RedirectFun> }; +type Auth = AuthObject & { redirectToSignIn: RedirectFun> }; -export const auth = (): Auth => { +export interface AuthFn { + (): Promise; + protect: AuthProtect; +} + +export const auth: AuthFn = async () => { require('server-only'); - const request = buildRequestLike(); + const request = await buildRequestLike(); const authObject = createGetAuth({ debugLoggerName: 'auth()', noAuthStatusMessage: authAuthHeaderMissing(), @@ -46,11 +49,23 @@ export const auth = (): Auth => { }); }; - const protect = createProtect({ request, authObject, redirectToSignIn, notFound, redirect }); - - return Object.assign(authObject, { protect, redirectToSignIn }); + return Object.assign(authObject, { redirectToSignIn }); }; -export const initialState = () => { - return buildClerkProps(buildRequestLike()); +auth.protect = async (...args) => { + require('server-only'); + + const request = await buildRequestLike(); + const authObject = await auth(); + + const protect = createProtect({ + request, + authObject, + redirectToSignIn: authObject.redirectToSignIn, + notFound, + redirect, + }); + + // @ts-expect-error TS flattens all possible combinations of the for AuthProtect signatures in a union. + return protect(...args); }; diff --git a/packages/nextjs/src/app-router/server/controlComponents.tsx b/packages/nextjs/src/app-router/server/controlComponents.tsx index 4618efd821..12ff781248 100644 --- a/packages/nextjs/src/app-router/server/controlComponents.tsx +++ b/packages/nextjs/src/app-router/server/controlComponents.tsx @@ -3,15 +3,15 @@ import React from 'react'; import { auth } from './auth'; -export function SignedIn(props: React.PropsWithChildren): React.JSX.Element | null { +export async function SignedIn(props: React.PropsWithChildren): Promise { const { children } = props; - const { userId } = auth(); + const { userId } = await auth(); return userId ? <>{children} : null; } -export function SignedOut(props: React.PropsWithChildren): React.JSX.Element | null { +export async function SignedOut(props: React.PropsWithChildren): Promise { const { children } = props; - const { userId } = auth(); + const { userId } = await auth(); return userId ? null : <>{children}; } @@ -27,9 +27,9 @@ export function SignedOut(props: React.PropsWithChildren): React.JSX.Element | n * Unauthorized

} /> * ``` */ -export function Protect(props: ProtectProps): React.JSX.Element | null { +export async function Protect(props: ProtectProps): Promise { const { children, fallback, ...restAuthorizedParams } = props; - const { has, userId } = auth(); + const { has, userId } = await auth(); /** * Fallback to UI provided by user or `null` if authorization checks failed @@ -46,17 +46,11 @@ export function Protect(props: ProtectProps): React.JSX.Element | null { * Check against the results of `has` called inside the callback */ if (typeof restAuthorizedParams.condition === 'function') { - if (restAuthorizedParams.condition(has)) { - return authorized; - } - return unauthorized; + return restAuthorizedParams.condition(has) ? authorized : unauthorized; } if (restAuthorizedParams.role || restAuthorizedParams.permission) { - if (has(restAuthorizedParams)) { - return authorized; - } - return unauthorized; + return has(restAuthorizedParams) ? authorized : unauthorized; } /** diff --git a/packages/nextjs/src/app-router/server/currentUser.ts b/packages/nextjs/src/app-router/server/currentUser.ts index 336fd65565..1e7426843c 100644 --- a/packages/nextjs/src/app-router/server/currentUser.ts +++ b/packages/nextjs/src/app-router/server/currentUser.ts @@ -6,10 +6,10 @@ import { auth } from './auth'; export async function currentUser(): Promise { require('server-only'); - const { userId } = auth(); + const { userId } = await auth(); if (!userId) { return null; } - return clerkClient().users.getUser(userId); + return (await clerkClient()).users.getUser(userId); } diff --git a/packages/nextjs/src/app-router/server/utils.ts b/packages/nextjs/src/app-router/server/utils.ts index 513e84f574..d831c4fdaa 100644 --- a/packages/nextjs/src/app-router/server/utils.ts +++ b/packages/nextjs/src/app-router/server/utils.ts @@ -19,13 +19,13 @@ export const isPrerenderingBailout = (e: unknown) => { return routeRegex.test(message) || dynamicServerUsage || bailOutPrerendering; }; -export const buildRequestLike = () => { +export async function buildRequestLike() { try { // Dynamically import next/headers, otherwise Next12 apps will break - // because next/headers was introduced in next@13 - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { headers } = require('next/headers'); - return new NextRequest('https://placeholder.com', { headers: headers() }); + // @ts-ignore: Cannot find module 'next/headers' or its corresponding type declarations.ts(2307) + const { headers } = await import('next/headers'); + const resolvedHeaders = await headers(); + return new NextRequest('https://placeholder.com', { headers: resolvedHeaders }); } catch (e: any) { // rethrow the error when react throws a prerendering bailout // https://nextjs.org/docs/messages/ppr-caught-error @@ -37,7 +37,7 @@ export const buildRequestLike = () => { `Clerk: auth() and currentUser() are only supported in App Router (/app directory).\nIf you're using /pages, try getAuth() instead.\nOriginal error: ${e}`, ); } -}; +} // Original source: https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/get-script-nonce-from-header.tsx export function getScriptNonceFromHeader(cspHeaderValue: string): string | undefined { diff --git a/packages/nextjs/src/client-boundary/NextOptionsContext.tsx b/packages/nextjs/src/client-boundary/NextOptionsContext.tsx index 7bc421e2c9..05fa6b0172 100644 --- a/packages/nextjs/src/client-boundary/NextOptionsContext.tsx +++ b/packages/nextjs/src/client-boundary/NextOptionsContext.tsx @@ -9,7 +9,7 @@ ClerkNextOptionsCtx.displayName = 'ClerkNextOptionsCtx'; const useClerkNextOptions = () => { const ctx = React.useContext(ClerkNextOptionsCtx) as { value: ClerkNextContextValue }; - return ctx.value; + return ctx?.value; }; const ClerkNextOptionsProvider = ( diff --git a/packages/nextjs/src/client-boundary/PromisifiedAuthProvider.tsx b/packages/nextjs/src/client-boundary/PromisifiedAuthProvider.tsx new file mode 100644 index 0000000000..10b04166bc --- /dev/null +++ b/packages/nextjs/src/client-boundary/PromisifiedAuthProvider.tsx @@ -0,0 +1,85 @@ +'use client'; + +import { useAuth } from '@clerk/clerk-react'; +import { useDerivedAuth } from '@clerk/clerk-react/internal'; +import type { InitialState } from '@clerk/types'; +import { useRouter } from 'next/compat/router'; +import { PHASE_PRODUCTION_BUILD } from 'next/constants'; +import React from 'react'; + +const PromisifiedAuthContext = React.createContext | InitialState | null>(null); + +export function PromisifiedAuthProvider({ + authPromise, + children, +}: { + authPromise: Promise | InitialState; + children: React.ReactNode; +}) { + return {children}; +} + +/** + * Returns the current auth state, the user and session ids and the `getToken` + * that can be used to retrieve the given template or the default Clerk token. + * + * Until Clerk loads, `isLoaded` will be set to `false`. + * Once Clerk loads, `isLoaded` will be set to `true`, and you can + * safely access the `userId` and `sessionId` variables. + * + * For projects using NextJs or Remix, you can have immediate access to this data during SSR + * simply by using the `ClerkProvider`. + * + * @example + * A simple example: + * + * import { useAuth } from '@clerk/nextjs' + * + * function Hello() { + * const { isSignedIn, sessionId, userId } = useAuth(); + * if(isSignedIn) { + * return null; + * } + * console.log(sessionId, userId) + * return
...
+ * } + * + * @example + * Basic example in a NextJs app. This page will be fully rendered during SSR: + * + * import { useAuth } from '@clerk/nextjs' + * + * export HelloPage = () => { + * const { isSignedIn, sessionId, userId } = useAuth(); + * console.log(isSignedIn, sessionId, userId) + * return
...
+ * } + */ +export function usePromisifiedAuth() { + const isPagesRouter = useRouter(); + const valueFromContext = React.useContext(PromisifiedAuthContext); + + let resolvedData = valueFromContext; + if (valueFromContext && 'then' in valueFromContext) { + resolvedData = React.use(valueFromContext); + } + + // At this point we should have a usable auth object + + if (typeof window === 'undefined') { + // Pages router should always use useAuth as it is able to grab initial auth state from context during SSR. + if (isPagesRouter) { + return useAuth(); + } + + if (!resolvedData && process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD) { + throw new Error( + 'Clerk: useAuth() called in static mode, wrap this component in to make auth data available during server-side rendering.', + ); + } + // We don't need to deal with Clerk being loaded here + return useDerivedAuth(resolvedData); + } else { + return useAuth(resolvedData); + } +} diff --git a/packages/nextjs/src/client-boundary/hooks.ts b/packages/nextjs/src/client-boundary/hooks.ts index 10fbeb540c..b3756943a4 100644 --- a/packages/nextjs/src/client-boundary/hooks.ts +++ b/packages/nextjs/src/client-boundary/hooks.ts @@ -1,7 +1,6 @@ 'use client'; export { - useAuth, useClerk, useEmailLink, useOrganization, @@ -20,3 +19,5 @@ export { isMetamaskError, EmailLinkErrorCode, } from '@clerk/clerk-react/errors'; + +export { usePromisifiedAuth as useAuth } from './PromisifiedAuthProvider'; diff --git a/packages/nextjs/src/client-boundary/hooks/useEnforceCatchAllRoute.tsx b/packages/nextjs/src/client-boundary/hooks/useEnforceCatchAllRoute.tsx index 2925795bf1..47e61f1a47 100644 --- a/packages/nextjs/src/client-boundary/hooks/useEnforceCatchAllRoute.tsx +++ b/packages/nextjs/src/client-boundary/hooks/useEnforceCatchAllRoute.tsx @@ -38,7 +38,7 @@ export const useEnforceCatchAllRoute = ( // because these components are usually protected by the middleware // and if the check runs before the session is available, it will fail // even if the route is a catch-all route, as the check request will result - // in a 404 because of auth().protect(); + // in a 404 because of auth.protect(); if (requireSessionBeforeCheck && !session) { return; } diff --git a/packages/nextjs/src/pages/ClerkProvider.tsx b/packages/nextjs/src/pages/ClerkProvider.tsx index 0f7c71d3f2..1da9a7c725 100644 --- a/packages/nextjs/src/pages/ClerkProvider.tsx +++ b/packages/nextjs/src/pages/ClerkProvider.tsx @@ -1,6 +1,7 @@ import { ClerkProvider as ReactClerkProvider } from '@clerk/clerk-react'; // Override Clerk React error thrower to show that errors come from @clerk/nextjs import { setClerkJsLoadingErrorPackageName, setErrorThrowerOptions } from '@clerk/clerk-react/internal'; +import type { ClerkHostRouter } from '@clerk/shared/router'; import { useRouter } from 'next/router'; import React from 'react'; @@ -15,9 +16,39 @@ import { removeBasePath } from '../utils/removeBasePath'; setErrorThrowerOptions({ packageName: PACKAGE_NAME }); setClerkJsLoadingErrorPackageName(PACKAGE_NAME); +// The version that Next added support for the window.history.pushState and replaceState APIs. +// ref: https://nextjs.org/blog/next-14-1#windowhistorypushstate-and-windowhistoryreplacestate +const NEXT_WINDOW_HISTORY_SUPPORT_VERSION = '14.1.0'; + +/** + * Clerk router integration with Next.js's router. + */ +const useNextRouter = (): ClerkHostRouter => { + const router = useRouter(); + + // The window.history APIs seem to prevent Next.js from triggering a full page re-render, allowing us to + // preserve internal state between steps. + const canUseWindowHistoryAPIs = + typeof window !== 'undefined' && window.next && window.next.version >= NEXT_WINDOW_HISTORY_SUPPORT_VERSION; + + return { + mode: 'path', + name: 'NextRouter', + push: (path: string) => router.push(path), + replace: (path: string) => + canUseWindowHistoryAPIs ? window.history.replaceState(null, '', path) : router.replace(path), + shallowPush(path: string) { + canUseWindowHistoryAPIs ? window.history.pushState(null, '', path) : router.push(path, {}); + }, + pathname: () => window.location.pathname, + searchParams: () => new URLSearchParams(window.location.search), + }; +}; + export function ClerkProvider({ children, ...props }: NextClerkProviderProps): JSX.Element { const { __unstable_invokeMiddlewareOnAuthStateChange = true } = props; const { push, replace } = useRouter(); + const clerkRouter = useNextRouter(); ReactClerkProvider.displayName = 'ReactClerkProvider'; useSafeLayoutEffect(() => { @@ -37,7 +68,12 @@ export function ClerkProvider({ children, ...props }: NextClerkProviderProps): J const navigate = (to: string) => push(removeBasePath(to)); const replaceNavigate = (to: string) => replace(removeBasePath(to)); - const mergedProps = mergeNextClerkPropsWithEnv({ ...props, routerPush: navigate, routerReplace: replaceNavigate }); + const mergedProps = mergeNextClerkPropsWithEnv({ + ...props, + __experimental_router: clerkRouter, + routerPush: navigate, + routerReplace: replaceNavigate, + }); // ClerkProvider automatically injects __clerk_ssr_state // getAuth returns a user-facing authServerSideProps that hides __clerk_ssr_state // @ts-expect-error initialState is hidden from the types as it's a private prop diff --git a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap index 127181d0aa..788676885f 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -3,7 +3,6 @@ exports[`/server public exports should not include a breaking change 1`] = ` [ "auth", - "authMiddleware", "buildClerkProps", "clerkClient", "clerkMiddleware", @@ -11,8 +10,6 @@ exports[`/server public exports should not include a breaking change 1`] = ` "createRouteMatcher", "currentUser", "getAuth", - "redirectToSignIn", - "redirectToSignUp", "verifyToken", ] `; diff --git a/packages/nextjs/src/server/__tests__/authMiddleware.test.ts b/packages/nextjs/src/server/__tests__/authMiddleware.test.ts deleted file mode 100644 index 8051a53e8a..0000000000 --- a/packages/nextjs/src/server/__tests__/authMiddleware.test.ts +++ /dev/null @@ -1,582 +0,0 @@ -// There is no need to execute the complete authenticateRequest to test authMiddleware -// This mock SHOULD exist before the import of authenticateRequest -import { AuthStatus } from '@clerk/backend/internal'; -import { expectTypeOf } from 'expect-type'; -import type { NextFetchEvent } from 'next/server'; -import { NextRequest, NextResponse } from 'next/server'; - -const authenticateRequestMock = jest.fn().mockResolvedValue({ - toAuth: () => ({}), - headers: new Headers(), -}); - -// Removing this mock will cause the authMiddleware tests to fail due to missing publishable key -// This mock SHOULD exist before the imports -jest.mock('../constants', () => { - return { - PUBLISHABLE_KEY: 'pk_test_Y2xlcmsuaW5jbHVkZWQua2F0eWRpZC05Mi5sY2wuZGV2JA', - SECRET_KEY: 'sk_test_xxxxxxxxxxxxxxxxxx', - }; -}); - -jest.mock('../clerkClient', () => { - return { - clerkClient: { - authenticateRequest: authenticateRequestMock, - telemetry: { record: jest.fn() }, - }, - }; -}); - -import { pathToRegexp } from '@clerk/shared/pathToRegexp'; - -import { authMiddleware, DEFAULT_CONFIG_MATCHER, DEFAULT_IGNORED_ROUTES } from '../authMiddleware'; -// used to assert the mock -import { clerkClient } from '../clerkClient'; -import { createRouteMatcher } from '../routeMatcher'; - -/** - * Disable console warnings about config matchers - */ -const consoleWarn = console.warn; -global.console.warn = jest.fn(); -beforeAll(() => { - global.console.warn = jest.fn(); -}); -afterAll(() => { - global.console.warn = consoleWarn; -}); - -type MockRequestParams = { - url: string; - appendDevBrowserCookie?: boolean; - method?: string; - headers?: any; -}; - -const mockRequest = ({ - url, - appendDevBrowserCookie = false, - method = 'GET', - headers = new Headers(), -}: MockRequestParams) => { - const headersWithCookie = new Headers(headers); - if (appendDevBrowserCookie) { - headersWithCookie.append('cookie', '__clerk_db_jwt=test_jwt'); - } - return new NextRequest(new URL(url, 'https://www.clerk.com').toString(), { - method, - headers: headersWithCookie, - }); -}; - -describe('isPublicRoute', () => { - describe('should work with path patterns', function () { - it('matches path and all sub paths using *', () => { - const isPublicRoute = createRouteMatcher(['/hello(.*)']); - expect(isPublicRoute(mockRequest({ url: '/hello' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/hello' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/hello/test/a' }))).toBe(true); - }); - - it('matches filenames with specific extensions', () => { - const isPublicRoute = createRouteMatcher(['/(.*).ts', '/(.*).js']); - expect(isPublicRoute(mockRequest({ url: '/hello.js' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.js' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.ts' }))).toBe(true); - }); - - it('works with single values (non array)', () => { - const isPublicRoute = createRouteMatcher('/test/hello.ts'); - expect(isPublicRoute(mockRequest({ url: '/hello.js' }))).not.toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.js' }))).not.toBe(true); - }); - }); - - describe('should work with regex patterns', function () { - it('matches path and all sub paths using *', () => { - const isPublicRoute = createRouteMatcher([/^\/hello.*$/]); - expect(isPublicRoute(mockRequest({ url: '/hello' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/hello/' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/hello/test/a' }))).toBe(true); - }); - - it('matches filenames with specific extensions', () => { - const isPublicRoute = createRouteMatcher([/^.*\.(ts|js)$/]); - expect(isPublicRoute(mockRequest({ url: '/hello.js' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.js' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.ts' }))).toBe(true); - }); - - it('works with single values (non array)', () => { - const isPublicRoute = createRouteMatcher(/hello/g); - expect(isPublicRoute(mockRequest({ url: '/hello.js' }))).toBe(true); - expect(isPublicRoute(mockRequest({ url: '/test/hello.js' }))).toBe(true); - }); - }); -}); - -const validRoutes = [ - '/api', - '/api/', - '/api/hello', - '/trpc', - '/trpc/hello', - '/trpc/hello.example', - '/protected', - '/protected/', - '/protected/hello', - '/protected/hello.example/hello', - '/my-protected-page', - '/my/$special/$pages', -]; - -const invalidRoutes = [ - '/_next', - '/favicon.ico', - '/_next/test.json', - '/files/api.pdf', - '/test/api/test.pdf', - '/imgs/img.png', - '/imgs/img-dash.jpg', -]; - -describe('default config matcher', () => { - it('compiles to regex using path-to-regex', () => { - [DEFAULT_CONFIG_MATCHER].flat().forEach(path => { - expect(pathToRegexp(path)).toBeInstanceOf(RegExp); - }); - }); - - describe('does not match any static files or next internals', function () { - it.each(invalidRoutes)(`does not match %s`, path => { - const matcher = createRouteMatcher(DEFAULT_CONFIG_MATCHER); - expect(matcher(mockRequest({ url: path }))).toBe(false); - }); - }); - - describe('matches /api or known framework routes', function () { - it.each(validRoutes)(`matches %s`, path => { - const matcher = createRouteMatcher(DEFAULT_CONFIG_MATCHER); - expect(matcher(mockRequest({ url: path }))).toBe(true); - }); - }); -}); - -describe('default ignored routes matcher', () => { - it('compiles to regex using path-to-regex', () => { - [DEFAULT_IGNORED_ROUTES].flat().forEach(path => { - expect(pathToRegexp(path)).toBeInstanceOf(RegExp); - }); - }); - - describe('matches all static files or next internals', function () { - it.each(invalidRoutes)(`matches %s`, path => { - const matcher = createRouteMatcher(DEFAULT_IGNORED_ROUTES); - expect(matcher(mockRequest({ url: path }))).toBe(true); - }); - }); - - describe('does not match /api or known framework routes', function () { - it.each(validRoutes)(`does not match %s`, path => { - const matcher = createRouteMatcher(DEFAULT_IGNORED_ROUTES); - expect(matcher(mockRequest({ url: path }))).toBe(false); - }); - }); -}); - -describe('authMiddleware(params)', () => { - beforeEach(() => { - authenticateRequestMock.mockClear(); - }); - - describe('without params', function () { - it('redirects to sign-in for protected route', async () => { - const resp = await authMiddleware()(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual( - 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', - ); - }); - - it('renders public route', async () => { - const signInResp = await authMiddleware({ publicRoutes: '/sign-in' })( - mockRequest({ url: '/sign-in' }), - {} as NextFetchEvent, - ); - expect(signInResp?.status).toEqual(200); - expect(signInResp?.headers.get('x-middleware-rewrite')).toEqual('https://www.clerk.com/sign-in'); - - const signUpResp = await authMiddleware({ publicRoutes: ['/sign-up'] })( - mockRequest({ url: '/sign-up' }), - {} as NextFetchEvent, - ); - expect(signUpResp?.status).toEqual(200); - expect(signUpResp?.headers.get('x-middleware-rewrite')).toEqual('https://www.clerk.com/sign-up'); - }); - }); - - describe('with ignoredRoutes', function () { - it('skips auth middleware execution', async () => { - const beforeAuthSpy = jest.fn(); - const afterAuthSpy = jest.fn(); - const resp = await authMiddleware({ - ignoredRoutes: '/ignored', - beforeAuth: beforeAuthSpy, - afterAuth: afterAuthSpy, - })(mockRequest({ url: '/ignored' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(clerkClient.authenticateRequest).not.toBeCalled(); - expect(beforeAuthSpy).not.toBeCalled(); - expect(afterAuthSpy).not.toBeCalled(); - }); - - it('executes auth middleware execution when is not matched', async () => { - const beforeAuthSpy = jest.fn(); - const afterAuthSpy = jest.fn(); - const resp = await authMiddleware({ - ignoredRoutes: '/ignored', - beforeAuth: beforeAuthSpy, - afterAuth: afterAuthSpy, - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(clerkClient.authenticateRequest).toBeCalled(); - expect(beforeAuthSpy).toBeCalled(); - expect(afterAuthSpy).toBeCalled(); - }); - }); - - describe('with publicRoutes', function () { - it('renders public route', async () => { - const resp = await authMiddleware({ - publicRoutes: '/public', - })(mockRequest({ url: '/public' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(resp?.headers.get('x-middleware-rewrite')).toEqual('https://www.clerk.com/public'); - }); - - describe('when sign-in/sign-up routes are defined in env', () => { - const currentSignInUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL; - const currentSignUpUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL; - - beforeEach(() => { - process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL = '/custom-sign-in'; - process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL = '/custom-sign-up'; - }); - - afterEach(() => { - process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL = currentSignInUrl; - process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL = currentSignUpUrl; - }); - - it('renders sign-in/sign-up routes', async () => { - const signInResp = await authMiddleware({ - publicRoutes: '/public', - })(mockRequest({ url: '/custom-sign-in' }), {} as NextFetchEvent); - expect(signInResp?.status).toEqual(200); - expect(signInResp?.headers.get('x-middleware-rewrite')).toEqual('https://www.clerk.com/custom-sign-in'); - - const signUpResp = await authMiddleware({ - publicRoutes: '/public', - })(mockRequest({ url: '/custom-sign-up' }), {} as NextFetchEvent); - expect(signUpResp?.status).toEqual(200); - expect(signUpResp?.headers.get('x-middleware-rewrite')).toEqual('https://www.clerk.com/custom-sign-up'); - }); - }); - - it('redirects to sign-in for protected route', async () => { - const resp = await authMiddleware({ - publicRoutes: '/public', - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual( - 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', - ); - }); - }); - - describe('with beforeAuth', function () { - it('skips auth middleware execution when beforeAuth returns false', async () => { - const afterAuthSpy = jest.fn(); - const resp = await authMiddleware({ - beforeAuth: () => false, - afterAuth: afterAuthSpy, - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(resp?.headers.get('x-clerk-auth-reason')).toEqual('skip'); - expect(clerkClient.authenticateRequest).not.toBeCalled(); - expect(afterAuthSpy).not.toBeCalled(); - }); - - it('executes auth middleware execution when beforeAuth returns undefined', async () => { - const afterAuthSpy = jest.fn(); - const resp = await authMiddleware({ - beforeAuth: () => undefined, - afterAuth: afterAuthSpy, - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(clerkClient.authenticateRequest).toBeCalled(); - expect(afterAuthSpy).toBeCalled(); - }); - - it('skips auth middleware execution when beforeAuth returns NextResponse.redirect', async () => { - const afterAuthSpy = jest.fn(); - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.redirect('https://www.clerk.com/custom-redirect'), - afterAuth: afterAuthSpy, - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual('https://www.clerk.com/custom-redirect'); - expect(clerkClient.authenticateRequest).not.toBeCalled(); - expect(afterAuthSpy).not.toBeCalled(); - }); - - it('executes auth middleware when beforeAuth returns NextResponse', async () => { - const resp = await authMiddleware({ - beforeAuth: () => - NextResponse.next({ - headers: { - 'x-before-auth-header': 'before', - }, - }), - afterAuth: () => - NextResponse.next({ - headers: { - 'x-after-auth-header': 'after', - }, - }), - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - expect(resp?.headers.get('x-before-auth-header')).toEqual('before'); - expect(resp?.headers.get('x-after-auth-header')).toEqual('after'); - expect(clerkClient.authenticateRequest).toBeCalled(); - }); - }); - - describe('with afterAuth', function () { - it('redirects to sign-in for protected route and sets redirect as auth reason header', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - })(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual( - 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', - ); - expect(clerkClient.authenticateRequest).toBeCalled(); - }); - - it('uses authenticateRequest result as auth', async () => { - const req = mockRequest({ url: '/protected' }); - const event = {} as NextFetchEvent; - authenticateRequestMock.mockResolvedValueOnce({ toAuth: () => ({ userId: null }), headers: new Headers() }); - const afterAuthSpy = jest.fn(); - - await authMiddleware({ afterAuth: afterAuthSpy })(req, event); - - expect(clerkClient.authenticateRequest).toBeCalled(); - expect(afterAuthSpy).toBeCalledWith( - { - userId: null, - isPublicRoute: false, - isApiRoute: false, - }, - req, - event, - ); - }); - }); - - describe('authenticateRequest', function () { - it('returns 307 and starts the handshake flow for handshake requestState status', async () => { - const mockLocationUrl = 'https://example.com'; - authenticateRequestMock.mockResolvedValueOnce({ - status: AuthStatus.Handshake, - headers: new Headers({ Location: mockLocationUrl }), - }); - const resp = await authMiddleware()(mockRequest({ url: '/protected' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('Location')).toEqual(mockLocationUrl); - }); - }); -}); - -describe('Dev Browser JWT when redirecting to cross origin', function () { - it('does NOT append the Dev Browser JWT when cookie is missing', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - })(mockRequest({ url: '/protected', appendDevBrowserCookie: false }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual( - 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', - ); - expect(clerkClient.authenticateRequest).toBeCalled(); - }); - - it('appends the Dev Browser JWT to the search when cookie __clerk_db_jwt exists and location is an Account Portal URL', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - })(mockRequest({ url: '/protected', appendDevBrowserCookie: true }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual( - 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected&__clerk_db_jwt=test_jwt', - ); - expect(clerkClient.authenticateRequest).toBeCalled(); - }); - - it('does NOT append the Dev Browser JWT if x-clerk-redirect-to header is not set', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.redirect('https://google.com/'), - })(mockRequest({ url: '/protected', appendDevBrowserCookie: true }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('location')).toEqual('https://google.com/'); - expect(clerkClient.authenticateRequest).toBeCalled(); - }); -}); - -describe('isApiRoute', function () { - it('treats route as API route if apiRoutes match the route path', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - apiRoutes: ['/api/(.*)'], - })(mockRequest({ url: '/api/items' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); - - it('treats route as Page route if apiRoutes do not match the route path', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - apiRoutes: ['/api/(.*)'], - })(mockRequest({ url: '/page' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - }); - - it('treats route as API route if apiRoutes prop is missing and route path matches the default matcher (/api/(.*))', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - })(mockRequest({ url: '/api/items' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); - - it('treats route as API route if apiRoutes prop is missing and route path matches the default matcher (/trpc/(.*))', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - })(mockRequest({ url: '/trpc/items' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); - - it('treats route as API route if apiRoutes prop is missing and Request method is not-GET,OPTIONS,HEAD', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - })(mockRequest({ url: '/products/items', method: 'POST' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); - - it('treats route as API route if apiRoutes prop is missing and Request headers Content-Type is application/json', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - })( - mockRequest({ url: '/products/items', headers: new Headers({ 'content-type': 'application/json' }) }), - {} as NextFetchEvent, - ); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); -}); - -describe('401 Response on Api Routes', function () { - it('returns 401 when route is not public and route matches API routes', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - apiRoutes: ['/products/(.*)'], - })(mockRequest({ url: '/products/items' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(401); - expect(resp?.headers.get('content-type')).toEqual('application/json'); - }); - - it('returns 307 when route is not public and route does not match API routes', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - apiRoutes: ['/products/(.*)'], - })(mockRequest({ url: '/api/items' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(307); - expect(resp?.headers.get('content-type')).not.toEqual('application/json'); - }); - - it('returns 200 when API route is public', async () => { - const resp = await authMiddleware({ - beforeAuth: () => NextResponse.next(), - publicRoutes: ['/public'], - apiRoutes: ['/public'], - })(mockRequest({ url: '/public' }), {} as NextFetchEvent); - - expect(resp?.status).toEqual(200); - }); -}); - -describe('Type tests', () => { - type AuthMiddleware = Parameters[0]; - describe('AuthMiddleware', () => { - it('is the options argument for authMiddleware', () => { - () => { - authMiddleware({} as AuthMiddleware); - }; - }); - - it('can receive the appropriate keys', () => { - expectTypeOf({ publishableKey: '', secretKey: '' }).toMatchTypeOf(); - expectTypeOf({ secretKey: '' }).toMatchTypeOf(); - expectTypeOf({ publishableKey: '', secretKey: '' }).toMatchTypeOf(); - expectTypeOf({ secretKey: '' }).toMatchTypeOf(); - }); - - describe('Multi domain', () => { - const defaultProps = { publishableKey: '', secretKey: '' }; - - it('proxyUrl (primary app)', () => { - expectTypeOf({ ...defaultProps, proxyUrl: 'test' }).toMatchTypeOf(); - }); - - it('proxyUrl + isSatellite (satellite app)', () => { - expectTypeOf({ ...defaultProps, proxyUrl: 'test', isSatellite: true }).toMatchTypeOf(); - }); - - it('domain + isSatellite (satellite app)', () => { - expectTypeOf({ ...defaultProps, domain: 'test', isSatellite: true }).toMatchTypeOf(); - }); - }); - }); -}); diff --git a/packages/nextjs/src/server/__tests__/clerkClient.test.ts b/packages/nextjs/src/server/__tests__/clerkClient.test.ts index 58b6e883dd..d41af5a6ad 100644 --- a/packages/nextjs/src/server/__tests__/clerkClient.test.ts +++ b/packages/nextjs/src/server/__tests__/clerkClient.test.ts @@ -4,7 +4,9 @@ import { clerkClient } from '../clerkClient'; describe('clerkClient', () => { it('should pass version package to userAgent', async () => { - await clerkClient().users.getUser('user_test'); + const resolvedClerkClient = await clerkClient(); + + await resolvedClerkClient.users.getUser('user_test'); expect(global.fetch).toBeCalled(); expect((global.fetch as any).mock.calls[0][1].headers).toMatchObject({ diff --git a/packages/nextjs/src/server/__tests__/clerkMiddleware.test.ts b/packages/nextjs/src/server/__tests__/clerkMiddleware.test.ts index ea116a664d..2ab3f240c9 100644 --- a/packages/nextjs/src/server/__tests__/clerkMiddleware.test.ts +++ b/packages/nextjs/src/server/__tests__/clerkMiddleware.test.ts @@ -2,9 +2,16 @@ // This mock SHOULD exist before the import of authenticateRequest import { AuthStatus, constants } from '@clerk/backend/internal'; import { describe, expect } from '@jest/globals'; +// used to assert the mock +import assert from 'assert'; import type { NextFetchEvent } from 'next/server'; import { NextRequest, NextResponse } from 'next/server'; +import { clerkClient } from '../clerkClient'; +import { clerkMiddleware } from '../clerkMiddleware'; +import { createRouteMatcher } from '../routeMatcher'; +import { decryptClerkRequestData } from '../utils'; + const publishableKey = 'pk_test_Y2xlcmsuaW5jbHVkZWQua2F0eWRpZC05Mi5sY2wuZGV2JA'; const authenticateRequestMock = jest.fn().mockResolvedValue({ toAuth: () => ({ @@ -23,14 +30,6 @@ jest.mock('../clerkClient', () => { }; }); -// used to assert the mock -import assert from 'assert'; - -import { clerkClient } from '../clerkClient'; -import { clerkMiddleware } from '../clerkMiddleware'; -import { createRouteMatcher } from '../routeMatcher'; -import { decryptClerkRequestData } from '../utils'; - /** * Disable console warnings about config matchers */ @@ -88,8 +87,9 @@ describe('ClerkMiddleware type tests', () => { it('can be used with a handler and an optional options object', () => { clerkMiddlewareMock( - (auth, request, event) => { - auth().getToken(); + async (auth, request, event) => { + const { getToken } = await auth(); + await getToken(); request.cookies.clear(); event.sourcePage; }, @@ -98,8 +98,9 @@ describe('ClerkMiddleware type tests', () => { }); it('can be used with just a handler and an optional options object', () => { - clerkMiddlewareMock((auth, request, event) => { - auth().getToken(); + clerkMiddlewareMock(async (auth, request, event) => { + const { getToken } = await auth(); + await getToken(); request.cookies.clear(); event.sourcePage; }); @@ -261,13 +262,14 @@ describe('clerkMiddleware(params)', () => { appendDevBrowserCookie: true, }); - const resp = await clerkMiddleware(auth => { - auth().redirectToSignIn(); + const resp = await clerkMiddleware(async auth => { + const { redirectToSignIn } = await auth(); + redirectToSignIn(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('sign-in'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to sign-in url when redirectToSignIn is called with the correct returnBackUrl', async () => { @@ -277,14 +279,15 @@ describe('clerkMiddleware(params)', () => { appendDevBrowserCookie: true, }); - const resp = await clerkMiddleware(auth => { - auth().redirectToSignIn(); + const resp = await clerkMiddleware(async auth => { + const { redirectToSignIn } = await auth(); + redirectToSignIn(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('sign-in'); expect(new URL(resp!.headers.get('location')!).searchParams.get('redirect_url')).toContain('/protected'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to sign-in url with redirect_url set to the provided returnBackUrl param', async () => { @@ -294,8 +297,9 @@ describe('clerkMiddleware(params)', () => { appendDevBrowserCookie: true, }); - const resp = await clerkMiddleware(auth => { - auth().redirectToSignIn({ returnBackUrl: 'https://www.clerk.com/hello' }); + const resp = await clerkMiddleware(async auth => { + const { redirectToSignIn } = await auth(); + redirectToSignIn({ returnBackUrl: 'https://www.clerk.com/hello' }); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); @@ -303,7 +307,7 @@ describe('clerkMiddleware(params)', () => { expect(new URL(resp!.headers.get('location')!).searchParams.get('redirect_url')).toEqual( 'https://www.clerk.com/hello', ); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to sign-in url without a redirect_url when returnBackUrl is null', async () => { @@ -313,18 +317,19 @@ describe('clerkMiddleware(params)', () => { appendDevBrowserCookie: true, }); - const resp = await clerkMiddleware(auth => { - auth().redirectToSignIn({ returnBackUrl: null }); + const resp = await clerkMiddleware(async auth => { + const { redirectToSignIn } = await auth(); + redirectToSignIn({ returnBackUrl: null }); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('sign-in'); expect(new URL(resp!.headers.get('location')!).searchParams.get('redirect_url')).toBeNull(); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); }); - describe('auth().protect()', () => { + describe('auth.protect()', () => { it('redirects to sign-in url when protect is called, the user is signed out and the request is a page request', async () => { const req = mockRequest({ url: '/protected', @@ -339,13 +344,13 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('sign-in'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('does not redirect to sign-in url when protect is called, the user is signed in and the request is a page request', async () => { @@ -362,13 +367,13 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: 'user-id' }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(200); expect(resp?.headers.get('location')).toBeFalsy(); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('throws a not found error when protect is called, the user is signed out, and is not a page request', async () => { @@ -385,13 +390,13 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(200); expect(resp?.headers.get(constants.Headers.AuthReason)).toContain('protect-rewrite'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('throws a not found error when protect is called with RBAC params the user does not fulfill, and is a page request', async () => { @@ -408,13 +413,13 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: 'user-id', has: () => false }), }); - const resp = await clerkMiddleware(auth => { - auth().protect({ role: 'random-role' }); + const resp = await clerkMiddleware(async auth => { + await auth.protect({ role: 'random-role' }); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(200); expect(resp?.headers.get(constants.Headers.AuthReason)).toContain('protect-rewrite'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to unauthenticatedUrl when protect is called with the redirectUrl param, the user is signed out, and is a page request', async () => { @@ -431,14 +436,14 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect({ unauthenticatedUrl: 'https://www.clerk.com/hello' }); + const resp = await clerkMiddleware(async auth => { + await auth.protect({ unauthenticatedUrl: 'https://www.clerk.com/hello' }); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toEqual('https://www.clerk.com/hello'); expect(resp?.headers.get(constants.Headers.ClerkRedirectTo)).toEqual('true'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect(await (await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to unauthorizedUrl when protect is called with the redirectUrl param, the user does not fulfill the RBAC params, and is a page request', async () => { @@ -455,8 +460,8 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: 'user-id', has: () => false }), }); - const resp = await clerkMiddleware(auth => { - auth().protect( + const resp = await clerkMiddleware(async auth => { + await auth.protect( { role: 'random-role' }, { unauthorizedUrl: 'https://www.clerk.com/discover', @@ -468,7 +473,7 @@ describe('clerkMiddleware(params)', () => { expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toEqual('https://www.clerk.com/discover'); expect(resp?.headers.get(constants.Headers.ClerkRedirectTo)).toEqual('true'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); }); @@ -487,16 +492,16 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('sign-in'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); - it('forwards headers from authenticateRequest when auth().protect() is called', async () => { + it('forwards headers from authenticateRequest when auth.protect() is called', async () => { const req = mockRequest({ url: '/protected', headers: new Headers({ [constants.Headers.SecFetchDest]: 'document' }), @@ -513,15 +518,15 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('X-Clerk-Auth')).toEqual('1'); expect(resp?.headers.get('Set-Cookie')).toEqual('session=;'); expect(resp?.headers.get('location')).toContain('sign-in'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to unauthenticatedUrl when protect is called with the unauthenticatedUrl param, the user is signed out, and is a page request', async () => { @@ -538,8 +543,8 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect({ + const resp = await clerkMiddleware(async auth => { + await auth.protect({ unauthenticatedUrl: 'https://www.clerk.com/unauthenticatedUrl', unauthorizedUrl: 'https://www.clerk.com/unauthorizedUrl', }); @@ -548,7 +553,7 @@ describe('clerkMiddleware(params)', () => { expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('https://www.clerk.com/unauthenticatedUrl'); expect(resp?.headers.get(constants.Headers.ClerkRedirectTo)).toEqual('true'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('redirects to unauthorizedUrl when protect is called with the unauthorizedUrl param, the user is signed in but does not have permissions, and is a page request', async () => { @@ -565,8 +570,8 @@ describe('clerkMiddleware(params)', () => { toAuth: () => ({ userId: 'userId', has: () => false }), }); - const resp = await clerkMiddleware(auth => { - auth().protect( + const resp = await clerkMiddleware(async auth => { + await auth.protect( { permission: 'random-permission' }, { unauthenticatedUrl: 'https://www.clerk.com/unauthenticatedUrl', @@ -578,7 +583,7 @@ describe('clerkMiddleware(params)', () => { expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toContain('https://www.clerk.com/unauthorizedUrl'); expect(resp?.headers.get(constants.Headers.ClerkRedirectTo)).toEqual('true'); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); }); @@ -624,15 +629,15 @@ describe('Dev Browser JWT when redirecting to cross origin for page requests', f toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toEqual( 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', ); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('appends the Dev Browser JWT to the search when cookie __clerk_db_jwt exists and location is an Account Portal URL', async () => { @@ -649,14 +654,15 @@ describe('Dev Browser JWT when redirecting to cross origin for page requests', f toAuth: () => ({ userId: null }), }); - const resp = await clerkMiddleware(auth => { - auth().protect(); + const resp = await clerkMiddleware(async auth => { + await auth.protect(); })(req, {} as NextFetchEvent); + expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toEqual( 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected&__clerk_db_jwt=test_jwt', ); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); it('does NOT append the Dev Browser JWT if x-clerk-redirect-to header is not set (user-returned redirect)', async () => { @@ -678,10 +684,11 @@ describe('Dev Browser JWT when redirecting to cross origin for page requests', f 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', ); })(req, {} as NextFetchEvent); + expect(resp?.status).toEqual(307); expect(resp?.headers.get('location')).toEqual( 'https://accounts.included.katydid-92.lcl.dev/sign-in?redirect_url=https%3A%2F%2Fwww.clerk.com%2Fprotected', ); - expect(clerkClient().authenticateRequest).toBeCalled(); + expect((await clerkClient()).authenticateRequest).toBeCalled(); }); }); diff --git a/packages/nextjs/src/server/authMiddleware.ts b/packages/nextjs/src/server/authMiddleware.ts deleted file mode 100644 index c3076b6c6c..0000000000 --- a/packages/nextjs/src/server/authMiddleware.ts +++ /dev/null @@ -1,346 +0,0 @@ -import type { AuthObject } from '@clerk/backend'; -import type { AuthenticateRequestOptions, ClerkRequest } from '@clerk/backend/internal'; -import { AuthStatus, constants, createClerkRequest, createRedirect } from '@clerk/backend/internal'; -import { isDevelopmentFromSecretKey } from '@clerk/shared/keys'; -import { eventMethodCalled } from '@clerk/shared/telemetry'; -import type { NextFetchEvent, NextMiddleware, NextRequest } from 'next/server'; -import { NextResponse } from 'next/server'; - -import { isRedirect, mergeResponses, serverRedirectWithAuth, setHeader, stringifyHeaders } from '../utils'; -import { withLogger } from '../utils/debugLogger'; -import { clerkClient } from './clerkClient'; -import { createAuthenticateRequestOptions } from './clerkMiddleware'; -import { PUBLISHABLE_KEY, SECRET_KEY, SIGN_IN_URL, SIGN_UP_URL } from './constants'; -import { informAboutProtectedRouteInfo, receivedRequestForIgnoredRoute } from './errors'; -import { errorThrower } from './errorThrower'; -import type { RouteMatcherParam } from './routeMatcher'; -import { createRouteMatcher } from './routeMatcher'; -import type { NextMiddlewareReturn } from './types'; -import { - apiEndpointUnauthorizedNextResponse, - assertKey, - decorateRequest, - redirectAdapter, - setRequestHeadersOnNextResponse, -} from './utils'; - -/** - * The default ideal matcher that excludes the _next directory (internals) and all static files, - * but it will match the root route (/) and any routes that start with /api or /trpc. - */ -export const DEFAULT_CONFIG_MATCHER = ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)']; - -/** - * Any routes matching this path will be ignored by the middleware. - * This is the inverted version of DEFAULT_CONFIG_MATCHER. - */ -export const DEFAULT_IGNORED_ROUTES = [`/((?!api|trpc))(_next.*|.+\\.[\\w]+$)`]; -/** - * Any routes matching this path will be treated as API endpoints by the middleware. - */ -export const DEFAULT_API_ROUTES = ['/api/(.*)', '/trpc/(.*)']; - -type IgnoredRoutesParam = Array | RegExp | string | ((req: NextRequest) => boolean); -type ApiRoutesParam = IgnoredRoutesParam; - -type WithExperimentalClerkUrl = T & { - /** - * When a NextJs app is hosted on a platform different from Vercel - * or inside a container (Netlify, Fly.io, AWS Amplify, docker etc), - * req.url is always set to `localhost:3000` instead of the actual host of the app. - * - * The `authMiddleware` uses the value of the available req.headers in order to construct - * and use the correct url internally. This url is then exposed as `experimental_clerkUrl`, - * intended to be used within `beforeAuth` and `afterAuth` if needed. - */ - experimental_clerkUrl: NextRequest['nextUrl']; -}; - -type BeforeAuthHandler = ( - req: WithExperimentalClerkUrl, - evt: NextFetchEvent, -) => NextMiddlewareReturn | false | Promise; - -type AfterAuthHandler = ( - auth: AuthObject & { isPublicRoute: boolean; isApiRoute: boolean }, - req: WithExperimentalClerkUrl, - evt: NextFetchEvent, -) => NextMiddlewareReturn; - -type AuthMiddlewareParams = AuthenticateRequestOptions & { - /** - * A function that is called before the authentication middleware is executed. - * If a redirect response is returned, the middleware will respect it and redirect the user. - * If false is returned, the auth middleware will not execute and the request will be handled as if the auth middleware was not present. - */ - beforeAuth?: BeforeAuthHandler; - /** - * A function that is called after the authentication middleware is executed. - * This function has access to the auth object and can be used to execute logic based on the auth state. - */ - afterAuth?: AfterAuthHandler; - /** - * A list of routes that should be accessible without authentication. - * You can use glob patterns to match multiple routes or a function to match against the request object. - * Path patterns and regular expressions are supported, for example: `['/foo', '/bar(.*)'] or `[/^\/foo\/.*$/]` - * The sign in and sign up URLs are included by default, unless a function is provided. - * For more information, see: https://clerk.com/docs - */ - publicRoutes?: RouteMatcherParam; - /** - * A list of routes that should be ignored by the middleware. - * This list typically includes routes for static files or Next.js internals. - * For improved performance, these routes should be skipped using the default config.matcher instead. - */ - ignoredRoutes?: IgnoredRoutesParam; - /** - * A list of routes that should be treated as API endpoints. - * When user is signed out, the middleware will return a 401 response for these routes, instead of redirecting the user. - * - * If omitted, the following heuristics will be used to determine an API endpoint: - * - The route path is ['/api/(.*)', '/trpc/(.*)'], - * - or the request has `Content-Type` set to `application/json`, - * - or the request method is not one of: `GET`, `OPTIONS` ,` HEAD` - * - * @default undefined - */ - apiRoutes?: ApiRoutesParam; - /** - * Enables extra debug logging. - */ - debug?: boolean; -}; - -export interface AuthMiddleware { - (params?: AuthMiddlewareParams): NextMiddleware; -} - -/** - * @deprecated `authMiddleware` is deprecated and will be removed in the next major version. - * Use {@link clerkMiddleware}` instead. - * Migration guide: https://clerk.com/docs/upgrade-guides/core-2/nextjs - */ -const authMiddleware: AuthMiddleware = (...args: unknown[]) => { - const [params = {}] = args as [AuthMiddlewareParams?]; - const publishableKey = assertKey(params.publishableKey || PUBLISHABLE_KEY, () => - errorThrower.throwMissingPublishableKeyError(), - ); - const secretKey = assertKey(params.secretKey || SECRET_KEY, () => errorThrower.throwMissingPublishableKeyError()); - const signInUrl = params.signInUrl || SIGN_IN_URL; - const signUpUrl = params.signUpUrl || SIGN_UP_URL; - - const options = { ...params, publishableKey, secretKey, signInUrl, signUpUrl }; - - const isIgnoredRoute = createRouteMatcher(options.ignoredRoutes || DEFAULT_IGNORED_ROUTES); - const isPublicRoute = createRouteMatcher(withDefaultPublicRoutes(options.publicRoutes)); - const isApiRoute = createApiRoutes(options.apiRoutes); - const defaultAfterAuth = createDefaultAfterAuth(isPublicRoute, isApiRoute, options); - - clerkClient.telemetry.record( - eventMethodCalled('authMiddleware', { - publicRoutes: Boolean(options.publicRoutes), - ignoredRoutes: Boolean(options.ignoredRoutes), - beforeAuth: Boolean(options.beforeAuth), - afterAuth: Boolean(options.afterAuth), - }), - ); - - return withLogger('authMiddleware', logger => async (_req: NextRequest, evt: NextFetchEvent) => { - if (options.debug) { - logger.enable(); - } - const clerkRequest = createClerkRequest(_req); - const nextRequest = withNormalizedClerkUrl(clerkRequest, _req); - - logger.debug('URL debug', { - url: nextRequest.nextUrl.href, - method: nextRequest.method, - headers: stringifyHeaders(nextRequest.headers), - nextUrl: nextRequest.nextUrl.href, - clerkUrl: nextRequest.experimental_clerkUrl.href, - }); - - logger.debug('Options debug', { ...options, beforeAuth: !!options.beforeAuth, afterAuth: !!options.afterAuth }); - - if (isIgnoredRoute(nextRequest)) { - logger.debug({ isIgnoredRoute: true }); - if (isDevelopmentFromSecretKey(options.secretKey) && !options.ignoredRoutes) { - console.warn( - receivedRequestForIgnoredRoute( - nextRequest.experimental_clerkUrl.href, - JSON.stringify(DEFAULT_CONFIG_MATCHER), - ), - ); - } - return setHeader(NextResponse.next(), constants.Headers.AuthReason, 'ignored-route'); - } - - const beforeAuthRes = await (options.beforeAuth && options.beforeAuth(nextRequest, evt)); - - if (beforeAuthRes === false) { - logger.debug('Before auth returned false, skipping'); - return setHeader(NextResponse.next(), constants.Headers.AuthReason, 'skip'); - } else if (beforeAuthRes && isRedirect(beforeAuthRes)) { - logger.debug('Before auth returned redirect, following redirect'); - return setHeader(beforeAuthRes, constants.Headers.AuthReason, 'before-auth-redirect'); - } - - const requestState = await clerkClient.authenticateRequest( - clerkRequest, - createAuthenticateRequestOptions(clerkRequest, options), - ); - - const locationHeader = requestState.headers.get('location'); - if (locationHeader) { - // triggering a handshake redirect - return new Response(null, { status: 307, headers: requestState.headers }); - } - - if (requestState.status === AuthStatus.Handshake) { - throw new Error('Clerk: unexpected handshake without redirect'); - } - - const auth = Object.assign(requestState.toAuth(), { - isPublicRoute: isPublicRoute(nextRequest), - isApiRoute: isApiRoute(nextRequest), - }); - - logger.debug(() => ({ auth: JSON.stringify(auth), debug: auth.debug() })); - const afterAuthRes = await (options.afterAuth || defaultAfterAuth)(auth, nextRequest, evt); - const finalRes = mergeResponses(beforeAuthRes, afterAuthRes) || NextResponse.next(); - logger.debug(() => ({ mergedHeaders: stringifyHeaders(finalRes.headers) })); - - if (isRedirect(finalRes)) { - logger.debug('Final response is redirect, following redirect'); - return serverRedirectWithAuth(clerkRequest, finalRes, options); - } - - if (options.debug) { - setRequestHeadersOnNextResponse(finalRes, nextRequest, { [constants.Headers.EnableDebug]: 'true' }); - logger.debug(`Added ${constants.Headers.EnableDebug} on request`); - } - - const result = decorateRequest(clerkRequest, finalRes, requestState, { secretKey }) || NextResponse.next(); - - if (requestState.headers) { - requestState.headers.forEach((value, key) => { - result.headers.append(key, value); - }); - } - - return result; - }); -}; - -export { authMiddleware }; - -const createDefaultAfterAuth = ( - isPublicRoute: ReturnType, - isApiRoute: ReturnType, - options: { signInUrl: string; signUpUrl: string; publishableKey: string; secretKey: string }, -) => { - return (auth: AuthObject, req: WithExperimentalClerkUrl) => { - if (!auth.userId && !isPublicRoute(req)) { - if (isApiRoute(req)) { - informAboutProtectedRoute(req.experimental_clerkUrl.pathname, options, true); - return apiEndpointUnauthorizedNextResponse(); - } else { - informAboutProtectedRoute(req.experimental_clerkUrl.pathname, options, false); - } - return createRedirect({ - redirectAdapter, - signInUrl: options.signInUrl, - signUpUrl: options.signUpUrl, - publishableKey: options.publishableKey, - // We're setting baseUrl to '' here as we want to keep the legacy behavior of - // the redirectToSignIn, redirectToSignUp helpers in the backend package. - baseUrl: '', - }).redirectToSignIn({ returnBackUrl: req.experimental_clerkUrl.href }); - } - return NextResponse.next(); - }; -}; - -const matchRoutesStartingWith = (path: string) => { - path = path.replace(/\/$/, ''); - return new RegExp(`^${path}(/.*)?$`); -}; - -const withDefaultPublicRoutes = (publicRoutes: RouteMatcherParam | undefined) => { - if (typeof publicRoutes === 'function') { - return publicRoutes; - } - - const routes = [publicRoutes || ''].flat().filter(Boolean); - // TODO: refactor it to use common config file eg SIGN_IN_URL from ./clerkClient - // we use process.env for now to support testing - const signInUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || ''; - if (signInUrl) { - routes.push(matchRoutesStartingWith(signInUrl)); - } - // TODO: refactor it to use common config file eg SIGN_UP_URL from ./clerkClient - // we use process.env for now to support testing - const signUpUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || ''; - if (signUpUrl) { - routes.push(matchRoutesStartingWith(signUpUrl)); - } - return routes; -}; - -// - Default behavior: -// If the route path is `['/api/(.*)*', '*/trpc/(.*)']` -// or Request has `Content-Type: application/json` -// or Request method is not-GET,OPTIONS,HEAD, -// then this is considered an API route. -// -// - If the user has provided a specific `apiRoutes` prop in `authMiddleware` then all the above are discarded, -// and only routes that match the user’s provided paths are considered API routes. -const createApiRoutes = ( - apiRoutes: RouteMatcherParam | undefined, -): ((req: WithExperimentalClerkUrl) => boolean) => { - if (apiRoutes) { - return createRouteMatcher(apiRoutes); - } - const isDefaultApiRoute = createRouteMatcher(DEFAULT_API_ROUTES); - return (req: WithExperimentalClerkUrl) => - isDefaultApiRoute(req) || isRequestMethodIndicatingApiRoute(req) || isRequestContentTypeJson(req); -}; - -const isRequestContentTypeJson = (req: NextRequest): boolean => { - const requestContentType = req.headers.get(constants.Headers.ContentType); - return requestContentType === constants.ContentTypes.Json; -}; - -const isRequestMethodIndicatingApiRoute = (req: NextRequest): boolean => { - const requestMethod = req.method.toLowerCase(); - return !['get', 'head', 'options'].includes(requestMethod); -}; - -const withNormalizedClerkUrl = ( - clerkRequest: ClerkRequest, - nextRequest: NextRequest, -): WithExperimentalClerkUrl => { - const res = nextRequest.nextUrl.clone(); - res.port = clerkRequest.clerkUrl.port; - res.protocol = clerkRequest.clerkUrl.protocol; - res.host = clerkRequest.clerkUrl.host; - return Object.assign(nextRequest, { experimental_clerkUrl: res }); -}; - -const informAboutProtectedRoute = ( - path: string, - options: AuthMiddlewareParams & { secretKey: string }, - isApiRoute: boolean, -) => { - if (options.debug || isDevelopmentFromSecretKey(options.secretKey)) { - console.warn( - informAboutProtectedRouteInfo( - path, - !!options.publicRoutes, - !!options.ignoredRoutes, - isApiRoute, - DEFAULT_IGNORED_ROUTES, - ), - ); - } -}; diff --git a/packages/nextjs/src/server/buildClerkProps.ts b/packages/nextjs/src/server/buildClerkProps.ts index f9cb3f41eb..a6f51aa068 100644 --- a/packages/nextjs/src/server/buildClerkProps.ts +++ b/packages/nextjs/src/server/buildClerkProps.ts @@ -1,17 +1,8 @@ -import type { Organization, Session, User } from '@clerk/backend'; -import { - AuthStatus, - constants, - makeAuthObjectSerializable, - signedInAuthObject, - signedOutAuthObject, - stripPrivateDataFromObject, -} from '@clerk/backend/internal'; -import { decodeJwt } from '@clerk/backend/jwt'; +import type { AuthObject, Organization, Session, User } from '@clerk/backend'; +import { makeAuthObjectSerializable, stripPrivateDataFromObject } from '@clerk/backend/internal'; -import { API_URL, API_VERSION, SECRET_KEY } from './constants'; +import { getAuthDataFromRequest } from './data/getAuthDataFromRequest'; import type { RequestLike } from './types'; -import { decryptClerkRequestData, getAuthKeyFromRequest, getHeader, injectSSRStateIntoObject } from './utils'; type BuildClerkPropsInitState = { user?: User | null; session?: Session | null; organization?: Organization | null }; @@ -33,34 +24,18 @@ type BuildClerkPropsInitState = { user?: User | null; session?: Session | null; */ type BuildClerkProps = (req: RequestLike, authState?: BuildClerkPropsInitState) => Record; -export const buildClerkProps: BuildClerkProps = (req, initState = {}) => { - const authStatus = getAuthKeyFromRequest(req, 'AuthStatus'); - const authToken = getAuthKeyFromRequest(req, 'AuthToken'); - const authMessage = getAuthKeyFromRequest(req, 'AuthMessage'); - const authReason = getAuthKeyFromRequest(req, 'AuthReason'); +export const buildClerkProps: BuildClerkProps = (req, initialState = {}) => { + const sanitizedAuthObject = getDynamicAuthData(req, initialState); - const encryptedRequestData = getHeader(req, constants.Headers.ClerkRequestData); - const decryptedRequestData = decryptClerkRequestData(encryptedRequestData); - - const options = { - secretKey: decryptedRequestData.secretKey || SECRET_KEY, - apiUrl: API_URL, - apiVersion: API_VERSION, - authStatus, - authMessage, - authReason, - }; - - let authObject; - if (!authStatus || authStatus !== AuthStatus.SignedIn) { - authObject = signedOutAuthObject(options); - } else { - const jwt = decodeJwt(authToken as string); + // Serializing the state on dev env is a temp workaround for the following issue: + // https://github.com/vercel/next.js/discussions/11209|Next.js + const __clerk_ssr_state = + process.env.NODE_ENV !== 'production' ? JSON.parse(JSON.stringify(sanitizedAuthObject)) : sanitizedAuthObject; + return { __clerk_ssr_state }; +}; - // @ts-expect-error - TODO @nikos: Align types - authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload); - } +export function getDynamicAuthData(req: RequestLike, initialState = {}) { + const authObject = getAuthDataFromRequest(req); - const sanitizedAuthObject = makeAuthObjectSerializable(stripPrivateDataFromObject({ ...authObject, ...initState })); - return injectSSRStateIntoObject({}, sanitizedAuthObject); -}; + return makeAuthObjectSerializable(stripPrivateDataFromObject({ ...authObject, ...initialState })) as AuthObject; +} diff --git a/packages/nextjs/src/server/clerkClient.ts b/packages/nextjs/src/server/clerkClient.ts index 84d3ba236a..59c05a5fe0 100644 --- a/packages/nextjs/src/server/clerkClient.ts +++ b/packages/nextjs/src/server/clerkClient.ts @@ -1,7 +1,5 @@ -import type { ClerkClient } from '@clerk/backend'; import { createClerkClient } from '@clerk/backend'; import { constants } from '@clerk/backend/internal'; -import { deprecated } from '@clerk/shared/deprecated'; import { buildRequestLike, isPrerenderingBailout } from '../app-router/server/utils'; import { clerkMiddlewareRequestDataStorage } from './clerkMiddleware'; @@ -38,21 +36,15 @@ const clerkClientDefaultOptions = { const createClerkClientWithOptions: typeof createClerkClient = options => createClerkClient({ ...clerkClientDefaultOptions, ...options }); -/** - * @deprecated - * This singleton is deprecated and will be removed in a future release. Please use `clerkClient()` as a function instead. - */ -const clerkClientSingleton = createClerkClient(clerkClientDefaultOptions); - /** * Constructs a BAPI client that accesses request data within the runtime. * Necessary if middleware dynamic keys are used. */ -const clerkClientForRequest = () => { +const clerkClient = async () => { let requestData; try { - const request = buildRequestLike(); + const request = await buildRequestLike(); const encryptedRequestData = getHeader(request, constants.Headers.ClerkRequestData); requestData = decryptClerkRequestData(encryptedRequestData); } catch (err) { @@ -67,20 +59,7 @@ const clerkClientForRequest = () => { return createClerkClientWithOptions(options); } - return clerkClientSingleton; + return createClerkClientWithOptions({}); }; -interface ClerkClientExport extends ClerkClient { - (): ClerkClient; -} - -// TODO SDK-1839 - Remove `clerkClient` singleton in the next major version of `@clerk/nextjs` -const clerkClient = new Proxy(Object.assign(clerkClientForRequest, clerkClientSingleton), { - get(target, prop: string, receiver) { - deprecated('clerkClient singleton', 'Use `clerkClient()` as a function instead.'); - - return Reflect.get(target, prop, receiver); - }, -}) as ClerkClientExport; - export { clerkClient }; diff --git a/packages/nextjs/src/server/clerkMiddleware.ts b/packages/nextjs/src/server/clerkMiddleware.ts index 592064c8a3..93668e3cf7 100644 --- a/packages/nextjs/src/server/clerkMiddleware.ts +++ b/packages/nextjs/src/server/clerkMiddleware.ts @@ -12,6 +12,14 @@ import { withLogger } from '../utils/debugLogger'; import { clerkClient } from './clerkClient'; import { PUBLISHABLE_KEY, SECRET_KEY, SIGN_IN_URL, SIGN_UP_URL } from './constants'; import { errorThrower } from './errorThrower'; +import { + isNextjsNotFoundError, + isNextjsRedirectError, + isRedirectToSignInError, + nextjsNotFound, + nextjsRedirectError, + redirectToSignInError, +} from './nextErrors'; import type { AuthProtect } from './protect'; import { createProtect } from './protect'; import type { NextMiddlewareEvtParam, NextMiddlewareRequestParam, NextMiddlewareReturn } from './types'; @@ -23,18 +31,14 @@ import { setRequestHeadersOnNextResponse, } from './utils'; -const CONTROL_FLOW_ERROR = { - FORCE_NOT_FOUND: 'CLERK_PROTECT_REWRITE', - REDIRECT_TO_URL: 'CLERK_PROTECT_REDIRECT_TO_URL', - REDIRECT_TO_SIGN_IN: 'CLERK_PROTECT_REDIRECT_TO_SIGN_IN', -}; - export type ClerkMiddlewareAuthObject = AuthObject & { - protect: AuthProtect; redirectToSignIn: RedirectFun; }; -export type ClerkMiddlewareAuth = () => ClerkMiddlewareAuthObject; +export interface ClerkMiddlewareAuth { + (): Promise; + protect: AuthProtect; +} type ClerkMiddlewareHandler = ( auth: ClerkMiddlewareAuth, @@ -56,16 +60,19 @@ interface ClerkMiddleware { * export default clerkMiddleware((auth, request, event) => { ... }, options); */ (handler: ClerkMiddlewareHandler, options?: ClerkMiddlewareOptions): NextMiddleware; + /** * @example * export default clerkMiddleware((auth, request, event) => { ... }, (req) => options); */ (handler: ClerkMiddlewareHandler, options?: ClerkMiddlewareOptionsCallback): NextMiddleware; + /** * @example * export default clerkMiddleware(options); */ (options?: ClerkMiddlewareOptions): NextMiddleware; + /** * @example * export default clerkMiddleware; @@ -76,7 +83,8 @@ interface ClerkMiddleware { const clerkMiddlewareRequestDataStore = new Map<'requestData', AuthenticateRequestOptions>(); export const clerkMiddlewareRequestDataStorage = new AsyncLocalStorage(); -export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => { +// @ts-expect-error TS is not happy here. Will dig into it +export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]) => { const [request, event] = parseRequestAndEvent(args); const [handler, params] = parseHandlerAndOptions(args); @@ -105,7 +113,9 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => { // Propagates the request data to be accessed on the server application runtime from helpers such as `clerkClient` clerkMiddlewareRequestDataStore.set('requestData', options); - clerkClient().telemetry.record( + const resolvedClerkClient = await clerkClient(); + + resolvedClerkClient.telemetry.record( eventMethodCalled('clerkMiddleware', { handler: Boolean(handler), satellite: Boolean(options.isSatellite), @@ -120,7 +130,7 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => { logger.debug('options', options); logger.debug('url', () => clerkRequest.toJSON()); - const requestState = await clerkClient().authenticateRequest( + const requestState = await resolvedClerkClient.authenticateRequest( clerkRequest, createAuthenticateRequestOptions(clerkRequest, options), ); @@ -142,14 +152,17 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => { logger.debug('auth', () => ({ auth: authObject, debug: authObject.debug() })); const redirectToSignIn = createMiddlewareRedirectToSignIn(clerkRequest); - const protect = createMiddlewareProtect(clerkRequest, authObject, redirectToSignIn); - const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(authObject, { protect, redirectToSignIn }); + const protect = await createMiddlewareProtect(clerkRequest, authObject, redirectToSignIn); + + const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(authObject, { redirectToSignIn }); + const authHandler = () => Promise.resolve(authObjWithMethods); + authHandler.protect = protect; let handlerResult: Response = NextResponse.next(); try { const userHandlerResult = await clerkMiddlewareRequestDataStorage.run( clerkMiddlewareRequestDataStore, - async () => handler?.(() => authObjWithMethods, request, event), + async () => handler?.(authHandler, request, event), ); handlerResult = userHandlerResult || handlerResult; } catch (e: any) { @@ -220,9 +233,8 @@ const createMiddlewareRedirectToSignIn = ( clerkRequest: ClerkRequest, ): ClerkMiddlewareAuthObject['redirectToSignIn'] => { return (opts = {}) => { - const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN) as any; - err.returnBackUrl = opts.returnBackUrl === null ? '' : opts.returnBackUrl || clerkRequest.clerkUrl.toString(); - throw err; + const url = clerkRequest.clerkUrl.toString(); + redirectToSignInError(url, opts.returnBackUrl); }; }; @@ -230,21 +242,17 @@ const createMiddlewareProtect = ( clerkRequest: ClerkRequest, authObject: AuthObject, redirectToSignIn: RedirectFun, -): ClerkMiddlewareAuthObject['protect'] => { - return ((params, options) => { - const notFound = () => { - throw new Error(CONTROL_FLOW_ERROR.FORCE_NOT_FOUND) as any; - }; - - const redirect = (url: string) => { - const err = new Error(CONTROL_FLOW_ERROR.REDIRECT_TO_URL) as any; - err.redirectUrl = url; - throw err; - }; - - // @ts-expect-error TS is not happy even though the types are correct +) => { + return (async (params: any, options: any) => { + const notFound = () => nextjsNotFound(); + + const redirect = (url: string) => + nextjsRedirectError(url, { + redirectUrl: url, + }); + return createProtect({ request: clerkRequest, redirect, notFound, authObject, redirectToSignIn })(params, options); - }) as AuthProtect; + }) as unknown as Promise; }; // Handle errors thrown by protect() and redirectToSignIn() calls, @@ -255,25 +263,28 @@ const createMiddlewareProtect = ( // This function handles the known errors thrown by the APIs described above, // and returns the appropriate response. const handleControlFlowErrors = (e: any, clerkRequest: ClerkRequest, requestState: RequestState): Response => { - switch (e.message) { - case CONTROL_FLOW_ERROR.FORCE_NOT_FOUND: - // Rewrite to a bogus URL to force not found error - return setHeader( - NextResponse.rewrite(`${clerkRequest.clerkUrl.origin}/clerk_${Date.now()}`), - constants.Headers.AuthReason, - 'protect-rewrite', - ); - case CONTROL_FLOW_ERROR.REDIRECT_TO_URL: - return redirectAdapter(e.redirectUrl); - case CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN: - return createRedirect({ - redirectAdapter, - baseUrl: clerkRequest.clerkUrl, - signInUrl: requestState.signInUrl, - signUpUrl: requestState.signUpUrl, - publishableKey: requestState.publishableKey, - }).redirectToSignIn({ returnBackUrl: e.returnBackUrl }); - default: - throw e; + if (isNextjsNotFoundError(e)) { + // Rewrite to a bogus URL to force not found error + return setHeader( + NextResponse.rewrite(`${clerkRequest.clerkUrl.origin}/clerk_${Date.now()}`), + constants.Headers.AuthReason, + 'protect-rewrite', + ); } + + if (isRedirectToSignInError(e)) { + return createRedirect({ + redirectAdapter, + baseUrl: clerkRequest.clerkUrl, + signInUrl: requestState.signInUrl, + signUpUrl: requestState.signUpUrl, + publishableKey: requestState.publishableKey, + }).redirectToSignIn({ returnBackUrl: e.returnBackUrl }); + } + + if (isNextjsRedirectError(e)) { + return redirectAdapter(e.redirectUrl); + } + + throw e; }; diff --git a/packages/nextjs/src/server/createGetAuth.ts b/packages/nextjs/src/server/createGetAuth.ts index 39b60a0d4d..c8acc34ff6 100644 --- a/packages/nextjs/src/server/createGetAuth.ts +++ b/packages/nextjs/src/server/createGetAuth.ts @@ -1,12 +1,13 @@ import type { AuthObject } from '@clerk/backend'; -import { AuthStatus, constants, signedInAuthObject, signedOutAuthObject } from '@clerk/backend/internal'; +import { constants } from '@clerk/backend/internal'; import { decodeJwt } from '@clerk/backend/jwt'; +import { isTruthy } from '@clerk/shared'; import { withLogger } from '../utils/debugLogger'; -import { API_URL, API_VERSION, SECRET_KEY } from './constants'; +import { getAuthDataFromRequest } from './data/getAuthDataFromRequest'; import { getAuthAuthHeaderMissing } from './errors'; import type { RequestLike } from './types'; -import { assertTokenSignature, decryptClerkRequestData, getAuthKeyFromRequest, getCookie, getHeader } from './utils'; +import { assertAuthStatus, getCookie, getHeader } from './utils'; export const createGetAuth = ({ noAuthStatusMessage, @@ -17,50 +18,13 @@ export const createGetAuth = ({ }) => withLogger(debugLoggerName, logger => { return (req: RequestLike, opts?: { secretKey?: string }): AuthObject => { - if (getHeader(req, constants.Headers.EnableDebug) === 'true') { + if (isTruthy(getHeader(req, constants.Headers.EnableDebug))) { logger.enable(); } - // When the auth status is set, we trust that the middleware has already run - // Then, we don't have to re-verify the JWT here, - // we can just strip out the claims manually. - const authToken = getAuthKeyFromRequest(req, 'AuthToken'); - const authSignature = getAuthKeyFromRequest(req, 'AuthSignature'); - const authMessage = getAuthKeyFromRequest(req, 'AuthMessage'); - const authReason = getAuthKeyFromRequest(req, 'AuthReason'); - const authStatus = getAuthKeyFromRequest(req, 'AuthStatus') as AuthStatus; - logger.debug('Headers debug', { authStatus, authMessage, authReason }); + assertAuthStatus(req, noAuthStatusMessage); - if (!authStatus) { - throw new Error(noAuthStatusMessage); - } - - const encryptedRequestData = getHeader(req, constants.Headers.ClerkRequestData); - const decryptedRequestData = decryptClerkRequestData(encryptedRequestData); - - const options = { - authStatus, - apiUrl: API_URL, - apiVersion: API_VERSION, - authMessage, - secretKey: opts?.secretKey || decryptedRequestData.secretKey || SECRET_KEY, - authReason, - }; - - logger.debug('Options debug', options); - - if (authStatus === AuthStatus.SignedIn) { - assertTokenSignature(authToken as string, options.secretKey, authSignature); - - const jwt = decodeJwt(authToken as string); - - logger.debug('JWT debug', jwt.raw.text); - - // @ts-expect-error - TODO @nikos: Align types - return signedInAuthObject(options, jwt.raw.text, jwt.payload); - } - - return signedOutAuthObject(options); + return getAuthDataFromRequest(req, { ...opts, logger }); }; }); diff --git a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts new file mode 100644 index 0000000000..69cbe911ad --- /dev/null +++ b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts @@ -0,0 +1,55 @@ +import type { AuthObject } from '@clerk/backend'; +import { AuthStatus, constants, signedInAuthObject, signedOutAuthObject } from '@clerk/backend/internal'; +import { decodeJwt } from '@clerk/backend/jwt'; + +import type { LoggerNoCommit } from '../../utils/debugLogger'; +import { API_URL, API_VERSION, SECRET_KEY } from '../constants'; +import type { RequestLike } from '../types'; +import { assertTokenSignature, decryptClerkRequestData, getAuthKeyFromRequest, getHeader } from '../utils'; + +/** + * Given a request object, builds an auth object from the request data. Used in server-side environments to get access + * to auth data for a given request. + */ +export function getAuthDataFromRequest( + req: RequestLike, + opts: { secretKey?: string; logger?: LoggerNoCommit } = {}, +): AuthObject { + const authStatus = getAuthKeyFromRequest(req, 'AuthStatus'); + const authToken = getAuthKeyFromRequest(req, 'AuthToken'); + const authMessage = getAuthKeyFromRequest(req, 'AuthMessage'); + const authReason = getAuthKeyFromRequest(req, 'AuthReason'); + const authSignature = getAuthKeyFromRequest(req, 'AuthSignature'); + + opts.logger?.debug('headers', { authStatus, authMessage, authReason }); + + const encryptedRequestData = getHeader(req, constants.Headers.ClerkRequestData); + const decryptedRequestData = decryptClerkRequestData(encryptedRequestData); + + const options = { + secretKey: opts?.secretKey || decryptedRequestData.secretKey || SECRET_KEY, + apiUrl: API_URL, + apiVersion: API_VERSION, + authStatus, + authMessage, + authReason, + }; + + opts.logger?.debug('auth options', options); + + let authObject; + if (!authStatus || authStatus !== AuthStatus.SignedIn) { + authObject = signedOutAuthObject(options); + } else { + assertTokenSignature(authToken as string, options.secretKey, authSignature); + + const jwt = decodeJwt(authToken as string); + + opts.logger?.debug('jwt', jwt.raw); + + // @ts-expect-error -- Restrict parameter type of options to only list what's needed + authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload); + } + + return authObject; +} diff --git a/packages/nextjs/src/server/errors.ts b/packages/nextjs/src/server/errors.ts index eba3589e23..fa179ff167 100644 --- a/packages/nextjs/src/server/errors.ts +++ b/packages/nextjs/src/server/errors.ts @@ -2,7 +2,7 @@ export const missingDomainAndProxy = ` Missing domain and proxyUrl. A satellite application needs to specify a domain or a proxyUrl. 1) With middleware - e.g. export default clerkMiddleware({domain:'YOUR_DOMAIN',isSatellite:true}); // or the deprecated authMiddleware() + e.g. export default clerkMiddleware({domain:'YOUR_DOMAIN',isSatellite:true}); 2) With environment variables e.g. NEXT_PUBLIC_CLERK_DOMAIN='YOUR_DOMAIN' NEXT_PUBLIC_CLERK_IS_SATELLITE='true' @@ -13,26 +13,16 @@ Invalid signInUrl. A satellite application requires a signInUrl for development Check if signInUrl is missing from your configuration or if it is not an absolute URL 1) With middleware - e.g. export default clerkMiddleware({signInUrl:'SOME_URL', isSatellite:true}); // or the deprecated authMiddleware() + e.g. export default clerkMiddleware({signInUrl:'SOME_URL', isSatellite:true}); 2) With environment variables e.g. NEXT_PUBLIC_CLERK_SIGN_IN_URL='SOME_URL' NEXT_PUBLIC_CLERK_IS_SATELLITE='true'`; -export const receivedRequestForIgnoredRoute = (url: string, matcher: string) => - `Clerk: The middleware was skipped for this request URL: ${url}. For performance reasons, it's recommended to your middleware matcher to: -export const config = { - matcher: ${matcher}, -}; - -Alternatively, you can set your own ignoredRoutes. See https://clerk.com/docs/nextjs/middleware -(This log only appears in development mode) -`; - export const getAuthAuthHeaderMissing = () => authAuthHeaderMissing('getAuth'); export const authAuthHeaderMissing = (helperName = 'auth') => - `Clerk: ${helperName}() was called but Clerk can't detect usage of clerkMiddleware() (or the deprecated authMiddleware()). Please ensure the following: -- clerkMiddleware() (or the deprecated authMiddleware()) is used in your Next.js Middleware. + `Clerk: ${helperName}() was called but Clerk can't detect usage of clerkMiddleware(). Please ensure the following: +- clerkMiddleware() is used in your Next.js Middleware. - Your Middleware matcher is configured to match this route or page. - If you are using the src directory, make sure the Middleware file is inside of it. @@ -48,54 +38,6 @@ To resolve this issue, make sure your system's clock is set to the correct time ${verifyMessage}`; -export const infiniteRedirectLoopDetected = () => - `Clerk: Infinite redirect loop detected. That usually means that we were not able to determine the auth state for this request. A list of common causes and solutions follows. - -Reason 1: -Your Clerk instance keys are incorrect, or you recently changed keys (Publishable Key, Secret Key). -How to resolve: --> Make sure you're using the correct keys from the Clerk Dashboard. If you changed keys recently, make sure to clear your browser application data and cookies. - -Reason 2: -A bug that may have already been fixed in the latest version of Clerk NextJS package. -How to resolve: --> Make sure you are using the latest version of '@clerk/nextjs' and 'next'. -`; - -export const informAboutProtectedRouteInfo = ( - path: string, - hasPublicRoutes: boolean, - hasIgnoredRoutes: boolean, - isApiRoute: boolean, - defaultIgnoredRoutes: string[], -) => { - const infoText = isApiRoute - ? `INFO: Clerk: The request to ${path} is being protected (401) because there is no signed-in user, and the path is included in \`apiRoutes\`. To prevent this behavior, choose one of:` - : `INFO: Clerk: The request to ${path} is being redirected because there is no signed-in user, and the path is not included in \`ignoredRoutes\` or \`publicRoutes\`. To prevent this behavior, choose one of:`; - const apiRoutesText = isApiRoute - ? `To prevent Clerk authentication from protecting (401) the api route, remove the rule matching "${path}" from the \`apiRoutes\` array passed to authMiddleware` - : undefined; - const publicRoutesText = hasPublicRoutes - ? `To make the route accessible to both signed in and signed out users, add "${path}" to the \`publicRoutes\` array passed to authMiddleware` - : `To make the route accessible to both signed in and signed out users, pass \`publicRoutes: ["${path}"]\` to authMiddleware`; - const ignoredRoutes = [...defaultIgnoredRoutes, path].map(r => `"${r}"`).join(', '); - const ignoredRoutesText = hasIgnoredRoutes - ? `To prevent Clerk authentication from running at all, add "${path}" to the \`ignoredRoutes\` array passed to authMiddleware` - : `To prevent Clerk authentication from running at all, pass \`ignoredRoutes: [${ignoredRoutes}]\` to authMiddleware`; - const afterAuthText = - "Pass a custom `afterAuth` to authMiddleware, and replace Clerk's default behavior of redirecting unless a route is included in publicRoutes"; - - return `${infoText} - -${[apiRoutesText, publicRoutesText, ignoredRoutesText, afterAuthText] - .filter(Boolean) - .map((text, index) => `${index + 1}. ${text}`) - .join('\n')} - -For additional information about middleware, please visit https://clerk.com/docs/nextjs/middleware -(This log only appears in development mode, or if \`debug: true\` is passed to authMiddleware)`; -}; - export const authSignatureInvalid = `Clerk: Unable to verify request, this usually means the Clerk middleware did not run. Ensure Clerk's middleware is properly integrated and matches the current route. For more information, see: https://clerk.com/docs/nextjs/middleware. (code=auth_signature_invalid)`; export const encryptionKeyInvalid = `Clerk: Unable to decrypt request data, this usually means the encryption key is invalid. Ensure the encryption key is properly set. For more information, see: https://clerk.com/docs/references/nextjs/clerk-middleware#dynamic-keys. (code=encryption_key_invalid)`; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index cbfa2e800b..f7f4e07321 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -63,10 +63,3 @@ export type { Token, User, } from '@clerk/backend'; - -/** - * Deprecated APIs - * These APIs will be removed in v6 - */ -export { authMiddleware } from './authMiddleware'; -export { redirectToSignIn, redirectToSignUp } from './redirectHelpers'; diff --git a/packages/nextjs/src/server/nextErrors.ts b/packages/nextjs/src/server/nextErrors.ts new file mode 100644 index 0000000000..c0594fd3a3 --- /dev/null +++ b/packages/nextjs/src/server/nextErrors.ts @@ -0,0 +1,111 @@ +/** + * Clerk's identifiers that are used alongside the ones from Next.js + */ +const CONTROL_FLOW_ERROR = { + FORCE_NOT_FOUND: 'CLERK_PROTECT_REWRITE', + REDIRECT_TO_URL: 'CLERK_PROTECT_REDIRECT_TO_URL', + REDIRECT_TO_SIGN_IN: 'CLERK_PROTECT_REDIRECT_TO_SIGN_IN', +}; + +/** + * In-house implementation of `notFound()` + * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/components/not-found.ts + */ +const NOT_FOUND_ERROR_CODE = 'NEXT_NOT_FOUND'; + +type NotFoundError = Error & { + digest: typeof NOT_FOUND_ERROR_CODE; + clerk_digest: typeof CONTROL_FLOW_ERROR.FORCE_NOT_FOUND; +}; + +function isNextjsNotFoundError(error: unknown): error is NotFoundError { + if (typeof error !== 'object' || error === null || !('digest' in error)) { + return false; + } + + return error.digest === NOT_FOUND_ERROR_CODE; +} + +function nextjsNotFound(): never { + const error = new Error(NOT_FOUND_ERROR_CODE); + (error as NotFoundError).digest = NOT_FOUND_ERROR_CODE; + (error as NotFoundError).clerk_digest = CONTROL_FLOW_ERROR.FORCE_NOT_FOUND; + throw error; +} + +/** + * In-house implementation of `redirect()` + * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/components/redirect.ts + */ + +const REDIRECT_ERROR_CODE = 'NEXT_REDIRECT'; + +type RedirectError = Error & { + digest: `${typeof REDIRECT_ERROR_CODE};${'replace'};${string};${307};`; + clerk_digest: typeof CONTROL_FLOW_ERROR.REDIRECT_TO_URL | typeof CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN; +} & T; + +function nextjsRedirectError( + url: string, + extra: Record, + type: 'replace' = 'replace', + statusCode: 307 = 307, +): never { + const error = new Error(REDIRECT_ERROR_CODE) as RedirectError; + error.digest = `${REDIRECT_ERROR_CODE};${type};${url};${statusCode};`; + error.clerk_digest = CONTROL_FLOW_ERROR.REDIRECT_TO_URL; + Object.assign(error, extra); + throw error; +} + +function redirectToSignInError(url: string, returnBackUrl?: string | URL | null): never { + nextjsRedirectError(url, { + clerk_digest: CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN, + returnBackUrl: returnBackUrl === null ? '' : returnBackUrl || url, + }); +} + +/** + * Checks an error to determine if it's an error generated by the + * `redirect(url)` helper. + * + * @param error the error that may reference a redirect error + * @returns true if the error is a redirect error + */ +function isNextjsRedirectError(error: unknown): error is RedirectError<{ redirectUrl: string | URL }> { + if (typeof error !== 'object' || error === null || !('digest' in error) || typeof error.digest !== 'string') { + return false; + } + + const digest = error.digest.split(';'); + const [errorCode, type] = digest; + const destination = digest.slice(2, -2).join(';'); + const status = digest.at(-2); + + const statusCode = Number(status); + + return ( + errorCode === REDIRECT_ERROR_CODE && + (type === 'replace' || type === 'push') && + typeof destination === 'string' && + !isNaN(statusCode) && + statusCode === 307 + ); +} + +function isRedirectToSignInError(error: unknown): error is RedirectError<{ returnBackUrl: string | URL }> { + if (isNextjsRedirectError(error) && 'clerk_digest' in error) { + return error.clerk_digest === CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN; + } + + return false; +} + +export { + isNextjsNotFoundError, + nextjsNotFound, + redirectToSignInError, + nextjsRedirectError, + isNextjsRedirectError, + isRedirectToSignInError, +}; diff --git a/packages/nextjs/src/server/nextFetcher.ts b/packages/nextjs/src/server/nextFetcher.ts index 7a73ade19c..8ad2ef96bf 100644 --- a/packages/nextjs/src/server/nextFetcher.ts +++ b/packages/nextjs/src/server/nextFetcher.ts @@ -12,7 +12,14 @@ type NextFetcher = Fetcher & { * Full type can be found https://github.com/vercel/next.js/blob/6185444e0a944a82e7719ac37dad8becfed86acd/packages/next/src/client/components/static-generation-async-storage.external.ts#L4 */ interface StaticGenerationAsyncStorage { + /** + * Available for Next 14 + */ readonly pagePath?: string; + /** + * Available for Next 15 + */ + readonly page?: string; } function isNextFetcher(fetch: Fetcher | NextFetcher): fetch is NextFetcher { diff --git a/packages/nextjs/src/server/protect.ts b/packages/nextjs/src/server/protect.ts index 0d9721aa8c..7e17e37817 100644 --- a/packages/nextjs/src/server/protect.ts +++ b/packages/nextjs/src/server/protect.ts @@ -15,17 +15,17 @@ type AuthProtectOptions = { unauthorizedUrl?: string; unauthenticatedUrl?: strin * Throws a Nextjs notFound error if user is not authenticated or authorized. */ export interface AuthProtect { - (params?: CheckAuthorizationParamsWithCustomPermissions, options?: AuthProtectOptions): SignedInAuthObject; + (params?: CheckAuthorizationParamsWithCustomPermissions, options?: AuthProtectOptions): Promise; ( params?: (has: CheckAuthorizationWithCustomPermissions) => boolean, options?: AuthProtectOptions, - ): SignedInAuthObject; + ): Promise; - (options?: AuthProtectOptions): SignedInAuthObject; + (options?: AuthProtectOptions): Promise; } -export const createProtect = (opts: { +export function createProtect(opts: { request: Request; authObject: AuthObject; /** @@ -44,10 +44,10 @@ export const createProtect = (opts: { * use this callback to customise the behavior */ redirectToSignIn: RedirectFun; -}): AuthProtect => { +}): AuthProtect { const { redirectToSignIn, authObject, redirect, notFound, request } = opts; - return ((...args: any[]) => { + return (async (...args: any[]) => { const optionValuesAsParam = args[0]?.unauthenticatedUrl || args[0]?.unauthorizedUrl; const paramsOrFunction = optionValuesAsParam ? undefined @@ -108,7 +108,7 @@ export const createProtect = (opts: { return handleUnauthorized(); }) as AuthProtect; -}; +} const isServerActionRequest = (req: Request) => { return ( @@ -134,7 +134,19 @@ const isAppRouterInternalNavigation = (req: Request) => const isPagePathAvailable = () => { const __fetch = globalThis.fetch; - return Boolean(isNextFetcher(__fetch) ? __fetch.__nextGetStaticStore().getStore()?.pagePath : false); + + if (!isNextFetcher(__fetch)) { + return false; + } + + const { page, pagePath } = __fetch.__nextGetStaticStore().getStore() || {}; + + return Boolean( + // available on next@14 + pagePath || + // available on next@15 + page, + ); }; const isPagesRouterInternalNavigation = (req: Request) => !!req.headers.get(nextConstants.Headers.NextjsData); diff --git a/packages/nextjs/src/server/redirectHelpers.ts b/packages/nextjs/src/server/redirectHelpers.ts deleted file mode 100644 index 8a95633588..0000000000 --- a/packages/nextjs/src/server/redirectHelpers.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { constants, createRedirect } from '@clerk/backend/internal'; -import { NextResponse } from 'next/server'; - -import { setHeader } from '../utils'; -import { PUBLISHABLE_KEY, SIGN_IN_URL, SIGN_UP_URL } from './constants'; - -const redirectAdapter = (url: string) => { - const res = NextResponse.redirect(url); - return setHeader(res, constants.Headers.ClerkRedirectTo, 'true'); -}; - -const redirectHelpers = createRedirect({ - redirectAdapter, - signInUrl: SIGN_IN_URL, - signUpUrl: SIGN_UP_URL, - publishableKey: PUBLISHABLE_KEY, - // We're setting baseUrl to '' here as we want to keep the legacy behavior of - // the redirectToSignIn, redirectToSignUp helpers in the backend package. - baseUrl: '', -}); - -/** - * @deprecated - * This function is deprecated and will be removed in a future release. Please use `auth().redirectToSignIn()` instead. - */ -export const redirectToSignIn = redirectHelpers.redirectToSignIn; - -/** - * @deprecated - * This function is deprecated and will be removed in a future release. Please use `auth().redirectToSignIn()` instead. - */ -export const redirectToSignUp = redirectHelpers.redirectToSignUp; diff --git a/packages/nextjs/src/server/utils.ts b/packages/nextjs/src/server/utils.ts index 29b558f2e4..90c2a0cb4c 100644 --- a/packages/nextjs/src/server/utils.ts +++ b/packages/nextjs/src/server/utils.ts @@ -92,15 +92,6 @@ export const setRequestHeadersOnNextResponse = ( }); }; -export const injectSSRStateIntoObject = (obj: O, authObject: T) => { - // Serializing the state on dev env is a temp workaround for the following issue: - // https://github.com/vercel/next.js/discussions/11209|Next.js - const __clerk_ssr_state = ( - process.env.NODE_ENV !== 'production' ? JSON.parse(JSON.stringify({ ...authObject })) : { ...authObject } - ) as T; - return { ...obj, __clerk_ssr_state }; -}; - // Auth result will be set as both a query param & header when applicable export function decorateRequest( req: ClerkRequest, @@ -196,6 +187,14 @@ export const redirectAdapter = (url: string | URL) => { return NextResponse.redirect(url, { headers: { [constants.Headers.ClerkRedirectTo]: 'true' } }); }; +export function assertAuthStatus(req: RequestLike, error: string) { + const authStatus = getAuthKeyFromRequest(req, 'AuthStatus'); + + if (!authStatus) { + throw new Error(error); + } +} + export function assertKey(key: string, onError: () => never): string { if (!key) { onError(); diff --git a/packages/nextjs/src/types.ts b/packages/nextjs/src/types.ts index d0eb56cbe6..96a89d74e5 100644 --- a/packages/nextjs/src/types.ts +++ b/packages/nextjs/src/types.ts @@ -16,4 +16,10 @@ export type NextClerkProviderProps = Without (path: string) => { describe('nextjs matcher', () => { /** * 🚨🚨🚨🚨 - * This is the matcher we document for clerkMiddleware + authMiddleware. + * This is the matcher we document for clerkMiddleware. * Any change made to the matcher here needs to be reflected in the documentation, the dashboard * and vice versa. * 🚨🚨🚨🚨 diff --git a/packages/nextjs/src/utils/__tests__/response.test.ts b/packages/nextjs/src/utils/__tests__/response.test.ts deleted file mode 100644 index fd7d85056f..0000000000 --- a/packages/nextjs/src/utils/__tests__/response.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { mergeResponses } from '../response'; - -describe('mergeResponses', function () { - it('should fail unless one response is passed', function () { - expect(mergeResponses(null, undefined)).toBe(undefined); - }); - - it('should handle non-response values', function () { - const response1 = new NextResponse(); - response1.headers.set('foo', '1'); - const finalResponse = mergeResponses(null, undefined, response1); - expect(finalResponse!.headers.get('foo')).toEqual('1'); - }); - - it('should merge the headers', function () { - const response1 = new NextResponse(); - const response2 = new NextResponse(); - response1.headers.set('foo', '1'); - response1.headers.set('bar', '1'); - response2.headers.set('bar', '2'); - const finalResponse = mergeResponses(response1, response2); - expect(finalResponse!.headers.get('foo')).toEqual('1'); - expect(finalResponse!.headers.get('bar')).toEqual('2'); - }); - - it('should merge the cookies', function () { - const response1 = new NextResponse(); - const response2 = new NextResponse(); - response1.cookies.set('foo', '1'); - response1.cookies.set('second', '2'); - response1.cookies.set('bar', '1'); - response2.cookies.set('bar', '2'); - const finalResponse = mergeResponses(response1, response2); - expect(finalResponse!.cookies.get('foo')).toEqual(response1.cookies.get('foo')); - expect(finalResponse!.cookies.get('second')).toEqual(response1.cookies.get('second')); - expect(finalResponse!.cookies.get('bar')).toEqual(response2.cookies.get('bar')); - }); - - it('should merge the cookies with non-response values', function () { - const response2 = NextResponse.next(); - response2.cookies.set('foo', '1'); - response2.cookies.set({ - name: 'second', - value: '2', - path: '/', - sameSite: 'none', - secure: true, - }); - response2.cookies.set('bar', '1', { - sameSite: 'none', - secure: true, - }); - const finalResponse = mergeResponses(null, response2); - expect(finalResponse!.cookies.get('foo')).toEqual(response2.cookies.get('foo')); - expect(finalResponse!.cookies.get('second')).toEqual(response2.cookies.get('second')); - expect(finalResponse!.cookies.get('bar')).toEqual(response2.cookies.get('bar')); - }); - - it('should use the status of the last response', function () { - const response1 = new NextResponse('', { status: 200, statusText: 'OK' }); - const response2 = new NextResponse('', { status: 201, statusText: 'Created' }); - const finalResponse = mergeResponses(response1, response2); - expect(finalResponse!.status).toEqual(response2.status); - expect(finalResponse!.statusText).toEqual(response2.statusText); - }); - - it('should use the body of the last response', function () { - const response1 = new NextResponse('1'); - const response2 = new NextResponse('2'); - const finalResponse = mergeResponses(response1, response2); - expect(finalResponse!.body).toEqual(response2.body); - }); -}); diff --git a/packages/nextjs/src/utils/debugLogger.ts b/packages/nextjs/src/utils/debugLogger.ts index d2ddab1604..9d2ca496d8 100644 --- a/packages/nextjs/src/utils/debugLogger.ts +++ b/packages/nextjs/src/utils/debugLogger.ts @@ -11,6 +11,7 @@ export type Logger = { debug: (...args: Array L)>) => void; enable: () => void; }; +export type LoggerNoCommit = Omit; export const createDebugLogger = (name: string, formatter: (val: LogEntry) => string) => (): Logger => { const entries: LogEntry[] = []; @@ -57,7 +58,7 @@ export const createDebugLogger = (name: string, formatter: (val: LogEntry) => st type WithLogger = any>( loggerFactoryOrName: string | (() => L), - handlerCtor: (logger: Omit) => H, + handlerCtor: (logger: LoggerNoCommit) => H, ) => H; export const withLogger: WithLogger = (loggerFactoryOrName, handlerCtor) => { diff --git a/packages/nextjs/src/utils/response.ts b/packages/nextjs/src/utils/response.ts index 7cb87b535d..56c11df06b 100644 --- a/packages/nextjs/src/utils/response.ts +++ b/packages/nextjs/src/utils/response.ts @@ -1,44 +1,5 @@ -import { NextResponse } from 'next/server'; - import { constants as nextConstants } from '../constants'; -/** - * A function that merges two Response objects into a single response. - * The final response respects the body and the status of the last response, - * but the cookies and headers of all responses are merged. - */ -export const mergeResponses = (...responses: (NextResponse | Response | null | undefined | void)[]) => { - const normalisedResponses = responses.filter(Boolean).map(res => { - // If the response is a NextResponse, we can just return it - if (res instanceof NextResponse) { - return res; - } - - return new NextResponse(res!.body, res!); - }); - - if (normalisedResponses.length === 0) { - return; - } - - const lastResponse = normalisedResponses[normalisedResponses.length - 1]; - const finalResponse = new NextResponse(lastResponse.body, lastResponse); - - for (const response of normalisedResponses) { - response.headers.forEach((value: string, name: string) => { - finalResponse.headers.set(name, value); - }); - - response.cookies.getAll().forEach(cookie => { - const { name, value, ...options } = cookie; - - finalResponse.cookies.set(name, value, options); - }); - } - - return finalResponse; -}; - export const isRedirect = (res: Response) => { return res.headers.get(nextConstants.Headers.NextRedirect); }; diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index e74322814f..ee0be27ba4 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,71 @@ # Change Log +## 5.13.1 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + - @clerk/shared@2.10.1 + +## 5.13.0 + +### Minor Changes + +- Internal changes to support `` ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + +### Patch Changes + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 5.12.0 + +### Minor Changes + +- Introducing experimental `asProvider`, `asStandalone`, and `` for `` and `` components. ([#4042](https://github.com/clerk/javascript/pull/4042)) by [@panteliselef](https://github.com/panteliselef) + + - `asProvider` converts `` and `` to a provider that defers rendering until `` is mounted. + - `` also accepts a `asStandalone` prop. It will skip the trigger of these components and display only the UI which was previously inside the popover. This allows developers to create their own triggers. + + Example usage: + + ```tsx + + +

This is my page available to all children

+
+ +
+ ``` + + ```tsx + + +

This is my page available to all children

+
+ +
+ ``` + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + +## 5.11.1 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + ## 5.11.0 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index c1bdb46930..8ef97333d1 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.11.0", + "version": "5.13.1", "description": "Clerk React library", "keywords": [ "clerk", @@ -76,13 +76,13 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { "@clerk/eslint-config-custom": "*", - "@clerk/themes": "2.1.35", + "@clerk/themes": "2.1.39", "@types/node": "^18.19.33", "@types/react": "*", "@types/react-dom": "*", diff --git a/packages/react/src/components/uiComponents.tsx b/packages/react/src/components/uiComponents.tsx index 919ec0d173..d4c589ced1 100644 --- a/packages/react/src/components/uiComponents.tsx +++ b/packages/react/src/components/uiComponents.tsx @@ -13,7 +13,7 @@ import type { Without, } from '@clerk/types'; import type { PropsWithChildren } from 'react'; -import React, { createElement } from 'react'; +import React, { createContext, createElement, useContext } from 'react'; import { organizationProfileLinkRenderedError, @@ -25,6 +25,7 @@ import { userProfilePageRenderedError, } from '../errors/messages'; import type { + CustomPortalsRendererProps, MountProps, OpenProps, OrganizationProfileLinkProps, @@ -35,7 +36,12 @@ import type { UserProfilePageProps, WithClerkProp, } from '../types'; -import { useOrganizationProfileCustomPages, useUserButtonCustomMenuItems, useUserProfileCustomPages } from '../utils'; +import { + useOrganizationProfileCustomPages, + useSanitizedChildren, + useUserButtonCustomMenuItems, + useUserProfileCustomPages, +} from '../utils'; import { withClerk } from './withClerk'; type UserProfileExportType = typeof _UserProfile & { @@ -49,10 +55,26 @@ type UserButtonExportType = typeof _UserButton & { MenuItems: typeof MenuItems; Action: typeof MenuAction; Link: typeof MenuLink; + /** + * The `` component can be used in conjunction with `asProvider` in order to control rendering + * of the `` without affecting its configuration or any custom pages + * that could be mounted + * @experimental This API is experimental and may change at any moment. + */ + __experimental_Outlet: typeof UserButtonOutlet; }; -type UserButtonPropsWithoutCustomPages = Without & { +type UserButtonPropsWithoutCustomPages = Without< + UserButtonProps, + 'userProfileProps' | '__experimental_asStandalone' +> & { userProfileProps?: Pick; + /** + * Adding `asProvider` will defer rendering until the `` component is mounted. + * @experimental This API is experimental and may change at any moment. + * @default undefined + */ + __experimental_asProvider?: boolean; }; type OrganizationProfileExportType = typeof _OrganizationProfile & { @@ -63,10 +85,34 @@ type OrganizationProfileExportType = typeof _OrganizationProfile & { type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & { OrganizationProfilePage: typeof OrganizationProfilePage; OrganizationProfileLink: typeof OrganizationProfileLink; + /** + * The `` component can be used in conjunction with `asProvider` in order to control rendering + * of the `` without affecting its configuration or any custom pages + * that could be mounted + * @experimental This API is experimental and may change at any moment. + */ + __experimental_Outlet: typeof OrganizationSwitcherOutlet; }; -type OrganizationSwitcherPropsWithoutCustomPages = Without & { +type OrganizationSwitcherPropsWithoutCustomPages = Without< + OrganizationSwitcherProps, + 'organizationProfileProps' | '__experimental_asStandalone' +> & { organizationProfileProps?: Pick; + /** + * Adding `asProvider` will defer rendering until the `` component is mounted. + * @experimental This API is experimental and may change at any moment. + * @default undefined + */ + __experimental_asProvider?: boolean; +}; + +const isMountProps = (props: any): props is MountProps => { + return 'mount' in props; +}; + +const isOpenProps = (props: any): props is OpenProps => { + return 'open' in props; }; // README: should be a class pure component in order for mount and unmount @@ -98,15 +144,9 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without { - return 'mount' in props; -}; - -const isOpenProps = (props: any): props is OpenProps => { - return 'open' in props; -}; - -class Portal extends React.PureComponent { +class Portal extends React.PureComponent< + PropsWithChildren<(MountProps | OpenProps) & { hideRootHtmlElement?: boolean }> +> { private portalRef = React.createRef(); componentDidUpdate(_prevProps: Readonly) { @@ -122,8 +162,11 @@ class Portal extends React.PureComponent { // instead, we simply use the length of customPages to determine if it changed or not const customPagesChanged = prevProps.customPages?.length !== newProps.customPages?.length; const customMenuItemsChanged = prevProps.customMenuItems?.length !== newProps.customMenuItems?.length; + if (!isDeeplyEqual(prevProps, newProps) || customPagesChanged || customMenuItemsChanged) { - this.props.updateProps({ node: this.portalRef.current, props: this.props.props }); + if (this.portalRef.current) { + this.props.updateProps({ node: this.portalRef.current, props: this.props.props }); + } } } @@ -151,18 +194,25 @@ class Portal extends React.PureComponent { } render() { + const { hideRootHtmlElement = false } = this.props; return ( <> -
- {isMountProps(this.props) && - this.props?.customPagesPortals?.map((portal, index) => createElement(portal, { key: index }))} - {isMountProps(this.props) && - this.props?.customMenuItemsPortals?.map((portal, index) => createElement(portal, { key: index }))} + {!hideRootHtmlElement &&
} + {this.props.children} ); } } +const CustomPortalsRenderer = (props: CustomPortalsRendererProps) => { + return ( + <> + {props?.customPagesPortals?.map((portal, index) => createElement(portal, { key: index }))} + {props?.customMenuItemsPortals?.map((portal, index) => createElement(portal, { key: index }))} + + ); +}; + export const SignIn = withClerk(({ clerk, ...props }: WithClerkProp) => { return ( + > + + ); }, 'UserProfile', @@ -216,21 +267,43 @@ export const UserProfile: UserProfileExportType = Object.assign(_UserProfile, { Link: UserProfileLink, }); +const UserButtonContext = createContext({ + mount: () => {}, + unmount: () => {}, + updateProps: () => {}, +}); + const _UserButton = withClerk( ({ clerk, ...props }: WithClerkProp>) => { - const { customPages, customPagesPortals } = useUserProfileCustomPages(props.children); + const { customPages, customPagesPortals } = useUserProfileCustomPages(props.children, { + allowForAnyChildren: !!props.__experimental_asProvider, + }); const userProfileProps = Object.assign(props.userProfileProps || {}, { customPages }); const { customMenuItems, customMenuItemsPortals } = useUserButtonCustomMenuItems(props.children); + const sanitizedChildren = useSanitizedChildren(props.children); + + const passableProps = { + mount: clerk.mountUserButton, + unmount: clerk.unmountUserButton, + updateProps: (clerk as any).__unstable__updateProps, + props: { ...props, userProfileProps, customMenuItems }, + }; + const portalProps = { + customPagesPortals: customPagesPortals, + customMenuItemsPortals: customMenuItemsPortals, + }; return ( - + + + {/*This mimics the previous behaviour before asProvider existed*/} + {props.__experimental_asProvider ? sanitizedChildren : null} + + + ); }, 'UserButton', @@ -251,12 +324,27 @@ export function MenuLink({ children }: PropsWithChildren) { return <>{children}; } +export function UserButtonOutlet(outletProps: Without) { + const providerProps = useContext(UserButtonContext); + + const portalProps = { + ...providerProps, + props: { + ...providerProps.props, + ...outletProps, + }, + } satisfies MountProps; + + return ; +} + export const UserButton: UserButtonExportType = Object.assign(_UserButton, { UserProfilePage, UserProfileLink, MenuItems, Action: MenuAction, Link: MenuLink, + __experimental_Outlet: UserButtonOutlet, }); export function OrganizationProfilePage({ children }: PropsWithChildren) { @@ -278,8 +366,9 @@ const _OrganizationProfile = withClerk( unmount={clerk.unmountOrganizationProfile} updateProps={(clerk as any).__unstable__updateProps} props={{ ...props, customPages }} - customPagesPortals={customPagesPortals} - /> + > + + ); }, 'OrganizationProfile', @@ -301,27 +390,68 @@ export const CreateOrganization = withClerk(({ clerk, ...props }: WithClerkProp< ); }, 'CreateOrganization'); +const OrganizationSwitcherContext = createContext({ + mount: () => {}, + unmount: () => {}, + updateProps: () => {}, +}); + const _OrganizationSwitcher = withClerk( ({ clerk, ...props }: WithClerkProp>) => { - const { customPages, customPagesPortals } = useOrganizationProfileCustomPages(props.children); + const { customPages, customPagesPortals } = useOrganizationProfileCustomPages(props.children, { + allowForAnyChildren: !!props.__experimental_asProvider, + }); const organizationProfileProps = Object.assign(props.organizationProfileProps || {}, { customPages }); + const sanitizedChildren = useSanitizedChildren(props.children); + + const passableProps = { + mount: clerk.mountOrganizationSwitcher, + unmount: clerk.unmountOrganizationSwitcher, + updateProps: (clerk as any).__unstable__updateProps, + props: { ...props, organizationProfileProps }, + }; + + /** + * Prefetch organization list + */ + clerk.__experimental_prefetchOrganizationSwitcher(); return ( - + + + {/*This mimics the previous behaviour before asProvider existed*/} + {props.__experimental_asProvider ? sanitizedChildren : null} + + + ); }, 'OrganizationSwitcher', ); +export function OrganizationSwitcherOutlet( + outletProps: Without, +) { + const providerProps = useContext(OrganizationSwitcherContext); + + const portalProps = { + ...providerProps, + props: { + ...providerProps.props, + ...outletProps, + }, + } satisfies MountProps; + + return ; +} + export const OrganizationSwitcher: OrganizationSwitcherExportType = Object.assign(_OrganizationSwitcher, { OrganizationProfilePage, OrganizationProfileLink, + __experimental_Outlet: OrganizationSwitcherOutlet, }); export const OrganizationList = withClerk(({ clerk, ...props }: WithClerkProp) => { diff --git a/packages/react/src/contexts/AuthContext.ts b/packages/react/src/contexts/AuthContext.ts index a17cfb43df..db59ac0fe7 100644 --- a/packages/react/src/contexts/AuthContext.ts +++ b/packages/react/src/contexts/AuthContext.ts @@ -1,7 +1,7 @@ import { createContextAndHook } from '@clerk/shared/react'; import type { ActJWTClaim, OrganizationCustomPermissionKey, OrganizationCustomRoleKey } from '@clerk/types'; -export const [AuthContext, useAuthContext] = createContextAndHook<{ +export type AuthContextValue = { userId: string | null | undefined; sessionId: string | null | undefined; actor: ActJWTClaim | null | undefined; @@ -10,4 +10,6 @@ export const [AuthContext, useAuthContext] = createContextAndHook<{ orgSlug: string | null | undefined; orgPermissions: OrganizationCustomPermissionKey[] | null | undefined; __experimental_factorVerificationAge: [number, number] | null; -}>('AuthContext'); +}; + +export const [AuthContext, useAuthContext] = createContextAndHook('AuthContext'); diff --git a/packages/react/src/hooks/useAuth.ts b/packages/react/src/hooks/useAuth.ts index d3aed86858..de6d08bbbf 100644 --- a/packages/react/src/hooks/useAuth.ts +++ b/packages/react/src/hooks/useAuth.ts @@ -6,7 +6,7 @@ import type { OrganizationCustomRoleKey, SignOut, } from '@clerk/types'; -import { useCallback } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { useAuthContext } from '../contexts/AuthContext'; import { useIsomorphicClerkContext } from '../contexts/IsomorphicClerkContext'; @@ -72,7 +72,7 @@ type UseAuthReturn = getToken: GetToken; }; -type UseAuth = () => UseAuthReturn; +type UseAuth = (initialAuthState?: any) => UseAuthReturn; /** * Returns the current auth state, the user and session ids and the `getToken` @@ -110,11 +110,28 @@ type UseAuth = () => UseAuthReturn; * return
...
* } */ -export const useAuth: UseAuth = () => { +export const useAuth: UseAuth = (initialAuthState = {}) => { useAssertWrappedByClerkProvider('useAuth'); + const authContext = useAuthContext(); + + const [authState, setAuthState] = useState(() => { + // This indicates the authContext is not available, and so we fallback to the provided initialState + if (authContext.sessionId === undefined && authContext.userId === undefined) { + return initialAuthState ?? {}; + } + return authContext; + }); + + useEffect(() => { + if (authContext.sessionId === undefined && authContext.userId === undefined) { + return; + } + setAuthState(authContext); + }, [authContext]); + const { sessionId, userId, actor, orgId, orgRole, orgSlug, orgPermissions, __experimental_factorVerificationAge } = - useAuthContext(); + authState; const isomorphicClerk = useIsomorphicClerkContext(); const getToken: GetToken = useCallback(createGetToken(isomorphicClerk), [isomorphicClerk]); @@ -133,6 +150,12 @@ export const useAuth: UseAuth = () => { [userId, __experimental_factorVerificationAge, orgId, orgRole, orgPermissions], ); + return useDerivedAuth({ sessionId, userId, actor, orgId, orgSlug, orgRole, getToken, signOut, has }); +}; + +export function useDerivedAuth(authObject: any): UseAuthReturn { + const { sessionId, userId, actor, orgId, orgSlug, orgRole, has, signOut, getToken } = authObject ?? {}; + if (sessionId === undefined && userId === undefined) { return { isLoaded: false, @@ -198,4 +221,4 @@ export const useAuth: UseAuth = () => { } return errorThrower.throw(invalidStateError); -}; +} diff --git a/packages/react/src/internal.ts b/packages/react/src/internal.ts index 938f3f4d9d..3ee8e579cc 100644 --- a/packages/react/src/internal.ts +++ b/packages/react/src/internal.ts @@ -1,6 +1,7 @@ export { setErrorThrowerOptions } from './errors/errorThrower'; export { MultisessionAppSupport } from './components/controlComponents'; export { useRoutingProps } from './hooks/useRoutingProps'; +export { useDerivedAuth } from './hooks/useAuth'; export { clerkJsScriptUrl, diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 1623b81cad..3a94a521f9 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -841,6 +841,15 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; + __experimental_prefetchOrganizationSwitcher = (): void => { + const callback = () => this.clerkjs?.__experimental_prefetchOrganizationSwitcher(); + if (this.clerkjs && this.#loaded) { + void callback(); + } else { + this.premountMethodCalls.set('__experimental_prefetchOrganizationSwitcher', callback); + } + }; + mountOrganizationList = (node: HTMLDivElement, props: OrganizationListProps): void => { if (this.clerkjs && this.#loaded) { this.clerkjs.mountOrganizationList(node, props); diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index 2ad19fa125..ec0f8dbd23 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -67,14 +67,17 @@ export interface HeadlessBrowserClerkConstructor { export type WithClerkProp = T & { clerk: LoadedClerk }; +export interface CustomPortalsRendererProps { + customPagesPortals?: any[]; + customMenuItemsPortals?: any[]; +} + // Clerk object export interface MountProps { mount: (node: HTMLDivElement, props: any) => void; unmount: (node: HTMLDivElement) => void; updateProps: (props: any) => void; props?: any; - customPagesPortals?: any[]; - customMenuItemsPortals?: any[]; } export interface OpenProps { diff --git a/packages/react/src/utils/useCustomPages.tsx b/packages/react/src/utils/useCustomPages.tsx index 4274fe34fc..c3367d1cc7 100644 --- a/packages/react/src/utils/useCustomPages.tsx +++ b/packages/react/src/utils/useCustomPages.tsx @@ -16,27 +16,39 @@ import { isThatComponent } from './componentValidation'; import type { UseCustomElementPortalParams, UseCustomElementPortalReturn } from './useCustomElementPortal'; import { useCustomElementPortal } from './useCustomElementPortal'; -export const useUserProfileCustomPages = (children: React.ReactNode | React.ReactNode[]) => { +export const useUserProfileCustomPages = ( + children: React.ReactNode | React.ReactNode[], + options?: UseCustomPagesOptions, +) => { const reorderItemsLabels = ['account', 'security']; - return useCustomPages({ - children, - reorderItemsLabels, - LinkComponent: UserProfileLink, - PageComponent: UserProfilePage, - MenuItemsComponent: MenuItems, - componentName: 'UserProfile', - }); + return useCustomPages( + { + children, + reorderItemsLabels, + LinkComponent: UserProfileLink, + PageComponent: UserProfilePage, + MenuItemsComponent: MenuItems, + componentName: 'UserProfile', + }, + options, + ); }; -export const useOrganizationProfileCustomPages = (children: React.ReactNode | React.ReactNode[]) => { +export const useOrganizationProfileCustomPages = ( + children: React.ReactNode | React.ReactNode[], + options?: UseCustomPagesOptions, +) => { const reorderItemsLabels = ['general', 'members']; - return useCustomPages({ - children, - reorderItemsLabels, - LinkComponent: OrganizationProfileLink, - PageComponent: OrganizationProfilePage, - componentName: 'OrganizationProfile', - }); + return useCustomPages( + { + children, + reorderItemsLabels, + LinkComponent: OrganizationProfileLink, + PageComponent: OrganizationProfilePage, + componentName: 'OrganizationProfile', + }, + options, + ); }; type UseCustomPagesParams = { @@ -48,16 +60,49 @@ type UseCustomPagesParams = { componentName: string; }; +type UseCustomPagesOptions = { + allowForAnyChildren: boolean; +}; + type CustomPageWithIdType = UserProfilePageProps & { children?: React.ReactNode }; -const useCustomPages = ({ - children, - LinkComponent, - PageComponent, - MenuItemsComponent, - reorderItemsLabels, - componentName, -}: UseCustomPagesParams) => { +/** + * Exclude any children that is used for identifying Custom Pages or Custom Items. + * Passing: + * ```tsx + * + * + * + * + * ``` + * Gives back + * ```tsx + * + * ```` + */ +export const useSanitizedChildren = (children: React.ReactNode) => { + const sanitizedChildren: React.ReactNode[] = []; + + const excludedComponents: any[] = [ + OrganizationProfileLink, + OrganizationProfilePage, + MenuItems, + UserProfilePage, + UserProfileLink, + ]; + + React.Children.forEach(children, child => { + if (!excludedComponents.some(component => isThatComponent(child, component))) { + sanitizedChildren.push(child); + } + }); + + return sanitizedChildren; +}; + +const useCustomPages = (params: UseCustomPagesParams, options?: UseCustomPagesOptions) => { + const { children, LinkComponent, PageComponent, MenuItemsComponent, reorderItemsLabels, componentName } = params; + const { allowForAnyChildren = false } = options || {}; const validChildren: CustomPageWithIdType[] = []; React.Children.forEach(children, child => { @@ -66,7 +111,7 @@ const useCustomPages = ({ !isThatComponent(child, LinkComponent) && !isThatComponent(child, MenuItemsComponent) ) { - if (child) { + if (child && !allowForAnyChildren) { logErrorInDevMode(customPagesIgnoredComponent(componentName)); } return; diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 048ac64105..af5321a798 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,59 @@ # Change Log +## 4.2.41 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/clerk-react@5.13.1 + - @clerk/shared@2.10.1 + +## 4.2.40 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`a0204a8e8`](https://github.com/clerk/javascript/commit/a0204a8e8742b63aea92d67e7d66fe0bc86a166f), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + - @clerk/clerk-react@5.13.0 + +## 4.2.39 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 4.2.38 + +### Patch Changes + +- Updated dependencies [[`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/clerk-react@5.12.0 + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 4.2.37 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + - @clerk/clerk-react@5.11.1 + +## 4.2.36 + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 4.2.35 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index eb200f7f56..c0ade98914 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.2.35", + "version": "4.2.41", "description": "Clerk SDK for Remix", "keywords": [ "clerk", @@ -73,11 +73,11 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", - "cookie": "0.5.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", + "cookie": "0.7.0", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index 265d28ada8..443f3a65fe 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -1,5 +1,57 @@ # Change Log +## 5.0.54 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/shared@2.10.1 + +## 5.0.53 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 5.0.52 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 5.0.51 + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 5.0.50 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + +## 5.0.49 + +### Patch Changes + +- Add transition period notice and migration info ([#4305](https://github.com/clerk/javascript/pull/4305)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 5.0.48 ### Patch Changes diff --git a/packages/sdk-node/README.md b/packages/sdk-node/README.md index e1fdedb1b9..95ac976fda 100644 --- a/packages/sdk-node/README.md +++ b/packages/sdk-node/README.md @@ -25,6 +25,9 @@
+> [!IMPORTANT] +> Starting October 8, 2024, the Node SDK is entering a three-month notice period. We encourage everyone to migrate to `@clerk/express`. For full details, please see our [changelog](https://clerk.com/changelog/2024-10-08-express-sdk). + ## Getting Started [Clerk](https://clerk.com/?utm_source=github&utm_medium=clerk_sdk_node) is the easiest way to add authentication and user management to your Node.js application. Add sign up, sign in, and profile management to your application in minutes. diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index f6f3242a0b..4487064fb4 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-sdk-node", - "version": "5.0.48", + "version": "5.0.54", "description": "Clerk server SDK for usage with node", "keywords": [ "clerk", @@ -53,9 +53,9 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { @@ -64,7 +64,6 @@ "@types/node": "^18.19.33", "nock": "^13.0.7", "npm-run-all": "^4.1.5", - "prettier": "^2.5.0", "tsup": "*", "typescript": "*" }, diff --git a/packages/sdk-node/src/index.ts b/packages/sdk-node/src/index.ts index 6de071dd83..4194c5e28e 100644 --- a/packages/sdk-node/src/index.ts +++ b/packages/sdk-node/src/index.ts @@ -24,3 +24,9 @@ export { createClerkExpressRequireAuth, createClerkExpressWithAuth }; export { requireAuth } from './requireAuth'; export { withAuth } from './withAuth'; + +console.warn( + 'Starting October 8, 2024, the Node SDK is entering a three-month notice period. ' + + 'We encourage everyone to migrate to @clerk/express. ' + + 'For full details, please see our changelog: https://clerk.com/changelog/2024-10-08-express-sdk', +); diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 7ab95a1d2c..d6e5f31a3f 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,41 @@ # Change Log +## 2.10.1 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + +## 2.10.0 + +### Minor Changes + +- Add experimental support for new UI components ([#4114](https://github.com/clerk/javascript/pull/4114)) by [@BRKalow](https://github.com/BRKalow) + +### Patch Changes + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/types@4.27.0 + +## 2.9.2 + +### Patch Changes + +- Retry with exponential backoff if loadScript fails to load the script ([#4349](https://github.com/clerk/javascript/pull/4349)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + +## 2.9.1 + +### Patch Changes + +- Only retry the OAuth flow if the captcha check failed. ([#4329](https://github.com/clerk/javascript/pull/4329)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/types@4.25.1 + ## 2.9.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 656893a215..a64120664b 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "2.9.0", + "version": "2.10.1", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", @@ -95,7 +95,7 @@ "test:coverage": "jest --collectCoverage && open coverage/lcov-report/index.html" }, "dependencies": { - "@clerk/types": "4.25.0", + "@clerk/types": "4.28.0", "glob-to-regexp": "0.4.1", "js-cookie": "3.0.5", "std-env": "^3.7.0", diff --git a/packages/shared/src/error.ts b/packages/shared/src/error.ts index f570fd99f0..e7ef7b56dc 100644 --- a/packages/shared/src/error.ts +++ b/packages/shared/src/error.ts @@ -6,6 +6,10 @@ export function isUnauthorizedError(e: any): boolean { return code === 'authentication_invalid' && status === 401; } +export function isCaptchaError(e: ClerkAPIResponseError): boolean { + return ['captcha_invalid', 'captcha_not_enabled', 'captcha_missing_token'].includes(e.errors[0].code); +} + export function is4xxError(e: any): boolean { const status = e?.status; return !!status && status >= 400 && status < 500; diff --git a/packages/shared/src/loadScript.ts b/packages/shared/src/loadScript.ts index c10d775328..9a85ab4e55 100644 --- a/packages/shared/src/loadScript.ts +++ b/packages/shared/src/loadScript.ts @@ -1,3 +1,5 @@ +import { runWithExponentialBackOff } from './utils'; + const NO_DOCUMENT_ERROR = 'loadScript cannot be called when document does not exist'; const NO_SRC_ERROR = 'loadScript cannot be called without a src'; @@ -11,34 +13,39 @@ type LoadScriptOptions = { export async function loadScript(src = '', opts: LoadScriptOptions): Promise { const { async, defer, beforeLoad, crossOrigin, nonce } = opts || {}; - return new Promise((resolve, reject) => { - if (!src) { - reject(NO_SRC_ERROR); - } - if (!document || !document.body) { - reject(NO_DOCUMENT_ERROR); - } + const load = () => { + return new Promise((resolve, reject) => { + if (!src) { + reject(NO_SRC_ERROR); + } - const script = document.createElement('script'); + if (!document || !document.body) { + reject(NO_DOCUMENT_ERROR); + } - crossOrigin && script.setAttribute('crossorigin', crossOrigin); - script.async = async || false; - script.defer = defer || false; + const script = document.createElement('script'); - script.addEventListener('load', () => { - script.remove(); - resolve(script); - }); + crossOrigin && script.setAttribute('crossorigin', crossOrigin); + script.async = async || false; + script.defer = defer || false; + + script.addEventListener('load', () => { + script.remove(); + resolve(script); + }); + + script.addEventListener('error', () => { + script.remove(); + reject(); + }); - script.addEventListener('error', () => { - script.remove(); - reject(); + script.src = src; + script.nonce = nonce; + beforeLoad?.(script); + document.body.appendChild(script); }); + }; - script.src = src; - script.nonce = nonce; - beforeLoad?.(script); - document.body.appendChild(script); - }); + return runWithExponentialBackOff(load, { shouldRetry: (_, iterations) => iterations < 5 }); } diff --git a/packages/shared/src/router.ts b/packages/shared/src/router.ts index 32dc0abf2e..b842f0ad05 100644 --- a/packages/shared/src/router.ts +++ b/packages/shared/src/router.ts @@ -1,5 +1,4 @@ -export { type ClerkRouter, type ClerkHostRouter, createClerkRouter } from './router/router'; -export { type RoutingMode } from './router/types'; +export { type ClerkRouter, type ClerkHostRouter, type RoutingMode, createClerkRouter } from './router/router'; export { Router, useClerkRouter, diff --git a/packages/shared/src/router/router.ts b/packages/shared/src/router/router.ts index dca2e40946..e8c1696922 100644 --- a/packages/shared/src/router/router.ts +++ b/packages/shared/src/router/router.ts @@ -1,21 +1,9 @@ +import type { ClerkHostRouter, RoutingMode } from '@clerk/types'; + import { isAbsoluteUrl, withLeadingSlash, withoutTrailingSlash } from '../url'; -import type { RoutingMode } from './types'; export const PRESERVED_QUERYSTRING_PARAMS = ['after_sign_in_url', 'after_sign_up_url', 'redirect_url']; -/** - * This type represents a generic router interface that Clerk relies on to interact with the host router. - */ -export type ClerkHostRouter = { - readonly mode: RoutingMode; - readonly name: string; - pathname: () => string; - push: (path: string) => void; - replace: (path: string) => void; - searchParams: () => URLSearchParams; - shallowPush: (path: string) => void; -}; - /** * Internal Clerk router, used by Clerk components to interact with the host's router. */ @@ -156,3 +144,5 @@ export function createClerkRouter(router: ClerkHostRouter, basePath: string = '/ basePath: normalizedBasePath, }; } + +export type { ClerkHostRouter, RoutingMode }; diff --git a/packages/shared/src/router/types.ts b/packages/shared/src/router/types.ts deleted file mode 100644 index d0f948e71d..0000000000 --- a/packages/shared/src/router/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type RoutingMode = 'path' | 'virtual'; diff --git a/packages/tailwindcss-transformer/src/index.ts b/packages/tailwindcss-transformer/src/index.ts index 7f84057482..6ce3f70afd 100644 --- a/packages/tailwindcss-transformer/src/index.ts +++ b/packages/tailwindcss-transformer/src/index.ts @@ -58,7 +58,7 @@ function visitNode(node: recast.types.ASTNode, ctx: { styleCache: StyleCache }, if (path.parentPath.node.type === 'ObjectProperty' && path.parentPath.node.key === path.node) { return false; } - if (path.node.value === '') { + if (path.node.value === '' || path.node.value === ' ') { return false; } const cn = generateHashedClassName(path.node.value); diff --git a/packages/tanstack-start/CHANGELOG.md b/packages/tanstack-start/CHANGELOG.md index 3b19e6e725..99f49a1e17 100644 --- a/packages/tanstack-start/CHANGELOG.md +++ b/packages/tanstack-start/CHANGELOG.md @@ -1,5 +1,59 @@ # @clerk/tanstack-start +## 0.4.17 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/clerk-react@5.13.1 + - @clerk/shared@2.10.1 + +## 0.4.16 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`a0204a8e8`](https://github.com/clerk/javascript/commit/a0204a8e8742b63aea92d67e7d66fe0bc86a166f), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + - @clerk/clerk-react@5.13.0 + +## 0.4.15 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 0.4.14 + +### Patch Changes + +- Updated dependencies [[`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/clerk-react@5.12.0 + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 0.4.13 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + - @clerk/clerk-react@5.11.1 + +## 0.4.12 + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 0.4.11 ### Patch Changes diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index 174565e537..31046839b6 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-start", - "version": "0.4.11", + "version": "0.4.17", "description": "Clerk SDK for TanStack Start", "keywords": [ "clerk", @@ -54,10 +54,10 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/clerk-react": "5.13.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 841a13d734..5d635f93ee 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,55 @@ # @clerk/testing +## 1.3.15 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5), [`1c7e105a3`](https://github.com/clerk/javascript/commit/1c7e105a32fd492cc175ef9fd1c1fa0428c259dc)]: + - @clerk/types@4.28.0 + - @clerk/backend@1.15.1 + - @clerk/shared@2.10.1 + +## 1.3.14 + +### Patch Changes + +- Updated dependencies [[`93dfe7a09`](https://github.com/clerk/javascript/commit/93dfe7a09648f414ee3f50bc8fb3f342d24020cd), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/backend@1.15.0 + - @clerk/shared@2.10.0 + - @clerk/types@4.27.0 + +## 1.3.13 + +### Patch Changes + +- Updated dependencies [[`e1a26547a`](https://github.com/clerk/javascript/commit/e1a26547a9c65f4c79c2bbd4dc386ddf67c2fbee)]: + - @clerk/backend@1.14.1 + +## 1.3.12 + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`752ce9bfa`](https://github.com/clerk/javascript/commit/752ce9bfa47a8eebd38cd272eeb58ae26fea3371), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`fb7ba1f34`](https://github.com/clerk/javascript/commit/fb7ba1f3485abdeac5e504cce6c2d84d3f3e4ffc), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + - @clerk/shared@2.9.2 + - @clerk/backend@1.14.0 + +## 1.3.11 + +### Patch Changes + +- Updated dependencies [[`d64e54c40`](https://github.com/clerk/javascript/commit/d64e54c40c9cf001b25e45a1b8939c9f7e80c6d6), [`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/shared@2.9.1 + - @clerk/types@4.25.1 + - @clerk/backend@1.13.10 + +## 1.3.10 + +### Patch Changes + +- Updated dependencies [[`358be296a`](https://github.com/clerk/javascript/commit/358be296a8181bb256fc1e15f878932c741b8743)]: + - @clerk/backend@1.13.9 + ## 1.3.9 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 1454292f4d..7a8f1a0896 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.3.9", + "version": "1.3.15", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", @@ -62,9 +62,9 @@ "lint": "eslint src/" }, "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.15.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "dotenv": "16.4.5" }, "devDependencies": { diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 9f4457be68..02f82d97ee 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,33 @@ # Change Log +## 2.1.39 + +### Patch Changes + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + +## 2.1.38 + +### Patch Changes + +- Updated dependencies [[`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc), [`3b50b67bd`](https://github.com/clerk/javascript/commit/3b50b67bd40da33c9e36773aa05462717e9f44cc)]: + - @clerk/types@4.27.0 + +## 2.1.37 + +### Patch Changes + +- Updated dependencies [[`e81d45b72`](https://github.com/clerk/javascript/commit/e81d45b72c81403c7c206dac5454de1fef6bec57), [`99cdf9b67`](https://github.com/clerk/javascript/commit/99cdf9b67d1e99e66cc73d8a5bfce1f1f8df1b83), [`ce40ff6f0`](https://github.com/clerk/javascript/commit/ce40ff6f0d3bc79e33375be6dd5e03f140a07000), [`2102052c0`](https://github.com/clerk/javascript/commit/2102052c017065ab511339870fcebaa6719f2702)]: + - @clerk/types@4.26.0 + +## 2.1.36 + +### Patch Changes + +- Updated dependencies [[`2ba2fd148`](https://github.com/clerk/javascript/commit/2ba2fd1483b7561d7df9a1952ead0ee15e422131)]: + - @clerk/types@4.25.1 + ## 2.1.35 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 08e6df0afe..41ede5fce3 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.1.35", + "version": "2.1.39", "description": "Themes for the Clerk auth components", "keywords": [ "react", @@ -37,7 +37,7 @@ "lint": "eslint src/" }, "dependencies": { - "@clerk/types": "4.25.0", + "@clerk/types": "4.28.0", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 4769c2e340..66f97b74f0 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,49 @@ # Change Log +## 4.28.0 + +### Minor Changes + +- Adding experimental support for legal consent for `` component ([#4337](https://github.com/clerk/javascript/pull/4337)) by [@octoper](https://github.com/octoper) + +## 4.27.0 + +### Minor Changes + +- Add experimental support for new UI components ([#4114](https://github.com/clerk/javascript/pull/4114)) by [@BRKalow](https://github.com/BRKalow) + +### Patch Changes + +- Fix `SignInProps`/`SignUpProps` `__experimental` type to allow for arbitrary properties ([#4114](https://github.com/clerk/javascript/pull/4114)) by [@BRKalow](https://github.com/BRKalow) + +## 4.26.0 + +### Minor Changes + +- Drop `maxAgeMinutes` from `__experimental_startVerification`. ([#4338](https://github.com/clerk/javascript/pull/4338)) by [@panteliselef](https://github.com/panteliselef) + + Drop types `__experimental_SessionVerificationConfig` and `__experimental_SessionVerificationMaxAgeMinutes`. + +- The "Restricted access" screen has been improved for visual consistency and the ability to contact support. The displayed texts have been made more clear and the sign-in button has been moved to the bottom. ([#4335](https://github.com/clerk/javascript/pull/4335)) by [@nikospapcom](https://github.com/nikospapcom) + +- Add experimental standalone mode for `` and ``. ([#4042](https://github.com/clerk/javascript/pull/4042)) by [@panteliselef](https://github.com/panteliselef) + + When `__experimental_asStandalone: true` the component will not render its trigger, and instead it will render only the contents of the popover in place. + + APIs that changed: + + - (For internal usage) Added `__experimental_prefetchOrganizationSwitcher` as a way to mount an internal component that will render the `useOrganizationList()` hook and prefetch the necessary data for the popover of ``. This enhances the UX since no loading state will be visible and keeps CLS to the minimum. + - New property for `mountOrganizationSwitcher(node, { __experimental_asStandalone: true })` + - New property for `mountUserButton(node, { __experimental_asStandalone: true })` + +- Use EIP-4361 message spec for Web3 wallets sign in signature requests ([#4334](https://github.com/clerk/javascript/pull/4334)) by [@chanioxaris](https://github.com/chanioxaris) + +## 4.25.1 + +### Patch Changes + +- Bypass captcha for providers dynamically provided in environment ([#4322](https://github.com/clerk/javascript/pull/4322)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + ## 4.25.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 581c175aab..2807e3bb05 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.25.0", + "version": "4.28.0", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/types/src/attributes.ts b/packages/types/src/attributes.ts index 44d170d339..7cc23cbcc4 100644 --- a/packages/types/src/attributes.ts +++ b/packages/types/src/attributes.ts @@ -1,3 +1,4 @@ export type FirstNameAttribute = 'first_name'; export type LastNameAttribute = 'last_name'; export type PasswordAttribute = 'password'; +export type LegalAcceptedAttribute = 'legal_accepted'; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 3f1b8abd9e..8dbcb28205 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -32,6 +32,7 @@ import type { SignUpFallbackRedirectUrl, SignUpForceRedirectUrl, } from './redirects'; +import type { ClerkHostRouter } from './router'; import type { ActiveSessionResource } from './session'; import type { __experimental_SessionVerificationLevel } from './sessionVerification'; import type { SignInResource } from './signIn'; @@ -329,6 +330,14 @@ export interface Clerk { */ unmountOrganizationSwitcher: (targetNode: HTMLDivElement) => void; + /** + * Prefetches the data displayed by an organization switcher. + * It can be used when `mountOrganizationSwitcher({ asStandalone: true})`, to avoid unwanted loading states. + * @experimantal This API is still under active development and may change at any moment. + * @param props Optional user verification configuration parameters. + */ + __experimental_prefetchOrganizationSwitcher: () => void; + /** * Mount an organization list component at the target element. * @param targetNode Target to mount the OrganizationList component. @@ -693,6 +702,11 @@ export type ClerkOptions = ClerkOptionsNavigation & }, Record >; + + /** + * [EXPERIMENTAL] Provide the underlying host router, required for the new experimental UI components. + */ + __experimental_router?: ClerkHostRouter; }; export interface NavigateOptions { @@ -828,6 +842,10 @@ export type SignInProps = RoutingOptions & { * Initial values that are used to prefill the sign in form. */ initialValues?: SignInInitialValues; + /** + * Enable experimental flags to gain access to new features. These flags are not guaranteed to be stable and may change drastically in between patch or minor versions. + */ + __experimental?: Record & { newComponents?: boolean }; } & TransferableOption & SignUpForceRedirectUrl & SignUpFallbackRedirectUrl & @@ -934,6 +952,10 @@ export type SignUpProps = RoutingOptions & { * Initial values that are used to prefill the sign up form. */ initialValues?: SignUpInitialValues; + /** + * Enable experimental flags to gain access to new features. These flags are not guaranteed to be stable and may change drastically in between patch or minor versions. + */ + __experimental?: Record & { newComponents?: boolean }; } & SignInFallbackRedirectUrl & SignInForceRedirectUrl & LegacyRedirectProps & @@ -1035,6 +1057,15 @@ export type UserButtonProps = UserButtonProfileMode & { * Controls the default state of the UserButton */ defaultOpen?: boolean; + + /** + * If true the `` will only render the popover. + * Enables developers to implement a custom dialog. + * @experimental This API is experimental and may change at any moment. + * @default undefined + */ + __experimental_asStandalone?: boolean; + /** * Full URL or path to navigate after sign out is complete * @deprecated Configure `afterSignOutUrl` as a global configuration, either in or in await Clerk.load() @@ -1095,6 +1126,15 @@ export type OrganizationSwitcherProps = CreateOrganizationMode & * Controls the default state of the OrganizationSwitcher */ defaultOpen?: boolean; + + /** + * If true, `` will only render the popover. + * Enables developers to implement a custom dialog. + * @experimental This API is experimental and may change at any moment. + * @default undefined + */ + __experimental_asStandalone?: boolean; + /** * By default, users can switch between organization and their personal account. * This option controls whether OrganizationSwitcher will include the user's personal account @@ -1247,6 +1287,7 @@ export interface ClerkAuthenticateWithWeb3Params { signUpContinueUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; strategy: Web3Strategy; + __experimental_legalAccepted?: boolean; } export interface AuthenticateWithMetamaskParams { @@ -1254,6 +1295,7 @@ export interface AuthenticateWithMetamaskParams { redirectUrl?: string; signUpContinueUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; + __experimental_legalAccepted?: boolean; } export interface AuthenticateWithCoinbaseWalletParams { @@ -1261,10 +1303,12 @@ export interface AuthenticateWithCoinbaseWalletParams { redirectUrl?: string; signUpContinueUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; + __experimental_legalAccepted?: boolean; } export interface AuthenticateWithGoogleOneTapParams { token: string; + __experimental_legalAccepted?: boolean; } export interface LoadedClerk extends Clerk { diff --git a/packages/types/src/displayConfig.ts b/packages/types/src/displayConfig.ts index b3de9bca05..bd25208f27 100644 --- a/packages/types/src/displayConfig.ts +++ b/packages/types/src/displayConfig.ts @@ -1,5 +1,6 @@ import type { DisplayThemeJSON } from './json'; import type { ClerkResource } from './resource'; +import type { OAuthStrategy } from './strategies'; export type PreferredSignInStrategy = 'password' | 'otp'; export type CaptchaWidgetType = 'smart' | 'invisible' | null; @@ -19,6 +20,7 @@ export interface DisplayConfigJSON { captcha_widget_type: CaptchaWidgetType; captcha_public_key_invisible: string | null; captcha_provider: CaptchaProvider; + captcha_oauth_bypass: OAuthStrategy[] | null; home_url: string; instance_environment_type: string; logo_image_url: string; @@ -36,6 +38,8 @@ export interface DisplayConfigJSON { after_create_organization_url: string; google_one_tap_client_id?: string; show_devmode_warning: boolean; + terms_url: string; + privacy_policy_url: string; } export interface DisplayConfigResource extends ClerkResource { @@ -52,6 +56,12 @@ export interface DisplayConfigResource extends ClerkResource { captchaWidgetType: CaptchaWidgetType; captchaProvider: CaptchaProvider; captchaPublicKeyInvisible: string | null; + /** + * An array of OAuth strategies for which we will bypass the captcha. + * We trust that the provider will verify that the user is not a bot on their end. + * This can also be used to bypass the captcha for a specific OAuth provider on a per-instance basis. + */ + captchaOauthBypass: OAuthStrategy[]; homeUrl: string; instanceEnvironmentType: string; logoImageUrl: string; @@ -70,4 +80,6 @@ export interface DisplayConfigResource extends ClerkResource { afterCreateOrganizationUrl: string; googleOneTapClientId?: string; showDevModeWarning: boolean; + termsUrl: string; + privacyPolicyUrl: string; } diff --git a/packages/types/src/elementIds.ts b/packages/types/src/elementIds.ts index d07c291892..69bc36ce17 100644 --- a/packages/types/src/elementIds.ts +++ b/packages/types/src/elementIds.ts @@ -20,7 +20,8 @@ export type FieldId = | 'deleteOrganizationConfirmation' | 'enrollmentMode' | 'affiliationEmailAddress' - | 'deleteExistingInvitationsSuggestions'; + | 'deleteExistingInvitationsSuggestions' + | '__experimental_legalAccepted'; export type ProfileSectionId = | 'profile' | 'username' diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 482d807e42..b8ccf135b7 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -36,6 +36,7 @@ export * from './phoneNumber'; export * from './redirects'; export * from './resource'; export * from './role'; +export * from './router'; export * from './saml'; export * from './samlAccount'; export * from './session'; diff --git a/packages/types/src/json.ts b/packages/types/src/json.ts index 88a07f0077..6e249fdaa8 100644 --- a/packages/types/src/json.ts +++ b/packages/types/src/json.ts @@ -97,6 +97,7 @@ export interface SignUpJSON extends ClerkResourceJSON { created_session_id: string | null; created_user_id: string | null; abandon_at: number | null; + legal_accepted_at: number | null; verifications: SignUpVerificationsJSON | null; } @@ -233,6 +234,7 @@ export interface UserJSON extends ClerkResourceJSON { create_organization_enabled: boolean; create_organizations_limit: number | null; delete_self_enabled: boolean; + legal_accepted_at: number | null; updated_at: number; created_at: number; } @@ -261,6 +263,7 @@ export interface VerificationJSON extends ClerkResourceJSON { verified_at_client: string; strategy: string; nonce?: string; + message?: string; external_verification_redirect_url?: string; attempts: number; expire_at: number; diff --git a/packages/types/src/localization.ts b/packages/types/src/localization.ts index 9b6a0140a4..ef95d7564a 100644 --- a/packages/types/src/localization.ts +++ b/packages/types/src/localization.ts @@ -148,6 +148,19 @@ type _LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; actionLink: LocalizationValue; + actionText: LocalizationValue; + blockButton__emailSupport: LocalizationValue; + }; + __experimental_legalConsent: { + continue: { + title: LocalizationValue; + subtitle: LocalizationValue; + }; + checkbox: { + label__termsOfServiceAndPrivacyPolicy: LocalizationValue; + label__onlyPrivacyPolicy: LocalizationValue; + label__onlyTermsOfService: LocalizationValue; + }; }; }; signIn: { diff --git a/packages/types/src/redirects.ts b/packages/types/src/redirects.ts index cfd52ede8e..9e9137d67b 100644 --- a/packages/types/src/redirects.ts +++ b/packages/types/src/redirects.ts @@ -79,6 +79,11 @@ export type AuthenticateWithRedirectParams = { * Email address to use for targeting a SAML connection at sign-up */ emailAddress?: string; + + /** + * Whether the user has accepted the legal requirements. + */ + __experimental_legalAccepted?: boolean; }; export type RedirectUrlProp = { diff --git a/packages/types/src/router.ts b/packages/types/src/router.ts new file mode 100644 index 0000000000..b159142ac7 --- /dev/null +++ b/packages/types/src/router.ts @@ -0,0 +1,14 @@ +export type RoutingMode = 'path' | 'virtual'; + +/** + * This type represents a generic router interface that Clerk relies on to interact with the host router. + */ +export type ClerkHostRouter = { + readonly mode: RoutingMode; + readonly name: string; + pathname: () => string; + push: (path: string) => void; + replace: (path: string) => void; + searchParams: () => URLSearchParams; + shallowPush: (path: string) => void; +}; diff --git a/packages/types/src/session.ts b/packages/types/src/session.ts index b9f0533745..d401e56316 100644 --- a/packages/types/src/session.ts +++ b/packages/types/src/session.ts @@ -18,7 +18,6 @@ import type { ClerkResource } from './resource'; import type { __experimental_ReverificationConfig, __experimental_SessionVerificationLevel, - __experimental_SessionVerificationMaxAgeMinutes, __experimental_SessionVerificationResource, } from './sessionVerification'; import type { TokenResource } from './token'; @@ -155,7 +154,6 @@ export type GetToken = (options?: GetTokenOptions) => Promise; export type __experimental_SessionVerifyCreateParams = { level: __experimental_SessionVerificationLevel; - maxAgeMinutes: __experimental_SessionVerificationMaxAgeMinutes; }; export type __experimental_SessionVerifyPrepareFirstFactorParams = EmailCodeConfig | PhoneCodeConfig; diff --git a/packages/types/src/sessionVerification.ts b/packages/types/src/sessionVerification.ts index 8dbd46a377..b5dbf4a771 100644 --- a/packages/types/src/sessionVerification.ts +++ b/packages/types/src/sessionVerification.ts @@ -17,22 +17,15 @@ export type __experimental_SessionVerificationStatus = 'needs_first_factor' | 'n export type __experimental_SessionVerificationTypes = 'veryStrict' | 'strict' | 'moderate' | 'lax'; -export type __experimental_SessionVerificationConfig = - | __experimental_SessionVerificationTypes - | { - level: __experimental_SessionVerificationLevel; - maxAgeMinutes: __experimental_SessionVerificationMaxAgeMinutes; - }; - export type __experimental_ReverificationConfig = | __experimental_SessionVerificationTypes | { level: __experimental_SessionVerificationLevel; - afterMinutes: __experimental_SessionVerificationMaxAgeMinutes; + afterMinutes: __experimental_SessionVerificationAfterMinutes; }; export type __experimental_SessionVerificationLevel = 'firstFactor' | 'secondFactor' | 'multiFactor'; -export type __experimental_SessionVerificationMaxAgeMinutes = number; +export type __experimental_SessionVerificationAfterMinutes = number; export type __experimental_SessionVerificationFirstFactor = EmailCodeFactor | PhoneCodeFactor | PasswordFactor; export type __experimental_SessionVerificationSecondFactor = PhoneCodeFactor | TOTPFactor | BackupCodeFactor; diff --git a/packages/types/src/signUp.ts b/packages/types/src/signUp.ts index 9f060bae84..ed269259c1 100644 --- a/packages/types/src/signUp.ts +++ b/packages/types/src/signUp.ts @@ -1,4 +1,4 @@ -import type { FirstNameAttribute, LastNameAttribute, PasswordAttribute } from './attributes'; +import type { FirstNameAttribute, LastNameAttribute, LegalAcceptedAttribute, PasswordAttribute } from './attributes'; import type { AttemptEmailAddressVerificationParams, PrepareEmailAddressVerificationParams } from './emailAddress'; import type { EmailAddressIdentifier, @@ -59,6 +59,7 @@ export interface SignUpResource extends ClerkResource { createdSessionId: string | null; createdUserId: string | null; abandonAt: number | null; + legalAcceptedAt: number | null; create: (params: SignUpCreateParams) => Promise; @@ -89,7 +90,10 @@ export interface SignUpResource extends ClerkResource { ) => Promise; authenticateWithWeb3: ( - params: AuthenticateWithWeb3Params & { unsafeMetadata?: SignUpUnsafeMetadata }, + params: AuthenticateWithWeb3Params & { + unsafeMetadata?: SignUpUnsafeMetadata; + __experimental_legalAccepted?: boolean; + }, ) => Promise; authenticateWithMetamask: (params?: SignUpAuthenticateWithWeb3Params) => Promise; @@ -135,7 +139,7 @@ export type AttemptVerificationParams = signature: string; }; -export type SignUpAttributeField = FirstNameAttribute | LastNameAttribute | PasswordAttribute; +export type SignUpAttributeField = FirstNameAttribute | LastNameAttribute | PasswordAttribute | LegalAcceptedAttribute; // TODO: SignUpVerifiableField or SignUpIdentifier? export type SignUpVerifiableField = @@ -161,7 +165,8 @@ export type SignUpCreateParams = Partial< unsafeMetadata: SignUpUnsafeMetadata; ticket: string; token: string; - } & SnakeToCamel> + __experimental_legalAccepted: boolean; + } & Omit>, 'legalAccepted'> >; export type SignUpUpdateParams = SignUpCreateParams; diff --git a/packages/types/src/userSettings.ts b/packages/types/src/userSettings.ts index 9edc2755e7..fafebce3fb 100644 --- a/packages/types/src/userSettings.ts +++ b/packages/types/src/userSettings.ts @@ -54,6 +54,7 @@ export type SignUpData = { progressive: boolean; captcha_enabled: boolean; mode: SignUpModes; + legal_consent_enabled: boolean; }; export type PasswordSettingsData = { diff --git a/packages/types/src/verification.ts b/packages/types/src/verification.ts index 9fa41444e9..5b53a5801c 100644 --- a/packages/types/src/verification.ts +++ b/packages/types/src/verification.ts @@ -8,6 +8,7 @@ export interface VerificationResource extends ClerkResource { expireAt: Date | null; externalVerificationRedirectURL: URL | null; nonce: string | null; + message: string | null; status: VerificationStatus | null; strategy: string | null; verifiedAtClient: string | null; diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index b5165965c8..82185981d3 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,16 @@ # @clerk/ui +## 0.1.10 + +### Patch Changes + +- Update internal dependencies to use public version ranges instead of file-based paths ([#4397](https://github.com/clerk/javascript/pull/4397)) by [@LekoArts](https://github.com/LekoArts) + +- Updated dependencies [[`3fdcdbf88`](https://github.com/clerk/javascript/commit/3fdcdbf88c38facf8b82563f634ec1b6604fd8e5)]: + - @clerk/types@4.28.0 + - @clerk/elements@0.17.1 + - @clerk/shared@2.10.1 + ## 0.1.9 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index aada6836b4..da1bd773d6 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,18 +1,20 @@ { "name": "@clerk/ui", - "version": "0.1.9", - "private": true, + "version": "0.1.10", + "repository": { + "type": "git", + "url": "git+https://github.com/clerk/javascript.git", + "directory": "packages/ui" + }, "license": "MIT", "author": { "name": "Clerk, Inc.", "email": "support@clerk.com", "url": "git+https://github.com/clerk/javascript.git" }, - "repository": { - "type": "git", - "url": "git+https://github.com/clerk/javascript.git", - "directory": "packages/ui" - }, + "sideEffects": [ + "*.css" + ], "exports": { "./contexts": { "import": { @@ -27,13 +29,16 @@ "./*": { "import": { "types": "./dist/components/*.d.mts", + "browser": "./dist/components/*.mjs", "default": "./dist/components/*.mjs" }, "require": { "types": "./dist/components/*.d.ts", + "browser": "./dist/components/*.js", "default": "./dist/components/*.js" } - } + }, + "./styles.css": "./dist/styles.css" }, "main": "index.js", "files": [ @@ -41,16 +46,15 @@ ], "scripts": { "build": "tsup", + "bundlewatch": "npx bundlewatch --config bundlewatch.config.json", "dev": "tsup --watch", "dev:theme-builder": "concurrently \"npm run dev\" \"cd theme-builder && npm run dev\"", - "bundlewatch": "npx bundlewatch --config bundlewatch.config.json", "test": "vitest" }, "dependencies": { - "@clerk/clerk-react": "file:../react", - "@clerk/elements": "file:../elements", - "@clerk/shared": "file:../shared", - "@clerk/types": "file:../types", + "@clerk/elements": "0.17.1", + "@clerk/shared": "2.10.1", + "@clerk/types": "4.28.0", "@formkit/auto-animate": "^0.8.2", "@radix-ui/react-slot": "^1.1.0", "cmdk": "^1.0.0", diff --git a/packages/ui/src/common/connections.tsx b/packages/ui/src/common/connections.tsx index 92bca49506..b9e976f685 100644 --- a/packages/ui/src/common/connections.tsx +++ b/packages/ui/src/common/connections.tsx @@ -6,6 +6,7 @@ import { useEnabledConnections } from '~/hooks/use-enabled-connections'; import { useLocalizations } from '~/hooks/use-localizations'; import { Button } from '~/primitives/button'; import { PROVIDERS } from '~/primitives/icons/providers'; +import { applyDescriptors } from '~/utils/dva'; /** * Calculates the number of columns given the total number of items and the maximum columns allowed per row. @@ -54,12 +55,26 @@ function getColumnCount({ length, max }: Record<'length' | 'max', number>): numb return Math.ceil(length / numRows); } +export const layoutStyle = { + connectionList: { + className: + '-m-[calc(var(--cl-connection-gap)/2)] flex flex-wrap items-center justify-center [--cl-connection-gap:theme(spacing.2)]', + }, + connectionListItem: { + className: 'w-full p-[calc(var(--cl-connection-gap)/2)] sm:w-[calc(100%/var(--cl-connection-columns))]', + }, +}; + +// Purposefully left blank to prevent confusion. +export const visualStyle = {}; + export function Connections( props: { columns?: number } & Pick, 'disabled' | 'textVisuallyHidden'>, ) { const { t } = useLocalizations(); const enabledConnections = useEnabledConnections(); - const { options } = useAppearance().parsedAppearance; + const { options, elements } = useAppearance().parsedAppearance; + const connectionListDescriptors = applyDescriptors(elements, 'connectionList'); const hasConnection = enabledConnections.length > 0; const textVisuallyHidden = typeof props?.textVisuallyHidden !== 'undefined' @@ -71,14 +86,14 @@ export function Connections( return hasConnection ? (
    {enabledConnections.map(c => { return (
  • {isConnectionLoading => { @@ -88,6 +103,7 @@ export function Connections( asChild > diff --git a/packages/ui/src/primitives/card.tsx b/packages/ui/src/primitives/card.tsx index 0df9a6f4c4..ca184ab910 100644 --- a/packages/ui/src/primitives/card.tsx +++ b/packages/ui/src/primitives/card.tsx @@ -1,55 +1,80 @@ -import { cva, cx } from 'cva'; +import { cx } from 'cva'; import * as React from 'react'; +import { useAppearance } from '~/contexts'; +import { mergeDescriptors, type ParsedElementsFragment } from '~/contexts/AppearanceContext'; import type { PolymorphicForwardRefExoticComponent, PolymorphicPropsWithoutRef } from '~/types/utils'; +import { applyDescriptors } from '~/utils/dva'; import { ClerkLogo } from './clerk-logo'; import { Image } from './image'; +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardRoot + */ const RootDefaultElement = 'div'; type RootOwnProps = { children?: React.ReactNode; banner?: React.ReactNode; }; +const cardRootLayoutStyle = { + cardRoot: { + className: [ + '[--card-banner-height:theme(size.4)]', + '[--card-body-px:theme(spacing.10)]', + '[--card-body-py:theme(spacing.8)]', + '[--card-content-rounded-b:theme(borderRadius.lg)]', + 'relative w-full max-w-[25rem]', + ].join(' '), + }, +}; +const cardRootVisualStyle = { + cardRoot: { + className: 'bg-gray-2 ring-gray-a3 rounded-xl ring-1', + }, + cardRootDefault: { + className: 'shadow-[0px_5px_15px_0px_theme(colors.gray.a4),0px_15px_35px_-5px_theme(colors.gray.a4)]', + }, + cardRootInner: { + className: 'overflow-hidden rounded-[inherit]', + }, +}; + export const Root: PolymorphicForwardRefExoticComponent = React.forwardRef( function CardRoot( - { as, banner, children, className, ...props }: PolymorphicPropsWithoutRef, + { as, banner, children, ...props }: PolymorphicPropsWithoutRef, forwardedRef: React.ForwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; const Element: React.ElementType = as || RootDefaultElement; + const cardRootDescriptors = applyDescriptors(elements, 'cardRoot'); + const cardRootDefaultDescriptors = applyDescriptors(elements, 'cardRootDefault'); return ( {banner && (

    @@ -57,58 +82,99 @@ export const Root: PolymorphicForwardRefExoticComponent

    )} - {children && ( -
    - {children} -
    - )} + {children &&
    {children}
    }
    ); }, ); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardContent + */ +const cardContentLayoutStyle = { + cardContent: { + className: 'relative flex flex-col gap-8 px-[--card-body-px] py-[--card-body-py]', + }, +} satisfies ParsedElementsFragment; +const cardContentVisualStyle = { + cardContent: { + className: [ + 'bg-gray-surface rounded-b-[--card-content-rounded-b] rounded-t-none', + 'ring-gray-a3 shadow-[0px_0px_2px_0px_theme(colors.gray.a4),0px_1px_2px_0px_theme(colors.gray.a3)] ring-1', + ].join(' '), + }, +} satisfies ParsedElementsFragment; + export const Content = React.forwardRef>(function CardContent( { children, className, ...props }, forwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; return (
    {children}
    ); }); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardHeader + */ +const cardHeaderLayoutStyle = { + cardHeader: { + className: 'z-1 flex flex-col items-center gap-1 text-center', + }, +} satisfies ParsedElementsFragment; + +// Purposefully left blank to prevent confusion. +const cardHeaderVisualStyle = {} satisfies ParsedElementsFragment; + export const Header = React.forwardRef>(function CardHeader( { children, className, ...props }, forwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; return (
    {children}
    ); }); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardLogo + */ +const cardLogoLayoutStyle = { + cardLogoBox: { + className: 'z-1 mb-5 flex h-8 justify-center', + }, + cardLogoLink: { + className: '-m-0.5 rounded-sm p-0.5 outline-none focus-visible:ring', + }, + cardLogoImage: { + className: 'size-full object-contain', + }, +} satisfies ParsedElementsFragment; + +// Purposefully left blank to prevent confusion. +const cardLogoVisualStyle = {} satisfies ParsedElementsFragment; + export const Logo = React.forwardRef(function CardLogo( { - className, href, src, ...props @@ -117,6 +183,7 @@ export const Logo = React.forwardRef(function CardLogo( }, forwardedRef: React.ForwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; if (!src) { return null; } @@ -124,19 +191,18 @@ export const Logo = React.forwardRef(function CardLogo( const img = ( ); return ( -
    +
    {href ? ( {img} @@ -147,29 +213,56 @@ export const Logo = React.forwardRef(function CardLogo( ); }); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardTitle + */ +// Purposefully left blank to prevent confusion. +const cardTitleLayoutStyle = {} satisfies ParsedElementsFragment; +const cardTitleVisualStyle = { + cardTitle: { + className: 'leading-medium text-gray-12 text-lg font-bold', + }, +} satisfies ParsedElementsFragment; + export const Title = React.forwardRef>(function CardTitle( { children, className, ...props }, forwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; return (

    {children}

    ); }); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardDescription + */ +// Purposefully left blank to prevent confusion. +const cardDescriptionLayoutStyle = {} satisfies ParsedElementsFragment; +const cardDescriptionVisualStyle = { + cardDescription: { + className: 'text-gray-a11 text-base', + }, +} satisfies ParsedElementsFragment; + export const Description = React.forwardRef>( function CardDescription({ children, className, ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return (

    {children}

    @@ -177,64 +270,106 @@ export const Description = React.forwardRef>(function CardBody( { children, className, ...props }, forwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; + return (
    {children}
    ); }); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardActions + */ +const cardActionsLayoutStyle = { + cardActions: { + className: [ + 'z-1 flex flex-col gap-3', + // Note: + // Prevents underline interractions triggering outside of the link text + // https://linear.app/clerk/issue/SDKI-192/#comment-ebf943b0 + '[&_[data-link]]:self-center', + ].join(' '), + }, +} satisfies ParsedElementsFragment; + +// Purposefully left blank to prevent confusion. +const cardActionsVisualStyle = {} satisfies ParsedElementsFragment; + export const Actions = React.forwardRef>(function CardActions( { children, className, ...props }, forwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; + return (
    {children}
    ); }); -export const Banner = React.forwardRef(function CardBanner( - { children, className, ...props }: React.HTMLAttributes, - forwardedRef: React.ForwardedRef, -) { - return ( -
    -

    - {children} -

    -
    - ); -}); +//////////////////////////////////////////////////////////////////////////////// + +/** + * CardFooter + */ +const cardFooterLayoutStyle = { + cardFooter: { + className: 'grid', + }, + cardFooterAction: { + className: 'px-6 py-4', + }, +} satisfies ParsedElementsFragment; +const cardFooterVisualStyle = { + cardFooterAction: { + className: 'border-gray-a3 border-b last-of-type:border-b-transparent', + }, + cardFooterActionText: { + className: 'text-gray-a11 text-center text-base', + }, + cardFooterActionLink: { + className: + 'text-accent-a10 text-base font-medium hover:underline rounded-sm outline-none focus-visible:ring -mx-0.5 px-0.5', + }, + cardFooterActionButton: { + className: + 'text-accent-a10 text-base font-medium hover:underline rounded-sm outline-none focus-visible:ring -mx-0.5 px-0.5', + }, + cardFooterActionPageLink: { + className: 'text-gray-a11 text-base font-medium hover:underline', + }, +} satisfies ParsedElementsFragment; export const Footer = React.forwardRef(function CardFooter( { @@ -253,6 +388,7 @@ export const Footer = React.forwardRef(function CardFooter( } & React.HTMLAttributes, forwardedRef: React.ForwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; const hasPageLinks = helpPageUrl || privacyPageUrl || termsPageUrl; const renderFooter = branded || hasPageLinks || children; const renderSubFooter = branded || hasPageLinks; @@ -261,9 +397,8 @@ export const Footer = React.forwardRef(function CardFooter( return renderFooter ? (
    {children} @@ -305,12 +440,12 @@ export const Footer = React.forwardRef(function CardFooter( export const FooterAction = React.forwardRef>( function CardFooterAction({ children, className, ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return (
    {children}
    @@ -320,12 +455,12 @@ export const FooterAction = React.forwardRef>( function CardFooterActionText({ children, className, ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return (

    {children}

    @@ -333,20 +468,16 @@ export const FooterActionText = React.forwardRef>( function CardFooterActionButton({ children, className, type = 'button', ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return ( @@ -356,12 +487,12 @@ export const FooterActionButton = React.forwardRef>( function CardFooterActionLink({ children, className, ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return ( {children} @@ -371,16 +502,41 @@ export const FooterActionLink = React.forwardRef>( function CardFooterPageLink({ children, className, ...props }, forwardedRef) { + const { elements } = useAppearance().parsedAppearance; return ( {children} ); }, ); + +export const layoutStyle = { + ...cardRootLayoutStyle, + ...cardHeaderLayoutStyle, + ...cardContentLayoutStyle, + ...cardTitleLayoutStyle, + ...cardDescriptionLayoutStyle, + ...cardBodyLayoutStyle, + ...cardActionsLayoutStyle, + ...cardFooterLayoutStyle, + ...cardLogoLayoutStyle, +} satisfies ParsedElementsFragment; + +export const visualStyle = { + ...cardRootVisualStyle, + ...cardHeaderVisualStyle, + ...cardContentVisualStyle, + ...cardTitleVisualStyle, + ...cardDescriptionVisualStyle, + ...cardBodyVisualStyle, + ...cardActionsVisualStyle, + ...cardFooterVisualStyle, + ...cardLogoVisualStyle, +} satisfies ParsedElementsFragment; diff --git a/packages/ui/src/primitives/field.tsx b/packages/ui/src/primitives/field.tsx index 1a4233d4f6..9a1c1e0a79 100644 --- a/packages/ui/src/primitives/field.tsx +++ b/packages/ui/src/primitives/field.tsx @@ -15,7 +15,6 @@ export const Root = React.forwardRef & { asChild?: boolean; @@ -167,9 +159,9 @@ export const Input = React.forwardRef(function FieldInput( return ( (function FieldMessage({ className, children, justify = 'start', intent = 'idle', ...props }, forwardedRef) { return (

    , 'className'> & { - children: string; - }, + descriptor, + }: HTMLAttributes & + VariantProps & { + children: string; + }, ref: React.ForwardedRef, ) { + const { elements } = useAppearance().parsedAppearance; return ( {children} diff --git a/packages/ui/src/themes/buildTheme.ts b/packages/ui/src/themes/buildTheme.ts index f42b20343a..96f2517670 100644 --- a/packages/ui/src/themes/buildTheme.ts +++ b/packages/ui/src/themes/buildTheme.ts @@ -1,22 +1,43 @@ -import type { PartialTheme, ParsedElements } from '~/contexts/AppearanceContext'; +import type { ParsedElements, PartialTheme } from '~/contexts/AppearanceContext'; +import { DESCRIPTORS } from '~/descriptors'; /** - * Given a complete theme object minus descriptors, returns a full ParsedElements object with generated descriptors. + * Given an object containing partial descriptors, returns a full ParsedElements object with generated descriptors. */ export function buildTheme(p: PartialTheme): ParsedElements { const theme: Partial = {}; + // Setup base theme containing empty objects for each descriptor. + DESCRIPTORS.forEach(descriptor => { + theme[descriptor] = { + descriptor: `cl-${descriptor}`, + className: '', + style: {}, + }; + }); + for (const descriptor in p) { - if (p[descriptor as keyof PartialTheme]) { - const { className, style } = p[descriptor as keyof PartialTheme]!; - theme[descriptor as keyof ParsedElements] = { - descriptor: `cl-${descriptor}`, - className: className ?? '', - style: style ?? {}, - }; + const key = descriptor as keyof ParsedElements; + + if (p[key]) { + if (!(key in theme)) { + console.warn(`Clerk: Unknown descriptor: ${descriptor}`); + continue; + } + + // These non-null assertions are okay since we confirmed that theme contains the descriptor above. + const { className, style } = p[key]!; + if (className) { + theme[key]!.className = className; + } + + if (style) { + theme[key]!.style = style; + } } } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return theme as ParsedElements; } @@ -34,3 +55,20 @@ export function mergeTheme(a: ParsedElements, b: ParsedElements): ParsedElements return mergedTheme; } + +if (import.meta.vitest) { + const { it, expect, describe } = import.meta.vitest; + + describe('buildTheme', () => { + it('returns a theme containing all descriptors', () => { + const theme = buildTheme({}); + expect(Object.keys(theme).sort()).toStrictEqual([...DESCRIPTORS].sort()); + + for (const [k, v] of Object.entries(theme)) { + expect(v.descriptor).toEqual(`cl-${k}`); + expect(v.className).toEqual(''); + expect(v.style).toStrictEqual({}); + } + }); + }); +} diff --git a/packages/ui/src/themes/full.ts b/packages/ui/src/themes/full.ts index 28bb8c96b5..061534c26d 100644 --- a/packages/ui/src/themes/full.ts +++ b/packages/ui/src/themes/full.ts @@ -1,8 +1,19 @@ -import { visualStyle as alertVisualStyle } from '~/primitives/alert'; -import { visualStyle as separatorVisualStyle } from '~/primitives/separator'; +import { visualStyle as connections } from '~/common/connections'; +import { visualStyle as alert } from '~/primitives/alert'; +import { visualStyle as button } from '~/primitives/button'; +import { visualStyle as card } from '~/primitives/card'; +import { visualStyle as separator } from '~/primitives/separator'; +import { visualStyle as spinner } from '~/primitives/spinner'; import { buildTheme, mergeTheme } from './buildTheme'; import { layoutTheme } from './layout'; -const visualTheme = buildTheme({ ...alertVisualStyle, ...separatorVisualStyle }); +const visualTheme = buildTheme({ + ...alert, + ...button, + ...card, + ...connections, + ...separator, + ...spinner, +}); export const fullTheme = mergeTheme(layoutTheme, visualTheme); diff --git a/packages/ui/src/themes/layout.ts b/packages/ui/src/themes/layout.ts index 5a05cfefae..b76dd7ff05 100644 --- a/packages/ui/src/themes/layout.ts +++ b/packages/ui/src/themes/layout.ts @@ -1,6 +1,17 @@ -import { layoutStyle as alertLayoutStyle } from '~/primitives/alert'; -import { layoutStyle as separatorStyle } from '~/primitives/separator'; +import { layoutStyle as connections } from '~/common/connections'; +import { layoutStyle as alert } from '~/primitives/alert'; +import { layoutStyle as button } from '~/primitives/button'; +import { layoutStyle as card } from '~/primitives/card'; +import { layoutStyle as separator } from '~/primitives/separator'; +import { layoutStyle as spinner } from '~/primitives/spinner'; import { buildTheme } from './buildTheme'; -export const layoutTheme = buildTheme({ ...alertLayoutStyle, ...separatorStyle }); +export const layoutTheme = buildTheme({ + ...alert, + ...button, + ...card, + ...connections, + ...separator, + ...spinner, +}); diff --git a/packages/ui/src/utils/dva.ts b/packages/ui/src/utils/dva.ts new file mode 100644 index 0000000000..e6132664cb --- /dev/null +++ b/packages/ui/src/utils/dva.ts @@ -0,0 +1,230 @@ +/** + * Copyright 2022 Joe Bell. All rights reserved. + * + * This file is licensed to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +import { clsx } from 'clsx'; + +import { type DescriptorIdentifier, mergeDescriptors, type ParsedElements } from '~/contexts/AppearanceContext'; + +/* Types + ============================================ */ + +/* clsx + ---------------------------------- */ + +// When compiling with `declaration: true`, many projects experience the dreaded +// TS2742 error. To combat this, we copy clsx's types manually. +// Should this project move to JSDoc, this workaround would no longer be needed. + +type ClassValue = ClassArray | ClassDictionary | DescriptorIdentifier | number | null | boolean | undefined; +type ClassDictionary = Record; +type ClassArray = ClassValue[]; + +/* Utils + ---------------------------------- */ + +type OmitUndefined = T extends undefined ? never : T; +type StringToBoolean = T extends 'true' | 'false' ? boolean : T; +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; + +export type VariantProps any> = Omit< + OmitUndefined[0]>, + 'class' | 'className' +>; + +/* compose + ---------------------------------- */ + +export interface Compose { + []>( + ...components: [...T] + ): ( + props?: ( + | UnionToIntersection< + { + [K in keyof T]: VariantProps; + }[number] + > + | undefined + ) & + DVAClassProp, + ) => string; +} + +/* cx + ---------------------------------- */ + +export interface CX { + (...inputs: ClassValue[]): string; +} + +export type CXOptions = Parameters; +export type CXReturn = ReturnType; + +/* dva + ============================================ */ + +type DVAConfigBase = { base?: ClassValue }; +type DVAVariantShape = Record>; +type DVAVariantSchema = { + [Variant in keyof V]?: StringToBoolean | undefined; +}; +type DVAClassProp = { descriptor?: ClassValue }; + +export interface DVA { + <_ extends "dva's generic parameters are restricted to internal use only.", V>( + config: V extends DVAVariantShape + ? DVAConfigBase & { + variants?: V; + compoundVariants?: (V extends DVAVariantShape + ? ( + | DVAVariantSchema + | { + [Variant in keyof V]?: + | StringToBoolean + | StringToBoolean[] + | undefined; + } + ) & + DVAClassProp + : DVAClassProp)[]; + defaultVariants?: DVAVariantSchema; + } + : DVAConfigBase & { + variants?: never; + compoundVariants?: never; + defaultVariants?: never; + }, + ): (props?: V extends DVAVariantShape ? DVAVariantSchema & DVAClassProp : DVAClassProp) => string; +} + +/* defineConfig + ---------------------------------- */ + +export interface DefineConfigOptions { + hooks?: { + /** + * @deprecated please use `onComplete` + */ + 'cx:done'?: (className: string) => string; + /** + * Returns the completed string of concatenated classes/classNames. + */ + onComplete?: (className: string) => string; + }; +} + +export interface DefineConfig { + (options?: DefineConfigOptions): { + compose: Compose; + cx: CX; + dva: DVA; + }; +} + +/* Exports + ============================================ */ + +const falsyToString = (value: T) => (typeof value === 'boolean' ? `${value}` : value === 0 ? '0' : value); + +export const defineConfig: DefineConfig = options => { + const cx: CX = (...inputs) => { + if (typeof options?.hooks?.['cx:done'] !== 'undefined') { + return options?.hooks['cx:done'](clsx(inputs)); + } + + if (typeof options?.hooks?.onComplete !== 'undefined') { + return options?.hooks.onComplete(clsx(inputs)); + } + + return clsx(inputs); + }; + + const dva: DVA = config => props => { + if (config?.variants == null) { + return cx(config?.base, props?.descriptor); + } + + const { variants, defaultVariants } = config; + + const getVariantClassNames = Object.keys(variants).map((variant: keyof typeof variants) => { + const variantProp = props?.[variant as keyof typeof props]; + const defaultVariantProp = defaultVariants?.[variant]; + + const variantKey = (falsyToString(variantProp) || + falsyToString(defaultVariantProp)) as keyof (typeof variants)[typeof variant]; + + return variants[variant][variantKey]; + }); + + const defaultsAndProps = { + ...defaultVariants, + // remove `undefined` props + ...(props && + Object.entries(props).reduce( + (acc, [key, value]) => (typeof value === 'undefined' ? acc : { ...acc, [key]: value }), + {} as typeof props, + )), + }; + + const getCompoundVariantClassNames = config?.compoundVariants?.reduce( + (acc, { descriptor, ...cvConfig }) => + Object.entries(cvConfig).every(([cvKey, cvSelector]) => { + const selector = defaultsAndProps[cvKey as keyof typeof defaultsAndProps]; + + return Array.isArray(cvSelector) ? cvSelector.includes(selector) : selector === cvSelector; + }) + ? [...acc, descriptor] + : acc, + [] as ClassValue[], + ); + + return cx(config?.base, getVariantClassNames, getCompoundVariantClassNames, props?.descriptor); + }; + + const compose: Compose = + (...components) => + props => { + const propsWithoutDescriptor = Object.fromEntries( + Object.entries(props || {}).filter(([key]) => !['descriptor'].includes(key)), + ); + + return cx(components.map(component => component(propsWithoutDescriptor)) as ClassValue[], props?.descriptor); + }; + + return { + compose, + dva, + cx, + }; +}; + +export const { compose, dva, cx } = defineConfig(); + +export function getDescriptors(elements: ParsedElements, descriptorList: string) { + const descriptors = descriptorList.split(' ') as (keyof ParsedElements)[]; + return descriptors.map(d => { + const value = elements[d]; + if (!value) { + console.warn(`Clerk: unable to access style configuration for descriptor: ${d}`); + } + + return value; + }); +} + +export function applyDescriptors(elements: ParsedElements, descriptorList: string) { + const descriptors = getDescriptors(elements, descriptorList); + return mergeDescriptors(...descriptors); +} diff --git a/packages/ui/theme-builder/package-lock.json b/packages/ui/theme-builder/package-lock.json index 10ac055703..e88492fe10 100644 --- a/packages/ui/theme-builder/package-lock.json +++ b/packages/ui/theme-builder/package-lock.json @@ -43,7 +43,6 @@ "version": "0.1.9", "license": "MIT", "dependencies": { - "@clerk/clerk-react": "file:../react", "@clerk/elements": "file:../elements", "@clerk/shared": "file:../shared", "@clerk/types": "file:../types", @@ -58,6 +57,7 @@ "@clerk/tailwindcss-transformer": "*", "@testing-library/react": "^16.0.0", "@vitejs/plugin-react": "^4.3.1", + "bundlewatch": "^0.4.0", "concurrently": "^8.2.2", "jsdom": "^24.1.1", "vitest": "^2.0.5" @@ -65,10 +65,10 @@ }, "../../localizations": { "name": "@clerk/localizations", - "version": "3.1.2", + "version": "3.3.0", "license": "MIT", "dependencies": { - "@clerk/types": "4.25.0" + "@clerk/types": "4.26.0" }, "devDependencies": { "@clerk/eslint-config-custom": "*", @@ -81,13 +81,13 @@ }, "../../nextjs": { "name": "@clerk/nextjs", - "version": "5.7.1", + "version": "5.7.5", "license": "MIT", "dependencies": { - "@clerk/backend": "1.13.8", - "@clerk/clerk-react": "5.11.0", - "@clerk/shared": "2.9.0", - "@clerk/types": "4.25.0", + "@clerk/backend": "1.14.1", + "@clerk/clerk-react": "5.12.0", + "@clerk/shared": "2.9.2", + "@clerk/types": "4.26.0", "crypto-js": "4.2.0", "server-only": "0.0.1", "tslib": "2.4.1" diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts index 9d45f79196..aea6489615 100644 --- a/packages/ui/tsup.config.ts +++ b/packages/ui/tsup.config.ts @@ -47,7 +47,7 @@ export default defineConfig(overrideOptions => { 'components/sign-up': 'src/components/sign-up/index.tsx', contexts: 'src/contexts/index.ts', }, - external: ['react', 'react-dom'], + external: ['react', 'react-dom', '@clerk/shared'], format: ['cjs', 'esm'], minify: false, sourcemap: true, diff --git a/packages/upgrade/CHANGELOG.md b/packages/upgrade/CHANGELOG.md index d1be9523ef..aa5a9dc2df 100644 --- a/packages/upgrade/CHANGELOG.md +++ b/packages/upgrade/CHANGELOG.md @@ -1,5 +1,108 @@ # @clerk/upgrade +## 1.1.2 + +### Patch Changes + +- Updating the CLI output to match the DX of core-1 to core-2 migration ([#4393](https://github.com/clerk/javascript/pull/4393)) by [@jacekradko](https://github.com/jacekradko) + +## 1.1.1 + +### Patch Changes + +- Adding fallback to properly link up transform ([#4386](https://github.com/clerk/javascript/pull/4386)) by [@jacekradko](https://github.com/jacekradko) + +## 1.1.0 + +### Minor Changes + +- @clerk/nextjs: Converting auth() and clerkClient() interfaces to be async ([#4366](https://github.com/clerk/javascript/pull/4366)) by [@jacekradko](https://github.com/jacekradko) + + @clerk/upgrade: Adding required codemod for @clerk/nextjs breaking changes + + # Migration guide + + ## `auth()` is now async + + Previously the `auth()` method from `@clerk/nextjs/server` was synchronous. + + ```typescript + import { auth } from "@clerk/nextjs/server"; + + export function GET() { + const { userId } = auth(); + return new Response(JSON.stringify({ userId })); + } + ``` + + The `auth` method now becomes asynchronous. You will need to make the following changes to the snippet above to make it compatible. + + ```diff + - export function GET() { + + export async function GET() { + - const { userId } = auth(); + + const { userId } = await auth(); + return new Response(JSON.stringify({ userId })); + } + ``` + + ## Clerk middleware auth is now async + + ```typescript + import { clerkClient, clerkMiddleware } from '@clerk/nextjs/server'; + import { NextResponse } from 'next/server'; + + export default clerkMiddleware(async (auth, request) => { + const resolvedAuth = await auth(); + + const count = await resolvedAuth.users.getCount(); + + if (count) { + return NextResponse.redirect(new URL('/new-url', request.url)); + } + }); + + export const config = { + matcher: [...], + }; + ``` + + ## clerkClient() is now async + + Previously the `clerkClient()` method from `@clerk/nextjs/server` was synchronous. + + ```typescript + import { clerkClient, clerkMiddleware } from '@clerk/nextjs/server'; + import { NextResponse } from 'next/server'; + + export default clerkMiddleware((auth, request) => { + const client = clerkClient(); + + const count = await client.users?.getCount(); + + if (count) { + return NextResponse.redirect(new URL('/new-url', request.url)); + } + }); + + export const config = { + matcher: [...], + }; + ``` + + The method now becomes async. You will need to make the following changes to the snippet above to make it compatible. + + ```diff + - export default clerkMiddleware((auth, request) => { + - const client = clerkClient(); + + export default clerkMiddleware(async (auth, request) => { + + const client = await clerkClient(); + const count = await client.users?.getCount(); + + if (count) { + } + ``` + ## 1.0.9 ### Patch Changes diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 0b5b73c8b1..fc93eeef7a 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,11 @@ { "name": "@clerk/upgrade", - "version": "1.0.9", + "version": "1.1.2", + "repository": { + "type": "git", + "url": "git+https://github.com/clerk/javascript.git", + "directory": "packages/upgrade" + }, "license": "MIT", "type": "module", "main": "dist/cli.js", @@ -11,16 +16,12 @@ "dist" ], "scripts": { - "build": "npm run clean && NODE_ENV=production babel --out-dir=dist src --copy-files", + "build": "npm run clean && NODE_ENV=production babel --keep-file-extension --out-dir=dist src --copy-files", "clean": "del-cli dist/*", - "dev": "babel --out-dir=dist --watch src --copy-files", + "dev": "babel --keep-file-extension --out-dir=dist --watch src --copy-files", "lint": "eslint src/", - "lint:publint": "publint" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/clerk/javascript.git", - "directory": "packages/upgrade" + "lint:publint": "publint", + "test": "vitest" }, "babel": { "presets": [ @@ -28,16 +29,18 @@ ] }, "dependencies": { - "@inkjs/ui": "^1.0.0", + "@inkjs/ui": "^2.0.0", "@jescalan/ink-markdown": "^2.0.0", "ejs": "3.1.10", + "execa": "9.4.1", "globby": "^14.0.1", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", - "ink": "^4.4.1", + "ink": "^5.0.1", "ink-big-text": "^2.0.0", "ink-gradient": "^3.0.0", - "ink-link": "^3.0.0", + "ink-link": "^4.1.0", + "jscodeshift": "^17.0.0", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.3.1", @@ -48,9 +51,10 @@ "devDependencies": { "@babel/cli": "^7.24.7", "@babel/preset-react": "^7.24.7", - "chalk": "^5.3.0", + "@types/jscodeshift": "^0.12.0", "del-cli": "^5.1.0", - "eslint-config-custom": "*" + "eslint-config-custom": "*", + "vitest": "^2.1.3" }, "engines": { "node": ">=18.17.0" diff --git a/packages/upgrade/src/app.js b/packages/upgrade/src/app.js index 332530a2dc..10b9bff442 100644 --- a/packages/upgrade/src/app.js +++ b/packages/upgrade/src/app.js @@ -1,37 +1,44 @@ import { MultiSelect, Select, TextInput } from '@inkjs/ui'; -import { Newline, Text } from 'ink'; -import BigText from 'ink-big-text'; -import Gradient from 'ink-gradient'; -import React, { useState } from 'react'; +import { Newline, Text, useApp } from 'ink'; +import React, { useEffect, useState } from 'react'; +import { Header } from './components/Header.js'; +import { Scan } from './components/Scan.js'; +import { SDKWorkflow } from './components/SDKWorkflow.js'; import SDKS from './constants/sdks.js'; -import Scan from './scan.js'; -import getClerkMajorVersion from './util/get-clerk-version.js'; +import { getClerkMajorVersion } from './util/get-clerk-version.js'; import guessFrameworks from './util/guess-framework.js'; -export default function App({ - _fromVersion, - _toVersion, - _sdk, - _dir = false, - _ignore = [], - _yolo = false, - noWarnings = false, - disableTelemetry = false, -}) { - const [yolo, setYolo] = useState(_yolo); - const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); +/** + * Main CLI application component for handling Clerk SDK upgrades. + * + * @param {Object} props - The `props` object. + * @param {string} [props.dir] - The directory to scan for files. + * @param {boolean} [props.disableTelemetry=false] - Flag to disable telemetry. + * @param {string} [props.fromVersion] - The current version of the SDK. + * @param {Array} [props.ignore] - List of files or directories to ignore. + * @param {boolean} [props.noWarnings=false] - Flag to disable warnings. + * @param {string} [props.sdk] - The SDK to upgrade. + * @param {string} [props.toVersion] - The target version of the SDK. + * @param {boolean} [props.yolo=false] - Flag to enable YOLO mode. + * + * @returns {JSX.Element} The rendered component. + */ +export default function App(props) { + const { noWarnings = false, disableTelemetry = false } = props; + const { exit } = useApp(); + + const [yolo, setYolo] = useState(props.yolo ?? false); + const [sdks, setSdks] = useState(props.sdk ? [props.sdk] : []); const [sdkGuesses, setSdkGuesses] = useState([]); const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); - // See comments below, can be enabled on next major - // eslint-disable-next-line no-unused-vars - const [fromVersion, setFromVersion] = useState(_fromVersion); + const [fromVersion, setFromVersion] = useState(props.fromVersion); const [fromVersionGuessAttempted, setFromVersionGuessAttempted] = useState(false); - // eslint-disable-next-line no-unused-vars - const [toVersion, setToVersion] = useState(_toVersion); - const [dir, setDir] = useState(_dir); - const [ignore, setIgnore] = useState(_ignore); + + const [toVersion, setToVersion] = useState(props.toVersion); + const [dir, setDir] = useState(props.dir); + const [ignore, setIgnore] = useState(props.ignore ?? []); const [configComplete, setConfigComplete] = useState(false); const [configVerified, setConfigVerified] = useState(false); const [uuid, setUuid] = useState(); @@ -42,20 +49,36 @@ export default function App({ setYolo(false); } + useEffect(() => { + if (toVersion === 'core-2') { + setFromVersion('core-1'); + } + }, [toVersion]); + + useEffect(() => { + if (fromVersion === 'core-1') { + setToVersion('core-2'); + } + }, [fromVersion]); + + // Handle the individual SDK upgrade + if (!fromVersion && !toVersion && sdks[0] === 'nextjs') { + return ; + } + // We try to guess which SDK they are using if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { if (!dir) { return setDir(process.cwd()); } const { guesses, _uuid } = guessFrameworks(dir, disableTelemetry); - console.log({ guesses, _uuid }); setUuid(_uuid); setSdkGuesses(guesses); setSdkGuessAttempted(true); } // We try to guess which version of Clerk they are using - if (!fromVersion && !fromVersionGuess && !fromVersionGuessAttempted) { + if (isEmpty(sdks) && !fromVersion && !fromVersionGuess && !fromVersionGuessAttempted) { fromVersionGuess = getClerkMajorVersion(); setFromVersionGuessAttempted(true); } @@ -72,20 +95,14 @@ export default function App({ return ( <> - - - +

    {/* Welcome to the upgrade script! */} {!configComplete && ( <> - Hello friend! We're excited to help you upgrade Clerk - {fromVersion ? ` from ${fromVersion}` : ''} - {toVersion ? ` to ${toVersion}` : ''}. Before we get started, a couple questions... + Hello friend! We're excited to help you upgrade Clerk modules. Before we get + started, a couple questions... @@ -106,7 +123,8 @@ export default function App({ ) : ( - It looks like you are using the "{sdkGuesses[0].label}" Clerk SDK in your project. Is that right? + It looks like you are using the {sdkGuesses[0].label} Clerk SDK in your project. Is that + right? )} @@ -120,6 +138,8 @@ export default function App({ // if true, we were right so we set the sdk if (item === 'yes') { setSdks(sdkGuesses.map(guess => guess.value)); + } else { + setSdkGuesses([]); } }} /> @@ -186,7 +206,7 @@ export default function App({ /> )} */} - {!isEmpty(sdks) > 0 && fromVersion && toVersion && !dir && ( + {!isEmpty(sdks) && fromVersion && toVersion && !dir && ( <> Where would you like for us to scan for files in your project? (globstar syntax supported) @@ -243,12 +263,12 @@ export default function App({ Does this look right? { + if (value === 'yes') { + setRunCodemod(true); + } else { + setDone(true); + } + }} + /> + + )} + + )} + {done && ( + <> + + Done upgrading @clerk/nextjs + + } + onError={() => null} + onSuccess={() => ( + + + We have detected that your application might be using the useAuth hook from{' '} + @clerk/nextjs. + + + + If usages of this hook are server-side rendered, you might need to add the dynamic{' '} + prop to your application's root ClerkProvider. + + + + You can find more information about this change in the Clerk documentation at{' '} + + https://clerk.com/docs/nextjs/rendering-modes + + . + + + )} + /> + + )} + + ); +} diff --git a/packages/upgrade/src/scan.js b/packages/upgrade/src/components/Scan.js similarity index 88% rename from packages/upgrade/src/scan.js rename to packages/upgrade/src/components/Scan.js index 100317ff63..75f513af27 100644 --- a/packages/upgrade/src/scan.js +++ b/packages/upgrade/src/components/Scan.js @@ -6,9 +6,10 @@ import { Newline, Text } from 'ink'; import path from 'path'; import React, { useEffect, useState } from 'react'; -import ExpandableList from './util/expandable-list.js'; +import ExpandableList from '../util/expandable-list.js'; -export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarnings, uuid, disableTelemetry }) { +export function Scan(props) { + const { fromVersion, toVersion, sdks, dir, ignore, noWarnings, uuid, disableTelemetry } = props; // NOTE: if the difference between fromVersion and toVersion is greater than 1 // we need to do a little extra work here and import two matchers, // sequence them after each other, and clearly mark which version migration @@ -29,7 +30,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn // { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] } useEffect(() => { setStatus(`Loading data for ${toVersion} migration`); - import(`./versions/${toVersion}/index.js`).then(version => { + import(`../versions/${toVersion}/index.js`).then(version => { setMatchers( sdks.reduce((m, sdk) => { m[sdk] = version.default[sdk]; @@ -44,22 +45,26 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn // result = `files` set to format: ['/filename', '/other/filename'] useEffect(() => { setStatus('Collecting files to scan'); - ignore.push( - 'node_modules/**', - '**/node_modules/**', - '.git/**', - 'package.json', - '**/package.json', - 'package-lock.json', - '**/package-lock.json', - 'yarn.lock', - '**/yarn.lock', - 'pnpm-lock.yaml', - '**/pnpm-lock.yaml', - '**/*.(png|webp|svg|gif|jpg|jpeg)+', // common image files - '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', // common video files - ); - globby(convertPathToPattern(path.resolve(dir)), { ignore: ignore.filter(Boolean) }).then(files => { + const pattern = convertPathToPattern(path.resolve(dir)); + + globby(pattern, { + ignore: [ + 'node_modules/**', + '**/node_modules/**', + '.git/**', + 'package.json', + '**/package.json', + 'package-lock.json', + '**/package-lock.json', + 'yarn.lock', + '**/yarn.lock', + 'pnpm-lock.yaml', + '**/pnpm-lock.yaml', + '**/*.(png|webp|svg|gif|jpg|jpeg)+', + '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', + ...ignore, + ].filter(Boolean), + }).then(files => { setFiles(files); }); }, [dir, ignore]); diff --git a/packages/upgrade/src/components/UpgradeSDK.js b/packages/upgrade/src/components/UpgradeSDK.js new file mode 100644 index 0000000000..1fc3f3113a --- /dev/null +++ b/packages/upgrade/src/components/UpgradeSDK.js @@ -0,0 +1,116 @@ +import { Select, Spinner, StatusMessage } from '@inkjs/ui'; +import { execa } from 'execa'; +import { existsSync } from 'fs'; +import { Newline, Text } from 'ink'; +import React, { useEffect, useState } from 'react'; + +function detectPackageManager() { + if (existsSync('package-lock.json')) { + return 'npm'; + } else if (existsSync('yarn.lock')) { + return 'yarn'; + } else if (existsSync('pnpm-lock.yaml')) { + return 'pnpm'; + } + return undefined; +} + +function upgradeCommand(sdk, packageManager) { + switch (packageManager) { + case 'yarn': + return `yarn add @clerk/${sdk}@latest`; + case 'pnpm': + return `pnpm add @clerk/${sdk}@latest`; + default: + return `npm install @clerk/${sdk}@latest`; + } +} + +/** + * Component that runs an upgrade command for a given SDK and handles the result. + * + * @component + * @param {Object} props + * @param {Function} props.callback - The callback function to be called after the command execution. + * @param {string} props.sdk - The SDK for which the upgrade command is run. + * @returns {JSX.Element} The rendered component. + * + * @example + * + */ +export function UpgradeSDK({ callback, sdk }) { + const [command, setCommand] = useState(); + const [error, setError] = useState(); + const [packageManager, setPackageManager] = useState(detectPackageManager()); + const [result, setResult] = useState(); + + useEffect(() => { + if (!packageManager) { + return; + } + setCommand(previous => { + if (previous) { + return previous; + } + return upgradeCommand(sdk, packageManager); + }); + if (!command) { + return; + } + + execa({ shell: true })`${command}` + .then(res => { + setResult(res); + }) + .catch(err => { + setError(err); + }) + .finally(() => { + callback(true); + }); + }, [command, packageManager, sdk]); + + return ( + <> + {packageManager ? null : ( + <> + + We could not detect the package manager used in your project. Please select the package manager you are + using + +